基于Pixhawk和ROS搭建自主无人车(四):MAVROS详解篇

参考

1. Pixhawk 详解

  • 3DR Pixhawk 1(已停产)自动驾驶仪是一款流行的通用飞行控制器,基于 FMUv2 开放硬件设计(结合了 PX4FMU + PX4IO 的功能),它在 NuttX 操作系统上运行 PX4/APM 固件
    • PX4FMU 负责姿态解算等算法的执行,PX4IO 负责管理各个外设接口
    • NuttX 是一个实时操作系统 (RTOS),主要管理标准是 Posix 和 ANSI 标准
    • 自动驾驶仪具有统一的控制框架,大多采用比例-积分-微分(Proportion-Integral-Derivative,PID)控制器,对于不同机型只需调整一些参数即可

1.1 主要参数/配置

  • 主片上系统 STM32F427
    • CPU:180 MHz ARM Cortex M4,带单精度 FPU
    • RAM:256 KB SRAM(L1)
  • 故障保护片上系统 STM32F100
    • 当主处理器失效的时候可以进行手动恢复
    • CPU: 24 MHz ARM Cortex M3
    • RAM: 8 KB SRAM
  • 电源模块输入/ USB 电源输入:4.8-5.4V
  • Invensense MPU6000 3 轴加速度计/陀螺仪
  • MEAS MS5611 气压计

常用外接设备

  • 安全开关和蜂鸣器:蜂鸣器起到状态指示的作用,如:飞控板黄灯闪烁且蜂鸣器快速重复响时,这表示电池故障保护功能己经激活,黄灯和蓝灯闪且三高一低响吋,提示 GPS 数据信息异常;长按安全开关才可解锁电机,去执行相应的任务,此时安全开关指示灯从闪烁变为常亮
  • 遥控器和接收机:遥控器可以控制车辆状态(速度、方向、偏航、俯仰等),也可以实现飞行模式的切换;接收机是用于接收遥控器指令,然后发送给飞控系统执行任务
  • 电源模块:将电池电压转化为 5V 为飞控板供电,还可监测电池电压,电压过低时通过地面站报警
  • GPS 模块:接收卫星信息,从而获取无人车当前的位置、速度等状态信息,车辆在巡航模式、返航模式的顺利实现都需要 GPS 来保障
  • 数据传输模块:用来连接 Pixhawk 飞控和地面站,是实现数据通信的桥梁,行驶过程中 Pixhawk 的各种状态信息,可以通过数传模块将数据传输到地面站上。数传模块一端接入计算机(地面站软件),另一端接入自驾仪(Pixhawk),采用一定协议(MAVLink)进行数据传输,从而保持自驾仪与地面站之间的双向通信
  • 电调:根据接收自驾仪传输的 PWM 信号来控制电机转速。由于自驾仪输出的 PWM 信号非常微弱无法直接驱动无刷直流电机,因此需要电调对信号进行处理和放大来驱动电机,无刷电调还可以充当一个换相器,把直流电源转化为可以供给无刷直流电机使用的三相交流电源,除此之外,还可实现电池保护和启动保护

