键盘控制的使用

本章介绍通过终端输入键盘指令,完成无人机解锁、起飞、内置任务执行、降落和锁定。按键及任务行为依据本工作空间 fcu_core_v2/src/ 中的 fcu_command.cpp、fcu_mission.cpp 和 fcu_bridge_001.cpp 编写。

键盘控制采用“单个字符 + 回车”的指令输入方式。内置任务的坐标在 fcu_mission.cpp 中定义;通过 RViz 插件加载的航点列表应使用插件按钮执行。任务代码的修改方法参见 fcu_mission 任务规划。

使用前准备

  1. 完成 配置与项目架构 中的环境配置和编译,并按实际设备设置 launch/fcu_core.launch 的通信参数。
  2. 按所用定位套件的教程完成定位检查,确认通信、传感器和定位数据正常。GNSS/RTK 模式还须满足相应的卫星数量与定位状态要求;SLAM 模式须等待初始化完成。
  3. 核对当前坐标原点、坐标轴方向、起飞位置、目标高度及完整飞行路径。按键触发的是代码中已有的目标,输入时不会再次询问坐标。
  4. 确认无人机处于电脑控制模式,并在 FanciSwarm App 中核对起飞高度、起飞速度及降落参数。
  5. 首次操作仅启用一架无人机对应的通信节点,核对正常后再进行多机测试。

键盘指令不包含无人机编号。 随工程启动、订阅 /fcu_command/command 的各通信节点会分别处理同一条指令;多个节点连接不同无人机时,解锁、起飞等指令可能同时作用于多架无人机。RViz 的“活动无人机数量”和当前选中的标签页不能限制键盘指令的接收范围。单机测试应在启动前停用其他无人机的通信节点,并核对实际话题连接。

本章以远程电脑直接连接 Mlink 的单机操作为例。使用机载电脑或 EGO 规划时,还应按对应套件教程配置 offboard、set_goal、话题映射和相关程序;键盘输入本身不会完成这些配置。

启动程序与键盘终端

单独启动键盘节点

fcu_command 从其自身的标准输入读取按键。建议将键盘节点放在独立终端中运行,便于输入指令和查看回显。

先在 fcu_core_v2/launch/fcu_core.launch 中注释掉已有的键盘节点,避免启动同名节点:

<!-- <node pkg="fcu_core" type="fcu_command" name="fcu_command" output="screen" /> -->

保留所需的 fcu_bridge、fcu_mission 以及当前连接架构要求的其他节点。fcu_mission 负责响应 p、r、s 和 1~4 等任务指令,执行内置任务时必须运行。

在 Ubuntu 终端 A 中进入实际 ROS 工作空间。以下以 ~/ros_ws 为例:

cd ~/ros_ws
catkin_make
source devel/setup.bash
roslaunch fcu_core fcu_core.launch

保持终端 A 运行。在终端 B 中执行:

cd ~/ros_ws
source devel/setup.bash
rosrun fcu_core fcu_command

终端 B 出现“请输入指令”后,可在该终端输入按键。

输入规则

当前程序要求每次读取到 2 个字节,即一个 ASCII 字符和一个换行符。输入长度不符合要求时显示“指令错误”,长度正确但按键未定义时显示“非法指令”。“解锁”“起飞”等回显仅表示节点已发布指令,实际执行结果仍须通过无人机状态确认。

按键速查

以下每个按键均须单独输入并按回车。

