单机自动任务
实验环境:Jetson Orin NX,Ubuntu 20.04 LTS。
本章所有程序均在机载电脑上运行,可在本机终端操作,也可通过 SSH 登录机载电脑后操作。
飞行全程须保持遥控器连接。执行自动任务时,将 CH7 置于下方挡位,使用电脑控制模式;需要人工接管时,将 CH7 切换至中间挡位,使用遥控器控制模式。
本章先使用默认的直接飞点模式,运行一次“解锁 → 起飞 → 两点飞行 → 降落 → 锁定”示例,再介绍雷达 SLAM 定位下的 EGO 目标点飞行。两种方式均在机载电脑上执行,使用同一份任务文件。
1. 确认配置
先按所用定位套件的教程完成通信、定位和电脑控制模式检查。以下以 UWB 套件 通过 Mlink 网络连接单架无人机为例。
提前打开功能包中的 fcu_core_v2/launch/fcu_core.launch,将已有的自动任务开关改为:
<arg name="enable_auto_mission" default="true"/>
机载电脑的 auto_ap.sh 开机启动该 launch 时,将按上述配置启用自动任务,无需在启动命令中追加参数。再检查 fcu_bridge_001 节点:
| 参数 | 默认值 | 本示例的设置 |
|---|---|---|
DRONE_IP |
192.168.4.1 |
与 Mlink 实际 IP 一致,不一致时修改。 |
DRONE_PORT |
333 |
与 Mlink 实际端口一致。 |
channel |
1 |
保持网络通信。 |
offboard |
false |
保持 Mlink 网络连接配置,程序仍在机载电脑上运行。 |
use_uwb |
true |
UWB 套件保持此值。 |
set_goal |
false |
保持直接飞点模式。 |
fcu_auto_mission 节点中的 use_planner=false 保持默认,不需要配置规划器话题。使用其他定位套件或串口连接时,先按对应套件教程调整通信与定位配置。
主 launch 还会启动其他通信节点;自动任务本身只控制 fcu_bridge_001。
2. 核对默认任务
任务文件为 fcu_core_v2/src/fcu_auto_mission/example_mission.py:
def mission(drone):
drone.arm()
drone.takeoff()
drone.goto(x=3.0, y=0.0, z=1.0, yaw=0.0)
drone.hover(seconds=5.0)
drone.goto(x=3.0, y=1.0, z=1.0, yaw=0.0)
drone.hover(seconds=5.0)
drone.land()
drone.disarm()
起飞后,依次前往(3.0, 0.0, 1.0)和(3.0, 1.0, 1.0),每点保持 5 秒,然后在第二个目标点降落并锁定。
XYZ 使用 /odom_global_001 的坐标约定,单位为米,均为绝对坐标,不叠加起飞位置;yaw 单位为弧度,正方向向左。接口自动转换 Y 和 yaw 的符号,无需手动取反。场地、原点和航段均适合上述路线时可保留示例,否则只修改 goto() 中的目标坐标。任务文件修改后须重启节点才会生效。
起飞高度由 FanciSwarm App 设置,z=1.0 不会修改 App 的起飞高度。goto() 仅判断 XY 到点,不检查高度和朝向;hover() 保持目标并计时,也不验证实际悬停状态。