1.2 端口详解

  • 1、Spektrum/DSM receiver
    • 将 Spektrum DSM 信号转换为可用于 Pixhawk 2.4.8 的 PWM 信号,因为 Pixhawk 2.4.8 上的 PWM 输入必须接收来自遥控器或接收机的 PWM 信号
  • 2-3、Telemetry(遥测)
    • 用于和地面站通信的接口,可用来传输飞控的状态、传感器数据、GPS 数据、电池电量、飞行日志等信息,通过这个接口,地面站可实时监测和控制飞行器,如:调整姿态、飞行模式、飞行高度等
    • 常见的 Telemetry 接口包括 UART、USB、WiFi、蓝牙等,根据不同的需求和使用环境可以选择不同的接口
  • 4、USB:USB 通信端口
  • 5、SPI(Serial Peripheral Interface)串行通信接口
    • SPI 通信协议是一种高速数据传输协议,可实现飞控与其他设备之间的快速数据传输
    • 该接口主要用于连接 SPI 设备(如 IMU 和外部飞行控制器)
  • 6、Power(电源)
    • 电源连接端口,给飞控供电的端口
  • 7、SWITCH(开关)
    • 可编程的 GPIO(通用输入/输出)端口之一,可通过遥控器、地面站或其他外部设备控制
    • 用途(1)飞行模式切换(2)ARM/解锁(3)其他:相机快门控制、灯光开关等
  • 8、BUZZER(蜂鸣器)
    • 可编程的音响输出端口,在 Pixhawk 上,buzzer 端口通常用于发出飞行器状态提示音和警告声,例如飞行器起飞和降落的音效、电池电量低的提示音等
  • 9、Serial4/5(扩展串口)
    • 用于连接其他外部设备,如 GPS、气压计、遥控器等
    • 这两个串口是带有硬件流控制的 UART 接口,支持多种协议,例如 Mavlink、FrSky 等
    • Serial4 默认为 GPS 接口,Serial5 默认为第 5 个 RC 通道
  • 10、GPS
    • 用于连接 GPS 模块,一般采用 UART 协议进行通信,也可以连接支持 NMEA 协议的 GPS 模块
  • 11、CAN(Controller Area Network)串行通信总线标准接口
    • 用于多种类型的 CAN 设备(如:遥控器、电调、电机等)
  • 12、I2C(Inter-Integrated Circuit)
    • 串行通信协议,在 Pixhawk 中,I2C 接口通常用于连接外部磁罗盘、气压计、光流传感器等,它具有简单、高效、可靠、使用线缆数量少等优点,常用于连接较短距离的设备
  • 13、ADC 6.6V(Analog-to-Digital Converter)模拟数字转换器
    • ADC 的作用是将模拟信号转换为数字信号,在 Pixhawk 中,ADC 6.6V 端口通常用于接收电池电压等模拟信号,以便飞控可以监测电池电量并作出相应的反应,如果连接了适当的传感器,ADC 6.6V 端口也可以用于监测其他模拟信号,例如温度、气压等
  • 14、ADC 3.3V(Analog-to-Digital Converter)模拟数字转换器
  • 15、LED
    • LED 指示灯,可以根据灯的颜色、闪烁状态判断飞控当前情况
  • 16、RC IN 端口
    • 仅用于连接 RC 接收机并给其供电,不可连接任何执行器、电源或电池
      在这里插入图片描述

1.3 端口引脚排列

在这里插入图片描述

2. PX4 详解

  • PX4 是 Pixhawk 的原生固件,是专门针对 Pixhawk 硬件开发的,它的核心是 Nuttx 实时 ARM 系统,PX4 固件支持直升机、固定翼、四旋翼、六旋翼和地面车等多种机型,无人车主要使用 PX4 Rover 固件

2.1 PX4 软、硬件构成

  • Pixhawk 飞控运行 PX4 飞行堆栈,而任务计算机则提供避障和规划等高级功能。这两个系统使用串行或 IP 链路连接,通常使用 MAVLink 协议通信,与地面站和云端的通信通常通过任务计算机进行路由(如 MAVLink 路由)。PX4 系统通常在任务计算机上运行 Linux 操作系统(PX4/PX4-Avoidance 项目提供专为 Linux 设计的基于 ROS 的避障库)

在这里插入图片描述

2.2 PX4 系统架构概述

  • PX4 系统架构由两个主要层组成
    • 飞行控制层(估计和飞行控制系统),中间层(通用机器人层,可以支持任何类型的自主机器人,提供内部/外部通信和硬件集成)
    • 模块之间的通信以 “发布消息-订阅消息” 的形式进行,这种方式被称作 uORB 消息机制(异步)
      • 在通信过程中,发送者只负责发送数据,而不关心数据由谁接收,也不关心接收者是否能将所有数据都接收到;而对接收者来说,并不关心数据是由谁发送的,也不关心在接收过程中是否能将所有数据都接收到
    • PX4 外部通信总线是 MAVLink,内部通信总线是 uORB

在这里插入图片描述

