无人机PX4飞控ROS应用层开发:MAVROS 功能包介绍与飞控消息汇总(一)
- 概述
- MAVROS安装
- 从飞控端通过MAVROS可以拿到的信息
- 高度信息(mavros/altitude)
- 电池信息(mavros/battery)
- 状态估计器状态(/mavros/estimator_status)
- 着陆状态(mavros/extended_state)
- 指南针航向角角度(mavros/global_position/compass_hdg)
- 世界坐标系位置(/mavros/global_position/global)
- 本地坐标系位姿(/mavros/global_position/local)
- 世界坐标系位置原始定位信息(/mavros/global_position/raw/fix)
- gps速度信息(/mavros/global_position/raw/gps_vel)
- 世界坐标系定位使用卫星数量(/mavros/global_position/raw/satellites)
- 世界坐标系位置相对高度(/mavros/global_position/rel_alt)
概述
这个软件包提供了针对各种自动驾驶仪(如PX4,Ardupilot)使用 MAVLink 通信协议的通信驱动程序。
此外,它还提供了用于地面控制站(例如 QGroundControl)的 UDP MAVLink 桥接功能。
通常与PX4的offboard模式联合使用
Offboard控制背后的想法是能够使用在自动驾驶仪外运行的软件来控制 PX4 飞控, 这是通过 Mavlink 协议完成的。
其中硬件部分连接模式大部分如下:
在飞行器上部署一台小型将计算机,用 UART 转 USB 适配器连接飞控
ROS (机器人操作系统) 是一个通用的机器人库,可以用于为 PX4 自动驾驶仪创建强大的无人机应用程序。
MAVROS安装
MAVROS可以通过源码或者二进制安装。
二进制安装
通过下面指令进行二进制安装
sudo apt-get install ros-${ROS_DISTRO}-mavros ros-${ROS_DISTRO}-mavros-extras ros-${ROS_DISTRO}-mavros-msgs
其中ROS_DISTRO
需要根据ROS的本部换成 kinetic、noetic
然后需要安装 GeographicLib ,通过如下指令
先下载 文件 install_geographiclib_datasets.sh
wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh
执行这个文件
./install_geographiclib_datasets.sh
从飞控端通过MAVROS可以拿到的信息
通过在gazebo中启动 px4 ,并启动mavros ,来测试
通过MAVROS可以从飞控端获取的信息
在gazebo中启动px4
roslaunch px4 posix_sitl.launch
启动mavros指令
roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"
高度信息(mavros/altitude)
话题名称: mavros/altitude
频率 :10HZ
消息类型:mavros_msgs/Altitude
消息体定义:
std_msgs/Header header float32 monotonic float32 amsl float32 local float32 relative float32 terrain float32 bottom_clearance
解释
- amsl (above mean sea level)平均海平面以上
- local 本地坐标系下的
- relative 相对地面的(应该加上对地测距才会有)
实例数据
gazebo中无人机在地面
header:
seq: 752
stamp:
secs: 78
nsecs: 528000000
frame_id: “map”
monotonic: 488.1638488769531
amsl: 488.08782958984375
local: 0.1731969118118286
relative: -0.0031573623418807983
terrain: nan
bottom_clearance: nan
通过QGC 让其起飞
QGC显示高度为9.3m
header:
seq: 11002
stamp:
secs: 1103
nsecs: 528000000
frame_id: “map”
monotonic: 497.4364929199219
amsl: 497.36468505859375
local: 9.450032234191895
relative: 9.288766860961914
terrain: nan
bottom_clearance: nan
电池信息(mavros/battery)
话题名称:mavros/battery
频率: 0.5hz
消息类型:sensor_msgs/BatteryState
消息体定义
std_msgs/Header header float32 voltage float32 current float32 charge float32 capacity float32 design_capacity float32 percentage uint8 power_supply_status uint8 power_supply_health uint8 power_supply_technology bool present float32[] cell_voltage string location string serial_number
解释:
- voltage 电压
- current 电流
gazebo中无人机 话题实例
header:
seq: 704
stamp:
secs: 1400
nsecs: 528000000
frame_id: ‘’
voltage: 15.30000114440918
temperature: 0.0
current: 1.0
charge: nan
capacity: nan
design_capacity: nan
percentage: 0.6599999666213989
power_supply_status: 2
power_supply_health: 0
power_supply_technology: 3
present: True
cell_voltage: [15.30000114440918]
cell_temperature: []
location: “id0”
serial_number: ‘’
状态估计器状态(/mavros/estimator_status)
话题名称:/mavros/estimator_status
频率:1HZ
消息类型: mavros_msgs/EstimatorStatus
消息体定义:
std_msgs/Header header bool attitude_status_flag bool velocity_horiz_status_flag bool velocity_vert_status_flag bool pos_horiz_rel_status_flag bool pos_horiz_abs_status_flag bool pos_vert_abs_status_flag bool pos_vert_agl_status_flag bool const_pos_mode_status_flag bool pred_pos_horiz_rel_status_flag bool pred_pos_horiz_abs_status_flag bool gps_glitch_status_flag bool accel_error_status_flag
解释:
- attitude_status_flag 姿态估计器状态
- velocity_horiz_status_flag 水平速度估计器状态
- velocity_vert_status_flag 垂直速度估计器状态
- pos_horiz_rel_status_flag 水平位置(相对)
- pos_horiz_abs_status_flag 水平位置(绝对)
- pos_vert_abs_status_flag 垂直位置(绝对)
- pos_vert_agl_status_flag 垂直位置(相对地面)
- const_pos_mode_status_flag 如果EKF处于恒定位置模式并且不使用外部测量(例如GPS或光流),则为True。
- pred_pos_horiz_rel_status_flag 如果EKF有足够的数据进入将提供(相对)位置估计的模式,则为True
- pred_pos_horiz_abs_status_flag 如果EKF有足够的数据进入将提供(绝对)位置估计的模式,则为True
- gps_glitch_status_flag 如果EKF检测到GPS故障,则为True
- accel_error_status_flag 如果EKF检测到错误的加速度计数据,则为True
gazebo中无人机 话题实例
header:
seq: 2145
stamp:
secs: 2148
nsecs: 524000000
frame_id: ‘’
attitude_status_flag: True
velocity_horiz_status_flag: True
velocity_vert_status_flag: True
pos_horiz_rel_status_flag: True
pos_horiz_abs_status_flag: True
pos_vert_abs_status_flag: True
pos_vert_agl_status_flag: False
const_pos_mode_status_flag: False
pred_pos_horiz_rel_status_flag: True
pred_pos_horiz_abs_status_flag: True
gps_glitch_status_flag: False
accel_error_status_flag: False
着陆状态(mavros/extended_state)
话题名称:/mavros/extended_state
频率:5HZ
消息类型: mavros_msgs/ExtendedState
消息体定义:
uint8 VTOL_STATE_UNDEFINED=0 uint8 VTOL_STATE_TRANSITION_TO_FW=1 uint8 VTOL_STATE_TRANSITION_TO_MC=2 uint8 VTOL_STATE_MC=3 uint8 VTOL_STATE_FW=4 uint8 LANDED_STATE_UNDEFINED=0 uint8 LANDED_STATE_ON_GROUND=1 uint8 LANDED_STATE_IN_AIR=2 uint8 LANDED_STATE_TAKEOFF=3 uint8 LANDED_STATE_LANDING=4 std_msgs/Header header uint8 vtol_state uint8 landed_state
解释:
- vtol_state 垂起固定翼的状态 多旋翼不关注
- 着陆状态 0为未定义;1为在地面;2为在空中;3为起飞;4位正在降落
gazebo中实例(无人机飞在9.2m)
header:
seq: 15936
stamp:
secs: 3190
nsecs: 528000000
frame_id: ‘’
vtol_state: 0
landed_state: 2
指南针航向角角度(mavros/global_position/compass_hdg)
话题名称:/mavros/global_position/compass_hdg
频率:50HZ
消息类型:std_msgs/Float64
gazebo中消息实例
通过直接旋转模型,可以发现数值发生变化,变化范围0~360
data: 100.63
data: 16.48
世界坐标系位置(/mavros/global_position/global)
话题名称:/mavros/global_position/global
频率:50HZ
消息类型:sensor_msgs/NavSatFix
std_msgs/Header header uint32 seq time stamp string frame_id sensor_msgs/NavSatStatus status int8 status uint16 service float64 latitude float64 longitude float64 altitude float64[9] position_covariance uint8 position_covariance_type
解释:
- status:sensor_msgs/NavSatStatus 类型的数据,包含 GPS 信号的质量信息。类型如下
int8 STATUS_NO_FIX = -1 # unable to fix position 不能定位 int8 STATUS_FIX = 0 # unaugmented fix 未增强的定位 int8 STATUS_SBAS_FIX = 1 # with satellite-based augmentation int8 STATUS_GBAS_FIX = 2 # with ground-based augmentation
- service:用了那种卫星信息
uint16 SERVICE_GPS = 1 # GPS导航系统 uint16 SERVICE_GLONASS = 2 # GLONASS导航系统 uint16 SERVICE_COMPASS = 4 # includes BeiDou. uint16 SERVICE_GALILEO = 8 # 伽利略导航系统
- latitude:以度为单位的浮点数,表示纬度。
- longitude:以度为单位的浮点数,表示经度。
- altitude:以米为单位的浮点数,表示相对于海平面的高度。
- position_covariance:以协方差矩阵表示的位置不确定性。是一个长度为9的一维数组,按照 [covariance_xx, covariance_yy, covariance_zz, covariance_xy, covariance_xz, covariance_yz, covariance_roll, covariance_pitch, covariance_yaw] 的顺序排列。(协方差的开平方是数据波动的范围)
- position_covariance_type:表示 position_covariance 中协方差的类型。 类型如下
uint8 COVARIANCE_TYPE_UNKNOWN=0 # 未知类型。表示协方差的具体类型未知,可能是由于某些原因无法确定 uint8 COVARIANCE_TYPE_APPROXIMATED=1 # 协方差未知。表示协方差矩阵中的元素值未知,即不提供具体的协方差信息 uint8 COVARIANCE_TYPE_DIAGONAL_KNOWN=2 # 对角协方差已知。表示协方差矩阵是对角矩阵,对角线上的元素已知,而非对角线上的元素未知。这种情况下,只有位置坐标之间的不确定性(方差)已知,协方差矩阵的其他元素未提供 uint8 COVARIANCE_TYPE_KNOWN=3 # 完全协方差已知。表示协方差矩阵的所有元素都已知,包括位置坐标之间的不确定性和它们之间的协方差。这种情况下,提供了协方差矩阵的所有元素
gazebo中消息实例
header:
seq: 65
stamp:
secs: 5935
nsecs: 852000000
frame_id: “base_link”
status:
status: 0
service: 1
latitude: 47.3977412
longitude: 8.5455928
altitude: 535.2749169098639
position_covariance: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
position_covariance_type: 2
本地坐标系位姿(/mavros/global_position/local)
话题名称:/mavros/global_position/local
频率:50HZ
消息类型:nav_msgs/Odometry
原消息体定义
std_msgs/Header header string child_frame_id geometry_msgs/PoseWithCovariance pose geometry_msgs/TwistWithCovariance twist
解释:
- pose 位置与姿态与协方差
- twist 线速度与角速度 与 协方差
gazebo中消息实例
header:
seq: 333735
stamp:
secs: 6680
nsecs: 492000000
frame_id: “map”
child_frame_id: “base_link”
pose:
pose:
position:
x: -2.0383938369578134
y: -1.4676804439870572
z: -2.918
orientation:
x: -0.0031129252366190966
y: 0.005099263730816597
z: 0.5929551081780201
w: 0.8052133175543716
covariance: [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 99999.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 99999.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 99999.0]
twist:
twist:
linear:
x: 0.02
y: 0.02
z: -0.01
angular:
x: 0.0
y: 0.0
z: 0.0
covariance: [-1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
世界坐标系位置原始定位信息(/mavros/global_position/raw/fix)
话题名称:/mavros/global_position/raw/fix
频率:2.5HZ
消息类型:sensor_msgs/NavSatFix
消息定义上面有提到
gazebo中消息实例
header:
seq: 21054
stamp:
secs: 7923
nsecs: 184000000
frame_id: “base_link”
status:
status: 0
service: 1
latitude: 47.3977413
longitude: 8.5455928
altitude: 535.3319169567044
position_covariance: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
position_covariance_type: 2
gps速度信息(/mavros/global_position/raw/gps_vel)
话题名称:/mavros/global_position/raw/gps_vel
频率:2.5HZ
消息类型:geometry_msgs/TwistStamped
std_msgs/Header header geometry_msgs/Twist twist
twist 包含角速度与线速度
gazebo中消息实例
header:
seq: 21606
stamp:
secs: 8130
nsecs: 980000000
frame_id: “map”
twist:
linear:
x: -0.0
y: -0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
世界坐标系定位使用卫星数量(/mavros/global_position/raw/satellites)
话题名称:/mavros/global_position/raw/satellites
频率:2.5HZ
消息类型:std_msgs/UInt32
gazebo中消息实例
data: 10
与QGC中卫星数量一致
世界坐标系位置相对高度(/mavros/global_position/rel_alt)
话题名称:/mavros/global_position/rel_alt
频率:50HZ
消息类型:std_msgs/Float64
gazebo中消息实例
data: 6.33
与QGC中一致