动捕使用 fcu_core_v2
机载电脑端使用 fcu_core_v2 连接无人机
注意:动捕频率必须为 10 Hz。
实验平台:Jetson Orin NX(8 GB / 16 GB)。
从 GitHub 获取源码(已完成此步骤时可跳过)
创建工作空间:
mkdir -p ~/ros_ws/src
拉取 fcu_core_v2 及相关工程:
项目 README
修改 launch 文件参数
motion_001:修改为实际使用的动捕话题名称。动捕频率必须为 10 Hz。channel:0。offboard:true。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"/> <!--"/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/ttyTHS0" type="string"/>
<param name="BANDRATE" value="460800"/>
<param name="channel" value="0"/>
<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"/>
<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>
使用 autodeploy 配置 /dev/ttyTHS0 的串口访问权限:
git clone https://gitee.com/fancinnov/autodeploy.git # 拉取自动部署脚本
cd autodeploy
sudo chmod +x autodeploy.sh
./autodeploy.sh --modules usb_permissions --run # 开启串口权限
sudo reboot # 重启后生效
确定坐标系
确认动捕坐标系的坐标轴方向。该坐标系应为“前、左、上”,如下图所示:

使用 rostopic echo 命令查看动捕话题中的位置数据,确认其单位是毫米、厘米还是米。
在 fcu_bridge_001.cpp 中找到动捕回调函数,并根据动捕输出单位调整坐标换算。程序默认使用米作为坐标单位。
例如,若动捕话题输出的坐标单位为毫米,则需将其转换为米,转换方式如下图所示:

检查动捕数据中的偏航角是否正确。
完成上述配置并确认动捕系统正常运行后,编译并启动 fcu_core_v2 工程。终端应持续输出动捕数据,如下图所示。当心跳间隔为 1 s、动捕输出频率为 10 Hz,且终端逐条打印动捕数据时,相邻两条心跳之间通常约有 10 条动捕数据。实际数量与心跳间隔、数据接收及打印时序有关,不能仅凭单次计数判定丢包。若持续出现数据缺失、延迟或频率异常,应结合实际动捕话题的 rostopic hz 输出及时间戳排查;确认数据连续、频率满足要求后再进行飞行测试。

上图中的第四项数据 yaw 为偏航角,取值范围为 −π 至 π。
偏航角须满足以下要求:
- 机头沿动捕坐标系 X 轴正方向时,yaw 值为 0。
- 机头沿动捕坐标系 Y 轴正方向时,yaw 值为 π/2。
飞控烧录动捕模式固件
打开飞控固件中的 clibrary/include/confg.h 文件。

按上图修改相应参数,保存、编译并烧录固件后,无人机进入动捕定位模式。 首先在动捕定位模式下完成试飞。 确认试飞正常后,可进一步启用动捕定高。

按上图启用动捕定高,保存、编译并烧录固件后,无人机进入动捕定位与动捕定高模式。
测试
烧录动捕模式固件后,fcu_core_v2 的 RViz 界面中,虚拟无人机应跟随真实无人机的位置变化。手持无人机在动捕场地内移动,检查虚拟无人机与真实无人机的位置是否一致。
远程电脑端使用 fcu_core_v2 连接无人机
实验环境:Windows 11 宿主机,VMware 17.5 Pro 虚拟机,Ubuntu 20.04 LTS。
从 GitHub 获取源码(已完成此步骤时可跳过)
创建工作空间:
mkdir -p ~/ros_ws/src
拉取 fcu_core_v2 及相关工程:
项目 README
修改 launch 文件参数
DRONE_IP:无人机 Mlink 的 IP 地址(Mlink 必须处于组网模式)。motion_001:修改为实际使用的动捕话题名称。动捕频率必须为 10 Hz。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"/> <!--"/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/ttyTHS0" 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>