2.2.1 uORB 消息机制
  • uORB(Micro Object Request Broker,微对象请求代理器)是一种用于进程/线程问进行异步发布-订阅的消息机制,使用 uORB 数据传输形式可以实现

    • 系统的实时响应,即:当有新的有效数据时系统能够立即更新
    • 系统的操作和通信可以完全并行运行
    • 系统组件能够在线程安全的方式下从任何地方获取数据并使用
    • 即使是在运行中,也可以实现功能模块的快速替换
  • uORB 是 PX4 系统中非常重要的模块,负责整个系统的数据传输任务,PX4 中所有消息都有对应的 uORB 消息名称

    • 所有的传感器数据、GPS、PPM 信号等都要从芯片获取后通过 uORB 进行传输到各个模块进行计算处理
    • uORB 是一套跨进程的 IPC 通讯模块,在 Pixhawk 中,所有的功能被独立以进程模块为单位进行实现并工作,而进程间的数据交互就尤为重要,必须符合实时、有序的特点
  • uORB 实际上是多个进程打开同一个设备文件,进程间通过此文件节点进行数据交互和共享。进程通过命名的总线交换的消息称之为主题(topic),在 Pixhawk 中,一个主题仅包含一种消息类型(数据类型)。每个进程可以订阅或者发布主题,可以存在多个发布者,或者一个进程可以订阅多个主题,但是一条总线上始终只有一条消息

2.2.2 飞行控制层
  • 飞行控制层主要是导航和自动控制算法的合集,包括运行模式切换、姿态控制、姿态估计等功能模块,下图展示了飞行控制层的简要运行流程,它包含从传感器、遥控输入和导航器到电机或伺服控制(执行器)的完整控制流程
    • 其中状态估计器使用一个或多个传感器作为输入,通过对传感器信息进行融合计算来获得车辆的运行状态
    • 这里的控制器包括位置控制器和姿态速度控制器两部分,控制器以当前的状态和设定值作为输入,通过调整过程变量的数值,使当前状态与设定值匹配
    • 以位置控制器为例,用设定的目标点和当前位置为输入,那么位置控制器的输出就是使无人车前往目标点的转向角度和速度值
    • 混控器用来将接收到的强制命令(如右转)转换为单独的电机指令,并确保不超过限制,如舵机的转向角度和电机的最大速度等
      在这里插入图片描述
2.2.3 中间层
  • 中间层是系统的基础部分,主要由传感器驱动程序、uORB 消息机制、MAVLink 通信协议、内部数据库维护、参数保存等几部分组成,除此之外中间层还有一个模拟模块,该模块可以实现 PX4 代码在桌面操作系统上的运行,从而实现在虚拟环境下车辆运行状态的模拟

3. ArduPilot(APM)详解

3.1 简介

  • ArduPilot Mega(APM)是一个值得信赖的自主无人驾驶车辆系统,提供一套全面的工具,几乎适用于任何车辆、无人机、潜艇、气球等设备,在 2007 年由 DIY Drones 推出,是在开源飞控还没有成型前,最早达到成熟阶段的开源硬件项目
    • APM 基于 Arduino 的开源平台,处理核心使用 Arduino,16 位 mega 系列单片机对硬件做出了很多改进
    • ArduPilot 不制造任何硬件,但 ArduPilot 固件可在各种不同的硬件上工作,以控制所有类型的无人驾驶车辆
    • APM 是硬件平台,Ardupilot 是 APM 的固件(简称 APM 固件)

    PX4 开源协议是 BSD 3-clause license(修改代码可以不开源),而 ArduPilot 是基于 GPL-V3 开源协议(修改了代码必须开源出来),规避方法是 Companion Computer 通过标准协议接口进行解耦以实现商用(使用配套计算机运行封闭源代码,以方便将 ArduPilet 集成到系统中,或者添加更高级别的功能,使自己与竞争对手区别开来)
    在这里插入图片描述

