资讯动态

ArduPilot无人车船避障实战:MR72雷达与TFmini Plus激光雷达配置指南

发布时间:2026/10/6 11:33:34 来源:尧图企业网站定制
1. 为什么给无人车/船做避障ArduPilot 是绕不开的选择搞无人车或者无人船的人迟早会碰到一个坎车能跑、船能走但一遇到障碍物就傻眼。不管是室内走廊里突然出现的纸箱还是湖面上漂着的浮标没有避障能力的无人平台本质上就是个遥控玩具。我最早做第一台差速小车的时候用的是最原始的超声波加继电器方案遇到障碍就急停结果在院子里测试时因为地面反射导致误触发车直接趴窝了半小时。后来转向 ArduPilot 生态才发现这套飞控固件在避障上的积累远比想象中深厚。ArduPilot 本身是从多旋翼飞控起家的但它的 Rover 和 Boat 固件经过多年迭代已经支持完整的避障链路。核心逻辑是通过测距传感器雷达、激光、超声波获取前方障碍距离飞控根据预设的避障参数决定减速、转向还是停止。这套机制在代码层面叫Proximity Avoidance配合BendyRuler或Simple Avoidance算法能实现从简单停障到动态绕障的完整功能。为什么选 ArduPilot 而不是自己写避障逻辑我踩过的坑告诉我自己写状态机在简单场景下没问题但一旦涉及多传感器融合、速度前馈、转向优先级仲裁代码复杂度会指数级上升。ArduPilot 把这些都封装成了参数你只需要调参就能适配不同平台。更重要的是它的避障逻辑和导航控制是深度耦合的——避障不是简单地在导航外面套一层 if-else而是直接介入速度控制和航向决策这样在高速运动时响应更平滑。这篇文章面向的是已经有一台能跑的无人车或无人船、想加上避障功能的朋友。如果你还没搞定基础导航建议先把 GPS 定点或光流定点跑通再来折腾避障。我会重点讲 MR72 毫米波雷达和 TFmini Plus 激光雷达的配置这两个传感器在中小型无人平台上性价比很高一个擅长中远距离、一个擅长近距离高精度搭配起来能覆盖大部分场景。2. 避障系统的整体设计与传感器选型思路2.1 避障链路的核心架构ArduPilot 的避障链路可以拆成三层感知层、决策层、执行层。感知层负责把传感器的原始数据转成飞控能理解的距离和方向信息决策层根据避障算法判断是否需要干预执行层则修改速度、航向或直接刹车。感知层的传感器接入方式有两种一种是走MAVLink 协议比如某些雷达自带 MAVLink 输出直接发 DISTANCE_SENSOR 消息另一种是走串口或 I2C 原始数据由飞控驱动解析。MR72 和 TFmini Plus 都属于后者需要飞控固件里对应的驱动支持。决策层的算法选择很关键。ArduPilot 目前支持三种避障模式Stop检测到障碍就停最简单但体验最差适合低速室内车。Simple Avoidance根据障碍方向选择左转或右转不重新规划路径适合开阔场景。BendyRuler在局部范围内重新规划一条绕过障碍的路径计算量大但绕障更自然。我实测下来室内小车用 Simple Avoidance 就够了室外无人船建议上 BendyRuler因为水面障碍物分布更随机简单转向容易卡在死角。2.2 为什么选 MR72 加 TFmini Plus 的组合MR72 是纳雷科技的一款 77GHz 毫米波雷达探测距离最远能到 40 米水平视场角 120 度输出的是目标距离和角度。它的优势是穿透雾霾、灰尘能力强不受光照影响适合室外无人车和无人船。缺点是近距离盲区较大最近探测距离大概在 1 米左右而且对角度的分辨率一般。TFmini Plus 是北醒的激光雷达探测范围 0.1 到 12 米精度能到厘米级体积小、功耗低。它的短板是受光照和天气影响大雨天或强光下性能下降明显。这两个传感器刚好互补TFmini Plus 补盲区MR72 管中远距离。我在一台 1.2 米长的无人船上同时装了这两个TFmini Plus 朝正前方MR72 稍微朝下倾斜 10 度避免水面反射干扰。实测在湖面上对浮标的检测距离能稳定在 8 到 15 米足够以 2m/s 的速度做绕障。2.3 飞控硬件的最低要求避障对飞控的算力有要求尤其是跑 BendyRuler 的时候。我建议至少用Pixhawk 4或CUAV V5这个级别的飞控STM32F7 或 H7 的主控。F4 的飞控跑 Simple Avoidance 还行BendyRuler 会有点吃力表现为绕障路径更新频率低高速时容易撞。串口数量也要提前规划。MR72 走一路串口TFmini Plus 走另一路串口GPS 再占一路数传占一路。Pixhawk 4 有 5 个串口刚好够用。如果你还要接光流或 RTK就得考虑用串口扩展板或者换带更多串口的飞控。注意MR72 的串口波特率默认是 115200TFmini Plus 默认也是 115200但 TFmini Plus 的协议是自定义的不是标准 MAVLink需要在飞控参数里指定正确的协议类型。3. 核心参数解析与传感器配置实操3.1 MR72 雷达的接线与飞控参数设置MR72 的接线不复杂但有几个坑我踩过。雷达端是 5 针接口VCC、GND、TX、RX、GND。注意它有两个 GND别只接一个否则数据会飘。VCC 接 5V电流要求 500mA 以上直接从飞控的 5V 输出取电可能会不够建议单独走一个 5V BEC。接线到飞控的串口比如接在SERIAL4上MR72 TX → 飞控 RX4MR72 RX → 飞控 TX4MR72 VCC → 5V BECMR72 GND → 飞控 GND 和 BEC GND 共地参数设置SERIAL4_PROTOCOL 11 # 11 是 MAVLink 2但 MR72 需要自定义驱动 SERIAL4_BAUD 115200 PRX1_TYPE 5 # 5 代表 MR72 驱动 PRX1_ORIENT 0 # 0 表示朝前根据实际安装调整 PRX1_YAW_CORR 0 # 如果雷达装偏了用这个修正这里有个关键点PRX1_TYPE 的值取决于你的固件版本。我用的 ArduPilot 4.3 里MR72 对应的值是 5但早期版本可能是 4 或者需要自己编译。如果你在参数列表里找不到 MR72 选项说明固件没编进去需要重新编译固件并在AP_Proximity里启用AP_PROXIMITY_NRA24或对应的驱动宏。MR72 的数据更新率是 20Hz飞控的避障循环是 10Hz所以数据是够用的。但如果你发现避障反应迟钝可以检查PRX1_FILT参数默认是 0.5调低到 0.3 会让响应更快但数据抖动会变大。3.2 TFmini Plus 的配置与协议解析TFmini Plus 有两种输出模式串口模式和 I2C 模式。我建议用串口模式因为 I2C 模式下多个设备地址冲突很麻烦。接线也是四根VCC、GND、TX、RX。注意 TFmini Plus 的 TX 要接飞控的 RXRX 接飞控的 TX别接反了。参数设置SERIAL5_PROTOCOL 9 # 9 是 TFmini Plus 的协议 SERIAL5_BAUD 115200 PRX2_TYPE 4 # 4 代表 TFmini Plus PRX2_ORIENT 0 PRX2_YAW_CORR 0TFmini Plus 的驱动在 ArduPilot 里叫AP_Proximity_TFmini它会把距离数据转成飞控的 proximity 消息。这里有个细节TFmini Plus 输出的是单点距离没有角度信息所以飞控会把它当作一个方向上的距离传感器。如果你装了多个 TFmini Plus可以用PRX2_ORIENT分别设置朝向飞控会自动融合成 360 度的距离图。我实测 TFmini Plus 在室内对黑色物体的检测距离会缩短因为黑色吸光。如果你的应用场景里有黑色障碍物建议把PRX2_MIN参数调低或者换用反射率更高的传感器。3.3 避障核心参数的计算与整定避障参数不是拍脑袋填的要根据你的平台尺寸和速度来算。核心参数是AVOID_MARGIN和AVOID_BEHAVE。AVOID_MARGIN是避障时保留的安全距离单位米。计算公式是AVOID_MARGIN 平台最大尺寸 / 2 刹车距离 安全余量刹车距离 速度² / (2 × 减速度)。假设你的无人船最大速度 2m/s减速度 1m/s²刹车距离就是 2 米。平台半长 0.6 米安全余量 0.5 米那AVOID_MARGIN至少设 3.1 米。我一般会再留 20% 余量设成 3.7 米。AVOID_BEHAVE决定避障行为0 停1 简单绕2 BendyRuler室内小车用 1室外无人船用 2。如果用了 BendyRuler还要设OA_TYPE为 1并调OA_LOOKAHEAD参数这个参数决定往前看多远开始规划绕障路径一般设成AVOID_MARGIN的 2 到 3 倍。还有一个容易被忽略的参数是PRX1_FILT和PRX2_FILT这是传感器数据的低通滤波系数。默认 0.5 比较平衡如果传感器噪声大就调高到 0.7如果要求响应快就调到 0.3。我一般会在试跑时先用 0.5看数据曲线再微调。提示调避障参数时一定要在开阔场地低速试跑别一上来就全速。我见过有人直接把AVOID_MARGIN设成 1 米然后全速跑结果刹车不及撞墙雷达都撞歪了。4. 完整避障实现流程与现场调试记录4.1 硬件安装与角度校准安装位置直接影响避障效果。MR72 我建议装在平台正前方最高处稍微向下倾斜 5 到 10 度这样能减少地面或水面反射的干扰。TFmini Plus 装在 MR72 下方朝正前方水平负责补盲区。安装完必须做角度校准。方法很简单把平台放在空旷场地正前方 3 米处放一个目标物然后看飞控地面站里的 proximity 数据显示。如果目标物在正前方但数据显示偏左或偏右就调PRX1_YAW_CORR参数。这个参数单位是度正值表示顺时针修正。我一般会用 Mission Planner 的 proximity 视图来校准它会把传感器数据画成一个扇形图很直观。校准的时候要注意MR72 的角度分辨率是 1 度左右所以修正精度到 1 度就够了不用太纠结。4.2 飞控固件编译与驱动启用如果你用的官方固件里没有 MR72 驱动就需要自己编译。编译环境我推荐用 Ubuntu 20.04 或 22.04ArduPilot 的编译脚本对这两个版本支持最好。步骤大致是git clone https://github.com/ArduPilot/ardupilot.git cd ardupilot git submodule update --init --recursive ./waf configure --board Pixhawk4 ./waf rover编译前要确认AP_Proximity里启用了 MR72 驱动。在libraries/AP_Proximity/AP_Proximity.cpp里找到#define AP_PROXIMITY_NRA24_ENABLED确保它是 1。如果用的是其他型号的雷达对应的宏也要打开。编译完成后用./waf --upload烧录。烧录后连地面站在参数列表里搜PRX1_TYPE如果能看到 MR72 选项说明驱动启用成功。这里有个坑不同版本的 ArduPilot 里 MR72 驱动的宏名字可能不一样。4.2 版本里叫AP_PROXIMITY_NRA244.3 里改成了AP_PROXIMITY_MR72。如果你编译时报错说找不到宏先去AP_Proximity目录下看看实际的文件名。4.3 避障模式切换与试跑验证参数配好后避障不会自动生效需要切换到对应的飞行模式。Rover 固件里避障在Auto、Guided、RTL模式下都会生效但在Manual模式下不生效。所以试跑时要用 Guided 模式通过地面站点一个目标点看平台会不会自动绕开障碍。试跑流程我一般分三步静态测试平台不动人在前面走动看地面站 proximity 数据是否跟着变。这一步验证传感器工作正常。低速动态测试用 Guided 模式让平台以 0.5m/s 速度朝障碍物走看它在AVOID_MARGIN距离外是否开始转向或停止。全速测试逐步提速到最大速度观察绕障路径是否平滑有没有震荡。我实测 MR72 在室外对行人检测距离能到 20 米以上对树木大概 15 米对金属物体更远。TFmini Plus 对白色墙壁能到 10 米对黑色物体只有 3 到 4 米。所以如果你的场景里有黑色障碍物建议把 TFmini Plus 的PRX2_MIN设成 0.5 米避免误判。4.4 数据日志分析与参数微调ArduPilot 的避障数据会记录在日志里用 Mission Planner 的日志分析功能可以看PRX和AVOID消息。重点看两个东西一是传感器距离数据的噪声水平二是避障触发时的距离是否和AVOID_MARGIN一致。如果发现避障触发距离比设定值小很多可能是传感器数据有延迟或者PRX1_FILT滤波太强。我遇到过 MR72 数据延迟 200ms 的情况后来发现是串口波特率设成了 57600改成 115200 后延迟降到 50ms 以内。如果绕障路径震荡比如左右来回摆那是OA_LOOKAHEAD设得太小或者AVOID_MARGIN太大导致频繁触发。我一般会先把OA_LOOKAHEAD调大 20%如果还震荡再降AVOID_MARGIN。5. 常见问题排查与避坑经验实录5.1 传感器数据异常排查表现象可能原因排查方法解决MR72 无数据串口接反或波特率不对用串口助手看原始输出交换 TX/RX确认波特率 115200TFmini Plus 数据跳变供电不足或地线干扰万用表测电压示波器看纹波单独供电加磁环避障不触发模式不对或参数未生效检查飞行模式和 PRX 参数切 Guided 模式重启飞控绕障震荡滤波太弱或 lookahead 太小看日志 AVOID 消息调高 PRX_FILT调大 OA_LOOKAHEAD近距离误触发地面反射或盲区看 proximity 扇形图调整安装角度设 PRX_MIN5.2 我踩过的三个典型坑第一个坑是MR72 的供电。我一开始直接从飞控的 5V 排针取电结果雷达数据时有时无。后来用万用表一测飞控 5V 输出在雷达工作时跌到了 4.3V雷达工作不稳定。换了一个 5V 3A 的 BEC 单独供电后问题解决。所以大功率传感器一定要单独供电别省这个 BEC 的钱。第二个坑是TFmini Plus 的协议选择。TFmini Plus 支持两种协议标准串口协议和 I2C 协议。我一开始用 I2C 模式结果和飞控上的其他 I2C 设备地址冲突数据一直读不到。后来改成串口模式问题消失。如果你非要用 I2C记得改 TFmini Plus 的地址别用默认的 0x10。第三个坑是避障参数的单位。AVOID_MARGIN的单位是米但有些版本的固件里是厘米。我一开始按厘米填了 300结果避障距离变成了 3 米平台在 3 米外就开始绕看起来像抽风。后来查了参数说明才发现单位是米改成 3 就正常了。所以填参数前一定要看单位别想当然。5.3 避障性能优化的几个技巧如果你觉得避障反应还是慢可以试试这几个方法。一是把PRX1_FILT和PRX2_FILT都调到 0.2让数据更实时但要注意噪声。二是把AVOID_MARGIN设成分段值低速时小一点高速时大一点ArduPilot 支持用AVOID_MARGIN和速度的联动但需要改代码或者用 Lua 脚本。还有一个技巧是多传感器融合。如果你同时装了 MR72 和 TFmini Plus飞控会自动融合两者的数据取每个方向上的最小值。但如果你发现融合效果不好可以手动设置PRX1_TYPE和PRX2_TYPE的优先级让更可靠的传感器主导。最后说一个我最近在试的方案用Lua 脚本做动态避障。ArduPilot 支持 Lua 脚本你可以写一个脚本根据当前速度和障碍距离动态调整AVOID_MARGIN。比如速度 1m/s 时 margin 设 2 米速度 2m/s 时设 4 米。这样低速时不会过度避障高速时又足够安全。脚本大概长这样function update() local speed vehicle:get_velocity_xy():length() local margin math.max(2.0, speed * 2.0) vehicle:set_parameter(AVOID_MARGIN, margin) return update, 100 end return update, 100这个脚本每 100ms 跑一次根据速度动态调 margin。我实测在无人船上效果不错低速时绕障更贴近障碍物高速时提前绕开整体路径更平滑。5.4 不同场景下的参数推荐场景AVOID_MARGINAVOID_BEHAVEPRX_FILTOA_LOOKAHEAD室内小车1.510.3不适用室外无人车3.020.56.0湖面无人船4.020.58.0高速无人车6.020.312.0这张表是我在不同项目里总结的你可以作为起点然后根据实际试跑微调。记住一点参数没有万能值一定要在自己的平台上试。我见过有人直接抄网上的参数结果平台尺寸和速度都不一样避障效果很差。6. 后续扩展与个人经验分享避障做完之后还可以往上叠更多功能。比如加一个前视摄像头做视觉避障和雷达数据融合能识别更小的障碍物。或者用RTK提高定位精度让绕障路径更精确。我最近在试的是用MAVLink 转发把 proximity 数据发给伴飞电脑在电脑上跑更复杂的路径规划算法然后把避障指令发回飞控。这样飞控只负责执行算力压力小很多。如果你用的是 ArduPilot 4.4 以上版本还可以试试AP_OAPathPlanner的新功能它支持多目标避障和动态障碍物跟踪。不过这个功能还在迭代参数比较多建议先把基础避障跑稳再折腾。我个人在实际操作中的体会是避障这件事传感器选型和安装占 60% 的功夫参数调试占 30%剩下的 10% 是运气。我见过太多人参数调了半天最后发现是传感器装歪了。所以每次调试前先花十分钟检查安装角度和接线比后面调两小时参数都管用。最后再分享一个小技巧如果你没有专业的角度校准工具可以用手机的水平仪 App 来校准传感器安装角度。把手机贴在传感器上看水平仪读数调整到目标角度。虽然精度不如专业工具但日常用足够了。我自己的无人船就是用手机校准的跑了大半年没出过问题。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