跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++AI算法

无人机开发:MAVROS 安装与 ROS C++ 仿真实战指南

MAVROS 作为 ROS 与飞控通信的中间件,实现了无人机数据的实时传输与控制指令下发。详细梳理了 MAVROS 的安装流程及环境依赖,重点解析了 global、local、body 三种坐标系的转换逻辑,以及 state、position、odometry 等核心话题与服务接口的用法。结合 ROS C++ 代码示例,演示了如何配置板外模式、控制无人机起飞及解析位姿数据,为无人机自主导航开发提供基础参考。

数字游民发布于 2026/3/29更新于 2026/7/2330 浏览
无人机开发:MAVROS 安装与 ROS C++ 仿真实战指南

MAVROS 简介

MAVROS 是连接机器人操作系统(ROS)与飞控系统的关键中间件,通过标准化通信协议实现 ROS 节点与无人机的交互。它基于 MAVLink 轻量级通信协议,为 ROS 生态提供了与飞控(如 Pixhawk、ArduPilot、PX4 等)通信的统一接口,使开发者无需深入理解底层飞控协议,即可直接调用 ROS 的丰富工具链快速搭建无人机任务。

MAVROS 的核心功能包括双向数据传输:一方面,它订阅飞控的传感器数据(如 IMU、GPS、电池状态)并发布至 ROS 话题,供导航、感知等模块使用;另一方面,它接收 ROS 服务或动作指令,转换为 MAVLink 消息发送至飞控执行。此外,MAVROS 支持多种通信接口(串口、UDP、TCP),适配不同硬件场景,并提供参数配置服务,允许动态读写飞控参数。

坐标系示意图

MAVROS 安装

在 Ubuntu 环境下,可以通过以下命令安装 MAVROS 及其扩展包:

sudo apt-get install ros-noetic-mavros
sudo apt install ros-noetic-mavros-extras

GeographicLib 是一个开源的地理计算库,专门用于处理地球表面的高精度地理坐标计算。MAVROS 在处理无人机导航和地理空间数据时需要依赖 GeographicLib 提供的高精度地理计算功能,例如经纬度与局部坐标系的转换、大地水准面高度校正等。因此安装时还需运行脚本初始化数据集:

wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh
sudo chmod +x ./install_geographiclib_datasets.sh
sudo ./install_geographiclib_datasets.sh

MAVROS 基础知识

坐标系说明

MAVROS 中涉及多个坐标系,理解它们之间的转换关系至关重要:

  • global 系:一般由 GPS 定义,例如经纬高坐标系(WGS84)。
  • local 系:
    • ROS 端:采用 ENU 坐标系,通常由 MAVROS 发布的 map 坐标系表示。其坐标原点是 MAVROS 收到里程计信息时飞控所在的位置,规定 x 轴朝东、y 轴朝北、z 轴朝天。
    • 飞控端:PX4/ArduPilot 等内部使用 NED 坐标系。
  • body 系:
    • ROS 端:采用 FLU 坐标系(前左上),通常由 MAVROS 发布的 base_link 坐标系表示。
    • 飞控端:采用 FRD 坐标系(前右下)。

实际调试中,map 系和 Gazebo 里的坐标系方向通常保持一致。机身前方定义为东,即 map 系的 x 轴正方向,机身前进方向同时为 base_link 系的 x 轴正方向。从方向来看,ROS 端的 map 系和 base_link 系是一致的。

坐标系关系图

常用话题

/mavros/state

订阅 MAVROS 的状态数据,如连接状态、是否解锁、当前无人机模式等。

  • connected:检测无人机与地面站的物理连接状态。
  • armed:监控无人机电机是否解锁,只有 armed=true 时表示电机已解锁,无人机可飞行。
  • mode:常用模式包括 MANUAL(手动)、POSCTL(位置控制)、ALTCTL(高度控制)、OFFBOARD(板外模式)、MISSION(自动任务)、LOITER(悬停)、RTL(返航)、LAND(降落)、TAKEOFF(起飞)。
  • system_status:无人机整体系统状态。

数据类型:mavros_msgs/State

/mavros/setpoint_position/local

定点飞行话题。注意只有 position 生效,不控制姿态 orientation。position 是相对于 ROS 端 local 坐标系的坐标。

数据类型:geometry_msgs/PoseStamped

/mavros/local_position/odom

提供无人机在 ROS 端坐标系的位姿和速度里程计信息。位姿信息是相对于 ROS 端 local 坐标系的坐标,速度信息是相对于 ROS 端 body 坐标系的坐标。

数据类型:nav_msgs/Odometry

/mavros/setpoint_raw/local

主要用于设置无人机各轴的加速度或推力。coordinate_frame 一般设置为 FRAME_LOCAL_NED,但话题数据都是在 ROS 端坐标系下,MAVROS 会自动进行一次坐标变换。type_mask 用于指定忽略哪些控制量(如只控制加速度则忽略位置和速度)。

数据类型:mavros_msgs::PositionTarget

/mavros/setpoint_raw/attitude

用于设置无人机的姿态、推力和各轴角速度。

数据类型:mavros_msgs::AttitudeTarget

常用服务

/mavros/cmd/arming

用于设置无人机的上锁或解锁状态。value 为 true 解锁,false 上锁。

数据类型:mavros_msgs/CommandBool

/mavros/set_mode

用于设置无人机飞控的飞行模式。ROS 端控制要切换到 OFFBOARD 模式。

数据类型:mavros_msgs/SetMode