3.2 基本架构

  • ArduPilot 的基本架构分为 5 个主要部分
    • 车辆代码:定义每种车辆类型的固件。目前有 6 种车辆类型:飞机、直升机、漫游者、潜艇、飞艇和天线追踪器
    • 共享库:这些库是在所有车辆类型之间共享,这些库包括传感器驱动程序、姿态和位置估计(又名 EKF)和控制代码(即 PID 控制器)
    • 硬件抽象层(AP_HAL):制作 ArduPilot 的方式,可移植到许多不同的平台
    • 工具目录:杂项支持目录,例如,tools/autotest 提供 autotest.ardupilot.org 站点后面的自动测试基础结构,以及 tools/Replay 提供日志回放实用程序
    • 外部支持代码(即 MAVLink、DroneKit):在某些平台上,需要外部支持代码来提供额外的 功能或板级支持。目前,外部依赖包括
      • PX4NuttX - Pixhawk 板上使用的核心 NuttX RTOS
      • PX4Firmware - Pixhawk 板上使用的基础 PX4 中间件和驱动程序
      • uavcan - ArduPilot 中使用的 uavcan CANBUS 实现
      • mavlink - MAVLink 协议和代码生成器

在这里插入图片描述

4. MAVLink 详解

4.1 定义与特点

  • MAVLink 是一个轻量级的、只由头文件组成的信息集编库,在串口通讯基础上开发出的更高层的开源通讯协议
    • MAVLink 协议最早由苏黎世联邦理工学院计算机视觉与几何实验组的 Lorenz Meier 于 2009 年发布,并遵循 LGPL 开源协议
    • MAVLink 通信协议已经广泛应用在飞控平台上,同时也用于在 IMU 和微控制器之间进行通信
    • MAVLink 为小型飞行器和地面站通讯时常常用到的数据制定了一种发送和接收的规则并进行校验功能
    • 主要特点:高效率、高可靠性、允许多个并发系统、具备消息内容检查、消息丢失检测的功能等

4.2 版本确定

  • 主要版本

    • MAVLink 2.0:当前/推荐的主要版本,2017 年初被主要用户采用
    • MAVLink 1.0:2013 年左右广泛采用,许多传统外设仍在使用

    MAVLink 2.0 C/C++ 和 Python 库向后兼容 MAVLink 1.0(支持两种协议)

  • 版本确定

    • 可以根据 MA​​V_PROTOCOL_CAPABILITY_MAVLINK2 标志检查 AUTOPILOT_VERSION.capability,以验证 MAVLink 2 支持
    • PROTOCOL_VERSION.version 包含 MAVLink 版本号乘以 100
      • v1.0 为 100
      • v2.3 为 203
    • HEARTBEAT.mavlink_version 字段包含次版本号
    • 主要版本可以从数据包开始标记字节确定
      MAVLink 1:0xFE
      MAVLink 2:0xFD

4.3 MAVLink 消息格式

  • MAVLink 消息帧结构(MAVLink 1)

    • STX:起始标志位,这个标志位在 MAVLink 消息帧接收端进行消息解码时有用处
    • LEN:PAYLOAD 的字节长度,范围从 0 到 255 之间,在 MAVLink 消息帧接收端可以用它和实际收到的有效载荷的长度比较,以验证有效载荷的长度是否正确
    • SEQ:本次消息帧的序号,每次发完一个消息,这个字节的内容会加 1,加到 255 后会从 0 重新开始,这个序号用于 MAVLink 消息帧接收端计算消息丢失比例用的,相当于是信号强度
    • SYS:发送本条消息帧的设备系统编号,使用 Pixhawk 刷 PX4 固件时默认的系统编号为 1,用于 MAVLink 消息帧接收端识别是哪个设备发来的消息
    • COMP:发送本条消息帧的设备单元编号,使用 Pixhawk 刷 PX4 固件时默认的单元编号为 50,用于 MAVLink 消息帧接收端识别是设备的哪个单元发来的消息
    • MSG(MSGID):有效载荷中消息包的编号,这个字节很重要,MAVLink 消息帧接收端要根据这个编号来确定有效载荷里到底放了什么消息包,并根据编号选择对应的方式来处理有效载荷里的信息包
    • PAYLOAD:有效载荷,这个字节很重要,要用到的消息数据存放在这里
    • 最后两个字节是 16 位校验位,CKB 是高八位,CKA 是低八位,校验码由 CRC16 算法得到,算法将整个消息(从起始位开始到有效载荷结束,还要额外加上个 MAVLINK_CRC_EXTRA 字节)进行 CRC16 计算,得出一个 16 位的校验码;作用:当无人车和地面站使用不同版本的 MAVLink 协议时,双方计算得到的校验码会不同,从而无法一起正常工作,可以避免由于不同版本间通讯时带来的问题
      在这里插入图片描述
  • MAVLink 中有两个重要的组成部分:MSGID 和 PAYLOAD

    • MSGID 是对 PAYLOAD 中的内容进行编号标记,PAYLOAD 则存放的是消息内部的负载信息
    • 消息有许多种类型,在官网的网页中中以蓝色的 “#” 加数字的方式来表示消息的编号如 “#0”,其中心跳包消息是飞控中最重要的 MAVLink 消息,只有它是必选消息

