无人机系统中的主要坐标系与Mavros控制话题

一、无人机系统中的主要坐标系梳理

从下往上分 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

向上

  • 使用话题:

话题

坐标系

自动转换

/mavros/local_position/pose

ENU

从 PX4 的 NED 自动转换

/mavros/setpoint_position/local

ENU

自动转换到 NED 发送给 PX4

/mavros/setpoint_velocity/cmd_vel

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)

/mavros/setpoint_position/local

PoseStamped

ENU

自动转换

速度控制(ENU)

/mavros/setpoint_velocity/cmd_vel

TwistStamped

ENU

简单速度控制

速度+加速度(机体系)

/mavros/setpoint_raw/local

PositionTarget

BODY_NED

最强控制接口

姿态控制

/mavros/setpoint_attitude/attitude

PoseStamped

Body

四元数控制

1. /mavros/setpoint_position/local

a. 话题基本信息

项目

内容

话题名

/mavros/setpoint_position/local

消息类型

geometry_msgs/PoseStamped

坐标系

ENU (East-North-Up) — ROS标准坐标系

发布频率

建议 ≥ 2 Hz(推荐 10–30 Hz)

PX4接收接口

MAVLink 消息 SET_POSITION_TARGET_LOCAL_NED

控制模式

位置 + 姿态控制(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 — 消息头信息

字段

类型

含义

seq

uint32

序列号(自动生成)

stamp

time

时间戳,推荐使用 ros::Time::now()

frame_id

string

参考坐标系(通常为 "map""local_origin"

PX4 实际不使用 frame_id,只要保持一致即可。一般情况下设置 "map""local_origin"

ⅱ. pose.position — 无人机期望位置(单位:米)

字段

含义

坐标系方向(ENU)

x

东向位移

X轴正方向指向东

y

北向位移

Y轴正方向指向北

z

高度(Up)

Z轴正方向指向上

MAVROS 自动把 ENU → NED 转换后发给 PX4,
即 PX4 内部的 Z 为负表示上升。

ⅲ. pose.orientation — 无人机期望姿态(四元数)

四元数定义了无人机机体坐标相对于 ENU 世界坐标的旋转。

字段

含义

说明

x, y, z, w

四元数分量

表示绕各轴的复合旋转

常见做法:只控制 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)后,会:

  1. 在位置控制器(Position Controller)中,将目标点转换为期望位置;
  2. 通过 PID / LQR 控制无人机到达目标;
  3. 若设置 yaw(姿态),则在偏航控制器中控制机头朝向;
  4. 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. 话题基本信息

项目

内容

话题名

/mavros/setpoint_velocity/cmd_vel

消息类型

geometry_msgs/TwistStamped

坐标系

ENU(East-North-Up) — ROS标准坐标系

发布频率

建议 ≥ 10 Hz(推荐 20–50 Hz)

PX4接收接口

MAVLink 消息 SET_POSITION_TARGET_LOCAL_NED(type_mask 设置为忽略位置,仅用速度)

控制模式

线速度 + 角速度(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 — 消息头信息

字段

类型

含义

seq

uint32

序列号(自动生成)

stamp

time

时间戳,建议使用 ros::Time::now()

frame_id

string

坐标系标识,通常为 "map"

"local_origin"

ⅱ. twist.linear — 无人机期望线速度(m/s)

字段

含义

坐标系方向(ENU)

x

东向速度

X轴正方向指向东

y

北向速度

Y轴正方向指向北

z

上升速度

Z轴正方向指向上

MAVROS 会自动把 ENU → NED 转换后发送给 PX4。
例如你在 ROS 中设置 z=+0.2(上升),PX4 内部收到的则是 Down=-0.2。

ⅲ. twist.angular — 无人机期望角速度(rad/s)

字段

含义

坐标系

x

滚转角速度(Roll)

一般不用控制(交由飞控自稳)

y

俯仰角速度(Pitch)

一般不用控制

z

偏航角速度(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 消息后,会:

  1. 忽略位置(type_mask 对应位置位设为 IGNORE);
  2. 仅使用 velocity 和 yaw_rate 字段;
  3. 进入 速度闭环控制(PID 或 LQR);
  4. 实时调整无人机推力与姿态,使速度逼近期望值;
  5. 若 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. 话题基本信息

项目

内容

话题名

/mavros/setpoint_attitude/attitude

消息类型

geometry_msgs/PoseStamped

坐标系

机体系(Body Frame)相对于 ENU 世界坐标系的姿态

发布频率

建议 ≥ 10 Hz(推荐 20–50 Hz)

PX4 接口

MAVLink 消息 SET_ATTITUDE_TARGET

控制模式

姿态控制(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

字段

类型

含义

seq

uint32

消息序列号

stamp

time

时间戳(建议用 ros::Time::now()

frame_id

string

坐标系标识(例如 "map""base_link"

在 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 后:

  1. 解算四元数 → 得到期望 roll/pitch/yaw;
  2. 与当前姿态比较;
  3. 通过姿态控制器(Attitude Controller)计算角速度;
  4. 由角速率控制器(Rate Controller)驱动电机转速,实现姿态收敛;
  5. 推力(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. 常见组合控制

话题

功能

消息类型

说明

/mavros/setpoint_attitude/attitude

姿态控制

geometry_msgs/PoseStamped

控制四元数姿态

/mavros/setpoint_attitude/att_throttle

推力控制

std_msgs/Float64

控制油门

/mavros/setpoint_attitude/cmd_vel

姿态+角速度控制

geometry_msgs/TwistStamped

控制角速度

示例:

  • 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. 基本信息

项目

内容

话题名

/mavros/setpoint_raw/local

消息类型

mavros_msgs/PositionTarget

PX4接收接口

MAVLink 消息 SET_POSITION_TARGET_LOCAL_NED

坐标系选择

可选 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

字段

含义

seq

序号

stamp

时间戳(建议使用 ros::Time::now()

frame_id

可填 "map""local_origin"

PX4 不使用 frame_id,仅供标识。

ⅱ. coordinate_frame — 坐标系选择

表示控制命令的参考坐标系。

名称

坐标系定义

说明

1

MAV_FRAME_LOCAL_NED

北、东、下

PX4 内部默认坐标

2

MAV_FRAME_LOCAL_OFFSET_NED

相对当前点NED

用于相对移动控制

7

MAV_FRAME_BODY_NED

机体前右下

与机头方向绑定

8

MAV_FRAME_BODY_OFFSET_NED

机体偏移坐标系

用于相机、吊舱偏移补偿

👉 常用推荐:

  • 想控制机头方向飞行 → 用 FRAME_BODY_NED
  • 想控制世界方向(北东上) → 用 FRAME_LOCAL_NED(默认)
ⅲ. type_mask — 控制字段掩码(非常关键 ⚠️)

每一位为 1 表示“忽略”该控制字段;为 0 表示“使用”。

位编号

掩码常量

控制字段

含义

0

IGNORE_PX

position.x

忽略 X 位置

1

IGNORE_PY

position.y

忽略 Y 位置

2

IGNORE_PZ

position.z

忽略 Z 位置

3

IGNORE_VX

velocity.x

忽略 X 速度

4

IGNORE_VY

velocity.y

忽略 Y 速度

5

IGNORE_VZ

velocity.z

忽略 Z 速度

6

IGNORE_AFX

acceleration_or_force.x

忽略 X 加速度

7

IGNORE_AFY

acceleration_or_force.y

忽略 Y 加速度

8

IGNORE_AFZ

acceleration_or_force.z

忽略 Z 加速度

9

FORCE_SET

使用力控制(1=力,0=加速度)

10

IGNORE_YAW

yaw

忽略偏航角

11

IGNORE_YAW_RATE

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 后:

  1. 检查掩码;
  2. 读取激活字段(pos/vel/acc/yaw);
  3. 根据当前控制模式(Position/Velocity/Acceleration)自动切换控制律;
  4. 进行闭环控制。

这意味着:
你可以用一条消息实现:

  • 单独速度控制;
  • 加速度补偿控制;
  • 位置+速度混控;
  • 机体系或世界系控制;
  • 任意组合!

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 + 加速度控制

根据视觉误差修正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值