仿真案例

设置无人机板外模式并解锁

在实际编写代码时,我们需要先建立服务客户端,然后循环检查状态并发送请求。这里有个细节要注意,切换模式和解锁之间最好有短暂延时,避免飞控来不及响应。

this->arm_client_ = this->nh_.serviceClient<mavros_msgs::CommandBool>("mavros/cmd/arming");
this->set_mode_client_ = this->nh_.serviceClient<mavros_msgs::SetMode>("mavros/set_mode");

mavros_msgs::SetMode offboardMode;
offboardMode.request.custom_mode = "OFFBOARD";
mavros_msgs::CommandBool armCmd;
armCmd.request.value = true;

ros::Time lastRequest = ros::Time::now();
while(ros::ok()) {
    if(this->mavros_state_.mode != "OFFBOARD" && (ros::Time::now() - lastRequest > ros::Duration(5.0))) {
        if(this->set_mode_client_.call(offboardMode) && offboardMode.response.mode_sent) {
            cout << "Offboard mode enabled." << endl;
        }
        lastRequest = ros::Time::now();
    } else {
        if(!this->mavros_state_.armed && (ros::Time::now() - lastRequest > ros::Duration(5.0))) {
            if(this->arm_client_.call(armCmd) && armCmd.response.success) {
                cout << "Vehicle armed." << endl;
            }
            lastRequest = ros::Time::now();
        }
    }
    r.sleep();
}

无人机起飞到指定高度

假设要飞到 1 米的高度,我们需要发布位置目标。注意 frame_id 必须设为 map,且高度值 z 为正。

this->position_pub_ = this->nh_.advertise<geometry_msgs::PoseStamped>("/mavros/setpoint_position/local", 1000);
geometry_msgs::PoseStamped ps;
ps.header.frame_id = "map";
ps.header.stamp = ros::Time::now();
ps.pose.position.x = this->odom_.pose.pose.position.x;
ps.pose.position.y = this->odom_.pose.pose.position.y;
ps.pose.position.z = 1.0;
ps.pose.orientation = this->odom_.pose.pose.orientation;
this->position_pub_.publish(ps);

获取无人机位姿并更新状态

订阅里程计话题后,需要解析 Pose 和 Twist 信息。这里利用 Eigen 库将四元数转换为旋转矩阵,以便后续进行坐标变换计算。

this->odom_sub_ = this->nh_.subscribe<nav_msgs::Odometry>("/mavros/local_position/odom", 1000, &flightBase::odomCB, this);

void flightBase::odomCB(const nav_msgs::Odometry::ConstPtr &odom) {
    this->odom_ = *odom;
    this->curr_position_(0) = this->odom_.pose.pose.position.x;
    this->curr_position_(1) = this->odom_.pose.pose.position.y;
    this->curr_position_(2) = this->odom_.pose.pose.position.z;

    Eigen::Vector3d curr_vel_body(this->odom_.twist.twist.linear.x,
                                  this->odom_.twist.twist.linear.y,
                                  this->odom_.twist.twist.linear.z);
    Eigen::Vector4d orientation_quat(this->odom_.pose.pose.orientation.w,
                                     this->odom_.pose.pose.orientation.x,
                                     this->odom_.pose.pose.orientation.y,
                                     this->odom_.pose.pose.orientation.z);
    Eigen::Matrix3d orientation_rot = quat2RotMatrix(orientation_quat);
    this->curr_vel_ = orientation_rot * curr_vel_body;
}

目录

  1. MAVROS 简介
  2. MAVROS 安装
  3. MAVROS 基础知识
  4. 坐标系说明
  5. 常用话题
  6. /mavros/state
  7. /mavros/setpoint_position/local
  8. /mavros/local_position/odom
  9. /mavros/setpoint_raw/local
  10. /mavros/setpoint_raw/attitude
  11. 常用服务
  12. /mavros/cmd/arming
  13. /mavros/set_mode
  14. 仿真案例
  15. 设置无人机板外模式并解锁
  16. 无人机起飞到指定高度
  17. 获取无人机位姿并更新状态
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 多模态大模型原理与跨模态应用实战
  • OpenClaw 飞书 AI 机器人搭建指南
  • 多模态大模型原理与跨模态应用实战
  • Python 遍历字典的 8 种常用方法
  • 基于 Higress 将 REST API 转换为 MCP Server 的配置实践
  • 移动端部署 Stable Diffusion 开源方案与使用指南
  • 大语言模型综述:核心能力与局限性分析
  • 小型无人机轻量化与成本控制方法
  • 高鋒集團合夥人黃俊瑯:以資本與生態賦能傳統企業 Web3 轉型
  • 使用 OpenClaw 与飞书搭建服务器运维机器人
  • 流处理、实时分析与 RAG 驱动的 Python ETL 框架:构建智能数据管道 (上)
  • Python 数据分析通用全流程指南
  • 常见 AI 模型与编程术语美式发音速查表
  • Python 调用高德地图 MCP 服务查询天气示例
  • 大模型落地应用:企业智能化转型的策略与实践
  • LFM2-1.2B:面向边缘设备的混合模型整理
  • GitHub 学生认证与 PyCharm 配置 Copilot 流程指南
  • 快手 AI 研发范式演进:从 Copilot 到 Agentic 的组织级重构
  • Vue 实例劫持突破 Web 编辑器粘贴限制
  • Python Tkinter 集成 DocsGPT API 实现代码编辑器

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online