1. MAVROS简介与核心价值

第一次接触MAVROS时,我正为一个农业巡检无人机项目头疼——需要让PX4飞控接收来自树莓派上ROS节点的指令。当时尝试直接写MAVLink协议解析,结果在坐标系转换和消息同步上栽了跟头。直到发现MAVROS这个"翻译官",问题才迎刃而解。

MAVROS本质上是个双向协议转换器。就像把中文翻译成英文,它把ROS的消息和服务调用实时转换成MAVLink协议帧,反之亦然。这种设计让开发者能专注于业务逻辑,不用纠结底层通信细节。我实测过,在千兆网口连接下,从ROS发布指令到飞控响应,延迟可以控制在20ms以内。

典型应用场景

  • 科研领域:ETH Zurich在无人机编队研究中,用MAVROS实现多机协同控制
  • 工业巡检:大疆M300通过MAVROS接入ROS,实现输电线自动检测
  • 教育领域:PX4官方教程推荐MAVROS作为ROS开发标准接口

与直接使用MAVLink相比,MAVROS提供了三大优势:

  1. 开发效率提升:省去协议解析代码,直接使用ROS标准消息类型
  2. 生态整合:无缝对接Rviz、Gazebo等ROS工具链
  3. 安全机制:内置心跳检测、超时重连等可靠性保障

2. 安装配置全攻略

去年给某高校搭建实验平台时,我对比过二进制和源码安装的差异。二进制安装虽然简单,但遇到PX4最新固件时,常出现协议版本不兼容。这里分享一个避坑指南:

2.1 二进制安装(推荐新手)

# 替换noetic为你的ROS版本(如melodic)
sudo apt-get install ros-noetic-mavros ros-noetic-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

安装后务必检查版本匹配:

roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"

如果看到[ INFO] [1625587362.345678]: FCU: Connected,说明链路已通。

2.2 源码安装(适合定制开发)

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin init
wstool init src
rosinstall_generator --upstream mavros | tee /tmp/mavros.rosinstall
rosinstall_generator mavlink | tee -a /tmp/mavros.rosinstall
wstool merge -t src /tmp/mavros.rosinstall
wstool update -t src
rosdep install --from-paths src --ignore-src --rosdistro noetic -y
catkin build

源码安装的关键在于解决依赖。去年在Jetson Nano上编译时,发现缺少geographiclib的问题可以通过手动安装解决:

sudo apt-get install libgeographic-dev

2.3 硬件连接配置

常见连接方式对比:

连接类型最大带宽延迟稳定性适用场景
USB转TTL1.5Mbps5-10ms★★★★☆室内测试
数传电台115Kbps50-100ms★★☆☆☆野外作业
ESP8266 WiFi54Mbps20-50ms★★★☆☆中距离控制
千兆以太网1Gbps<5ms★★★★★机载计算机

配置示例(USB连接):

# 查看设备权限
ls -l /dev/ttyACM*
# 添加当前用户到dialout组
sudo usermod -a -G dialout $USER
# 启动节点
roslaunch mavros px4.launch fcu_url:=/dev/ttyACM0:921600

3. 坐标系深度解析

曾有个项目因为坐标系混淆导致无人机"跳探戈",血的教训让我意识到坐标系理解的重要性。MAVROS涉及三类核心坐标系:

3.1 坐标系类型

  • 全局坐标系(global):GPS经纬高(WGS84),适合户外导航
    # 获取全球位置
    rospy.Subscriber("/mavros/global_position/global", NavSatFix, callback)
    
  • 本地坐标系(local):ENU(东-北-天),原点通常为解锁点
    // 发布本地位置指令
    geometry_msgs::PoseStamped pose;
    pose.pose.position.x = 5;  // 东向5米
    pose.pose.position.y = 0;  // 北向0米 
    pose.pose.position.z = 3;  // 天向3米
    
  • 机体坐标系(body):FLU(前-左-上),与无人机固联

3.2 坐标系转换实践

PX4飞控内部使用NED(北-东-地)坐标系,而MAVROS默认使用ENU。转换关系如下:

def ned_to_enu(ned_vec):
    enu_vec = [ned_vec[1], ned_vec[0], -ned_vec[2]]
    return enu_vec

实测案例:当飞控报告位置为(10,5,-3)时:

  • NED解释:北10米,东5米,地-3米(即天上3米)
  • ENU解释:东5米,北10米,天3米

3.3 配置技巧

修改px4_config.yaml可调整坐标系设定:

local_position:
  frame_id: "map"  # local系父坐标系
  child_frame_id: "base_link"  # body系坐标系

4. 核心通信机制实战

4.1 状态监控

/mavros/state话题是无人机的心电图,我习惯在回调函数里做状态机判断:

mavros_msgs::State current_state;
void state_cb(const mavros_msgs::State::ConstPtr& msg){
    if(!current_state.armed && msg->armed){
        ROS_INFO("检测到解锁!");
    }
    current_state = *msg;
}

4.2 基础控制指令

解锁无人机的正确姿势

from mavros_msgs.srv import CommandBool
arming = rospy.ServiceProxy('/mavros/cmd/arming', CommandBool)
try:
    arming(True)  # False为上锁
except rospy.ServiceException as e:
    rospy.logerr("解锁失败: %s", e)

模式切换注意事项

# 查看支持的飞行模式
rostopic echo /mavros/state | grep mode

常见模式包括:

  • STABILIZED:自稳模式
  • OFFBOARD:外部控制模式
  • AUTO.MISSION:任务模式

4.3 位置控制实战

实现一个简单的悬停控制:

rate = rospy.Rate(20)  # 必须大于2Hz
while not rospy.is_shutdown():
    if current_state.mode != "OFFBOARD":
        set_mode(custom_mode="OFFBOARD")
    
    pose.pose.position.z = 2.0  # 悬停高度2米
    local_pos_pub.publish(pose)
    rate.sleep()

5. 高级控制技巧

5.1 混合控制策略

结合位置和速度控制实现平滑轨迹:

// 位置环控制东向5米区域
if(current_pose.x < 5.0){
    cmd_vel.linear.x = 0.5 * (5.0 - current_pose.x);  // P控制
} else {
    cmd_vel.linear.x = 0;
}

5.2 异常处理机制

在室外测试时,我总会添加这些安全判断:

def check_safety():
    if battery.voltage < 14.8:
        rospy.logwarn("低电压警告!")
    if not global_position.health:
        rospy.logerr("GPS信号丢失!")

5.3 性能优化建议

  • 使用mavros.set_stream_rate服务调整数据流频率
  • 关闭不需要的话题订阅(如/mavros/distance_sensor
  • 在Jetson等嵌入式平台启用硬件加速:
    export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libgomp.so.1
    

6. 仿真与实机调试

6.1 Gazebo仿真配置

快速启动PX4+SITL:

cd ~/PX4_Firmware
make px4_sitl_default gazebo
roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"

6.2 实机调试技巧

  • 使用rqt_graph查看节点连接
  • 通过rostopic hz监测话题频率
  • 记录日志分析:
    rosbag record -O flight.bag /mavros/state /mavros/local_position/pose
    

7. 常见问题排坑指南

连接失败排查

  1. 检查fcu_url参数是否正确
  2. 确认飞控波特率匹配(常见921600/57600)
  3. 查看~/.ros/log中的错误日志

OFFBOARD模式退出的可能原因:

  • 控制指令发送间隔大于500ms
  • 飞控检测到EKF失效
  • RC遥控器切换到了其他模式

坐标系混乱的快速验证方法:

rostopic echo /mavros/local_position/pose
# 当无人机向东移动时,x坐标应增大
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