4.4 常用 MAVLink 消息解析

4.4.1 #0)心跳包
  • 用来表明发出该消息的设备是活跃的,飞行器和地面站都会发出这个信号(一般以 1Hz 发送),地面站和飞行器会根据是否及时收到了心跳包来判断是否和飞行器或地面站失去了联系
    • 参数一:代表飞行器的型号,可以在 MAV_TYPE 中看到无人车用 10 表示,这个数据就是从地面车辆的固件中发送出来的
    • 参数二:自驾仪(即通常所说的飞控)类型,比如 APM,Pixhawk 等飞控
    • 参数三:基本模式,表示车辆当前的飞行状态。在 Pixhawk 中基本模式有两种,分别是用户模式和基本模式(在这里代表非用户模式)。其中基本模式又分为自动模式(auto)、位置控制模式和手动模式(manual),通常使用用户模式
    • 参数四:用户模式
    • 参数五:系统状态,standby 表示还没解锁的状态,active 表示已经解锁准备起飞的状态
    • 参数六:MAVLink 版本

在这里插入图片描述

在这里插入图片描述

4.4.2 #76)命令
  • 发送长命令,一般是用于地面站发送给飞控
    • 目标系统(命令的接收方,就是目标系统编号 sysid)
    • 目标单元(命令的接收单元,就是目标单元编号 compid)
    • command 数据是这条命令的编号,用于区别不同的命令
    • confirmation 是否需要收到命令后回复确认信号

    查询 MAV_CMD 指令,其中第 176 号命令 MAV_CMD_DO_SET_MODE:用于改变飞行器的飞行模式,第一个参数就是设置飞控的 base_mode,第二个是设置 custom_mode

在这里插入图片描述

在这里插入图片描述

4.5 地面站与飞控通信

  • 飞控与地面站之间的通讯是由 MAVLink 模块、commander 模块、navigator 模块等完成

    • commander 中包含常用的飞行控制命令切换的定义
    • navigator 中包含着导航相关的数据
    • 通过 MAVLink 模块将 MAVLink 数据包转换成 uORB 的数据结构,这种方式使系统不用过分依赖 MAVLink,并且使通讯架构更加清晰,系统中传感器数据和当前状态信息都通过 MAVLink 模块发送给地面站
      在这里插入图片描述
  • 地面站和飞控的通信流程

    • 当飞行控制器连接上地面站后,会主动向地面站发送心跳包、飞行器姿态、系统状态和遥控器信号等组成的数据流。不同的数据用不同的频率发送,如心跳包是 1Hz,姿态信息会快些,Pixhawk 控制器用数传模块连接地面站时发送数据的频率为 7-8Hz。通常地面站会在刚连接上飞行控制器时发送命令,请求飞行控制器传回所有参数,飞行控制器根据自己的情况判断是否接受地面站的请求,同时地面站也会根据用户的操作发送相应的 MAVLink 消息给飞控

5. ROS 通信机制

ROS 常用的三种通信机制中,参数服务器(Parameter) 是一种数据共享机制,可以在不同的节点之间共享数据;话题通信(Topic)与服务通信(Service) 是在不同的节点之间传递数据的,二者的实现流程是比较相似的,都是涉及到四个要素

  • 要素 1:消息的发布方/客户端 (Publisher/Client)
  • 要素 2:消息的订阅方/服务端 (Subscriber/Server)
  • 要素 3:话题名称 (Topic/Service)
  • 要素 4:数据载体 (msg/srv)

6. MAVROS 详解

