保姆级教程:用MAVROS连接Pixhawk飞控与ROS,实现无人车基础控制(附避坑清单)
从零搭建ROS与Pixhawk的通信桥梁:MAVROS实战指南
当第一次将Pixhawk飞控接入ROS系统时,许多开发者都会遇到通信链路搭建的难题。本文将以实操为导向,手把手带你完成MAVROS环境配置、飞控参数调试、通信验证全流程,并附上经过实战检验的避坑指南。
1. 硬件准备与系统环境搭建
在开始之前,确保你已准备好以下硬件:
- Pixhawk系列飞控(如Pixhawk 4、Cube等)
- 配套的电源模块和电池
- 微型USB数据线或数传模块
- 安装Ubuntu 18.04/20.04的计算机
- 可选:GPS模块、遥控器接收机
关键步骤:
# 安装ROS Melodic(Ubuntu 18.04)或Noetic(Ubuntu 20.04) sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update sudo apt install ros-${ROS_DISTRO}-desktop-full # 安装MAVROS sudo apt install ros-${ROS_DISTRO}-mavros ros-${ROS_DISTRO}-mavros-extras wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh chmod +x install_geographiclib_datasets.sh sudo ./install_geographiclib_datasets.sh注意:不同版本的Ubuntu需要对应不同版本的ROS。Pixhawk官方推荐使用Ubuntu 18.04 + ROS Melodic组合,兼容性最佳。
2. Pixhawk飞控基础配置
连接飞控到QGroundControl地面站,进行必要参数设置:
| 参数组 | 关键参数 | 推荐值 | 说明 |
|---|---|---|---|
| System | SYSID_MYGCS | 255 | 地面站ID,MAVROS默认使用该值 |
| Serial | SERIAL1_BAUD | 921600 | TELEM1端口波特率(使用数传时) |
| Serial | SERIAL2_PROTOCOL | 1 | TELEM2端口启用MAVLink协议 |
| Network | MAV_BROADCAST | 1 | 启用广播模式 |
| Safety | CBRK_USB_CHK | 197848 | 禁用USB连接安全检查 |
常见问题排查:
- 如果飞控无法被识别,尝试更换USB线或检查端口权限:
ls /dev/ttyACM* sudo chmod 666 /dev/ttyACM0 - 波特率不匹配会导致通信失败,确保飞控和MAVROS使用相同波特率
3. MAVROS启动与通信验证
创建启动文件mavros.launch:
<launch> <arg name="fcu_url" default="/dev/ttyACM0:57600" /> <arg name="gcs_url" default="" /> <arg name="tgt_system" default="1" /> <arg name="tgt_component" default="1" /> <include file="$(find mavros)/launch/node.launch"> <arg name="pluginlists_yaml" value="$(find mavros)/launch/px4_pluginlists.yaml" /> <arg name="config_yaml" value="$(find mavros)/launch/px4_config.yaml" /> <arg name="fcu_url" value="$(arg fcu_url)" /> <arg name="gcs_url" value="$(arg gcs_url)" /> <arg name="tgt_system" value="$(arg tgt_system)" /> <arg name="tgt_component" value="$(arg tgt_component)" /> </include> </launch>启动MAVROS节点:
roslaunch mavros mavros.launch验证通信状态:
rostopic echo /mavros/state rostopic echo /mavros/heartbeat提示:正常状态下
connected字段应为True,system_status为3(Standby)或4(Active)
4. 核心话题与服务解析
MAVROS提供了丰富的接口供开发者使用,主要分为以下几类:
4.1 状态监控话题
/mavros/state:飞控连接状态/mavros/battery:电池信息/mavros/imu/data:IMU原始数据/mavros/global_position/global:GPS全局位置
4.2 控制指令话题
/mavros/setpoint_position/local:本地坐标系位置指令/mavros/setpoint_velocity/cmd_vel:速度控制指令/mavros/rc/override:遥控器通道重载
4.3 常用服务
rosservice list | grep mavros/mavros/cmd/arming:解锁/锁定飞控/mavros/set_mode:切换飞行模式/mavros/param/get:获取飞控参数
5. 实战:基础控制实现
下面通过Python脚本实现基础的飞控控制:
#!/usr/bin/env python import rospy from geometry_msgs.msg import PoseStamped from mavros_msgs.msg import State from mavros_msgs.srv import CommandBool, SetMode current_state = State() def state_cb(state): global current_state current_state = state if __name__ == "__main__": rospy.init_node('offb_node', anonymous=True) state_sub = rospy.Subscriber("mavros/state", State, state_cb) local_pos_pub = rospy.Publisher("mavros/setpoint_position/local", PoseStamped, queue_size=10) arming_client = rospy.ServiceProxy('mavros/cmd/arming', CommandBool) set_mode_client = rospy.ServiceProxy('mavros/set_mode', SetMode) rate = rospy.Rate(20) # Hz # 等待飞控连接 while not current_state.connected: rate.sleep() pose = PoseStamped() pose.pose.position.x = 0 pose.pose.position.y = 0 pose.pose.position.z = 2 # 发送若干设定点 for i in range(100): local_pos_pub.publish(pose) rate.sleep() # 切换到OFFBOARD模式 if set_mode_client(0, "OFFBOARD").mode_sent: rospy.loginfo("OFFBOARD enabled") # 解锁飞控 if arming_client(True).success: rospy.loginfo("Vehicle armed") # 主控制循环 while not rospy.is_shutdown(): local_pos_pub.publish(pose) rate.sleep()6. 避坑清单与调试技巧
根据实际项目经验,整理出以下常见问题及解决方案:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| MAVROS无法连接飞控 | 串口权限不足 | 执行sudo usermod -a -G dialout $USER后重新登录 |
| 通信时断时续 | 波特率不匹配 | 检查飞控参数SERIALx_BAUD与MAVROS启动参数 |
| 无法切换到OFFBOARD模式 | 未发送设定点 | 在切换模式前持续发送设定点至少2秒 |
| 遥控器信号丢失 | SYSID_MYGCS设置错误 | 确保地面站ID与飞控参数匹配 |
| IMU数据异常 | 飞控校准不完整 | 在QGC中执行传感器校准流程 |
高级调试技巧:
- 使用
rqt_graph可视化节点通信关系 - 通过
rostopic hz检查话题发布频率 - 启用MAVROS调试日志:
rosrun mavros mavros_node _debug:=true
在实际部署中,建议先通过仿真环境验证控制逻辑。硬件在环(HITL)仿真可以大幅降低开发风险,PX4生态提供了完善的仿真工具链支持。
