无人机PX4飞控ROS应用层开发:MAVROS 功能包介绍与飞控消息汇总(二)

概述

这个软件包提供了针对各种自动驾驶仪(如PX4,Ardupilot)使用 MAVLink 通信协议的通信驱动程序。
此外,它还提供了用于地面控制站(例如 QGroundControl)的 UDP MAVLink 桥接功能。

通常与PX4的offboard模式联合使用
Offboard控制背后的想法是能够使用在自动驾驶仪外运行的软件来控制 PX4 飞控, 这是通过 Mavlink 协议完成的。

其中硬件部分连接模式大部分如下:
在飞行器上部署一台小型将计算机,用 UART 转 USB 适配器连接飞控
在这里插入图片描述
ROS (机器人操作系统) 是一个通用的机器人库,可以用于为 PX4 自动驾驶仪创建强大的无人机应用程序。

从飞控端通过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"

GPS1原始数据(/mavros/gpsstatus/gps1/raw)

话题名称:/mavros/gpsstatus/gps1/raw

频率:2.5HZ

消息类型:mavros_msgs/GPSRAW

消息体定义:

uint8 GPS_FIX_TYPE_NO_GPS=0
uint8 GPS_FIX_TYPE_NO_FIX=1
uint8 GPS_FIX_TYPE_2D_FIX=2
uint8 GPS_FIX_TYPE_3D_FIX=3
uint8 GPS_FIX_TYPE_DGPS=4
uint8 GPS_FIX_TYPE_RTK_FLOATR=5
uint8 GPS_FIX_TYPE_RTK_FIXEDR=6
uint8 GPS_FIX_TYPE_STATIC=7
uint8 GPS_FIX_TYPE_PPP=8
std_msgs/Header header
uint8 fix_type
int32 lat
int32 lon
int32 alt
uint16 eph
uint16 epv
uint16 vel
uint16 cog
uint8 satellites_visible
int32 alt_ellipsoid
uint32 h_acc
uint32 v_acc
uint32 vel_acc
int32 hdg_acc
uint16 yaw
uint8 dgps_numch
uint32 dgps_age

解释:

  • fix_type : 定位类型
  • lat 纬度
  • lon 经度
  • alt 海拔高度
  • eph 水平精度因子
  • epv 垂直精度因子
  • vel 速度
  • cog 移动方向 0.00 ~ 359.99 度
  • satellites_visible 可见卫星数量
  • alt_ellipsoid 椭球体高度
  • h_acc 水平位置不确定度
  • v_acc 垂直位置不确定度
  • hdg_acc 航向不确定度
  • yaw 航向角度
  • dgps_numch 伪距差分卫星数量
  • dgps_age Age of DGPS info

gazebo中消息实例

header:
seq: 606
stamp:
secs: 255
nsecs: 988000000
frame_id: “/wgs84”
fix_type: 3
lat: 473977421
lon: 85455934
alt: 488111
eph: 0
epv: 0
vel: 0
cog: 3341
satellites_visible: 10
alt_ellipsoid: 488111
h_acc: 1000
v_acc: 1000
vel_acc: 250
hdg_acc: 0
yaw: 0
dgps_numch: 255
dgps_age: 4294967295

家点位置(/mavros/home_position/home)

话题名称:/mavros/home_position/home

频率:0.5HZ

消息类型:mavros_msgs/HomePosition

消息体定义:

std_msgs/Header header
geographic_msgs/GeoPoint geo
geometry_msgs/Point position
geometry_msgs/Quaternion orientation
geometry_msgs/Vector3 approach

解释:

  • geo home点WGS-84基准的大地坐标
  • position home点本地坐标
  • orientation 姿态
  • approach position of the end of approach vector (一直是0)

gazebo中消息实例

