配置与项目架构
fcu_core_v2 项目架构介绍
fcu_core_v2
|- fcu_core.launch 一键启动launch脚本
|- mavlink 第三方消息库用来传输Mavlink数据
|- rviz_cfg rviz配置文件存放目录
└─ src 功能包源文件
|- fcu_mission.cpp 任务规划文件
|- fcu_command.cpp 命令发送文件
|- fcu_bridge_001.cpp 和Mlink/fcu_server之间的通信文件
|- fcu_bridge_002.cpp
|- fcu_bridge_00*.cpp
|- fcu_server_001.cpp 和fcu_bridge之间的通信文件
|- fcu_server_002.cpp
└─ fcu_server_00*.cpp
编译与运行
编译与运行步骤参见 fcu_core_v2 项目 README。运行前,请完成以下环境配置并核对 launch 文件参数。
配置电脑环境
实验环境:Windows 11 宿主机,VMware 17.5 Pro 虚拟机,Ubuntu 20.04 LTS。
安装 ROS
在终端中执行以下命令:
wget http://fishros.com/install -O fishros && . fishros
按照下图所示步骤完成安装:
安装完成后,在终端中执行以下命令:
sudo apt-get install ros-noetic-serial # 串口库
sudo apt-get install libeigen3-dev # Eigen 是开源 C++ 线性代数库,支持矩阵、矢量运算及数值分析
fcu_core.launch 配置参数详解
fcu_bridge 的使用场景如下:
- 远程电脑上的
fcu_bridge通过 Wi-Fi 直接连接无人机的 Mlink,获取里程计数据并下发指令。 - 机载电脑上的
fcu_bridge通过串口 直接连接无人机的 Mlink,获取里程计、IMU 等数据;当set_goal==true时,发送 EGO 目标点。 - 远程电脑上的
fcu_bridge通过 Wi-Fi 连接机载电脑上的fcu_server,获取里程计数据并下发指令。
<node pkg="fcu_core" type="fcu_bridge_001" name="fcu_bridge_001" output="screen" >
<remap from="~odometry_001" to="/vins_estimator/odometry"/> <!--"/vins_estimator/odometry" for vins; "/Odometry" for faster-lio -->
<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.4.1" type="string"/>
<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="true" 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>
channel:通信方式,0表示串口通信,1表示网络通信。DRONE_IP:在channel==1时生效,指定无人机 Mlink 或机载电脑的 IP 地址。连接 Mlink 时,默认值为192.168.4.1;若已通过配网模块更改 IP 地址,需同步更新此参数。连接机载电脑时,此参数应与对应机载电脑的 IP 地址一致。DRONE_PORT:在channel==1时生效,指定无人机 Mlink 或机载电脑的端口号。连接 Mlink 时,默认值为333;连接机载电脑时,此参数应与对应fcu_server的DRONE_PORT一致。USB_PORT:在channel==0时生效,指定串口设备路径,默认值为/dev/ttyACM0,可根据实际设备修改。offboard:是否使用机载电脑,默认值为false,可根据实际配置修改。use_uwb:是否使用 UWB 基站,默认值为true,可根据所用定位套件修改。set_goal:是否使用远程电脑(如个人笔记本电脑)设置轨迹规划目标点,默认值为false。simple_target:仅用于机载电脑配置。启用后,目标点仅包含位置信息,不包含速度和加速度信息。
fcu_server 的使用场景如下:
- 机载电脑上的
fcu_server通过 Wi-Fi 与远程电脑上的fcu_bridge连接,发送里程计信息并接收指令。
<node pkg="fcu_core" type="fcu_server_001" name="fcu_server_001" output="screen" >
<remap from="~command" to="/fcu_command/command"/>
<remap from="~odom_global_001" to="odom_global_001"/>
<remap from="~mission_001" to="/fcu_mission/mission_001"/>
<remap from="~goal_001" to="/move_base_simple/goal"/>
<param name="DRONE_PORT" value="10001"/>
</node>
DRONE_PORT:指定机载电脑的服务端端口号。连接远程电脑时,此参数应与对应fcu_bridge的DRONE_PORT一致。
fcu_core_v2 提供以下两种远程控制架构,均可用于单机或多机控制。
1. 通过 Mlink 与远程电脑通信
对于未搭载机载电脑的无人机,使用远程电脑通过 2.4 GHz Wi-Fi 连接 Mlink,直接与飞控通信。
Mlink模式:默认为AP热点模式,适用于单机飞行,需要远程电脑连接Mlink发出的热点,IP地址默认为192.168.4.1;组网模式,需要飞行环境内有支持2.4G的路由器可供使用,适用于单机飞行和多机飞行,需要远程电脑通过IP连接Mlink。
下面为配置Mlink为组网模式的操作方法,若单机飞行可跳过,使用AP热点模式即可。
说明: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 地址。

2. 通过机载电脑与远程电脑通信
对于搭载机载电脑的无人机,可使用远程电脑通过 5 GHz Wi-Fi 连接机载电脑上的 fcu_server,实现远距离通信,提高通信稳定性。
远程电脑通过IP连接机载电脑,机载电脑通过串口连接无人机。

多机拓扑网络中的 fcu_bridge 与 fcu_server
本节配置仅适用于第二种远程控制架构。
以六架无人机为例,每架无人机的机载电脑使用 fcu_bridge_001 连接飞控,使用 fcu_server_001 连接远程电脑。fcu_bridge_002 至 fcu_bridge_006 分别连接其他五架无人机上的 fcu_server,获取其位姿信息;本机的 fcu_server_002 至 fcu_server_006 则向其他五架无人机提供本机位姿信息。六架无人机之间共有 30 个 TCP 连接(每机主动连接其他五机,即 6 × 5),机载电脑与飞控之间共有 6 个串口连接。此处未计入远程电脑与各机的连接。该拓扑用于实现各无人机之间的位姿信息共享。

具体连接
以下以六机拓扑网络中,1 号机的 fcu_bridge_002 连接 2 号机的 fcu_server_002 为例:
前提:1 号机的 IP 地址为 192.168.0.201,2 号机的 IP 地址为 192.168.0.202。
1 号机的 fcu_core.launch 配置如下:
<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"/> <!-- 2号机的IP地址 -->
<param name="DRONE_PORT" value="10002"/> <!-- 2号机的端口号 -->
<param name="USB_PORT" value="/dev/ttyACM0" type="string"/>
<param name="BANDRATE" value="460800"/>
<param name="channel" value="1"/> <!-- channel==1意味着WIFI连接 -->
<param name="offboard" value="true" 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>
2 号机的 fcu_core.launch 配置如下:
<node pkg="fcu_core" type="fcu_server_002" name="fcu_server_002" output="screen" >
<remap from="~command" to="/fcu_command/command"/>
<remap from="~odom_global_001" to="odom_global_001"/>
<remap from="~mission_001" to="/fcu_mission/mission_001"/>
<param name="DRONE_PORT" value="10002"/> <!-- 2号机的端口号 -->
</node>
按照相同方法配置其他无人机之间的连接,即可构建六机拓扑网络。
注意:同一台机载电脑上的不同 fcu_server 节点必须使用不同的端口号。