- 博客(88)
- 收藏
- 关注
原创 ArduSub.cpp 水下机器人的核心任务调度与主循环实现
这段代码是ArduSub水下机器人的核心任务调度与主循环实现,负责管理系统中所有周期性任务的执行频率、优先级和逻辑,是连接传感器数据处理、控制算法和硬件输出的关键环节。SCHED_TASKSub这是系统的“任务清单”,定义了所有周期性任务的执行参数,是调度器的核心配置。每个任务通过SCHED_TASK或或AP_GPSupdateupdateAP_BaroaccumulateAP_NotifyupdateGCSGCSAC_FenceupdateAP_Mountupdate。
2025-07-25 20:46:58
1044
原创 ArduSub 系统中气压计 / 深度传感器的数据处理
用于测量海拔高度的气压计(例如无人机的气压计),在水下航行器中作为辅助传感器(水面航行时)。:系统可能配备多个气压计/深度传感器(如主传感器+备用传感器),通过切换机制提高可靠性。:当指定的主传感器出现异常(如通信中断、数据超界)时,自动切换到备用传感器。:若启用,减去风对气压的干扰(高速运动时气流压力会影响气压测量)。:指单位时间内的高度/深度变化率(如米/秒),是重要输入参数。:最终选定的主传感器索引,后续导航算法将主要使用该传感器数据。:允许运行时动态添加/移除传感器,系统会自动调整主传感器。
2025-07-25 15:17:18
752
原创 ArduSub电机控制与导航指令转换的核心逻辑——不同导航模式下的角度指令到推力指令的转换
功能:初始化电机输出,将所有电机(或推进器)设置为最小输出状态(通常为0推力)。作用:在电机启动、测试或安全模式下,确保初始状态无意外推力,避免机器人误动作。依赖: 是电机驱动库的接口,直接控制电子调速器(ESC)输出最小PWM信号。2. 功能:根据当前工作模式控制电机输出,是电机执行层的核心调度函数。逻辑分支:电机检测模式(MOTOR_DETECT):直接返回,不输出推力(此时仅进行硬件检测)。电机测试模式(ap.motor_test为true):调用验证测试合法性(如是否超时)。
2025-07-13 14:06:01
417
原创 信号量核心机制说明及实际应用(结合ArduPilot代码)
信号量(Semaphore)是操作系统中用于解决多线程同步与互斥问题的核心机制,尤其在实时系统(如无人机飞控)中,是保证共享资源安全访问、避免数据竞争的关键工具。
2025-07-12 15:18:22
1009
原创 ArduPilot核心机制——定时器回调(Timer Callback)
在ArduPilot中,定时器回调(Timer Callback)是实现高精度、低延迟任务调度的核心机制,用于处理对实时性要求极高的操作(如传感器数据采集、控制算法更新)。本文对其工作原理、实现方式及应用场景作详细解释
2025-07-11 15:48:38
626
原创 在PID控制中添加低通滤波器的深度解析:从理论到工程实践
在无人机、机器人等控制系统中,PID(比例-积分-微分)控制器是实现精确控制的核心组件。然而,微分项对高频噪声极其敏感——即使是传感器(如IMU、DVL)的微小抖动,也会被微分项放大,导致控制输出剧烈波动,甚至引发系统振荡。以水下机器人的DVL(多普勒速度计)数据为例:当水体浑浊或存在水流扰动时,DVL输出的速度信号可能包含大量高频噪声。若直接将该信号接入PID的微分项,会导致推进器频繁启停,严重影响航行稳定性。此时,低通滤波器成为抑制噪声的关键技术。
2025-06-30 16:33:20
1279
原创 深入解析RTOS:从原理到实践的实时系统指南
当您在设计一款关乎安全、效率或用户体验的嵌入式设备时,RTOS的选择与优化将直接决定项目的成败。希望本文的深度解析能成为您的技术指南针,在实时系统的复杂领域中,找到那条最精准的路径。
2025-04-18 10:33:23
2313
原创 SPI、UART、IIC(I²C) 通信协议的详细介绍及对比分析
综合选择,必要时可结合上层协议(如UART+Modbus、IIC+扩展地址)优化功能。
2025-04-10 19:07:41
1697
原创 电流计、稳压模块、电调的作用及如何选型
在飞控系统或智能硬件中,电流计、稳压模块、电调(电子调速器)是电源与动力控制的核心组件,其作用和选型需结合系统需求(如电压、电流、功耗、精度)进行精准匹配。
2025-04-10 14:38:15
1277
原创 2025.04最新PyTorch 安装超详细教程(含多系统、多场景、避坑指南)
**PyTorch 安装超详细教程(含多系统、多场景、避坑指南)**,涵盖**CPU/GPU版本选择、环境配置、验证测试、问题解决**全流程,附命令行示例和图文说明:
2025-04-02 10:05:30
36994
1
原创 Anaconda Windows安装与使用的超详细指南(2025.04最新)——新手避坑细节、深度操作技巧、全流程演示
通过以上步骤,你不仅能完成安装,还能熟练管理复杂项目环境,避免 90% 的 Python 依赖问题。遇到卡住的问题,记得在 Anaconda Prompt 中输入 `conda --help` 或访问 [Conda 官方文档]
2025-04-01 15:07:27
2709
原创 从静态到动态:D * 算法如何革新机器人路径规划
D*(Dynamic A*)由Anthony Stentz于1994年提出,核心目标是高效处理动态环境中的路径更新,通过反向搜索和代价增量更新机制,显著减少重新规划的计算量。
2025-03-31 09:49:59
1235
原创 卡尔曼滤波:从原理到无人机定位应用实例
在众多滤波算法中,卡尔曼滤波占据着举足轻重的地位。它是最优线性滤波算法中的经典之作,犹如一颗璀璨的明珠,在工程、物理、机器人等诸多领域散发着耀眼光芒。在工程领域,卡尔曼滤波广泛应用于飞机、船舶的导航系统。通过融合陀螺仪、加速度计等多种传感器的数据,它能够实时、精准地计算出飞行器或船舶的位置、速度与姿态信息,为安全、高效的航行提供坚实保障。在物理学研究中,卡尔曼滤波助力科学家分析实验数据。例如在粒子物理实验里,探测器采集的数据充满噪声,利用卡尔曼滤波,能够精确推断粒子的运动轨迹,从而推动科学研究的深入发展。
2025-03-26 09:38:20
976
原创 离散时间LQR控制器设计
LQR通过最小化二次型性能指标,得到最优线性反馈控制器。其核心是求解黎卡提方程,得到反馈增益矩阵。当系统为无限时域且稳定时,
2025-03-24 15:29:31
803
原创 OSI 模型详解及详细知识总结
功能:负责处理物理介质上的信号传输,包括电缆、光纤、无线等。它定义了接口的电气、机械、功能和过程特性,确保比特流能够在物理介质上正确传输。示例:网线、光纤、网卡等硬件设备工作在这一层,它们将数字信号转换为适合在物理介质上传输的电信号、光信号或无线电信号。物理层:作为基础层,负责在物理介质(如电缆、光纤、无线信号)上传输原始的比特流。它规定了诸如电压、信号编码、线缆规格、接口类型等物理特性,保障比特流能在不同设备间可靠传输。数据链路层。
2025-03-24 14:23:55
1050
原创 TCP/IP 协议栈深度解析
数据链路层: 添加MAC首部与FCS。传输层: 添加TCP/UDP首部。:提供端到端的数据包路由与寻址。:提供进程间通信的端到端可靠性。:提供用户级网络服务接口。TCP/IP协议栈采用。网络层: 添加IP首部。物理层: 比特流传输。
2025-03-24 10:06:21
1592
原创 双环 PID 控制:从理论到实践的动态性能优化指南
响应速度与稳态精度的矛盾单环PID通过单一控制器平衡比例(P)、积分(I)、微分(D)参数。增大比例增益可加快响应,但易导致超调;增加积分项虽能消除稳态误差,但会降低系统响应速度。例如在电机调速系统中,单环PID难以同时满足快速启停和精准定位的需求。抗干扰能力不足单环控制对外部扰动(如负载突变、摩擦变化)的抑制能力有限。当扰动直接作用于被控对象时,PID控制器需通过误差反馈间接调整,可能导致动态过程振荡或恢复缓慢。非线性系统适应性差单环PID基于线性模型设计,对非线性特性(如死区、饱和)敏感。
2025-03-24 09:41:54
1874
原创 如何把全局坐标系转到机器人本体坐标系
轴的旋转时,该矩阵可通过数学上的旋转变换,将全局坐标系下的位置关系转换到机器人本体坐标系。将全局坐标系下的位置关系转换到机器人本体坐标系。因此,当机器人本体坐标系相对全局坐标系仅存在绕。轴方向在两个坐标系中一致(若有。轴在全局坐标系中的投影;轴在全局坐标系中的投影;轴旋转,需更复杂矩阵)。
2025-03-21 10:56:57
992
原创 25. K 个一组翻转链表(C++)
int val;这里定义了链表节点的结构ListNode,每个节点包含一个整数值val和一个指向下一个节点的指针next。构造函数用于初始化节点的值,并将next指针设为nullptr。
2025-03-18 20:39:08
724
1
原创 MPC算法路径跟踪_Matlab实现
函数名输入参数path:一个二维矩阵,每一行代表路径上一个点的坐标,通常为[x, y]形式。n:一个正整数,表示插值的次数。输出参数path_new:经过n次插值操作后的新路径,同样是一个二维矩阵,行数比原路径更多,路径更加平滑。
2025-03-18 09:52:35
769
原创 约束下的精准控制:MPC(模型预测控制)基本原理与数学推导及案例分析
年提出的一种基于数值优化的算法。模型预测控制的基本实现是根据对象的约束条件和控制目标,使用成本函数来评价系统的行为,当得到优化问题的最优解后,再将这个控制策略的第一个动作应用到对象上,然后重复这个步骤。模型预测控制在对系统进行优化时,能够将处理约束的过程与优化的过程结合在一起,可以减小扰动引起的不确定性。虽然实时性是模型预测控制的一个缺点,但是随着近年来计算机性能的提高、算法结构的改进、计算工具的优化,模型预测控制的实时性得到很大的改善,已被广泛地应用于无人机、无人车及无人船的路径规划中去。
2025-03-17 15:46:20
1238
原创 206. 反转链表(C++)
递归方法的核心思想是将链表分成两部分:当前节点和剩余部分,先递归地反转剩余部分,然后再将当前节点插入到反转后的剩余部分的末尾。迭代方法的核心思想是通过遍历链表,依次改变每个节点的指针方向,从而实现链表的反转。指针方向,为了避免丢失原链表中当前节点的下一个节点,需要用一个临时指针。给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。指针指向的就是反转后链表的头节点,将其返回。输入:head = [1,2,3,4,5]之后的链表,返回反转后链表的头节点。输出:[5,4,3,2,1]
2025-03-14 09:09:54
956
原创 链表的定义、节点结构、基本操作(C++)
在 C++ 中,我们通常使用结构体(struct)或类(class)来定义链表节点的结构。int val;// 存储节点的数据,这里假设为整数类型// 指向下一个节点的指针ListNode(int x) : val(x), next(nullptr) {} // 构造函数,用于初始化节点在这个定义中,val是节点存储的数据,next是指向下一个节点的指针。构造函数用于创建一个新节点,并将其数据初始化为xnext指针初始化为nullptr,表示该节点目前没有后续节点。
2025-03-13 16:15:01
642
原创 48. 旋转图像(C++)
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]
2025-03-12 20:38:31
831
原创 54. 螺旋矩阵(C++)
为了实现这个目标,我们采用了一种边界控制的方法,通过定义矩阵的四个边界(左、右、上、下),并按照顺时针方向依次遍历这些边界上的元素,同时不断收缩边界,直到遍历完整个矩阵。给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]
2025-03-11 20:39:20
971
原创 解析动态窗口法:机器人避障的智能 “导航仪”
动态窗口法,全称为 Dynamic Window Approach,是一种应用于机器人路径规划与运动控制的经典算法。它聚焦于机器人当下的速度、加速度等动态参数,在速度空间内构建一个随时间实时变化的 “窗口”。这个窗口涵盖了机器人在当前时刻,基于自身运动学与动力学约束,能够安全且合理达到的速度集合。在每一个控制周期里,算法都会对动态窗口内的众多速度组合进行评估,从中筛选出最优解,以此驱动机器人运动,使其既能朝着目标点稳步前进,又能巧妙避开途中的各类障碍物。
2025-03-11 09:42:08
1829
原创 240. 搜索二维矩阵 II(C++)
算法选择从矩阵的右上角开始搜索(当然,从左下角开始搜索也是可行的,原理类似)。,由于当前列的元素是从上到下升序排列的,所以当前列中所有位于当前元素下方的元素都必然大于。,因为当前行的元素是从左到右升序排列的,所以当前行中所有位于当前元素左侧的元素都必然小于。,即第一行的最后一列元素。减 1,向左移动一列,继续进行搜索。从起始位置开始,将当前位置的元素。,说明已经找到了目标值,直接返回。加 1,向下移动一行,继续搜索。每列的所有元素从上到下升序排列。每行的元素从左到右升序排列。每列的元素从上到下升序排列。
2025-03-10 09:39:23
859
原创 88. 合并两个有序数组(C++)
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。解释:需要合并 [1,2,3] 和 [2,5,6]。中,使合并后的数组同样按 非递减顺序 排列。解释:需要合并的数组是 [] 和 [1]。解释:需要合并 [1] 和 []。中的元素,将较大的元素依次放入。个元素表示应合并的元素,后。合并结果是 [1]。合并结果是 [1]。
2025-03-10 08:57:56
538
原创 A*算法路径规划_MATLAB实现
节点:在路径规划问题中,地图或空间被抽象为由一系列节点组成。每个节点代表一个特定的位置或状态,例如在二维地图中,每个节点可以是一个坐标点。开放列表(Open List):是一个存储待评估节点的列表。算法开始时,开放列表中通常只包含起点节点。随着算法的进行,新发现的未评估节点会被加入到开放列表中。开放列表中的节点是算法后续可能扩展和探索的候选节点。关闭列表(Closed List):用于存储已经评估过的节点。
2025-03-04 09:32:46
2139
原创 解决报错:未定义标识符 “M_PI“
包含了头文件,但是在使用M_PI时依旧报错说未定义。库中的 M_PI 是一个条件宏,需要。使用C++编译,已经用。
2025-01-16 20:03:28
1615
1
原创 无法打开源文件eigen3/Eigen/Dense----解决办法
首先,确保你已经从 Eigen 的官方网站(http://eigen.tuxfamily.org)下载了 Eigen 库。将下载的库解压到你喜欢的位置,例如。你可以在代码中添加一段简单的测试代码,以确认 Eigen 库是否正确配置。确保你的 C++ 代码中的包含语句与你添加的路径匹配。例如,如果 Eigen 库在。点击get it下边的压缩包下载。
2025-01-16 19:51:20
1624
原创 Ardusub源码剖析——GCS_Mavlink.h
代码#pragma once#include <GCS_MAVLink/GCS.h>class GCS_MAVLINK_Sub : public GCS_MAVLINK {public: using GCS_MAVLINK::GCS_MAVLINK;protected: uint32_t telem_delay() const override { return 0; }; MAV_RESULT handle_flight_
2024-12-02 20:08:52
392
原创 396.旋转函数(C++)
首先,我们需要明确什么是旋转函数。对于一个数组nums,其旋转函数F(k)定义为:其中表示取模运算,n是数组的长度。简单来说,F(k)是将数组从位置k开始旋转后,每个元素乘以其索引(从0开始)的总和。
2024-12-02 16:33:49
1034
原创 Ardusub源码剖析——control_althold.cpp
如果期望的偏航速率不为零(即飞行员正在请求改变朝向),则调用姿态控制器,使用飞行员指定的横滚、俯仰和偏航速率。类将收到的四元数转换为欧拉角(Euler angles),即横滚(roll)、俯仰(pitch)和偏航(yaw)角度。如果潜水器到达了底部,初始化Z轴控制器,并将目标深度设置为当前高度加上10厘米,以保持潜水器在底部上方10厘米的位置。分别获取飞行员指定的前进和侧向通道的标准化输入值,并使用这些值来设置电机的推力方向。如果期望的偏航速率为零(即飞行员没有请求改变朝向),则尝试保持当前的朝向。
2024-12-02 15:36:42
1166
SD卡格式化工具SDFormatter,将SD卡格式化为FAT32格式注意:格式化SD卡将删除其上的所有数据,请提前备份重要资料
2024-09-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人