6.1 定义

  • 官方定义:MAVLink extendable communication node for ROS with proxy for Ground Control Station(用于 ROS 的 MAVLink 可扩展的通信节点,带有地面控制站代理)
  • 通俗定义:一个在 ROS 下的 MAVLink 软件适配包,它的作用其实就是将 MAVLink 协议放到 ROS 框架里去解析,统一使用 ROS 框架,publish、subscribe 话题进行操作

6.2 节点解析(Node)

6.2.1 mavros_node
  • 作用:主要通信节点
  • 订阅的话题
    • mavros_msgs/Mavlink(Mavlink 流到自动驾驶仪)
  • 发布的话题
    • mavros_msgs/Mavlink(来自自动驾驶仪的 Mavlink 流)
    • diagnostic_msgs/DiagnosticStatus(诊断状态信息)
  • 参数
    • ~system_id (int, default: 1)
      • MAVLink 节点系统 ID
    • ~component_id (int, default: 240)
      • MAVLink 节点组件 ID
    • ~target_system_id (int, default: 1)
      • 飞控 MAVLink 系统 ID
    • ~target_component_id (int, default: 1)
      • 飞控 MAVLink 组件 ID
    • ~startup_px4_usb_quirk (bool, default: false)
      • Define apply quirk for PX4 or not.
      • quirks for PX4 是指围绕基于 PX4 的系统运行过程中遇到的特定硬件或软件问题,配置和修改软件行为或设置的过程
    • ~plugin_blacklist (string[], default: [])
      • 别名黑名单(glob 语法,示例:[‘rc*’])
    • ~plugin_whitelist (string[], default: [])
      • 别名白名单(glob 语法,覆盖黑名单)
    • ~fcu_url (string, default: /dev/ttyACM0:57600)
      • 飞控连接 URL
    • ~fcu_protocol (string, default: v2.0)
      • MAVLink 协议版本,支持:“v1.0”、“v2.0”
    • ~gcs_url (string, default: udp://@)
      • GCS 桥连接网址
6.2.2 gcs_bridge
  • 作用:附加代理(旧名称 ros_udp)
  • 订阅的话题
    • mavros_msgs/Mavlink(来自自动驾驶仪的 Mavlink 流)
  • 发布的话题
    • mavros_msgs/Mavlink(Mavlink 流到自动驾驶仪)
  • 参数
    • ~gcs_url (string, default: udp://@)
      • 连接网址
6.2.3 event_launcher
  • 作用:监听解锁/锁定状态、触发事件并运行程序
  • 订阅的话题
    • mavros/state(解锁/锁定事件的来源)
  • 服务端(服务通信)
    • <trigger_event>(std_srvs/Trigger)
    • 可选事件触发器,可以使用配置创建多个服务
  • 参数
    • ~<event_name>/service (string)
      • 创建由服务(参数值)触发的事件(名称为 <event_name>)
    • ~<event_handler>/event (string[])
      • 触发该处理程序的事件列表
    • ~<event_handler>/action (string[])
      • 对相应事件执行的操作列表,支持的操作:运行、停止
    • ~<event_handler>/shell (string)
      • 发生事件时运行/停止的命令
    • ~<event_handler>/logfile (string, default: “”)
      • 用于保存命令的 stdout 和 stderr 输出的文件,可选的

6.3 安装/使用

6.4 常用命令(Command)

  • mavcmd
    • mavcmd [-h] [-n MAVROS_NS] [-v] [–wait]
    • 用于向 MAVLink 设备发送命令的命令行工具
  • mavftp
    • mavftp [-h] [-n MAVROS_NS] [-v]
    • MAVLink-FTP 的文件操作工具,只用于 PX4
  • mavparam
    • mavparam [-h] [-n MAVROS_NS] [-v]
    • 用于从 MAVLink 设备获取、设置参数的命令行工具
  • mavsafety
    • mavsafety [-h] [-n MAVROS_NS] [-v]
    • 用于在 MAVLink 设备上操作安全的命令行工具
  • mavsetp
    • mavsetp [-h] [-n MAVROS_NS] [-v]
    • 用于通过设定点控制设备的命令行工具
  • mavsys
    • mavsys [-h] [-n MAVROS_NS] [-v] [–wait]
    • 更改 MAVLink 设备上的模式和速率
  • mavwp
    • mavwp [-h] [-n MAVROS_NS] [-v]
    • 用于在 MAVLink 设备上操纵任务的命令行工具

6.5 插件接口(Plugin)

  • 官方定义:由 mavros_node 加载的标准通信插件集
  • 通俗定义:plugin 中文意思是插件(对应的消息处理插件),插件的意思是指可以自由添加或删除而不影响 MAVROS 本体程序的运行

    类比 ROS 中 plugin 插件,是指是将 C++ 类通过 pluginlib 进行封装,编译为动态库(.so 文件),再通过 pluginlib 提供的加载接口在主程序中进行运行时加载操作

3dr_radio
  • 作用:发布无线电状态,用于 APM and PX4 的 3DR Radio 数传
  • 发布的话题:/mavros/radio_status
  • 消息类型:mavros_msgs/RadioStatus
actuator_control
  • 作用:向飞控发送执行器命令
  • 订阅的话题:mavros_msgs/ActuatorControl
  • 消息类型:mavros_msgs/ActuatorControl
imu_pub
  • 作用:发布 IMU 的状态
  • 发布的话题:/mavros/imu/data、/mavros/imu/data_raw 等
local_position
  • 作用:在 TF 和 PoseStamped 话题中发布 LOCAL_POSITION_NED
  • 发布的话题:/mavros/local_position/pose、/mavros/local_position/velocity
  • 消息类型:geometry_msgs/PoseStamped、geometry_msgs/TwistStamped
  • 参数
    • 消息的frame_id:/mavros/local_position/frame_id
    • TF 发送开关:/mavros/local_position/tf/send
    • TF 的原始 frame_id:/mavros/local_position/tf/frame_id
    • TF 的子 frame_id:/mavros/local_position/tf/child_frame_id
rc_io
  • 作用:发布 RC 接收器输入
  • 订阅的话题:/mavros/rc/override
    • 向飞控发送 RC 重载消息, APM 需要设置飞控参数 SYSID_MYGCS 以匹配 MAVROS 系统 ID,由于缺乏安全机制,不建议用于自动控制,使用设定点插件和 OFFBOARD 模式之一
  • 发布的话题:/mavros/rc/in(发布 RC 输入(以原始毫秒为单位))、/mavros/rc/out(发布飞控伺服输出)
setpoint_position
  • 作用:使用 SET_POSITION_TARGET_GLOBAL_INT 或 SET_POSITION_TARGET_LOCAL_NED 发送位置设定值
  • 订阅的话题:/mavros/setpoint_position/global、/mavros/setpoint_position/local、/mavros/setpoint_position/global_to_local
setpoint_raw
  • 作用:设置目标(视觉估计为 local,GPS 为 global,气压计为 attitude)
  • 订阅的话题:/mavros/setpoint_raw/local、/mavros/setpoint_raw/global、/mavros/setpoint_raw/attitude
  • 发布的话题:/mavros/setpoint_raw/target_local、/mavros/setpoint_raw/target_global、/mavros/setpoint_raw/target_attitude
setpoint_velocity
  • 作用:将速度设定值发送至飞控
  • 订阅的话题:/mavros/setpoint_velocity/cmd_vel_unstamped
vision_pose_estimate
  • 作用:向 PX4 发送视觉里程计,用于位姿融合
  • 订阅的话题:/mavros/vision_pose/pose
  • 消息类型:geometry_msgs/PoseStamped

6.6 黑白名单设置

  • MAVROS 有一个专门的插件列表 mavros_plugins.xml,用于 MAVROS 自动加载插件,运行的时候加载进来,插件黑名单的意思,就是不加载哪些插件。px4_pluginlists.yaml 和 apm_pluginlists.yaml 是 mavros 设置黑白插件名单的配置文件(想要用哪个插件,就必须放在白名单中
    # apm_pluginlists.yaml 文件
    /mavros/**:
      ros__parameters:
        plugin_denylist:
          # common
          - actuator_control
          - ftp
          - hil
          # extras
          - altitude
          - debug_value
          - image_pub
          - px4flow
          - vibration
          - vision_speed_estimate
          - wheel_odometry
    
        # plugin_allowlist:
        #   - 'sys_*'
    

在这里插入图片描述

在这里插入图片描述

6.7 ROS 和 PX4/APM 通信

  • 如需进行上层开发则在 ROS 中编写代码,订阅或发布 MAVROS 话题(Plugin 插件),从而订阅实车状态并发布实车的期望位置或期望速度,PX4/APM 飞控追踪此期望运动,无论上层程序多么复杂,最后都是分解成为控制实车的位置、速度或姿态等,再通过 MAVROS 发布给飞控进行跟踪
    在这里插入图片描述
ROS是一种用于机器人开发的开源框架,而无人车自主跟随基于视觉的仿真教程,可以让我们了解如何使用ROS框架实现无人车自主跟随功能。本教程将提供以下步骤: 1. 安装ROS 2. 下载并安装仿真环境 3. 配置ROS工作环境 4. 编写ROS节点 5. 测试程序 以下是详细的步骤说明: 1. 安装ROS 在开始之前,您需要先安装ROS。您可以按照ROS官方网站上的说明进行安装: http://wiki.ros.org/ROS/Installation 2. 下载并安装仿真环境 在本教程中,我们将使用Gazebo仿真环境和RViz视觉化工具。您可以使用以下命令安装: ```bash sudo apt-get install ros-<distro>-gazebo-ros-pkgs ros-<distro>-gazebo-ros-control sudo apt-get install ros-<distro>-rviz ``` 其中,`<distro>`应该替换为您正在使用的ROS版本,例如“kinetic”或“melodic”。 3. 配置ROS工作环境 在开始编写ROS程序之前,您需要设置ROS工作环境。请按照以下步骤执行: ```bash mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make source devel/setup.bash ``` 这将创建一个名为“catkin_ws”的工作空间,并为ROS设置必要的环境变量。 4. 编写ROS节点 在此步骤中,我们将编写ROS节点以实现无人车自主跟随功能。您可以使用以下命令在“src”文件夹中创建一个新的ROS包: ```bash cd ~/catkin_ws/src catkin_create_pkg follow_car rospy ``` 这将创建一个名为“follow_car”的ROS包,并使用Python编写ROS节点。现在,您可以使用文本编辑器打开“follow_car”文件夹中的“src”文件夹,并创建一个名为“follow_car_node.py”的新文件。请在该文件中添加以下代码: ```python #!/usr/bin/env python import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge import cv2 class FollowCar: def __init__(self): self.bridge = CvBridge() self.image_sub = rospy.Subscriber('/camera/image_raw', Image, self.callback) def callback(self, data): cv_image = self.bridge.imgmsg_to_cv2(data, 'bgr8') # 在此添加跟随功能代码 cv2.imshow('Follow Car', cv_image) cv2.waitKey(1) if __name__ == '__main__': rospy.init_node('follow_car_node') fc = FollowCar() rospy.spin() ``` 上述代码使用OpenCV库接收摄像头图像,并在回调函数中实现跟随功能。您可以按照您的需求更改代码以实现想要的跟随方式。 5. 测试程序 现在,您可以使用以下命令运行ROS节点: ```bash roscore ``` 在新的终端中,使用以下命令启动Gazebo仿真环境: ```bash roslaunch gazebo_ros empty_world.launch ``` 接下来,您需要将无人车模型添加到仿真环境中。您可以使用以下命令将无人车模型添加到仿真环境中: ```bash roslaunch gazebo_ros spawn_model -file ~/catkin_ws/src/follow_car/models/car.urdf -urdf -x 0 -y 0 -z 1 -model car ``` 这将在仿真环境中添加一个名为“car”的无人车模型。现在,您可以使用以下命令将无人车模型的摄像头图像发布到ROS话题中: ```bash rosrun gazebo_ros gzclient ``` 在新的终端中,您可以使用以下命令运行ROS节点: ```bash rosrun follow_car follow_car_node.py ``` 现在,您应该可以在新的窗口中看到无人车的视频流,并且车辆应该开始跟随。 总结 本教程提供了如何使用ROS框架实现无人车自主跟随功能的步骤。在完成此教程后,您应该熟悉ROS的基本概念,并可以使用ROS框架开发自己的机器人应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值