键盘控制的使用
本章介绍通过终端输入键盘指令,完成无人机解锁、起飞、内置任务执行、降落和锁定。按键及任务行为依据本工作空间 fcu_core_v2/src/ 中的 fcu_command.cpp、fcu_mission.cpp 和 fcu_bridge_001.cpp 编写。
键盘控制采用“单个字符 + 回车”的指令输入方式。内置任务的坐标在 fcu_mission.cpp 中定义;通过 RViz 插件加载的航点列表应使用插件按钮执行。任务代码的修改方法参见 fcu_mission 任务规划。
使用前准备
- 完成 配置与项目架构 中的环境配置和编译,并按实际设备设置
launch/fcu_core.launch的通信参数。 - 按所用定位套件的教程完成定位检查,确认通信、传感器和定位数据正常。GNSS/RTK 模式还须满足相应的卫星数量与定位状态要求;SLAM 模式须等待初始化完成。
- 核对当前坐标原点、坐标轴方向、起飞位置、目标高度及完整飞行路径。按键触发的是代码中已有的目标,输入时不会再次询问坐标。
- 确认无人机处于电脑控制模式,并在 FanciSwarm App 中核对起飞高度、起飞速度及降落参数。
- 首次操作仅启用一架无人机对应的通信节点,核对正常后再进行多机测试。
键盘指令不包含无人机编号。 随工程启动、订阅 /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 出现“请输入指令”后,可在该终端输入按键。
输入规则
- 切换到终端 B,使用英文输入法,输入一个小写字母或一个数字,然后按回车。例如,解锁时输入
a后按回车。 - 每次只输入一条指令。不要输入空格、中文字符或整段按键序列,也不要将
a t r一次粘贴到终端。 - 按键区分大小写。
A与a不等价。 - 本程序不支持按住按键连续移动,也不提供常见的 WASD 手动移动方式。例如,
w是下视追踪指令。
当前程序要求每次读取到 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 | 自由追踪 | 用于已配置对应目标追踪功能的系统。 |
追踪按键需配套固件、目标检测与相关数据源支持,不能仅凭按键回显判断追踪已建立。本章的基础飞行流程不启用追踪功能。
单机基础飞行流程
解锁与起飞
- 确认终端 A 持续收到无人机心跳,定位状态满足对应套件要求,且当前位姿数据正确。
- 在终端 B 输入
a并按回车,确认无人机完成解锁。 - 输入
t并按回车,观察无人机升至 App 设置的起飞高度并稳定悬停。
t 被任务模块接收时会记录当前位姿。执行定点例程前,须确认这次记录使用了有效的定位数据;不要通过重复发送 t 来调整目标点。
选择一个内置任务
在下文核对内置任务的坐标和参数后,选择 1~4、r 或 p 中的一种任务执行。每次触发后,观察实际飞行状态,确认符合预期后再进行下一步。
切换内置任务前,先输入 s 退出当前路径或绕圆计算,再选择新任务。当前实现优先执行绕圆,其次是路径,最后才是定点分支;直接输入另一种任务按键不会自动清除先前的使能状态。
结束任务与降落
- 输入
s并按回车,退出内置任务计算,观察无人机的实际状态。 - 输入
l并按回车,确认无人机下降并着陆。 - 无人机已着陆且仍未锁定时,输入
d并按回车,确认动力系统已锁定。 - 完成锁定后,若不再飞行,关闭无人机并断开电池连接,再退出 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 核心代码说明