一、无人机系统中的主要坐标系梳理
从下往上分 5 层:
|
层级 |
坐标系名称 |
典型使用模块 |
坐标定义方向 |
|
① 飞控内核层 |
NED 坐标系(North-East-Down) |
PX4 / EKF2 / MAVLink 原生 |
X北、Y东、Z向下 |
|
② ROS/MAVROS 层 |
ENU 坐标系(East-North-Up) |
ROS / MAVROS / Gazebo / RViz |
X东、Y北、Z向上 |
|
③ 机体系 |
Body 坐标系(机体自身坐标) |
MAVROS setpoint_raw/local / 飞行控制律 |
X前、Y右、Z下 |
|
④ 传感器坐标系 |
Camera / LiDAR / IMU / UWB / Radar |
各传感器本体 |
根据安装方向定义 |
|
⑤ 地理坐标系 |
WGS84(经纬度-高程) |
GPS / RTK |
经度λ、纬度φ、高度h |
一、 地理坐标系(WGS84)
- 定义: 全球通用的经纬度坐标系。
- 坐标轴:
-
- 纬度(φ)→ 北正
- 经度(λ)→ 东正
- 高度(h)→ 向上(相对地球椭球面)
- 使用模块:
-
- GPS、RTK、UM982 模块、PX4 global position estimator
- 在 PX4 中表现为:
/mavros/global_position/global
→ 包含latitude,longitude,altitude。
二、 飞控内部坐标系(NED)
- 名称: North-East-Down
- 是 PX4 飞控算法、MAVLink 协议的标准坐标系。
|
轴 |
含义 |
正方向 |
|
X |
North |
北 |
|
Y |
East |
东 |
|
Z |
Down |
向下(高度增加 → Z 减小) |
- 使用场景:
-
- PX4 EKF2、控制律内部计算
- MAVLink message:
SET_POSITION_TARGET_LOCAL_NED - PX4 log (
.ulg) 中的所有位置、速度、加速度都为 NED
三、ROS / MAVROS 层坐标系(ENU)
- 名称: East-North-Up
- 是 ROS 和 Gazebo 的标准坐标系。
|
轴 |
含义 |
正方向 |
|
X |
East |
东 |
|
Y |
North |
北 |
|
Z |
Up |
向上 |
- 使用话题:
|
话题 |
坐标系 |
自动转换 |
|
|
ENU |
从 PX4 的 NED 自动转换 |
|
|
ENU |
自动转换到 NED 发送给 PX4 |
|
|
ENU |
自动转换到 NED |
- 作用:
-
- ROS 端算法(PID、路径规划)统一使用 ENU;
- MAVROS 在桥接层自动完成 ENU <-->NED 转换;
- RViz / Gazebo 坐标与现实直观一致(Z向上)。
四、机体系(Body Frame)
- 名称: BODY_NED(机体自身坐标)
- 定义: 与无人机姿态(roll, pitch, yaw)绑定的坐标系
|
轴 |
含义 |
正方向 |
|
X |
Forward |
机头方向 |
|
Y |
Right |
机体右侧 |
|
Z |
Down |
机体下方 |
- 使用场景:
-
/mavros/setpoint_raw/local设置coordinate_frame = FRAME_BODY_NED/mavros/setpoint_velocity/cmd_vel_unstamped- PX4 姿态 / 加速度控制律
- 典型用途:
-
- 动态平台补偿(“机头方向前进”)
- 速度 + 加速度控制
- 编队控制(相对机头方向)
- 重要特征:
-
- 坐标系随无人机姿态旋转;
- X/Y/Z 方向实时变化;
- 用于前进/横移控制最自然。
五、传感器坐标系(Sensor Frame)
每个传感器(IMU、相机、LiDAR、雷达、UWB)都有各自的坐标系定义,通常要通过外参矩阵进行坐标对齐。
|
传感器 |
坐标定义 |
通常转换到 |
|
IMU |
X前、Y右、Z下 |
Body |
|
相机 (Camera) |
X右、Y下、Z前 |
Body / ENU |
|
LiDAR (Velodyne/Livox) |
X前、Y左、Z上(厂商不同) |
Body |
|
雷达 (TF02/TFS20L) |
X前、Z下 |
Body |
|
UWB Anchor/Tag |
安装面为参考 |
ENU 或 Body |
这些都需要在 ROS TF 树中通过 static_transform_publisher 校正为 ENU 或 Body 系。
二、各种控制发布话题
|
控制需求 |
话题 |
消息类型 |
坐标系 |
备注 |
|
位置控制(ENU) |
|
|
ENU |
自动转换 |
|
速度控制(ENU) |
|
|
ENU |
简单速度控制 |
|
速度+加速度(机体系) |
|
|
BODY_NED |
最强控制接口 |
|
姿态控制 |
|
|
Body |
四元数控制 |
1. /mavros/setpoint_position/local
a. 话题基本信息
|
项目 |
内容 |
|
话题名 |
|
|
消息类型 |
|
|
坐标系 |
ENU (East-North-Up) — ROS标准坐标系 |
|
发布频率 |
建议 ≥ 2 Hz(推荐 10–30 Hz) |
|
PX4接收接口 |
MAVLink 消息 |
|
控制模式 |
位置 + 姿态控制(Position + Yaw) |
|
典型用途 |
起飞、悬停、导航、航点飞行、降落引导 |
b. 消息类型结构详解
执行命令:
rosmsg show geometry_msgs/PoseStamped
输出如下:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
geometry_msgs/Pose pose
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
ⅰ. header — 消息头信息
|
字段 |
类型 |
含义 |
|
|
uint32 |
序列号(自动生成) |
|
|
time |
时间戳,推荐使用 |
|
|
string |
参考坐标系(通常为 |
PX4 实际不使用 frame_id,只要保持一致即可。一般情况下设置 "map" 或 "local_origin"。
ⅱ. pose.position — 无人机期望位置(单位:米)
|
字段 |
含义 |
坐标系方向(ENU) |
|
|
东向位移 |
X轴正方向指向东 |
|
|
北向位移 |
Y轴正方向指向北 |
|
|
高度(Up) |
Z轴正方向指向上 |
MAVROS 自动把 ENU → NED 转换后发给 PX4,
即 PX4 内部的 Z 为负表示上升。
ⅲ. pose.orientation — 无人机期望姿态(四元数)
四元数定义了无人机机体坐标相对于 ENU 世界坐标的旋转。
|
字段 |
含义 |
说明 |
|
|
四元数分量 |
表示绕各轴的复合旋转 |
常见做法:只控制 Yaw(偏航角),Roll/Pitch 留给飞控自稳。
在 ROS C++ 中可通过:
tf::createQuaternionMsgFromYaw(yaw_angle)
生成四元数。
c. 坐标系说明(ENU → NED 转换)
当你在 ROS 中发布 PoseStamped:
position.x = 5.0; // 东向 5m
position.y = 3.0; // 北向 3m
position.z = 2.0; // 上升 2m
MAVROS 会自动转换成 PX4 的 NED 坐标:
X (N) = +3.0
Y (E) = +5.0
Z (D) = -2.0
所以你可以始终把 ROS 坐标系看作 ENU,无需手动转换。
d. PX4 内部处理逻辑
当 PX4 收到该话题(经 MAVROS 转换为 MAVLink 指令 SET_POSITION_TARGET_LOCAL_NED)后,会:
- 在位置控制器(Position Controller)中,将目标点转换为期望位置;
- 通过 PID / LQR 控制无人机到达目标;
- 若设置
yaw(姿态),则在偏航控制器中控制机头朝向; - 若
z高度不变,则自动悬停。
e. 典型控制代码示例
#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.h>
#include <tf/tf.h>
int main(int argc, char **argv){
ros::init(argc, argv, "offboard_posctl_demo");
ros::NodeHandle nh;
ros::Publisher local_pos_pub =
nh.advertise<geometry_msgs::PoseStamped>("/mavros/setpoint_position/local", 10);
ros::Rate rate(20.0);
geometry_msgs::PoseStamped pose;
pose.pose.position.x = 0;
pose.pose.position.y = 0;
pose.pose.position.z = 2; // 起飞目标高度2m
pose.pose.orientation = tf::createQuaternionMsgFromYaw(0.0);
while (ros::ok()) {
pose.header.stamp = ros::Time::now();
local_pos_pub.publish(pose);
rate.sleep();
}
return 0;
}
发布频率建议 ≥ 10 Hz,否则 PX4 会判定 Offboard 控制丢失自动切模式。
f. 常见使用场景
|
场景 |
控制逻辑 |
坐标特点 |
|
起飞到固定高度 |
z 变化 |
ENU 向上 |
|
飞到目标点 |
x/y/z 同时控制 |
ENU世界系 |
|
悬停 |
不更新位置 |
PX4自动稳态 |
|
航点导航 |
循环发布不同目标点 |
ENU路径 |
|
定向朝向控制 |
调整 orientation yaw |
四元数绕Z轴 |
2. /mavros/setpoint_velocity/cmd_vel
a. 话题基本信息
|
项目 |
内容 |
|
话题名 |
|
|
消息类型 |
|
|
坐标系 |
ENU(East-North-Up) — ROS标准坐标系 |
|
发布频率 |
建议 ≥ 10 Hz(推荐 20–50 Hz) |
|
PX4接收接口 |
MAVLink 消息 |
|
控制模式 |
线速度 + 角速度(Yaw rate) |
|
典型用途 |
速度PID控制、跟随目标、自动对齐、动态平台起降 |
b. 消息类型结构详解
执行命令:
rosmsg show geometry_msgs/TwistStamped
输出:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
geometry_msgs/Twist twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
ⅰ. header — 消息头信息
|
字段 |
类型 |
含义 |
|
|
uint32 |
序列号(自动生成) |
|
|
time |
时间戳,建议使用 |
|
|
string |
坐标系标识,通常为 或 |
ⅱ. twist.linear — 无人机期望线速度(m/s)
|
字段 |
含义 |
坐标系方向(ENU) |
|
|
东向速度 |
X轴正方向指向东 |
|
|
北向速度 |
Y轴正方向指向北 |
|
|
上升速度 |
Z轴正方向指向上 |
MAVROS 会自动把 ENU → NED 转换后发送给 PX4。
例如你在 ROS 中设置 z=+0.2(上升),PX4 内部收到的则是 Down=-0.2。
ⅲ. twist.angular — 无人机期望角速度(rad/s)
|
字段 |
含义 |
坐标系 |
|
|
滚转角速度(Roll) |
一般不用控制(交由飞控自稳) |
|
|
俯仰角速度(Pitch) |
一般不用控制 |
|
|
偏航角速度(Yaw rate) |
常用,控制机头旋转方向 |
- 在 ENU 中,绕Z轴逆时针为正(左转为正)。
- MAVROS 会自动转换为 PX4 中的顺时针为正。
c. 坐标系说明(ENU → NED 自动转换)
|
坐标轴 |
ROS侧(ENU) |
PX4内部(NED) |
自动转换 |
|
X |
东 |
北 |
✅ |
|
Y |
北 |
东 |
✅ |
|
Z |
上 |
下 |
✅ |
|
Yaw正方向 |
逆时针 |
顺时针 |
✅ |
因此你在 ROS 侧可以始终把指令理解为:“x 东,y 北,z 上,yaw 逆时针为正”,MAVROS 会在底层自动转换成 PX4 可识别的 NED 控制命令。
d. PX4 接收逻辑
当 PX4 收到 /mavros/setpoint_velocity/cmd_vel 转换后的 MAVLink 消息后,会:
- 忽略位置(type_mask 对应位置位设为 IGNORE);
- 仅使用 velocity 和 yaw_rate 字段;
- 进入 速度闭环控制(PID 或 LQR);
- 实时调整无人机推力与姿态,使速度逼近期望值;
- 若 Offboard 模式丢失(>1s未收到指令),则切出模式以防坠机。
e. 代码示例(C++)
#include <ros/ros.h>
#include <geometry_msgs/TwistStamped.h>
int main(int argc, char **argv){
ros::init(argc, argv, "offboard_vel_ctl");
ros::NodeHandle nh;
ros::Publisher vel_pub = nh.advertise<geometry_msgs::TwistStamped>(
"/mavros/setpoint_velocity/cmd_vel", 10);
ros::Rate rate(20.0); // 20Hz
geometry_msgs::TwistStamped vel_msg;
while (ros::ok()) {
vel_msg.header.stamp = ros::Time::now();
// 线速度(ENU)
vel_msg.twist.linear.x = 1.0; // 向东 1m/s
vel_msg.twist.linear.y = 0.0; // 向北
vel_msg.twist.linear.z = 0.0; // 保持高度
// 角速度
vel_msg.twist.angular.z = 0.0; // 不旋转
vel_pub.publish(vel_msg);
rate.sleep();
}
return 0;
}
✅ 每次发布都会覆盖上次命令;
✅ 发布频率 < 2 Hz 时 PX4 会退出 Offboard 模式。
f. 典型应用场景
|
场景 |
控制逻辑 |
优点 |
|
速度PID控制 |
PID计算期望速度后发送cmd_vel |
响应快、稳定性高 |
|
动态平台起降 |
实时补偿平台速度 |
与机体系补偿配合使用 |
|
目标跟随 |
根据视觉或UWB计算误差速度 |
连续控制、平滑 |
|
编队飞行 |
主机发布相对速度,子机跟随 |
支持实时分布控制 |
|
路径追踪 |
按轨迹计算速度矢量 |
支持连续曲线飞行 |
3. /mavros/setpoint_attitude/attitude
a. 话题基本信息
|
项目 |
内容 |
|
话题名 |
|
|
消息类型 |
|
|
坐标系 |
机体系(Body Frame)相对于 ENU 世界坐标系的姿态 |
|
发布频率 |
建议 ≥ 10 Hz(推荐 20–50 Hz) |
|
PX4 接口 |
MAVLink 消息 |
|
控制模式 |
姿态控制(Roll、Pitch、Yaw) + 推力(需另行发送) |
|
典型用途 |
姿态保持、姿态航迹控制、姿态轨迹测试、姿态稳定验证、手动控制替代实现 |
b. 消息类型结构详解
执行命令:
rosmsg show geometry_msgs/PoseStamped
输出如下:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
geometry_msgs/Pose pose
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
ⅰ. header
|
字段 |
类型 |
含义 |
|
|
uint32 |
消息序列号 |
|
|
time |
时间戳(建议用 |
|
|
string |
坐标系标识(例如 |
在 MAVROS 中 frame_id 不参与控制逻辑,仅供标识。
ⅱ. pose.position
在此话题中 该字段无效(被忽略)。
PX4 在 SET_ATTITUDE_TARGET 消息中不会使用位置信息。
因此你可以不设置 pose.position,仅控制 pose.orientation。
ⅲ. pose.orientation — 姿态(核心字段)
无人机期望姿态由 四元数 (x, y, z, w) 表示。
四元数定义了无人机机体坐标系相对于世界坐标系(ENU)的旋转。
转换关系:
- Roll (绕X轴旋转):机体左右倾斜
- Pitch (绕Y轴旋转):机体前后俯仰
- Yaw (绕Z轴旋转):机头朝向
- 四元数与欧拉角互转由
tf库完成。
生成姿态四元数
在 C++ 中通常使用:
#include <tf/tf.h>
tf::Quaternion q = tf::createQuaternionFromRPY(roll, pitch, yaw);
geometry_msgs::Quaternion q_msg;
tf::quaternionTFToMsg(q, q_msg);
pose.pose.orientation = q_msg;
或只控制偏航角:
pose.pose.orientation = tf::createQuaternionMsgFromYaw(yaw);
c. PX4 接收后的控制逻辑
PX4 收到 MAVLink 消息 SET_ATTITUDE_TARGET 后:
- 解算四元数 → 得到期望 roll/pitch/yaw;
- 与当前姿态比较;
- 通过姿态控制器(Attitude Controller)计算角速度;
- 由角速率控制器(Rate Controller)驱动电机转速,实现姿态收敛;
- 推力(thrust)单独由
/mavros/setpoint_attitude/att_throttle或/setpoint_raw/attitude设定。
d. 代码示例(C++)
#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.h>
#include <tf/tf.h>
int main(int argc, char** argv){
ros::init(argc, argv, "attitude_control_node");
ros::NodeHandle nh;
ros::Publisher att_pub = nh.advertise<geometry_msgs::PoseStamped>(
"/mavros/setpoint_attitude/attitude", 10);
ros::Rate rate(20.0); // 20 Hz
geometry_msgs::PoseStamped pose;
double roll = 0.0;
double pitch = 0.0;
double yaw = M_PI / 4.0; // 偏航45°
tf::Quaternion q = tf::createQuaternionFromRPY(roll, pitch, yaw);
tf::quaternionTFToMsg(q, pose.pose.orientation);
while (ros::ok()) {
pose.header.stamp = ros::Time::now();
att_pub.publish(pose);
rate.sleep();
}
return 0;
}
⚠️ 如果只发布 attitude 而不发布推力 /att_throttle,无人机会保持当前推力,不会上升或下降。
e. 常见组合控制
|
话题 |
功能 |
消息类型 |
说明 |
|
|
姿态控制 |
|
控制四元数姿态 |
|
|
推力控制 |
|
控制油门 |
|
|
姿态+角速度控制 |
|
控制角速度 |
示例:
attitude决定姿态方向;att_throttle决定上升或下降的力度。
f. 坐标系说明
|
坐标系 |
定义 |
Yaw旋转方向 |
说明 |
|
ENU(ROS标准) |
X东、Y北、Z上 |
绕Z轴逆时针为正 |
ROS中显示的姿态 |
|
NED(PX4内部) |
X北、Y东、Z下 |
绕Z轴顺时针为正 |
PX4控制计算坐标 |
|
Body |
X前、Y右、Z下 |
与机体姿态绑定 |
实际飞行姿态 |
MAVROS 会自动在 ENU 与 NED 之间进行转换。
所以你在 ROS 中定义 yaw=π/2(机头朝北),飞控中会自动映射到正确方向。
g. 典型应用场景
|
场景 |
控制逻辑 |
优点 |
|
姿态稳定测试 |
固定姿态四元数 |
验证飞控姿态环稳定性 |
|
动态姿态轨迹 |
动态更新 roll/pitch/yaw |
可实现机头朝向控制 |
|
视觉伺服控制 |
根据相机误差控制 yaw |
精准对准目标 |
|
动态平台起降补偿 |
实时姿态修正 |
稳定起降平台倾斜影响 |
|
编队定向 |
同步 yaw |
保持队形朝向一致 |
4. /mavros/setpoint_raw/local
a. 基本信息
|
项目 |
内容 |
|
话题名 |
|
|
消息类型 |
|
|
PX4接收接口 |
MAVLink 消息 |
|
坐标系选择 |
可选 ENU/NED/BODY_NED/BODY_OFFSET_NED |
|
控制内容 |
位置 + 速度 + 加速度 + yaw + yaw速率(任意组合) |
|
频率要求 |
≥ 10 Hz(推荐 20–50 Hz) |
|
典型用途 |
动态平台补偿、速度+加速度混控、机体系飞行、精准降落、编队控制 |
b. 消息结构详解
执行命令:
rosmsg show mavros_msgs/PositionTarget
输出如下:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
uint8 coordinate_frame
uint16 type_mask
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Vector3 velocity
float64 x
float64 y
float64 z
geometry_msgs/Vector3 acceleration_or_force
float64 x
float64 y
float64 z
float32 yaw
float32 yaw_rate
ⅰ. header
|
字段 |
含义 |
|
|
序号 |
|
|
时间戳(建议使用 |
|
|
可填 |
PX4 不使用 frame_id,仅供标识。
ⅱ. coordinate_frame — 坐标系选择
表示控制命令的参考坐标系。
|
值 |
名称 |
坐标系定义 |
说明 |
|
1 |
|
北、东、下 |
PX4 内部默认坐标 |
|
2 |
|
相对当前点NED |
用于相对移动控制 |
|
7 |
|
机体前右下 |
与机头方向绑定 |
|
8 |
|
机体偏移坐标系 |
用于相机、吊舱偏移补偿 |
👉 常用推荐:
- 想控制机头方向飞行 → 用
FRAME_BODY_NED - 想控制世界方向(北东上) → 用
FRAME_LOCAL_NED(默认)
ⅲ. type_mask — 控制字段掩码(非常关键 ⚠️)
每一位为 1 表示“忽略”该控制字段;为 0 表示“使用”。
|
位编号 |
掩码常量 |
控制字段 |
含义 |
|
0 |
|
position.x |
忽略 X 位置 |
|
1 |
|
position.y |
忽略 Y 位置 |
|
2 |
|
position.z |
忽略 Z 位置 |
|
3 |
|
velocity.x |
忽略 X 速度 |
|
4 |
|
velocity.y |
忽略 Y 速度 |
|
5 |
|
velocity.z |
忽略 Z 速度 |
|
6 |
|
acceleration_or_force.x |
忽略 X 加速度 |
|
7 |
|
acceleration_or_force.y |
忽略 Y 加速度 |
|
8 |
|
acceleration_or_force.z |
忽略 Z 加速度 |
|
9 |
|
使用力控制(1=力,0=加速度) | |
|
10 |
|
yaw |
忽略偏航角 |
|
11 |
|
yaw_rate |
忽略偏航角速度 |
📘 举例:
// 忽略位置,只用速度和yaw角速率
target.type_mask =
mavros_msgs::PositionTarget::IGNORE_PX |
mavros_msgs::PositionTarget::IGNORE_PY |
mavros_msgs::PositionTarget::IGNORE_PZ |
mavros_msgs::PositionTarget::IGNORE_AFX |
mavros_msgs::PositionTarget::IGNORE_AFY |
mavros_msgs::PositionTarget::IGNORE_AFZ |
mavros_msgs::PositionTarget::IGNORE_YAW;
ⅳ. position — 目标位置 (m)
- 在坐标系内定义目标点。
- 仅当未屏蔽
IGNORE_PX/PY/PZ时生效。
ⅴ. velocity — 目标速度 (m/s)
- 常用于速度控制。
- 当
type_mask未屏蔽VX/VY/VZ时生效。
ⅵ. acceleration_or_force — 目标加速度或力 (m/s² 或 N)
- 当
FORCE_SET = 0→ 解释为加速度控制; - 当
FORCE_SET = 1→ 解释为力控制; - 常用于速度+加速度混控、补偿控制。
ⅶ. yaw & yaw_rate
yaw:期望偏航角(rad)yaw_rate:期望偏航角速度(rad/s)- 二选一使用(同时设置会根据掩码选择)。
c. PX4 接收逻辑
PX4 接收到 SET_POSITION_TARGET_LOCAL_NED 后:
- 检查掩码;
- 读取激活字段(pos/vel/acc/yaw);
- 根据当前控制模式(Position/Velocity/Acceleration)自动切换控制律;
- 进行闭环控制。
这意味着:
你可以用一条消息实现:
- 单独速度控制;
- 加速度补偿控制;
- 位置+速度混控;
- 机体系或世界系控制;
- 任意组合!
d. 常用控制模式示例
ⅰ. 纯位置控制(世界坐标)
target.coordinate_frame = mavros_msgs::PositionTarget::FRAME_LOCAL_NED;
target.type_mask =
mavros_msgs::PositionTarget::IGNORE_VX |
mavros_msgs::PositionTarget::IGNORE_VY |
mavros_msgs::PositionTarget::IGNORE_VZ |
mavros_msgs::PositionTarget::IGNORE_AFX |
mavros_msgs::PositionTarget::IGNORE_AFY |
mavros_msgs::PositionTarget::IGNORE_AFZ |
mavros_msgs::PositionTarget::IGNORE_YAW_RATE;
target.position.x = 5.0; // 北
target.position.y = 3.0; // 东
target.position.z = -2.0; // 上2m
target.yaw = 0.0;
ⅱ. 速度控制(机体系)
target.coordinate_frame = mavros_msgs::PositionTarget::FRAME_BODY_NED;
target.type_mask =
mavros_msgs::PositionTarget::IGNORE_PX |
mavros_msgs::PositionTarget::IGNORE_PY |
mavros_msgs::PositionTarget::IGNORE_PZ |
mavros_msgs::PositionTarget::IGNORE_AFX |
mavros_msgs::PositionTarget::IGNORE_AFY |
mavros_msgs::PositionTarget::IGNORE_AFZ |
mavros_msgs::PositionTarget::IGNORE_YAW;
target.velocity.x = 1.0; // 前进 1m/s
target.velocity.y = 0.0;
target.velocity.z = 0.0;
target.yaw_rate = 0.0;
ⅲ. 速度 + 加速度混控(机体系)
target.coordinate_frame = mavros_msgs::PositionTarget::FRAME_BODY_NED;
target.type_mask =
mavros_msgs::PositionTarget::IGNORE_PX |
mavros_msgs::PositionTarget::IGNORE_PY |
mavros_msgs::PositionTarget::IGNORE_PZ |
mavros_msgs::PositionTarget::IGNORE_YAW |
mavros_msgs::PositionTarget::IGNORE_YAW_RATE;
target.velocity.x = 1.0; // 前进1m/s
target.acceleration_or_force.x = 0.2; // 向前加速0.2m/s²
ⅳ. 纯加速度控制(世界系)
target.coordinate_frame = mavros_msgs::PositionTarget::FRAME_LOCAL_NED;
target.type_mask =
mavros_msgs::PositionTarget::IGNORE_PX |
mavros_msgs::PositionTarget::IGNORE_PY |
mavros_msgs::PositionTarget::IGNORE_PZ |
mavros_msgs::PositionTarget::IGNORE_VX |
mavros_msgs::PositionTarget::IGNORE_VY |
mavros_msgs::PositionTarget::IGNORE_VZ |
mavros_msgs::PositionTarget::IGNORE_YAW |
mavros_msgs::PositionTarget::IGNORE_YAW_RATE;
target.acceleration_or_force.x = 0.0;
target.acceleration_or_force.z = -9.8; // 模拟重力
e. 代码完整模板
#include <ros/ros.h>
#include <mavros_msgs/PositionTarget.h>
int main(int argc, char **argv){
ros::init(argc, argv, "offboard_raw_local");
ros::NodeHandle nh;
ros::Publisher setpoint_raw_pub = nh.advertise<mavros_msgs::PositionTarget>(
"/mavros/setpoint_raw/local", 10);
ros::Rate rate(20.0);
while (ros::ok()) {
mavros_msgs::PositionTarget target;
target.header.stamp = ros::Time::now();
target.coordinate_frame = mavros_msgs::PositionTarget::FRAME_BODY_NED;
target.type_mask =
mavros_msgs::PositionTarget::IGNORE_PX |
mavros_msgs::PositionTarget::IGNORE_PY |
mavros_msgs::PositionTarget::IGNORE_PZ |
mavros_msgs::PositionTarget::IGNORE_YAW |
mavros_msgs::PositionTarget::IGNORE_YAW_RATE;
target.velocity.x = 1.0; // 前进 1m/s
target.velocity.y = 0.0;
target.velocity.z = 0.0;
target.acceleration_or_force.x = 0.1; // 轻微加速
setpoint_raw_pub.publish(target);
rate.sleep();
}
}
f. 典型应用场景
|
应用 |
控制逻辑 |
特点 |
|
动态平台起降 |
BODY_NED + 速度+加速度补偿 |
支持速度补偿 |
|
轨迹跟踪 |
LOCAL_NED + 位置+速度控制 |
平滑路径 |
|
编队飞行 |
BODY_NED + 速度控制 |
主从同步 |
|
自主降落 |
LOCAL_NED + 速度/加速度融合 |
平稳下降 |
|
视觉伺服 |
BODY_NED + 加速度控制 |
根据视觉误差修正 |
1万+

被折叠的 条评论
为什么被折叠?