header:
seq: 706
stamp:
secs: 1426
nsecs: 532000000
frame_id: ‘’
geo:
latitude: 47.397742
longitude: 8.5455933
altitude: 535.3319165871775
position:
x: -0.0013211744371801615
y: -0.0020850745495408773
z: 0.20032213628292084
orientation:
x: 0.9966978615985974
y: -0.08119944399151235
z: 6.103014229618669e-17
w: -4.972031958837507e-18
approach:
x: 0.0
y: 0.0
z: -0.0

惯导数据带姿态(/mavros/imu/data)

话题名称:/mavros/imu/data

频率:50HZ

消息类型:sensor_msgs/Imu

IMU数据 包含 姿态四元数、姿态协方差、角速度、角速度协方差、加速度、加速度协方差

gazebo中消息实例

header:
seq: 111508
stamp:
secs: 2244
nsecs: 228000000
frame_id: “base_link”
orientation:
x: 0.007384428628733207
y: -0.007200897913145637
z: -0.9916137715564253
w: -0.12882411840336733
orientation_covariance: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
angular_velocity:
x: 0.0007936469046398997
y: 0.0006271927268244324
z: -0.0013350683730095625
angular_velocity_covariance: [1.2184696791468346e-07, 0.0, 0.0, 0.0, 1.2184696791468346e-07, 0.0, 0.0, 0.0, 1.2184696791468346e-07]
linear_acceleration:
x: -0.16984868049621582
y: 0.10508567094802976
z: 9.788949966430664
linear_acceleration_covariance: [8.999999999999999e-08, 0.0, 0.0, 0.0, 8.999999999999999e-08, 0.0, 0.0, 0.0, 8.999999999999999e-08]

惯导原始数据不带姿态(/mavros/imu/data_raw)

话题名称:/mavros/imu/data_raw

频率:50HZ

消息类型:sensor_msgs/Imu

IMU数据 包含 姿态四元数(均为0)、姿态协方差(不可用)、角速度、角速度协方差、加速度、加速度协方差

gazebo中消息实例

