ArduPilot 脚本实战:用 follow-target-send.lua 广播 FOLLOW_TARGET 消息实现多机跟随
ArduPilot 脚本实战用 follow-target-send.lua 广播 FOLLOW_TARGET 消息实现多机跟随【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot导读本篇文章聚焦 ArduPilot 官方 Lua 应用小程序appletfollow-target-send.lua 及其配套说明文档 follow-target-send.md讲解如何让一架飞行器通过 MAVLink 以 10Hz 频率对外广播FOLLOW_TARGET消息从而作为被跟随目标供其他飞行器或地面端解析使用。读完本文你将掌握该脚本的完整安装流程、FOLT_ENABLE与FOLT_MAV_CHAN两个参数的配置方法、消息各字段的含义与填充逻辑以及 ArduPilot 端AP_Follow库是如何解码并消费这条消息实现跟随的底层原理。一、功能背景FOLLOW_TARGET 在 ArduPilot 跟随体系中的位置ArduPilot 的跟随Follow功能通常涉及两架飞行器一架作为目标target另一架作为跟随者follower。传统做法是目标机通过遥测链路持续发送GLOBAL_POSITION_INT、ATTITUDE等标准消息跟随者据此推算目标位置。而FOLLOW_TARGETMAVLink 消息 ID 144是一种信息更丰富、更专用的目标状态消息它一次性携带目标的位置、速度、加速度、姿态四元数与机体角速率并带有能力位标志est_capabilities说明哪些估计量有效。follow-target-send.lua的作用就是让任意一架运行 Lua 脚本的 ArduPilot 飞行器变身目标机主动对外发布FOLLOW_TARGET消息。从代码注释follow-target-send.lua可以确认其定位Sends the FOLLOW_TARGET mavlink message to allow other vehicles to follow this one。需要说明的是该脚本只负责发送不负责接收。接收侧的解码逻辑位于 C 库 libraries/AP_Follow/AP_Follow.cpp 中例如 Copter 的 FOLLOW 模式与 plane_follow.lua 都会调用AP_Follow::handle_msg来处理FOLLOW_TARGET。二、脚本工作原理源码级解读脚本整体逻辑非常清晰核心函数为send_follow_target_msg()follow-target-send.lua其执行流程如下获取当前位置调用ahrs:get_location()取得经纬度与高度若为空则直接放弃本次发送。获取速度目标通过poscontrol:get_vel_target()读取 NED 坐标系下的目标速度成功则把能力位VEL(2^1)置位。获取加速度目标通过poscontrol:get_accel_target()读取 NED 坐标系下的目标加速度成功则把能力位ACCEL(2^2)置位。获取姿态与角速率用ahrs:get_quaternion()取姿态四元数、ahrs:get_gyro()取机体角速率并通过ahrs:body_to_earth()将角速率转换到 NED 系成功则把能力位ATT_RATES(2^3)置位。组装并发送将以上数据填进follow_target_msg表调用mavlink:send_chan()在指定通道发送。脚本顶部定义的能力位常量与消息编码约定严格对应local FOLLOW_TARGET_CAPABILITIES {POS2^0, VEL2^1, ACCEL2^2, ATT_RATES2^3}其中POS(2^0)位置能力位恒被置位因为脚本必然携带有效的经纬度。这一点与接收端 AP_Follow.cpp 的校验逻辑相吻合——接收端要求est_capabilities至少包含 bit 0位置有效否则丢弃该帧。脚本的驱动机制是典型的 Lua 脚本自调度模式follow-target-send.luaupdate()函数每次执行完发送后返回自身并指定下一次调用的延时local UPDATE_INTERVAL_MS 100 -- update at about 10hz ... return update, UPDATE_INTERVAL_MS即每 100ms 执行一次等效于 10Hz 发布频率。若FOLT_ENABLE不大于 0则退回 1000ms 的空转周期避免无谓消耗。脚本加载时还会向 GCS 发送一条follow-target-send script loaded的 INFO 级文本消息方便确认加载成功。三、参数配置详解脚本通过 Lua 参数表机制注册了两个参数表键为 88、前缀为FOLT_follow-target-send.lua因此地面站参数列表中以FOLT_开头。启动脚本时若参数表注册失败会直接assert报错便于排查。FOLT_ENABLE项目内容显示名Follow Target Send Enable默认值1启用取值0禁用1启用等级Standard该参数控制脚本总开关。为 0 时update()直接空转不再发送任何消息。由于默认即为 1复制脚本并启用 Lua 后即开始广播。FOLT_MAV_CHAN项目内容显示名Follow Target Send MAVLink Channel默认值0取值范围010等级Standard该参数指定通过哪个 MAVLink 通道发送FOLLOW_TARGET消息。ArduPilot 的通道编号从 0 开始0 对应 SERIAL0 通常为 USB1 对应 SERIAL1/Telem1依次类推实际映射与 AP_SerialManager 的 SERIALx_MAV 配置相关。应将其设置为与跟随者相连的链路通道例如跟随机通过 Telem2 接入则设FOLT_MAV_CHAN 2。四、安装与使用步骤按照官方说明follow-target-send.md安装共四步复制脚本将 follow-target-send.lua 复制到飞控 SD 卡的scripts目录APM/scripts。与其他 applet 一致本脚本属于即拷即用型无需用户编辑脚本内容参见 applets/README.md。创建 modules 目录在scripts目录下新建modules子目录。复制 MAVLink 消息定义将 libraries/AP_Scripting/modules/MAVLink 下的mavlink_msgs.lua与mavlink_msg_*.lua文件复制到 SD 卡scripts/modules/MAVLink/目录。脚本通过require(MAVLink/mavlink_msgs)加载这些定义。验证发布上电后脚本即以 10Hz 频率对外广播FOLLOW_TARGET可在 GCS 的 MAVLink 消息查看器中确认消息到达。此外还需满足前置条件在目标机发送方上启用脚本功能即设置SCR_ENABLE 1确保飞控固件包含 Lua 支持。关于第 3 步的mavlink_msg_*.lua文件它们是消息的 Lua 化定义理论上可用 pymavlink 的mavgen.py按需重新生成生成方法记录在 modules/MAVLink/Readme.md--lang Lua协议 2.0 可包含扩展字段。日常使用直接拷贝仓库内现成文件即可。五、FOLLOW_TARGET 消息格式发送端字段映射消息的 Lua 定义见 mavlink_msg_FOLLOW_TARGET.lua其字段与脚本填充逻辑对照如下字段类型脚本来源follow-target-send.lua说明timestampuint64 (I8)millis():toint()机载时间戳毫秒接收端会做抖动校正custom_stateuint64 (I8)恒为 0自定义状态字latint32 (i4)curr_loc:lat()纬度1e7 度WGS84lonint32 (i4)curr_loc:lng()经度1e7 度WGS84altfloatcurr_loc:alt() * 0.01高度米绝对高度注意脚本内 Location 高度单位为厘米故乘以 0.01 换算velfloat[3]vel_target_NEDNED 系目标速度m/saccfloat[3]accel_target_NEDNED 系目标加速度m/s²attitude_qfloat[4]attitude_quat姿态四元数w,x,y,zratesfloat[3]ahrs:body_to_earth(curr_rot_rate)转换到 NED 系的角速率rad/sposition_covfloat[3]恒为 {0,0,0}位置协方差est_capabilitiesuint8 (B)FOLLOW_TARGET_CAPABILITIES位组合能力位标志值得注意的是vel、acc、attitude_q、rates在数据不可用时会以零向量占位但通过est_capabilities的对应位明确告知接收端该量是否有效从而避免接收端误用无意义数据。六、接收端如何消费AP_Follow 库的解码逻辑跟随者的核心处理函数是AP_Follow::handle_msglibraries/AP_Follow/AP_Follow.cpp。它先检查消息发送者系统 IDsysid是否与FOLL_SYSID参数一致并忽略本机自身消息随后按消息类型分发GLOBAL_POSITION_INT仅在没有启用 FOLLOW_TARGET 时才处理FOLLOW_TARGET调用handle_follow_target_message解码。handle_follow_target_messageAP_Follow.cpp的关键校验与换算包括合法性校验lat与lon全为 0无效 GPS时丢弃est_capabilities不含 bit 0位置无效时丢弃。位置换算由经纬高构造Location再把alt米乘 100 转回厘米并换算为相对原点的 NED 坐标AP_Follow.cpp。姿态与航向若est_capabilities含 bit 3则用四元数还原姿态解算目标航向并把机体角速率旋转到地球系取 z 分量作为航向变化率AP_Follow.cpp若使用相对偏移FOLL_OFS_TYPE为相对类型但姿态缺失则直接判为失败。速度与加速度依据 bit 1、bit 2 分别写入_target_vel_ned_ms、_target_accel_ned_mss缺失则清零AP_Follow.cpp。时间戳校正用_jitter.correct_offboard_timestamp_msec()对发送端时间戳做抖动校正后记录更新时间。优先级切换一旦收到合法的FOLLOW_TARGET设置_using_follow_target true此后GLOBAL_POSITION_INT将被忽略AP_Follow.cpp。由此可见发送端脚本置位的能力位与接收端的解码分支严格一一对应FOLLOW_TARGET的富信息优势——速度、加速度、航向率一并送达——正是它优于仅靠GLOBAL_POSITION_INT之处。此外若在超时窗口内AP_FOLLOW_ESTIMATE_TIMEOUT_MS收不到目标更新估计会被标记为无效并回退AP_Follow.cpp因此保证发送端 10Hz 的稳定广播对跟随效果至关重要。七、典型应用场景与注意事项与 Copter FOLLOW 模式配合在 ArduCopter 中mode_follow.cpp 的 FOLLOW 模式通过AP_Follow解析目标状态follow-target-send.lua可以作为移动目标信标部署在需被跟随的飞行器上。与 plane_follow.lua 配合官方还提供 plane_follow.lua 实现固定翼跟随固定翼。该文档说明目标机无需安装任何脚本跟随机设置FOLL_SYSID指向目标而若希望目标机以更丰富的FOLLOW_TARGET消息供其消费则可叠加本脚本。同时其建议的遥测链路调优提高SRx_POSITION、SRx_EXTRA1流率至 810Hz并在MAVx_OPTIONS置位 bit 2 防止地面站压低流率同样适用于本场景以保证跟随机及时收到目标更新。注意事项汇总目标机与跟随机的MAVLINK_SYSIDSYSID_THIS_MAV必须不同否则接收端会把自己的消息当作目标消息而忽略AP_Follow.cpp。FOLT_MAV_CHAN务必选对链路通道否则消息会发到错误的串口而无法到达跟随机。脚本依赖poscontrol对象位置控制器的存在在未启用相关导航库的机型上get_vel_target/get_accel_target可能返回 nil此时对应能力位不置位消息仍会以仅含位置/姿态的形式正常发出。发送频率固定为 10HzUPDATE_INTERVAL_MS 100如需调整可修改该常量但需同步考虑接收端的估计超时窗口与遥测链路带宽。结语follow-target-send.lua是 ArduPilot Lua 生态中即拷即用型 applet 的典型代表脚本短小、参数简洁仅FOLT_ENABLE与FOLT_MAV_CHAN两个却能借助FOLLOW_TARGET消息把一架飞行器完整的状态估计位置、速度、加速度、姿态、角速率以 10Hz 稳定广播给整个 MAVLink 网络为 Copter FOLLOW 模式、plane_follow.lua乃至自研跟随逻辑提供了标准化的目标数据源。掌握本脚本即可快速搭建一架发布、多机跟随的实验与实战环境。【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →