RTK 套件集群飞行
本章以三架配备 RTK 模组的无人机为例,介绍组网配置、RTK 定位检查和集群飞行操作。飞行前,请先完成 GNSS(RTK)套件单机飞行,并确认每架无人机均已通过系统测试和单机试飞。
实验环境:Windows 11 宿主机,VMware 17.5 Pro 虚拟机,Ubuntu 20.04 LTS。
配置联网模块
集群飞行需要所有无人机都连接到同一个局域网。 因此,需为各无人机的 Mlink-esp Wi-Fi 模块配置 IP 地址。
使用 Mlink-esp 调试器配置
说明:Mlink-esp 调试器可简化组网配置。未配备该调试器的 FanciSwarm™ 集群套件用户,可通过原购买渠道向幻思创新申请;申请通过后,将免费寄送。
先将 Mlink-esp Wi-Fi 模块连接至 Mlink-esp 调试器,再通过 USB 将调试器连接至电脑。具体步骤如下:
- 连接 Mlink-esp 调试器
将 Mlink-esp Wi-Fi 模块从 FanciSwarm™ 无人机上取下,按照下图所示,将 Mlink-esp Wi-Fi 模块与 Mlink-esp 调试器连接。 注意:请按图示方向连接,严禁反接。反接会烧毁设备。

- 下载串口助手
下载串口助手并解压,在电脑上双击 sscom5.13.1.exe 文件。
- 打开串口助手并连接 Mlink-esp 调试器
打开上一步下载的串口助手软件,将 Mlink-esp 调试器与电脑连接。
- 设置串口助手
点击端口号下拉菜单,选择“......USB-SERIAL CH340”对应的端口,再按下一步说明输入 AT 指令,如下图所示。