header:
seq: 121628
stamp:
secs: 2446
nsecs: 692000000
frame_id: “base_link”
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 0.0
orientation_covariance: [-1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
angular_velocity:
x: 0.00019099446944892406
y: 0.0022359241265803576
z: 0.0003359029069542882
angular_velocity_covariance: [1.2184696791468346e-07, 0.0, 0.0, 0.0, 1.2184696791468346e-07, 0.0, 0.0, 0.0, 1.2184696791468346e-07]
linear_acceleration:
x: -0.1549476683139801
y: 0.08514387905597808
z: 9.81126594543457
linear_acceleration_covariance: [8.999999999999999e-08, 0.0, 0.0, 0.0, 8.999999999999999e-08, 0.0, 0.0, 0.0, 8.999999999999999e-08]

磁力计(/mavros/imu/mag)

话题名称:/mavros/imu/mag

频率:14HZ

消息类型:sensor_msgs/MagneticField

消息体定义

std_msgs/Header header
geometry_msgs/Vector3 magnetic_field
float64[9] magnetic_field_covariance

解释

  • magnetic_field 磁向量
  • 方差

gazebo中消息实例

header:
seq: 33772
stamp:
secs: 2770
nsecs: 732000000
frame_id: “base_link”
magnetic_field:
x: 4.864371567964554e-06
y: -2.732550501823425e-05
z: 1.5307366847991947e-05
magnetic_field_covariance: [-1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

静态气压(/mavros/imu/static_pressure)

话题名称:/mavros/imu/static_pressure

频率:16HZ

消息类型:sensor_msgs/FluidPressure

消息体定义

std_msgs/Header header
float64 fluid_pressure
float64 variance

解释

  • fluid_pressure 压强
  • 方差

gazebo中消息实例

header:
seq: 56296
stamp:
secs: 3374
nsecs: 652000000
frame_id: “base_link”
fluid_pressure: 95596.6875
variance: 0.0

惯导温度(/mavros/imu/temperature_imu)

话题名称:/mavros/imu/temperature_imu

频率:16HZ

消息类型:sensor_msgs/Temperature

消息体定义

std_msgs/Header header
float64 temperature
float64 variance

解释

  • temperature 温度
  • variance 方差

gazebo中消息实例

header: 
  seq: 60626
  stamp: 
    secs: 3632
    nsecs: 612000000
  frame_id: "base_link"
temperature: 11.827661514282227
variance: 0.0

本地坐标系里程计(/mavros/local_position/odom)

话题名称:/mavros/local_position/odom

频率:30HZ

消息类型:nav_msgs/Odometry

消息中的坐标系方向:
mavros 的 local 系指本地坐标系,一般是ENU坐标系
mavros 的 body 系指机体坐标系,noetic 版本一般是 FLU(前左上)

gazebo中消息实例

header:
seq: 2781
stamp:
secs: 116
nsecs: 896000000
frame_id: “map”
child_frame_id: “base_link”
pose:
pose:
position:
x: -0.014927205629646778
y: -0.04328818991780281
z: 0.1138390600681305
orientation:
x: 3.71945938109191e-05
y: -0.01319045419989748
z: 0.07933056843484232
w: -0.9967610818713637
covariance: [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.0]
twist:
twist:
linear:
x: 0.00368956224535372
y: -0.04010872877133959
z: -0.05673302266379153
angular:
x: 0.0002368032291997224
y: -0.0012611267156898975
z: -0.0003067363868467508
covariance: [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.0]

本地坐标系位姿(/mavros/local_position/pose)

话题名称:/mavros/local_position/pose

频率:30HZ

消息类型:geometry_msgs/PoseStamped

mavros 的 local 系指本地坐标系,一般是ENU坐标系

gazebo中消息实例

header:
seq: 50
stamp:
secs: 1223
nsecs: 284000000
frame_id: “map”
pose:
position:
x: 0.014077379368245602
y: -0.0009231782169081271
z: 0.04424547404050827
orientation:
x: -0.0009682392215684591
y: -0.003946917361421034
z: 0.08464140852200303
w: -0.9964031708338092

另飞机起飞,高度值与QGC上基本一致
在这里插入图片描述
在这里插入图片描述

机体坐标系速度(/mavros/local_position/velocity_body)

话题名称:/mavros/local_position/velocity_body

频率:30HZ

消息类型:geometry_msgs/TwistStamped

mavros 的 body 系指机体坐标系,noetic 版本一般是 FLU(前左上)

gazebo中消息实例

header:
seq: 47535
stamp:
secs: 1608
nsecs: 680000000
frame_id: “base_link”
twist:
linear:
x: -0.010222390351782138
y: -0.0055268923671740215
z: -0.015064295234807535
angular:
x: 0.0026360894553363323
y: 0.010151303373277187
z: 0.00037095276638865346

本地坐标系速度(/mavros/local_position/velocity_local)

话题名称:/mavros/local_position/velocity_local

频率:30HZ

消息类型:geometry_msgs/TwistStamped

mavros 的 body 系指机体坐标系,noetic 版本一般是 FLU(前左上)

gazebo中消息实例

header:
seq: 60236
stamp:
secs: 2032
nsecs: 40000000
frame_id: “base_link”
twist:
linear:
x: 0.022900719195604324
y: -0.0002231835969723761
z: -0.0248167235404253
angular:
x: -0.006672305803166181
y: 0.0016501393936368097
z: 0.001181692288822832

Mavros状态(/mavros/state)

话题名称:/mavros/state

频率:1HZ

消息类型:mavros_msgs/State

消息体定义

string MODE_PX4_MANUAL=MANUAL
string MODE_PX4_ACRO=ACRO
string MODE_PX4_ALTITUDE=ALTCTL
string MODE_PX4_POSITION=POSCTL
string MODE_PX4_OFFBOARD=OFFBOARD
string MODE_PX4_STABILIZED=STABILIZED
string MODE_PX4_RATTITUDE=RATTITUDE
string MODE_PX4_MISSION=AUTO.MISSION
string MODE_PX4_LOITER=AUTO.LOITER
string MODE_PX4_RTL=AUTO.RTL
string MODE_PX4_LAND=AUTO.LAND
string MODE_PX4_RTGS=AUTO.RTGS
string MODE_PX4_READY=AUTO.READY
string MODE_PX4_TAKEOFF=AUTO.TAKEOFF
std_msgs/Header header
bool connected
bool armed
bool guided
bool manual_input
string mode
uint8 system_status

gazebo中消息实例

header:
seq: 4512
stamp:
secs: 4535
nsecs: 524000000
frame_id: ‘’
connected: True
armed: False
guided: True
manual_input: False
mode: “AUTO.LOITER”
system_status: 3

时间参考(/mavros/time_reference)

话题名称:/mavros/time_reference

频率:1HZ

消息类型:sensor_msgs/TimeReference

gazebo中消息实例

header:
seq: 4838
stamp:
secs: 4861
nsecs: 524000000
frame_id: ‘’
time_ref:
secs: 1721303257
nsecs: 755735000
source: “fcu”

其余的很多MAVROS的topic 并没有消息发出,
有些是由于在特点条件下才会发出
有些是作为数据的输入端,例如下面这些

/mavros/setpoint_accel/accel
/mavros/setpoint_attitude/cmd_vel
/mavros/setpoint_attitude/thrust
/mavros/setpoint_position/global
/mavros/setpoint_position/global_to_local
/mavros/setpoint_position/local
/mavros/setpoint_raw/attitude
/mavros/setpoint_raw/global
/mavros/setpoint_raw/local
/mavros/setpoint_raw/target_attitude
/mavros/setpoint_raw/target_global
/mavros/setpoint_raw/target_local
/mavros/setpoint_trajectory/desired
/mavros/setpoint_trajectory/local
/mavros/setpoint_velocity/cmd_vel
/mavros/setpoint_velocity/cmd_vel_unstamped
/mavros/setpoint_attitude/attitude 是ROS中mavros提供的一个话题,用于控制飞行器的姿态。如果你想在C++程序中使用该话题,可以使用ROS的C++客户端库来实现。 首先,在你的程序中含mavros的头文件: ```c++ #include <ros/ros.h> #include <mavros_msgs/AttitudeTarget.h> ``` 然后,创建一个ROS节点,并初始化ROS: ```c++ int main(int argc, char** argv) { ros::init(argc, argv, "attitude_control"); ros::NodeHandle nh; // ... } ``` 接下来,创建一个发布者用于发布控制姿态的指令: ```c++ ros::Publisher att_pub = nh.advertise<mavros_msgs::AttitudeTarget>("/mavros/setpoint_attitude/attitude", 10); ``` 然后,创建一个mavros_msgs::AttitudeTarget类型的变量,并设置其值: ```c++ mavros_msgs::AttitudeTarget att_msg; att_msg.header.stamp = ros::Time::now(); att_msg.type_mask = 0b00000111; // 只使用欧拉角控制姿态 att_msg.orientation.w = 1.0; // 四元数表示的姿态,这里设置为单位四元数 att_msg.thrust = 0.5; // 推力,范围为0到1 ``` 最后,发布指令: ```c++ att_pub.publish(att_msg); ``` 完整的代码示例: ```c++ #include <ros/ros.h> #include <mavros_msgs/AttitudeTarget.h> int main(int argc, char** argv) { ros::init(argc, argv, "attitude_control"); ros::NodeHandle nh; ros::Publisher att_pub = nh.advertise<mavros_msgs::AttitudeTarget>("/mavros/setpoint_attitude/attitude", 10); while (ros::ok()) { mavros_msgs::AttitudeTarget att_msg; att_msg.header.stamp = ros::Time::now(); att_msg.type_mask = 0b00000111; att_msg.orientation.w = 1.0; att_msg.thrust = 0.5; att_pub.publish(att_msg); ros::spinOnce(); ros::Rate(10).sleep(); } return 0; } ``` 这样,你就可以使用上述代码在C++程序中发布控制姿态的指令到/mavros/setpoint_attitude/attitude话题了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月照银海似蛟龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值