解锁、起飞、降落和锁定采用“发送一次命令后等待”的方式,不检测动作是否完成。默认解锁后等待 2 秒、起飞后等待 5 秒、降落后等待 15 秒、锁定后等待 2 秒。必须保证降落等待时间足够长:示例在等待结束后发送锁定命令,不检查是否接地。 需要调整时,提前修改 launch 中 land_wait 的默认值;disarm_wait 是锁定后的等待时间,不能代替降落等待。
3. 配置开机自启动
首次部署或更新源码后,在机载电脑中进入实际 ROS 工作空间编译,以下以 ~/ros_ws 为例:
cd ~/ros_ws
catkin_make
source devel/setup.bash
找到机载电脑已有的 auto_ap.sh 开机自启动文件,确认其已加载实际工作空间环境,并启动本教程修改的 launch。对应启动命令为:
roslaunch fcu_core fcu_core.launch
沿用脚本原有的启动管理方式,不要重复添加同一启动项;如原命令显式设置了 enable_auto_mission:=false,须移除该覆盖值。若脚本使用安装空间,应修改实际加载的配置,并在源码更新后重新安装。
完成配置后重启机载电脑,由 auto_ap.sh 自动启动节点。平时使用无需再手动执行 roslaunch。自动任务节点加载默认任务后等待启动服务,节点开机自启动不等于任务自动起飞。等待 bridge 启动至少 5 秒,并确认定位和通信正常,再进行下一节检查。
如需将降落等待改为 20 秒,提前将 launch 中对应配置改为 <arg name="land_wait" default="20.0"/>。
4. 检查并执行
每个新终端均先执行 source ~/ros_ws/devel/setup.bash,工作空间路径按实际情况修改。若自启动脚本使用安装空间,则加载对应的 install/setup.bash,确保终端与自启动程序使用同一工作空间环境。
在终端 B 中查看里程计,确认位置、朝向与实际一致且持续更新,检查完成后按 Ctrl+C 退出该监听:
rostopic echo /odom_global_001
随后监听任务状态,保持该终端运行:
rostopic echo /fcu_auto_mission/status
确认定位正常、遥控器已连接、CH7 位于下方挡位且航线可用后,在终端 C 中调用任务启动服务。也可通过 SSH 登录机载电脑后执行同一命令:
rosservice call /fcu_auto_mission/start "{}"
若需开机后自动执行任务,可在 auto_ap.sh 的末尾安排延时调用上述服务,并在调用前检查飞行条件、定位和话题连接是否就绪。固定延时不代表这些条件已满足;调用成功后,示例将执行解锁和起飞。
服务返回 success: true 表示接受启动请求。终端 B 会显示 RUNNING、各动作名称,最终显示 SUCCEEDED 或 FAILED。SUCCEEDED 只表示程序执行完毕,仍须确认实际着陆并锁定,再关闭无人机、断开电池。
本示例使用的接口
| 名称 | 类型 | 用途 |
|---|---|---|
/odom_global_001 |
话题,nav_msgs/Odometry |
bridge 输出的位置与朝向反馈;任务启动及飞点过程需要持续有效的数据。 |
/fcu_auto_mission/status |
话题,std_msgs/String |
查看就绪、动作进度和失败原因,保留最新状态。 |
/fcu_auto_mission/start |
服务,std_srvs/Trigger |
开始已加载的任务,不是话题。 |
/fcu_auto_mission/cancel |
服务,std_srvs/Trigger |
请求取消当前任务,不是话题。 |
/fcu_auto_mission/command 向 bridge 发送解锁、起飞等命令,/fcu_auto_mission/mission_001 发送直接飞点目标;程序已自动连接,无需手动发布。启用自动任务后,旧键盘控制话题不再控制该 bridge。
/fcu_auto_mission/control_001、/move_base_simple/goal 和 /planning/pos_cmd 用于第 6 节的 EGO 规划模式,前面的直接飞点示例无需配置或监听。
5. 取消与简单排查
需要取消时,在终端 C 中执行:
rosservice call /fcu_auto_mission/cancel "{}"
取消不自动降落或锁定。正在飞点且定位有效时改为保持当前位置;正在起飞或降落时,不撤回已发送的命令。定位失效时停止发布目标。取消后须确认实际状态,按已熟悉的接管方式处理;关闭终端不能代替降落。
| 问题 | 检查方法 |
|---|---|
| 启动后没有动作 | 完成检查后调用 start;启动节点本身不执行任务。 |
| 提示里程计过期或不可用 | 检查 /odom_global_001 是否持续更新,核对通信与定位程序。 |
| 提示 bridge 未连接 | 检查 auto_ap.sh 是否成功启动相关节点,实际加载的 launch 是否已设置 enable_auto_mission 默认值为 true。 |
| 飞点超时或任务失败 | 查看状态中的原因,检查位置、目标坐标及定位;失败不代表已降落。 |
| 修改示例后没有变化 | 重启节点;使用安装空间时确认修改的是实际加载的文件。 |
同一时间只能运行一个任务。再次调用 start 会从任务开头执行,不是断点继续;重新测试前,先确认无人机已着陆、锁定并完成飞行前检查。
6. 雷达 SLAM 定位与 EGO 目标点飞行
本节以 Jetson Orin NX 通过串口连接飞控、Faster-LIO 输出 /Odometry、EGO 规划目标点为例。沿用第 2 节的 mission(drone),仅调整连接与规划配置。
修改必要配置
在 fcu_core_v2/launch/fcu_core.launch 中,修改 fcu_bridge_001 节点的以下配置,其余自动任务话题映射保持原样:
| 配置项 | 本例设置 | 说明 |
|---|---|---|
~odometry_001 的 remap |
/Odometry |
雷达 SLAM 输出,名称须与实际一致。 |
USB_PORT |
/dev/ttyTHS0 |
改为实际连接飞控的串口,并完成串口权限配置。 |
BANDRATE |
460800 |
与飞控端串口波特率一致。 |
channel |
0 |
使用串口,网络 IP 和端口不参与本例连接。 |
offboard |
true |
使用机载电脑配置。 |
use_uwb |
false |
使用雷达 SLAM 定位。 |
set_goal |
true |
将任务目标作为 EGO 规划目标发送。 |
simple_target |
true |
保持位置目标配置。 |
里程计映射写法如下:
<remap from="~odometry_001" to="/Odometry"/>
再将 fcu_auto_mission 节点中已有的参数改为:
<param name="use_planner" value="true" type="bool"/>
set_goal 和 use_planner 必须同时设为 true,修改后重启。
恢复直接飞点时,将两者均改回 false,并按所用定位与通信方式恢复相应配置。
启动并运行原示例
- 提前完成本节配置,并确认
auto_ap.sh中已有雷达 SLAM、EGO 和fcu_core.launch的启动项;enable_auto_mission按第 1 节设为true。主fcu_core.launch本身不负责启动 SLAM 和 EGO。 - 将无人机放在地面上启动,由
auto_ap.sh自动运行上述程序。初始化完成前不要移动无人机;确认定位、地图及 EGO 规划正常后再继续。 - 确认 EGO 接收
/move_base_simple/goal,输出/planning/pos_cmd,且 SLAM、EGO 和/odom_global_001的原点、轴向与坐标偏移一致。先按 雷达 SLAM 教程 的系统测试检查定位和规划结果。 - 核对第 2 节两个目标点在当前地图中可达,起飞位置、飞行路径和降落位置均合适;需要时修改示例中的
goto()坐标并重启节点。起飞高度和降落等待的检查仍按第 2 节执行。 - 等待 bridge 初始化至少 5 秒,确认
/odom_global_001持续有效,再调用启动服务,无需重复启动 launch。
确认上述条件满足后,在机载终端或通过 SSH 登录机载电脑调用任务启动服务:
rosservice call /fcu_auto_mission/start "{}"
如需在 auto_ap.sh 中自动调用该服务,应先确认飞行前条件、定位、话题连接及规划器均已就绪;调用服务后将执行解锁和起飞。首次测试建议完成检查后手动调用。
状态查看与取消仍使用第 4、5 节的接口,无需更换任务文件或另写一套动作代码。飞行中观察 EGO 规划与真实轨迹,规划效果取决于地图和规划器配置。
必要话题检查
| 话题 | 用途与检查时机 |
|---|---|
/Odometry |
Faster-LIO 的里程计输出,启动 SLAM 后应持续更新;bridge 从这里获取雷达定位数据。 |
/odom_global_001 |
bridge 输出给自动任务的位置反馈;开始任务前须持续有效且与实际位置一致。 |
/move_base_simple/goal |
bridge 发布的飞控回传目标,供 EGO 接收;运行到 goto() 时应出现目标消息。 |
/planning/pos_cmd |
EGO 的规划位置指令输出,类型为 quadrotor_msgs/PositionCommand;执行规划飞点时应持续更新。 |
/fcu_auto_mission/status |
与直接飞点相同,用于观察动作和失败原因。 |
任务目标由 /fcu_auto_mission/mission_001 经 bridge 发给飞控,再回传到 /move_base_simple/goal;EGO 输出由自动任务节点转发到 /fcu_auto_mission/control_001。这些内部连接无需手动发布,飞控须支持规划目标回传。当前回传分支只填写位置,不保证向 EGO 传递目标 yaw;规划输出也仅转发位置和 yaw,不包含速度、加速度前馈。
如提示规划输出超时,先检查两个模式参数,再观察目标与输出:
rostopic echo /move_base_simple/goal
在另一个终端中执行:
rostopic hz /planning/pos_cmd
运行到 goto() 后没有目标消息时,检查 bridge、串口及飞控回传;有目标但没有规划输出时,检查 EGO 的目标话题配置、地图和规划状态。默认等待首个输出 10 秒,后续输出间隔不能超过 2 秒。定位、规划器和自动任务应能通过同一 ROS master 通信。