在无人机自主降落的应用场景中,二维码识别因其成本低廉、部署简单而成为主流方案之一。但传统静态二维码降落方案存在明显局限——当二维码载体移动时,无人机无法实时调整姿态,导致降落失败甚至发生碰撞。本文将基于PX4飞控和ROS机器人操作系统,手把手教你构建一套能够动态追踪移动二维码的完整系统。
一套可靠的硬件系统是项目成功的基础。经过多次实地测试,我们推荐以下配置组合:
提示:摄像头安装位置建议在无人机正下方,与重心垂直距离不超过5cm,可减少视觉-姿态转换误差。
系统需要以下关键软件组件协同工作:
bash复制# Ubuntu 18.04基础环境
sudo apt install ros-melodic-desktop-full python-catkin-tools
# PX4相关工具链
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot && git checkout v1.13.0
make px4_fmu-v5_default
ROS功能包依赖关系如下表所示:
| 功能包 | 作用 | 安装方式 |
|---|---|---|
| mavros | PX4-ROS桥接 | apt install ros-melodic-mavros |
| usb_cam | 摄像头驱动 | apt install ros-melodic-usb-cam |
| apriltag_ros | 二维码识别 | 源码编译安装 |
整个系统采用分布式架构,各节点通过ROS Topic进行数据交换:
code复制[usb_cam] --image_raw--> [apriltag_ros] --tag_detections--> [tracking_controller]
↑ |
| ↓
[mavros] <--setpoint_position-- [tracking_controller] --> [PID调节器]
关键参数传递路径:
V2版本的核心改进在于动态PID调节策略。传统固定参数PID在移动场景下会出现震荡或响应迟缓问题。我们采用基于速度反馈的自适应算法:
python复制def update_pid(self, current_error, velocity):
# 动态调整比例项
Kp = self.base_Kp * (1 + 0.5*abs(velocity))
# 速度越大积分项越小
Ki = self.base_Ki / (1 + 0.3*abs(velocity))
# 微分项补偿
Kd = self.base_Kd * (1 + 0.2*abs(current_error))
return Kp, Ki, Kd
参数调节经验值参考:
| 场景 | base_Kp | base_Ki | base_Kd | 最大速度(m/s) |
|---|---|---|---|---|
| 悬停 | 1.2 | 0.05 | 0.3 | 0.5 |
| 追踪 | 0.8 | 0.02 | 0.5 | 2.0 |
V2版本的启动文件v2_ar_track_landing.launch进行了多项改进:
xml复制<launch>
<!-- 摄像头参数动态配置 -->
<arg name="camera_frame" default="camera_link"/>
<arg name="image_width" default="1280"/>
<arg name="image_height" default="720"/>
<!-- 节点1:MAVROS连接 -->
<include file="$(find mavros)/launch/px4.launch">
<arg name="fcu_url" value="/dev/ttyACM0:57600"/>
</include>
<!-- 节点2:摄像头驱动 -->
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node">
<param name="video_device" value="/dev/video0"/>
<param name="image_width" value="$(arg image_width)"/>
<param name="image_height" value="$(arg image_height)"/>
</node>
<!-- 节点3:AprilTag识别 -->
<include file="$(find apriltag_ros)/launch/continuous_detection.launch">
<param name="camera_name" value="usb_cam"/>
<param name="image_topic" value="image_raw"/>
</include>
<!-- 节点4:运动控制器 -->
<node name="tracking_controller" pkg="drone_control" type="v2_tracker.py" output="screen">
<param name="landing_speed" value="0.3"/>
<param name="max_horizontal_speed" value="2.0"/>
</node>
</launch>
在实际测试中,我们发现图像遮挡、光照变化会导致二维码短暂丢失。V2版本新增了预测补偿算法:
实现代码片段:
python复制def handle_tag_lost(self, lost_time):
if lost_time < 0.5:
pos = self.kalman.predict()
self.set_position(pos)
elif lost_time < 2.0:
pos = self.optical_flow.get_position()
self.set_position(pos)
else:
self.emergency_hold()
使用QGroundControl进行飞行参数微调时,重点关注以下参数组:
| 参数组 | 关键参数 | 推荐值 | 作用 |
|---|---|---|---|
| MPC_XY | MPC_XY_P | 0.8 | 水平位置P增益 |
| MPC_Z | MPC_Z_VEL_P | 0.4 | 垂直速度P增益 |
| MC_YAW | MC_YAW_P | 2.5 | 偏航角P增益 |
注意:每次修改参数后需重启飞控才能生效,建议通过SD卡保存配置模板。
开发过程中可以使用rqt工具观察系统实时状态:
bash复制# 查看计算耗时
rqt_graph
# 监控话题频率
rostopic hz /tag_detections
# 可视化调试
rqt_plot /tracking_controller/error/x /tracking_controller/error/y
典型性能指标要求:
在Jetson Nano上实测数据表明,整套系统CPU占用率约65%,内存消耗1.2GB,完全满足实时性要求。