按键 指令值 功能 使用说明
a 1 解锁 完成定位和传感器检查后使用,确认实际解锁成功。
d 2 锁定 确认无人机已着陆后使用。
t 3 起飞 先确认已解锁;同时使任务模块记录各机当前位姿,作为定点例程的参考。
l 4 降落 下发降落指令,继续观察实际下降与着陆状态。
p 0 执行内置路径 运行 fcu_mission.cpp 中 enable_path 分支的路径。
r 5 执行内置绕圆任务 运行 enable_track 分支;终端回显为“运行”。
s 6 退出内置路径、绕圆或定点计算 不发送降落或锁定指令,不保证立即悬停;详见下文。
1 7 定点例程 1 选择 enable_pos==1 对应的目标。
2 8 定点例程 2 选择 enable_pos==2 对应的目标。
3 9 定点例程 3 选择 enable_pos==3 对应的目标。
4 10 定点例程 4 选择 enable_pos==4 对应的目标。
q 1011 前向追踪 用于已配置对应目标追踪功能的系统。
w 1012 下视追踪 用于已配置对应目标追踪功能的系统。
e 1013 停止追踪 与 s 的功能不同,不是退出键盘程序。
z 1015 自由追踪 用于已配置对应目标追踪功能的系统。

追踪按键需配套固件、目标检测与相关数据源支持,不能仅凭按键回显判断追踪已建立。本章的基础飞行流程不启用追踪功能。

单机基础飞行流程

解锁与起飞

  1. 确认终端 A 持续收到无人机心跳,定位状态满足对应套件要求,且当前位姿数据正确。
  2. 在终端 B 输入 a 并按回车,确认无人机完成解锁。
  3. 输入 t 并按回车,观察无人机升至 App 设置的起飞高度并稳定悬停。

t 被任务模块接收时会记录当前位姿。执行定点例程前,须确认这次记录使用了有效的定位数据;不要通过重复发送 t 来调整目标点。

选择一个内置任务

在下文核对内置任务的坐标和参数后,选择 1~4、r 或 p 中的一种任务执行。每次触发后,观察实际飞行状态,确认符合预期后再进行下一步。

切换内置任务前,先输入 s 退出当前路径或绕圆计算,再选择新任务。当前实现优先执行绕圆,其次是路径,最后才是定点分支;直接输入另一种任务按键不会自动清除先前的使能状态。

结束任务与降落

  1. 输入 s 并按回车,退出内置任务计算,观察无人机的实际状态。
  2. 输入 l 并按回车,确认无人机下降并着陆。
  3. 无人机已着陆且仍未锁定时,输入 d 并按回车,确认动力系统已锁定。
  4. 完成锁定后,若不再飞行,关闭无人机并断开电池连接,再退出 ROS 程序。

s 不是紧急悬停或急停指令。 它将 enable_track、enable_path 设为 false,并将 enable_pos 设为 255;在未启用其他模式时,任务模块仍可能继续发布保留的最后一个目标。无人机可能继续前往该目标,因此不能把终端显示“停止”视为已经悬停。

l 不会清除内置路径和绕圆的使能状态,正常结束任务时应先输入 s 再输入 l。Ctrl+C 只终止当前终端中的程序,不会自动向无人机发送降落、锁定或悬停指令。

内置任务的坐标与参数

以下数值取自当前工作空间源码,修改后须重新编译。它们是程序例程,不是适合所有定位套件和场地的通用飞行参数。

任务代码使用米作为位置单位,使用弧度作为偏航角单位。里程计进入任务模块时,代码对 Y 坐标和偏航角进行符号转换:y_mission=-y_odom、yaw_mission=-yaw_odom。下表和公式均描述任务模块内部的数值,不能将 RViz 显示的 Y 值直接照填到代码中。配置了坐标偏移时,还须核对通信模块的偏移换算。

1~4:定点例程

t 指令记录各机的起飞参考位置后,数字按键将 X、Y 偏移叠加到对应无人机的参考位置。Z 和偏航角直接采用例程中的设定值,不叠加起飞参考高度或参考偏航角。

按键 X 偏移(m) Y 偏移(m) Z 目标值(m) 偏航角(rad)
1 1.0 1.0 1.0 0.0
2 1.0 −1.0 1.0 0.0
3 −1.0 −1.0 1.0 0.0
4 0.0 0.0 1.0 0.0

例如,1 对应 X目标=X起飞参考+1.0、Y目标=Y起飞参考+1.0、Z目标=1.0、yaw目标=0.0。4 表示返回起飞参考位置的水平坐标,并使用表中的高度和朝向,不是降落。