- 发送 AT 指令
在输入框中依次输入以下 AT 指令并发送: (1)重启模块。输入以下指令并发送:
AT+RST\r\n
(2)恢复出厂设置。输入以下指令并发送:
AT+RESTORE\r\n
(3)设置为 Station 模式(默认使用 AP 模式)。输入以下指令并发送:
AT+CWMODE_DEF=1\r\n
(4)设置要连接的路由器名称和密码。输入以下指令并发送: 注意:Wi-Fi 名称不能使用中文。 (例:AT+CWJAP_DEF="Fancinnov","Mcontroller"\r\n)
AT+CWJAP_DEF="WiFi名称","WiFi密码"\r\n
串口助手接收界面显示“WIFI CONNECTED”时,表示组网模块已连接路由器;显示“WIFI GOT IP”时,表示模块已获得 IP 地址。若未显示上述信息,请重新尝试连接。
(5)查询 IP 地址。输入以下指令并发送:
AT+CIFSR\r\n
上述指令成功发送后,串口助手接收界面会显示路由器分配到该组网模块的 IP 地址。
(6)设置固定的 IP 地址。输入以下指令并发送:
AT+CIPSTA_DEF="ip","网关","子网掩码"\r\n
固定 IP 地址、网关和子网掩码须与实际局域网配置一致。例如,若局域网网关为 192.168.0.254、子网掩码为 255.255.255.0,且 192.168.0.100 尚未被占用,可发送 AT+CIPSTA_DEF="192.168.0.100","192.168.0.254","255.255.255.0"。指令中的符号均使用英文半角字符。每架无人机须分配不同的 IP 地址,并避免与网关或其他设备冲突;静态地址应避开路由器的 DHCP 自动分配范围,或在路由器中设置地址保留。
(7)查询 IP 地址,确认设置是否成功。输入以下指令并发送:
AT+CIFSR\r\n
若串口助手返回的 IP 地址与上一步设置一致,表示配置成功。请记录该 IP 地址。
特别说明 (1)配合 App 使用时,先打开 App,将手机连接至目标路由器的 Wi-Fi,再点击首页右上方的数传连接按钮,在输入框中填写已配置的组网模块 IP 地址。
- 确认配置完成,并记录模块的 IP 地址。
导入 ROS 工程
集群飞行的配置流程与单机飞行相似,主要区别如下:
- launch 文件中需配置多个
fcu_bridge节点,并逐一核对各节点的参数。 - 终端会同时输出多架无人机的信息,需根据各无人机的标识区分输出内容。
- 集群飞行前,必须确认每架无人机均已通过系统测试和单机试飞。
从 GitHub 获取源码(已完成此步骤时可跳过)
创建工作空间:
mkdir -p ~/ros_ws/src
拉取 fcu_core_v2 和 quadrotor_msgs:
项目 README
修改 launch 文件参数
DRONE_IP:无人机 Mlink 的 IP 地址。channel:1。offboard:false。use_uwb:false。set_goal:false。simple_target:true。
<node pkg="fcu_core" type="fcu_bridge_001" name="fcu_bridge_001" output="screen" >
<remap from="~odometry_001" to="/vins_estimator/odometry"/>
<remap from="~imu_global_001" to="imu_global_001"/>
<remap from="~odom_global_001" to="odom_global_001"/>
<remap from="~path_global_001" to="path_global_001"/>
<remap from="~path_target_001" to="path_target_001"/>
<remap from="~goal_001" to="/move_base_simple/goal"/>
<remap from="~motion_001" to="motion_001"/>
<remap from="~command" to="/fcu_command/command"/>
<remap from="~mission_001" to="/fcu_mission/mission_001"/>
<param name="DRONE_IP" value="192.168.0.201" type="string"/> <!-- 修改为对应无人机 Mlink 的 IP 地址 -->
<param name="DRONE_PORT" value="333"/>
<param name="USB_PORT" value="/dev/ttyACM0" type="string"/>
<param name="BANDRATE" value="460800"/>
<param name="channel" value="1"/>
<param name="offboard" value="false" type="bool"/>
<param name="use_uwb" value="false" type="bool"/>
<param name="set_goal" value="false" type="bool"/>
<param name="simple_target" value="true" type="bool"/>
<param name="odom_init_x" value="0.0"/> <!-- FLU 坐标系 -->
<param name="odom_init_y" value="0.0"/>
<param name="odom_init_z" value="0.0"/>
</node>
<node pkg="fcu_core" type="fcu_bridge_002" name="fcu_bridge_002" output="screen" >
<remap from="~odometry_002" to="odometry_002"/>
<remap from="~imu_global_002" to="imu_global_002"/>
<remap from="~odom_global_002" to="odom_global_002"/>
<remap from="~path_global_002" to="path_global_002"/>
<remap from="~path_target_002" to="path_target_002"/>
<remap from="~motion_002" to="motion_002"/>
<remap from="~command" to="/fcu_command/command"/>
<remap from="~mission_002" to="/fcu_mission/mission_002"/>
<param name="DRONE_IP" value="192.168.0.202" type="string"/> <!-- 修改为对应无人机 Mlink 的 IP 地址 -->
<param name="DRONE_PORT" value="333"/>
<param name="USB_PORT" value="/dev/ttyACM0" type="string"/>
<param name="BANDRATE" value="460800"/>
<param name="channel" value="1"/>
<param name="offboard" value="false" type="bool"/>
<param name="use_uwb" value="false" type="bool"/>
<param name="set_goal" value="false" type="bool"/>
<param name="simple_target" value="true" type="bool"/>
</node>
<node pkg="fcu_core" type="fcu_bridge_003" name="fcu_bridge_003" output="screen" >
<remap from="~odometry_003" to="odometry_003"/>
<remap from="~imu_global_003" to="imu_global_003"/>
<remap from="~odom_global_003" to="odom_global_003"/>
<remap from="~path_global_003" to="path_global_003"/>
<remap from="~path_target_003" to="path_target_003"/>
<remap from="~motion_003" to="motion_003"/>
<remap from="~command" to="/fcu_command/command"/>
<remap from="~mission_003" to="/fcu_mission/mission_003"/>
<param name="DRONE_IP" value="192.168.0.203" type="string"/> <!-- 修改为对应无人机 Mlink 的 IP 地址 -->
<param name="DRONE_PORT" value="333"/>
<param name="USB_PORT" value="/dev/ttyACM0" type="string"/>
<param name="BANDRATE" value="460800"/>
<param name="channel" value="1"/>
<param name="offboard" value="false" type="bool"/>
<param name="use_uwb" value="false" type="bool"/>
<param name="set_goal" value="false" type="bool"/>
<param name="simple_target" value="true" type="bool"/>
</node>
系统测试
测试必须在空旷的室外环境中进行。首次飞行须在技术支持工程师的指导下进行。
布置 RTK 基站
将 RTK 基站固定在空旷区域,离地高度约 1.5 m,并为基站通电。检查基站与各无人机 RTK 模组的指示灯状态:
- 基站的蓝色指示灯点亮:表示已成功锁定卫星。
- 无人机 RTK 模组的蓝色指示灯常亮:表示已成功锁定卫星。
- 无人机 RTK 模组的绿色指示灯常亮:表示已进入 RTK 定位模式。

**启动顺序:**按标签 ID 从大到小启动无人机;三机示例依次启动 3 号机、2 号机、1 号机。
测试期间应持续检查指示灯状态。状态异常时,需重新检查基站和各无人机的定位状态,确认正常后再进行后续操作。
核对无人机与通信节点
使用手机 App 逐一连接各无人机,核对机号与通信节点 001、002、003 的对应关系。各 Mlink 模块的 IP 地址须与 launch 文件中对应节点的 DRONE_IP 一致,且各机 IP 地址不得重复。
连接无人机
在虚拟机中进入 ros_ws 目录,打开终端并执行以下命令:
catkin_make
source ./devel/setup.bash
随后运行 ROS 程序:
roslaunch fcu_core fcu_core.launch
确认终端持续收到三架无人机的心跳包,并逐一检查各机的 sat(卫星数量)与 gnss(定位状态值)。无人机静止时,卫星数量应在 20 颗左右。每架无人机的 gnss 定位状态值均须达到 5,才允许解锁起飞。

核对坐标与轨迹
单机教程中的 GNSS 坐标系以无人机首次获得 GNSS 坐标的位置为原点;本节 RTK 集群以首次获取的 1 号机 GNSS 坐标所对应的位置为公共原点,各机均同步至该原点,坐标轴方向为“北、西、天”。飞行前须逐一核对各机实际使用的坐标原点、坐标轴方向、起飞位置及目标轨迹,确认每条轨迹均对应正确的无人机。各机获得 RTK 定位后,仍需完成上述坐标核对。
以下三机直线巡航示例使用上述公共坐标系。001、002、003 号无人机在该坐标系中的起飞位置分别为(0.0, 0.0)、(0.0, -1.5)、(0.0, -3.0)。加载航点前,须确认各机已完成原点同步,且显示位置与实际起飞位置一致。
gnss_lines.txt 航点记录文件:
文件头中的 DRONE_001 3 表示 001 号无人机有 3 个航点,后续各行依次为 X、Y、Z 和偏航角。位置单位为米,偏航角单位为度。DRONE_004 0 至 DRONE_006 0 表示对应无人机未设置航点。
DRONE_001 3
0.000000 0.000000 1.000000 0.000000
1.500000 0.000000 1.000000 0.000000
3.000000 0.000000 1.000000 0.000000
DRONE_002 3
0.000000 -1.500000 1.000000 0.000000
1.500000 -1.500000 1.000000 0.000000
3.000000 -1.500000 1.000000 0.000000
DRONE_003 3
0.000000 -3.000000 1.000000 0.000000
1.500000 -3.000000 1.000000 0.000000
3.000000 -3.000000 1.000000 0.000000
DRONE_004 0
DRONE_005 0
DRONE_006 0
在 RViz 中,分别手持三架无人机沿测试路径移动,检查各机的显示位置、运动方向及轨迹是否与实际运动一致。确认无误后,方可进行飞行测试。
飞行测试
集群飞行前,必须通过 ROS 对每架 FanciSwarm™ 无人机进行单机试飞。所有参与集群飞行的无人机均通过测试、确认运行正常后,方可执行集群飞行任务。
飞行前准备
在空旷的室外环境中,为无人机通电并通过虚拟机建立连接。确认终端收到心跳包,并检查其中的 GNSS 卫星数量和定位状态。无人机静止时,卫星数量应在 20 颗左右;未配备 RTK 基站时,定位状态值须达到 2;配备 RTK 基站时,须达到 5。满足上述要求后,方可解锁起飞。
遥控器设置

