ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

PX4Ctrl实战:从油门映射到姿态控制的无人机调试指南

PX4Ctrl实战:从油门映射到姿态控制的无人机调试指南 1. 先弄明白PX4Ctrl在哪一层工作它只发期望真正闭环在飞控里1.1 从一条完整指令链路看PX4Ctrl的位置很多第一次接触PX4Ctrl的同学上来就把它当成“飞控里的一个控制器”结果一调参数就懵为什么我改了PX4Ctrl的增益飞机一点反应都没有为什么我停了PX4Ctrl节点飞机还在自己飞行这里必须先纠正一个认知PX4Ctrl是一个运行在机载计算机通常是NUC、树莓派或Jetson上的ROS节点它不在PX4固件内部。PX4固件跑在独立的飞行控制器上比如Pixhawk系列两者之间通过MAVROS通信。PX4Ctrl这条链路的位置大致是上层决策节点任务规划/视觉引导/遥控器指令 ↓ 期望姿态 期望油门 PX4Ctrl节点翻译、映射、平滑、保护 ↓ mavros_msgs/AttitudeTarget MAVROS → MAVLink ↓ PX4飞控姿态内环、角速率内环、混控器 ↓ 电机 → 螺旋桨 → 实际运动所以我愿意把PX4Ctrl称为“塔台调度员”它不亲自开飞机只负责给飞行员PX4姿态控制器下达“保持这个角度、给这个油门”的指令真正执行闭环控制的是PX4内部跑的一套串级PID。PX4Ctrl要管的核心是两件事一个是多少油门合适一个是期望姿态怎么给才稳定。这个定位非常重要。调试姿态震荡、油门掉高这类问题时先分清楚问题出在“塔台的指令”还是“飞行员的操纵”上能省下好几个下午的瞎折腾。后面所有调试步骤都是围绕这个边界展开的。1.2 关注的核心话题与消息结构以我手头这个版本的PX4Ctrl为例它订阅和发布的话题如下表所列不同开源项目里话题名可能有差异但消息本质一致方向话题名消息类型用途订阅/mavros/statemavros_msgs/State获取飞控是否进入offboard模式、是否已解锁订阅/mavros/imu/datasensor_msgs/Imu获取当前姿态、角速度用于状态反馈与姿态平滑订阅/mavros/rc/outmavros_msgs/RCIn获取遥控器各通道校准后的值用于手动直通和辅助开关发布/mavros/setpoint_raw/attitudemavros_msgs/AttitudeTarget将期望姿态四元数期望推力发往飞控发布~attitude_cmdmavros_msgs/AttitudeTarget给上层看当前正在执行的期望姿态与油门发布~throttle_outputstd_msgs/Float32经过映射和限幅后的最终油门值调试必备发布~statusstd_msgs/Int32当前节点状态机状态方便地面端判断节点是否健康这里最容易出问题的是mavros_msgs/AttitudeTarget里的type_mask。我们要发的是“姿态角推力”不是“角速率推力”也不是“位置速度”。所以 mask 里一定要把 body_rate 相关的位忽略掉同时保留姿态和推力位。如果 mask 写错了PX4可能把你的四元数忽略掉转而去跟踪你根本没设置的角速率飞机会直接发疯。我在实机测试前一定会rostopic echo看一眼发出去的type_mask数值。另外PX4对offboard setpoint有超时保护机制默认如果超过约500ms没有收到新的期望指令飞控会退出offboard模式或者按参数设置执行紧急动作。这意味着PX4Ctrl的发布频率不能太低我一般固定跑50Hz既能满足PX4的实时性要求也不会把串口带宽占满。1.3 为什么“外部期望内部闭环”这种混合架构是主流可能有人会问既然姿态控制这么重要为什么不直接在PX4固件里改控制律非要在外面套一个PX4Ctrl原因很实际。PX4内部的串级PID经过多年迭代角速率环和姿态环的鲁棒性已经调得相当好位置控制、速度控制、磁干扰下的异常保护也都验证过。对绝大多数自研无人机项目真正缺的不是姿态控制器而是“怎么根据视觉、雷达或任务逻辑生成合理的期望”。把PX4Ctrl放在外部意味着上层算法可以快速用Python或C迭代不用每次改动都重新编译刷写固件而且万一上层节点崩溃或出现异常指令飞控还能通过遥控器一键切回手动接管安全性高很多。这也是我个人的实机原则PX4Ctrl只做策略和指令的生成不做底层飞行控制的重造。把底层的东西交给飞控把上层的灵活性留给自己这条边界本身就是一种降低风险的设计。2. 油门映射从摇杆到推力的完整换算悬停标定、分段映射与限幅修正2.1 先标定悬停油门这是整张映射表的地基油门映射听起来像是“摇杆打多少油门给多少”实际操作里远比这讲究。因为PX4内部期望推力是一个0到1的归一化值而遥控器摇杆通常被归一化成-1到1。如果直接把两边做线性映射会出现一个很基础也很致命的问题不同飞机的悬停油门不一样你按同一个斜率映射有的飞机在悬停点附近太灵敏有的飞机根本推不起来。我调试的第一件事永远是标定悬停油门。具体操作选择开阔场地最好把无人机系留或者至少装上桨叶保护切自稳模式起飞缓慢推到大约0.5米到1米高度保持悬停5秒以上。然后用下面的命令抓取当前实际油门值rostopic echo /px4ctrl/throttle_output | tee hover.log如果没有直接输出油门也可以看MAVROS里的setpointrostopic echo /mavros/setpoint_raw/attitude/thrust记录大约200个点用Python或awk简单取个平均。我惯用的快速命令是rostopic echo /px4ctrl/throttle_output | grep data: | awk -F: {sum$2; n} END {print sum/n}这个平均值就是hover_thrust。经验参照一架起飞重量1.2kg左右、轴距450mm的四旋翼悬停油门通常在0.45到0.6之间如果挂载了云台、视觉模块可能到0.65以上。低于0.4说明动力冗余很足高于0.7说明飞机已经很吃力要么减重要么换桨。我见过不少人跳过这个步骤直接在launch里把hover_thrust写死成0.5结果有的飞机悬停时油门输出始终偏高导致飞机“点头”甚至小幅爬升震荡。悬停油门不是理论值是实测值是一切油门映射的地基这一步绝对不能省。2.2 分段线性映射为什么比单一直线好用拿到悬停油门之后接下来要做的是把遥控器摇杆的[-1,1]区间映射到实际的期望推力区间。很多人第一反应是整体线性映射thrust 0.5 0.5 * rc_throttle # 摇杆-1对应01对应1这种映射最大的问题是悬停点一定在油门中位吗不一定。假设悬停油门实测是0.6而你摇杆在中位rc_throttle0时输出的期望推力是0.5飞机自然会往下掉。为了让飞机在摇杆中位悬停必须让映射曲线在“悬停油门”这个点上穿过零刻度。所以我强烈建议使用以悬停油门为原点的分段线性映射。上段和下段的斜率可以不同甚至故意不对称。公式如下rc_throttle ≥ 0: thrust hover (max_thrust - hover) * rc_throttle rc_throttle 0: thrust hover (hover - min_thrust) * rc_throttle举例hover0.55min_thrust0.12max_thrust0.85。那么摇杆上推10%rc_throttle0.1时thrust 0.55 0.30 * 0.1 0.58下拉10%rc_throttle-0.1时thrust 0.55 - 0.43 * 0.1 0.507。注意上段增益只有0.30下段增益却有0.43也就是说下拉方向每一步的油门变化更大。这是我故意设计的四旋翼在悬停附近往下减油门时如果步长太小飞机响应慢容易出现“掉高度—补油—过冲—再掉”的纵向晃动而下拉段给的步长大一点操作者能更快找回下沉趋势。代码实现也不复杂以C伪代码为例float map_throttle(float rc_throttle, float hover, float lo, float hi) { float deadzone 0.05f; if (fabsf(rc_throttle) deadzone) return hover; if (rc_throttle 0.0f) { return hover (hi - hover) * rc_throttle; } else { return hover (hover - lo) * rc_throttle; } }这里要注意浮点数精度问题hover (hi - hover) * rc_throttle在 rc_throttle 很小时结果会略偏。所以我在工程里还会加一个判断当fabsf(rc_throttle) 1e-4时直接返回hover避免悬停点附近出现肉眼难查但实际存在的零点漂移。2.3 死区、限幅和指数修正都是为了“不吓人”接着处理三个细节死区、限幅、手感曲线。死区是给摇杆中位保护用的。RC接收机输出即使经过校准中位附近也会有±0.02甚至更大的抖动。不加死区的话飞机悬停时会频繁收到微小的油门增减指令电机转速会持续轻微波动电池发热快、手感也不干净。死区建议设在0.03到0.05之间太小没效果太大会感觉油门“空了一截”。我一般从0.04起步手感和数据都能接受。限幅则是安全问题。期望推力不要输出到0.0或1.0这两个极端。油门为0时即使期望姿态正常四个电机也可能在低转速区域出现响应非线性姿态控制会受限油门接近1.0时电机进入高转速区机身结构振动和电流骤增都会放大非常危险。mtpilot我通常设throttle_min 0.12 throttle_max 0.85这两个值就是飞行时的“安全包线”宁可略微牺牲极端机动能力也要保证任何指令都不会逼着电机进入失控边界。多次实机下来我深知一个乱跳的油门值比一个保守的限幅更可怕。关于指数曲线修正也就是手感调校我的建议是先在PX4Ctrl这一层保持线性把手感调整放在遥控器端的EXP或PX4的RC feel参数上。原因在于PX4Ctrl的油门输出不只是给手动模式用offboard模式下位置控制器和任务逻辑也会依赖它如果强行加非线性曲线上层算法的输出和实际期望还会再折一轮排查问题时会多一层未知数。线性映射在调试阶段最直观等所有参数都稳定了再考虑要不要加人性化曲线。2.4 电池电压和载重变化时的映射漂移这里说一个很容易被忽略的问题同样的油门值满电和快没电的时候推力完全不一样。3S锂电从12.6V放到11.1V电压降了约12%电机在同一油门指令下的转速会明显下降导致飞机“越飞越沉”。在5分钟内的调试实验中这个影响还不够大但如果要做长航时测试就会眼睁睁看着悬停油门一点一点往上漂。我采用过一种相对简单的补偿思路在PX4Ctrl里订阅电池电压以满电电压为参考点做线性补偿。参考公式thrust_compensated thrust * (v_ref / v_batt)v_ref取标称满电电压4S电池就是16.8V。补偿系数要限制在±10%以内防止电压跳变时油门跟着突变。这个功能我在大多数项目里默认关闭只有续航测试才会打开。如果只是普通调试开补偿反而容易引入噪声。载重变化就更直接了加了载荷、换了更重的电池悬停油门变了整套映射就得重新标定。所以我把悬停油门设计成运行时参数由遥控器辅助开关动态切换这样同一架飞机在不同构型之间切换不需要重启节点。这个技巧放到文末专门说。3. 姿态控制调试的关键解耦内外环调参顺序、切换接管与油门耦合补偿3.1 内外环怎么分工如何根据现象判断是谁的问题PX4的姿态控制通常是串级PID结构外环是角度环把期望姿态角换算成期望角速率内环是角速率环把期望角速率换算成机体坐标系下的力矩力矩经过混控器分配到四个电机。PX4Ctrl只发送期望姿态角PX4的外环内环自己去闭环。所以当你看到offboard模式下飞机姿态震荡时第一步不是改PX4Ctrl里的任何增益而是先做一个“跟踪 vs 期望”的对比震荡是因为PX4Ctrl发下来的期望姿态本身在抖还是因为PX4的PID参数没调好、跟踪跟不上判断方法很简单录制/px4ctrl/attitude_cmd和/mavros/imu/data做对比。如果attitude_cmd里期望姿态非常平稳但实际姿态在抖问题在PX4固件的姿态控制器如果期望姿态本身就在来回跳问题在PX4Ctrl或它的上游节点。这个先分清责任范围后续调参才不会南辕北辙。我见过不少初学者一遇到震荡就去刷网上找的PID参数改完更糟。正确做法是先看期望值是不是平滑的再看实际值能不能跟上。数据永远比感觉可靠。3.2 手动直通与offboard接管的切换逻辑PX4Ctrl的调试还有一个容易被忽视的地方手动模式和offboard模式之间的切换逻辑。手动模式下PX4Ctrl可以做一个“直通”功能把遥控器摇杆的期望姿态直接映射后通过setpoint发出去或者干脆不接管让飞控自己处理RC输入。调试时我强烈建议先跑直通模式这样能够验证PX4飞控自身的姿态响应是否正常。手动模式下飞机姿态不稳先不要怪PX4Ctrl这是PX4固件层面该解决的问题。offboard接管时最危险的是切换瞬间的期望跳变。假设你在地面站着飞机在悬停当前欧拉角是roll2°、pitch1°但PX4Ctrl刚启动时默认期望姿态是全是0。如果offboard一接管期望直接变成0飞控会瞬间用力把飞机掰正产生一个猛烈晃动严重时直接翻机。解决这个问题的手段叫“期望预同步”PX4Ctrl在收到offboard使能信号之前一直以飞控当前姿态作为期望发布等offboard真正使能后再逐渐过渡到上层下发的目标。用ROS术语说就是切换瞬间在两个姿态之间加一个slerp球面线性插值过渡或者做slew rate限幅。这是我对所有使用PX4Ctrl做二次开发的人的第一条告诫切换瞬间的平滑比任何姿态增益都重要。另外PX4进入offboard模式本身有条件必须持续以不低于2Hz的频率收到setpoint并且满足一定时间后才能用辅助开关或地面站切到offboard。PX4Ctrl节点一般启动后就要立刻开始发setpoint哪怕只在当前姿态悬停也要保证飞控随时满足进入offboard的条件。3.3 调参顺序先内环、后外环、最后油门映射姿态调参最忌讳的是全参数一起改。我的固定顺序是先保证手动模式下的姿态响应没问题再调PX4Ctrl的平滑与限幅最后才碰油门映射。具体操作可以这样拆手动模式悬停给遥控器一个小幅的俯仰阶跃行程约30%观察飞机是否干脆地响应、是否振荡。如果振荡说明PX4角速率环或姿态环参数有问题回QGroundControl里调百灵鸟的roll/pitch rate loop这个阶段跟PX4Ctrl没关系。手动模式稳定后把PX4Ctrl切到offboard在节点里做一个固定角度阶跃测试比如期望roll5°通过plotjuggler观察实际角度跟随过程。如果实际响应出现超调且期望本身很稳定去调PX4的姿态环或角速率环如果期望本身的斜率和噪声有问题去调PX4Ctrl里的姿态平滑系数。姿态稳定后再回到油门映射验证不同油门下的高度保持能力。这个顺序的逻辑是姿态控制是油门控制的影响因素飞机倾斜时升力会损失如果姿态控制本身就是乱的油门映射再准也反映不出来。用牛顿第二定律的话说姿态决定了力的方向油门决定了力的大小先把方向控制好了再管大小才能解耦调试。3.4 油门与姿态的耦合补偿为什么悬停时一倾斜就掉高还有一个经常被认为“PX4Ctrl油门映射没调好”的问题其实是姿态与油门耦合导致的掉高。当飞机倾斜一个角度θ时电机总推力F在垂直方向的有效分量是F * cos θ。cos30°大约是0.866也就是说如果飞机以30°倾角飞行哪怕油门和之前完全一样垂直方向的升力也掉了13.4%。这个量级非常可观机头一低高度肉眼可见往下掉。所以要保证高度不掉必须在倾斜时增加总推力补偿量约等于1/cosθ。在小角度下可以用泰勒展开做近似1/cosθ ≈ 1 θ²/2 θ为弧度θ²/2在小角度下误差很小也就是说倾斜10°左右约0.175 rad时补偿量大约增加1.5%倾斜30°时增加15%。我把这个补偿逻辑写在PX4Ctrl里根据期望姿态四元数实时计算一个倾角补偿系数乘到期望推力上同时做饱和限幅防止大倾角下油门直接顶到1.0。这个补偿在悬停和低速平移时非常有用。很多飞控固件内部其实已经做了类似补偿但如果你用PX4Ctrl直接发AttitudeTargetPX4只把它当成一个纯推力指令不会主动帮你在倾斜时加升力必须在上层自己处理。这也是我认为PX4Ctrl里最值得提供的功能之一。4. ROS节点配置的完整清单launch、参数陷阱与话题重映射4.1 一个可以直接跑的最小launch配置PX4Ctrl不是一个孤立的节点它要配合MAVROS一起工作。下面是一个我常用的最小launch文件同时启动MAVROS和PX4Ctrl仿真环境Gazebo SITL可以直接跑?xml version1.0? launch arg namesim defaulttrue / arg namefcu_url defaultudp://:14550127.0.0.1:14557 / group if$(arg sim) node namemavros pkgmavros typemavros_node outputscreen param namefcu_url value$(arg fcu_url) / param namegcs_url value / param nametarget_system_id value1 / param nametarget_component_id value1 / param nameframe_id valuebase_link / /node /group node namepx4ctrl pkgpx4ctrl typepx4ctrl_node outputscreen param namectrl_freq value50 / param namehover_thrust value0.55 / param namethrottle_min value0.12 / param namethrottle_max value0.85 / param namethrottle_deadzone value0.04 / param nameattitude_smooth_enable valuetrue / param nameattitude_smooth_gain value0.2 / param namevoltage_compensation_enable valuefalse / remap fromattitude_cmd to/px4ctrl/attitude_cmd / remap fromthrottle_output to/px4ctrl/throttle_output / /node /launch这里的仿真fcu_url选的是一台Gazebo SITL的默认端口实机时改成串口设备即可比如param namefcu_url value/dev/ttyUSB0:921600 /实机串口波特率要和飞控端一致PX4默认通常是921600或57600具体以固件参数为准。4.2 参数服务器里的坑类型、命名空间与单位launch文件写起来简单但里面藏着不少会让节点行为诡异的细节我逐一说明。第一是参数类型问题。ROS的param在launch里如果直接写0.55XML解析后会被当成字符串还是浮点数取决于节点用rosparam怎么读。很多老手都有过这种经历节点读回一个string转数字出错节点要么崩溃要么默认值被覆盖。我的做法是在C节点里统一用ros::param::param(hover_thrust, ...)读取并且对读到的值做范围校验不在[0,1]区间就打印警告并回退默认值。这比在launch里纠结写法更可靠。第二是命名空间问题。node namepx4ctrl ...节点如果没有显式指定ns默认命名空间就是节点名/px4ctrl。所以用remap fromattitude_cmd to/px4ctrl/attitude_cmd是绝对路径重映射稳妥如果写remap from~attitude_cmd to...~会解析成节点命名空间下的私有话题。两种写法都常见但混用很容易出现“话题看起来存在但节点收不到”的诡异问题。我的建议是对外发布的调试话题全部用绝对路径私有参数用~前缀两套体系分清楚。第三是单位问题。PX4的AttitudeTarget.thrust范围是0到1的归一化推力不是百分比也不是PWM值。有些新手把遥控器1000到2000的PWM直接填进去出来的油门巨大无比非常危险。所有上层参数设计都按0到1走出问题之前先在rostopic echo里确认数值范围。第四是ctrl_freq。这个参数控制PX4Ctrl主循环频率。我默认用50Hz这个频率跟PX4的offboard超时保护默认500ms相比有10倍余量足够保证setpoint不丢失而且50Hz对姿态控制来说已经足够平滑再往上提对MavLink串口带宽压力变大在数传模块上尤其明显。除非你做了特别需要高频响应的上层算法否则不建议超过100Hz。4.3 仿真和实机配置切换的整理方法我习惯用arg加上group做仿真和实机的配置切换而不是维护两套launch文件。原因很简单一套launch里通过布尔参数切换比维护两份逐渐漂移的配置要安全得多。实机时还需要额外处理几个细节串口权限把当前用户加入dialout组、飞控参数检查是否开启了DMA或硬件流控、GPS或光流的坐标系对齐。这些虽然与PX4Ctrl节点本身无关但任何一项出错都会表现为“PX4Ctrl发了期望但飞控不响应”或“位置反馈跳变”。所以我在实机配置里会专门在PX4Ctrl启动前加一个环境检查脚本确认串口存在、权限正确、MAVROS能ping通飞控。仿真的优势在于可以随便折腾我强烈建议新手先在Gazebo SITL里把PX4Ctrl跑通验证话题名、参数类型、切换逻辑都没问题之后再上实机。仿真里出现姿态震荡和掉高通常说明算法逻辑有问题实机里出现同样现象还要叠加振动、电压、磁场干扰这些物理因素。一次只引入一个变量排查难度才会降下来。4.4 验证节点是否正常工作的快捷方法配置写完不要急着起飞先用一组快速检查命令确认链路完整。我每次实机前必跑以下几条# 检查节点是否正常发布 rostopic hz /px4ctrl/attitude_cmd # 检查MAVROS是否收到飞控状态 rostopic echo /mavros/state # 检查期望推力的数值范围是否在安全区间 rostopic echo /px4ctrl/throttle_output # 检查setpoint是否真的发到飞控 rostopic hz /mavros/setpoint_raw/attitude正常状态下attitude_cmd和setpoint_raw/attitude都应该有50Hz左右的频率。如果setpoint_raw频率忽高忽低先怀疑系统调度和串口通信如果一直为零检查MAVROS是否连接成功以及飞控是否处于offboard可接收状态。等这些检查全部通过再解锁起飞不要在这个环节节省时间。5. 实机排障复盘掉高、震荡、电机啸叫的定位链路5.1 案例一缓慢掉高根源在RC通道中位偏移有一架四旋翼在offboard切换后出现缓慢掉高高度下降速率大约0.2m/s不是特别快但一直不停。当时我第一反应是悬停油门标定错了于是重新标定发现数值和之前差不多。又怀疑电池电压换了块满电电池问题依旧。后来把rosbag录下来才发现问题出在RC通道的中位偏移上。遥控器油门通道校准之后理论上中位对应的归一化值应该是0.5但实际/mavros/rc/out的第三通道中位数是0.55。PX4Ctrl从rc/out读到的“中位”已经是偏移的经过分段线性映射飞行中即使遥控器油门在中立位置期望推力也低了。飞机为了维持原高度只能慢慢掉。这个问题如果只看PX4Ctrl的油门输出还真不容易发现因为期望推力比悬停点低了一点点但差值不足以触发明显的告警。用plotjuggler把/px4ctrl/throttle_output和/mavros/rc/out叠在一起看立刻发现中位偏移。解决办法很简单重新做遥控器中立点校准并把PX4Ctrl里的rc_trim_offset参数加上对应的修正值。这也解释了为什么我一直强调要先录数据再改参数——不抓rc/out光盯着油门映射怎么改都改不到点子上。5.2 案例二offboard切换后出现1Hz左右的震荡另一个项目里offboard模式一切换roll角就出现大约1Hz的往复晃动幅度越来越大吓得我赶紧切回手动。当时第一反应是PX4的姿态环参数有问题但在手动模式下做同样幅度的阶跃响应飞机非常干脆没有振荡。于是聚焦在PX4Ctrl下发的期望上。回放rosbag把/px4ctrl/attitude_cmd的roll角和/mavros/imu/data的实际roll角放在同一张图里发现attitude_cmd本身就在来回跳。再往上追一层发现位置控制模块输出的期望姿态里叠加了周期性噪声频率大约1Hz来源是某个传感器数据融合的轻微振荡。这次的问题不在PX4Ctrl的PID也不在飞控而在上游指令噪声。处理方式是在PX4Ctrl里加了一阶低通滤波并把期望角速率做了限幅例如限制最大姿态角速率不超过30°/s这样上游的噪声被明显压制震荡消失。后来我把位置控制模块里那个传感器的噪声源也修了问题彻底解决。这个案例的教训是不要看到震荡就调PID。先把指令链路的每一环都录下来看期望值本身平不平滑再做决定。调参是最后一步不是第一步。5.3 案例三接近全油门时的电机啸叫第三次比较特别的故障飞机只要油门逼近0.9就发出一种高频率啸叫伴随机身剧烈振动。一开始怀疑是油门映射输出超过了某个安全值把电机驱动进了非线性区于是把throttle_max从0.95降到0.85啸叫明显减轻但偶尔还会出现。后来仔细检查发现噪声源其实在机械结构其中一个螺旋桨有轻微的制造偏差高转速下动平衡变差和机臂形成了共振。换了一套动平衡更好的桨叶后无论油门推到多少都不再有啸叫。这个案例我特别提出来是想提醒大家PX4Ctrl里的油门限幅是一个保护手段但它保护不了机械结构的问题。如果限幅已经设得很保守故障依然存在不要继续在参数里找原因去检查桨叶、电机、机臂螺丝这些物理环节。软件限幅解决不了硬件共振。5.4 用rosbag和plotjuggler固化排查过程排查上述问题的过程中rosbag和plotjuggler是我最依赖的两样东西。录包的命令我一般这样写rosbag record -O px4ctrl_debug.bag \ /mavros/state \ /mavros/imu/data \ /mavros/rc/out \ /px4ctrl/attitude_cmd \ /px4ctrl/throttle_output然后用plotjuggler打开bag重点观察下面几组对比对比项关注重点attitude_cmd vs imu姿态期望是否平滑、实际是否超调throttle_output vs rc/out映射是否线性、中位是否偏移mavros/state.offboardoffboard使能时间点与指令突变是否对齐throttle_output vs 电机转速/电压电压跌落、高油门区是否异常排查的基本原则是“先录数据再改参数”。哪怕问题一眼就能想到答案也要先记录一份状态改完参数后再录一份通过对比确认改动是否有效。很多看似玄学的故障最后都是靠数据对比找到的而不是靠经验猜出来的。我在实机调试时还有一个习惯每轮只改一个参数改完必须重新录包对比。一次改三个参数出了问题根本不知道是哪个引起的。这个习惯听起来很笨却是避免反复横跳最有效的方法。最后再分享一个动态切换映射曲线的小技巧把悬停油门和油门映射限幅绑定到遥控器的一个辅助开关上。我通常在PX4Ctrl里监听一个RC辅助通道比如通道7根据开关位置加载不同的hover_thrust和throttle_min/max。同一架飞机换电池、换载荷后不用改代码、不用重启节点拨一下开关就能在两套映射之间切换。配合dynamic_reconfigure甚至可以在线调整参数写完一个映射数值立刻试飞不需要重新roslaunch。我用这个方法在同一架飞机上准备了“空机”“带云台”“全载荷”三套悬停参数实际使用下来非常方便。调试时如果觉得某个映射手感不对直接拨开关回到上一套参数再逐步微调。比每次停机改launch再重启要高效得多。当然这一切的前提是把节点跑稳定、把所有逻辑先在仿真里验证过。实机测试务必系留、装桨叶保护数据链路确认无误后再放手飞。算起来无人机调试的多数“灵异事件”最后都能落回数据和参数映射的细节上。把PX4Ctrl的油门映射和姿态控制这两条线彻底理清楚很多看似复杂的问题会变得很简单。希望这篇教程能帮你少走一些弯路。
返回列表