数字按键会设置六机对应的目标值;实际哪些无人机收到目标,取决于已启动的通信节点和话题映射。目标位置位于定位坐标系中,不会随无人机当前机头方向旋转。

r:绕圆例程

当前源码为六架无人机分别生成带有相位差的圆形目标,001 号机的目标为:

px1 = 1.0 * cosf(theta) + 2;
py1 = 1.0 * sinf(theta) + 2;
pz1 = 0.6;
yaw1 = 0.0;

圆心为任务坐标系中的(2.0, 2.0),半径为 1.0 m,Z 目标值为 0.6 m,偏航角固定为 0 rad。圆心坐标不叠加起飞位置。程序首次启动时 theta=0,001 号机首个圆上目标位于(3.0, 2.0, 0.6)。启动绕圆前须检查从当前位置到圆上目标的过渡路径。

其余无人机使用不同相位。多机使用前,应逐机核对初始目标、机间距离和飞行区域。s 不会重置 theta,再次输入 r 会从保留的角度继续计算,不保证从初始圆上位置重新开始。

p:路径例程

当前路径分支仅调用 SetGoal(1, ...),为 001 号机设置以下 10 个目标:

序号 X(m) Y(m) Z(m) 偏航角(rad)
1 0.5 0.5 0.0 0.0
2 1.0 1.0 0.0 0.0
3 1.5 1.0 0.0 0.0
4 2.0 1.0 0.0 0.0
5 2.5 1.0 0.0 0.0
6 2.5 2.0 0.0 0.0
7 2.0 2.0 0.0 0.0
8 1.5 2.0 0.0 0.0
9 1.0 2.0 0.0 0.0
10 0.5 2.0 0.0 0.0

这些是任务坐标系下的绝对目标,不叠加起飞位置。源码中的 Z 值均为 0.0;不要将其理解为“保持当前高度”。实飞前,应结合飞控固件的高度处理方式确认其含义,并按实际场地调整目标高度后重新编译。

到点条件为 X、Y 两个方向的误差分别小于 0.1 m,不检查高度和偏航角,也不包含到点悬停时间。完成最后一个目标后,源码没有自动循环或自动降落逻辑。

s 只退出路径计算,不重置 goal_point 和路径状态机;再次输入 p 不是重新从第一个目标开始。需要从头测试时,应在无人机着陆、锁定后重启任务节点,并重新完成位姿检查和起飞参考记录。

常见问题

现象 检查方法
键盘节点显示“禁用指令”后退出 代码在标准输入读取失败或结束时退出。按本章方法使用独立交互终端运行 rosrun fcu_core fcu_command,检查是否使用了输入重定向或后台启动。
输入后没有反应 确认焦点在键盘终端,已输入一个有效字符并按回车;确认只有一个键盘节点在运行。
有按键回显,无人机无动作 回显不能证明执行成功。检查通信、解锁前提、控制模式、话题连接及接收节点。任务按键还需检查 fcu_mission 是否运行,以及是否已有其他任务或规划模式接管。
p 没有执行 RViz 航点 p 执行代码内置路径;RViz 航点应使用插件的 执行轨迹 或 单步执行。
输入数字后仍在绕圆或执行路径 先输入 s,确认当前状态后再输入数字。任务分支存在优先级。
s 后仍在移动 最后一个目标可能仍有效;s 不等价于立即悬停,也不会退出目标追踪。追踪功能使用 e 停止。
多架无人机同时响应 检查共享命令话题的订阅者及启动节点;键盘程序没有选机功能。

可在另一终端中查看节点和命令话题连接:

rosnode list
rostopic info /fcu_command/command
rostopic echo /fcu_command/command

话题监听只能确认指令值与发布、订阅关系,实际飞行状态仍需通过无人机遥测和现场观察确认。


返回教程目录 · 上一章:rviz_plugin 的使用 · 下一章:fcu_bridge_001 与 fcu_server_001 核心代码说明