熟悉 RViz 插件操作
飞行测试前,请先阅读 rviz_plugin 的使用,熟悉航点设置、轨迹执行及基础控制按钮。
确认无人机连接
**启动顺序:**按标签 ID 从大到小启动无人机;三机示例依次启动 3 号机、2 号机、1 号机。
确认系统测试中的 ROS 程序仍在运行,且无人机通信正常。若程序已退出,请在虚拟机中进入 ros_ws 目录,打开终端并执行以下命令;若程序已在运行,无需重复启动。
catkin_make
source ./devel/setup.bash
随后运行 ROS 程序:
roslaunch fcu_core fcu_core.launch
起飞前,请再次完成定位检查,确认所有参与飞行的无人机定位正常。
设置航点
将上方航点记录内容保存为 gnss_lines.txt,将 活动无人机数量 设为 3,点击 加载目标点 选择该文件。逐一检查三架无人机的航点列表,确认每机均有 3 个航点,坐标与经核对的实际坐标系一致。

无人机解锁

确认每架无人机 RTK 模组的蓝色指示灯常亮、绿色指示灯常亮,且终端显示的 GNSS 定位状态值均达到 5。
完成上述检查后,点击 RViz 插件中的 解锁 按钮。

此时,Mcontroller 右侧的 LED 绿灯点亮,并响起启动提示音。FanciSwarm™ 无人机完成解锁。
起飞
确认三架无人机均已解锁后,点击 RViz 插件中的 起飞 按钮,并逐一确认各机起飞状态。

此时,三架 FanciSwarm™ 无人机上升至 FanciSwarm App 中设置的起飞高度并悬停。
启用循环执行(可选)
如需重复执行轨迹,将 循环执行 开关设为 开,该设置同时作用于所有活动无人机;仅执行一次时,保持为 关。循环执行包含末航点返回首航点的过程,启用前须确认返程路径。

执行轨迹
点击 RViz 插件中的 执行轨迹 按钮。

点击一次 执行轨迹 后,三架活动无人机同时开始执行各自的航点任务。请逐一确认各机的航点执行状态和实际轨迹。启用循环执行时,还须核对最后一个航点返回首个航点的路径。
停止轨迹
点击 RViz 插件中的 停止轨迹 按钮。

插件停止下发后续航点。已发送至无人机的航点无法撤回,因此该操作不保证无人机立即悬停。请观察无人机状态,确认当前目标点的执行情况。
降落
点击 RViz 插件中的 降落 按钮。

此时,三架 FanciSwarm™ 无人机开始下降,随后着陆。
锁定无人机
确认三架无人机均已着陆后,点击 RViz 插件中的 锁定 按钮,并逐一确认各机锁定状态。

此时,FanciSwarm™ 无人机的电调指示灯熄灭,同时,Mcontroller 右侧的 LED 绿灯熄灭、LED 红灯点亮。FanciSwarm™ 无人机完成锁定。
关闭无人机和 RTK 基站
FanciSwarm™ 无人机锁定后,如果不继续飞行,请及时关闭无人机和 RTK 基站,并断开电池连接,以减少电量消耗。
RTK 集群轨迹飞行流程完成。