从 MAVROS 到 PX4 飞控的数据流向

2023-05-16

上一篇分析了 MAVROS 中数据收发的实现方法。当用户发送一个 ros 话题的消息后,对应的 plugin 中的回调函数被处罚,ros 消息被包装成 mavlink 消息,从链路中发送出去。

下面以 "/mavros/setpoint_position/local" 话题为例进行分析。

一、MAVROS 部分

用户代码发送了一个 "/mavros/setpoint_position/local" 话题的消息,会触发 SetpointPositionPlugin::setpoint_cb 函数,如下所示:

	void setpoint_cb(const geometry_msgs::PoseStamped::ConstPtr &req)
	{
		Eigen::Affine3d tr;
		tf::poseMsgToEigen(req->pose, tr);

		send_position_target(req->header.stamp, tr);
	}

进而调用了 send_position_target 函数,实际上发送 GPS 位置时实际上也是将GPS位置转换为局部坐标系发送的,调用的也是这个函数。

	void send_position_target(const ros::Time &stamp, const Eigen::Affine3d &tr)
	{
		using mavlink::common::MAV_FRAME;

		/* Documentation start from bit 1 instead 0;
		 * Ignore velocity and accel vectors, yaw rate.
		 *
		 * In past versions on PX4 there been bug described in #273.
		 * If you got similar issue please try update firmware first.
		 */
		const uint16_t ignore_all_except_xyz_y = (1 << 11) | (7 << 6) | (7 << 3);

		auto p = [&] () {
				if (static_cast<MAV_FRAME>(mav_frame) == MAV_FRAME::BODY_NED || static_cast<MAV_FRAME>(mav_frame) == MAV_FRAME::BODY_OFFSET_NED) {
					return ftf::transform_frame_baselink_aircraft(Eigen::Vector3d(tr.translation()));
				} else {
					return ftf::transform_frame_enu_ned(Eigen::Vector3d(tr.translation()));
				}
			} ();

		auto q = [&] () {
				if (mav_frame == MAV_FRAME::BODY_NED || mav_frame == MAV_FRAME::BODY_OFFSET_NED) {
					return ftf::transform_orientation_baselink_aircraft(Eigen::Quaterniond(tr.rotation()));
				} else {
					return ftf::transform_orientation_enu_ned(
						ftf::transform_orientation_baselink_aircraft(Eigen::Quaterniond(tr.rotation())));
				}
			} ();

		set_position_target_local_ned(stamp.toNSec() / 1000000,
			utils::enum_value(mav_frame),
			ignore_all_except_xyz_y,
			p,
			Eigen::Vector3d::Zero(),
			Eigen::Vector3d::Zero(),
			ftf::quaternion_get_yaw(q), 0.0);
	}

从这里可以看到坐标系的转换,一般情况下,输入值都是 ENU 坐标系的,需要转换成 NED 坐标系之后再调用 set_position_target_local_ned 函数,将 mavlink 消息发送给飞控。

而当定义了坐标系为 MAV_FRAME::BODY_NED 时没有进行坐标翻转,而是进行了另一种转换。

 set_position_target_local_ned 函数的参数列表如下所示:

	void set_position_target_local_ned(uint32_t time_boot_ms, uint8_t coordinate_frame,
			uint16_t type_mask,
			Eigen::Vector3d p,
			Eigen::Vector3d v,
			Eigen::Vector3d af,
			float yaw, float yaw_rate)

其中,coordinate_frame 就是坐标系类型,type_mask 是控制类型掩码,没有文档对这些进行说明,因此需要从 PX4 飞控源码中寻找对应的代码来分析。

二、 PX4 飞控部分

对应的 mavlink 消息处理函数是

void
MavlinkReceiver::handle_message_set_position_target_local_ned(mavlink_message_t *msg)

代码很长就不贴了。

首先找 type_mask 的相关内容

		/* convert mavlink type (local, NED) to uORB offboard control struct */
		offboard_control_mode.ignore_position = (bool)(set_position_target_local_ned.type_mask & 0x7);
		offboard_control_mode.ignore_alt_hold = (bool)(set_position_target_local_ned.type_mask & 0x4);
		offboard_control_mode.ignore_velocity = (bool)(set_position_target_local_ned.type_mask & 0x38);
		offboard_control_mode.ignore_acceleration_force = (bool)(set_position_target_local_ned.type_mask & 0x1C0);
		bool is_force_sp = (bool)(set_position_target_local_ned.type_mask & (1 << 9));
		/* yaw ignore flag mapps to ignore_attitude */
		offboard_control_mode.ignore_attitude = (bool)(set_position_target_local_ned.type_mask & 0x400);
		/* yawrate ignore flag mapps to ignore_bodyrate */
		offboard_control_mode.ignore_bodyrate = (bool)(set_position_target_local_ned.type_mask & 0x800);


		bool is_takeoff_sp = (bool)(set_position_target_local_ned.type_mask & 0x1000);
		bool is_land_sp = (bool)(set_position_target_local_ned.type_mask & 0x2000);
		bool is_loiter_sp = (bool)(set_position_target_local_ned.type_mask & 0x3000);
		bool is_idle_sp = (bool)(set_position_target_local_ned.type_mask & 0x4000);

这些 bool 数值都会参与到控制的决策过程。

然后找 coordinate_frame ,只有这个赋值语句

					/* set the local vel values */
					if (!offboard_control_mode.ignore_velocity) {
						pos_sp_triplet.current.velocity_valid = true;
						pos_sp_triplet.current.vx = set_position_target_local_ned.vx;
						pos_sp_triplet.current.vy = set_position_target_local_ned.vy;
						pos_sp_triplet.current.vz = set_position_target_local_ned.vz;

						pos_sp_triplet.current.velocity_frame =
							set_position_target_local_ned.coordinate_frame;

					} else {
						pos_sp_triplet.current.velocity_valid = false;
					}

在控制代码  void MulticopterPositionControl::control_offboard(float dt) 中坐标系类型起作用

				if (_pos_sp_triplet.current.velocity_frame == position_setpoint_s::VELOCITY_FRAME_LOCAL_NED) {
					/* set position setpoint move rate */
					_vel_sp(0) = _pos_sp_triplet.current.vx;
					_vel_sp(1) = _pos_sp_triplet.current.vy;

				} else if (_pos_sp_triplet.current.velocity_frame == position_setpoint_s::VELOCITY_FRAME_BODY_NED) {
					// Transform velocity command from body frame to NED frame
					_vel_sp(0) = cosf(_yaw) * _pos_sp_triplet.current.vx - sinf(_yaw) * _pos_sp_triplet.current.vy;
					_vel_sp(1) = sinf(_yaw) * _pos_sp_triplet.current.vx + cosf(_yaw) * _pos_sp_triplet.current.vy;

				} else {
					warn_rate_limited("Unknown velocity offboard coordinate frame");
				}

也就是说,当坐标类型为 LOCAL_NED 时,直接将值赋值给 速度期望;而当坐标类型是 BODY_NED 时,需要进行一次坐标转换;其他类型均引发错误。

需要特别注意,从代码过程可以分析得知,用户设定的坐标类型只在最终控制端发生了作用。用户进行对坐标数值进行赋值的时候,只能按照 ENU 坐标系的方式来进行赋值,并不是按照设定的坐标类型来赋值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 MAVROS 到 PX4 飞控的数据流向 的相关文章

  • PX4使用I2C方式添加自定义传感器(1)

    PX4使用I2C方式添加自定义传感器 xff08 1 xff09 前言 毕业设计就是要在PX4上添加一个传感器 xff08 角度传感器 xff09 xff0c 由于板子上的接口数量很少 xff0c 很是宝贵 最后只能选择通过I2C通信方式
  • PX4 Offboard Control with MAVROS--Takeoff(一键起飞)

    警告 xff1a 请先在仿真环境下进行测试 xff0c 能达到预期效果后在进行实际飞行测试 xff0c 以免发生意外 本篇文章只是用作学习交流 xff0c 实际飞行时如出现意外情况作者不予以负责 所需材料 1 PIXhawk或者Pixrac
  • PX4 SITL Gazebo 仿真时 libgazebo_multirotor_base_plugin 插件运行时出错

    PX4 SITL Gazebo 仿真时 libgazebo multirotor base plugin 插件运行时出错 问题描述原因分析解决办法总结 问题描述 在 Gazebo 中进行 PX4 的软件在环仿真时 xff0c 执 make
  • Ubuntu18.04安装PX4踩坑、报错及解决方案整理

    笔者最近需要跑无人机巡检大坝的仿真 xff0c 于是在自己的Ubuntu2018 04中开始安装PX4 xff0c 问过不少之前已经装过PX4的师兄和同学 xff0c 都曾在PX4安装过程中踩过许多坑 xff0c 耗费了不少时间 xff0c
  • PX4代码学习系列博客(6)——offboard模式位置控制代码分析

    分析offboard模式的代码需要用到以下几个模块 local position estimator mavlink mc pos control mc att control mixer 程序数据走向 mavlink 一般的offboar
  • Ubuntu下构建PX4软件

    本搭建过程基于http dev px4 io starting building html xff0c 希望大家互相交流学习 原文 xff1a Building PX4 Software xff08 构建PX4软件 xff09 PX4 ca
  • 初学PX4之环境搭建

    文章转自 xff1a http www jianshu com p 36dac548106b 前言 前段时间linux崩溃了 xff0c 桌面进去后只有背景 xff0c 折腾好久没搞定 xff0c 为了节省时间索性重装了系统 xff0c 同
  • PX4模块设计之五:自定义MAVLink消息

    PX4模块设计之五 xff1a 自定义MAVLink消息 1 MAVLink Dialects1 1 PX4 Dialects1 2 Paprazzi Dialects1 3 MAVLink XML File Format 2 添加自定义M
  • PX4模块设计之二十四:内部ADC模块

    PX4模块设计之二十四 xff1a 内部ADC模块 1 内部ADC模块简介2 模块入口函数2 1 主入口board adc main2 2 自定义子命令custom command 3 内部ADC模块重要函数3 1 task spawn3
  • PX4模块设计之三十三:Sensors模块

    PX4模块设计之三十三 xff1a Sensors模块 1 Sensors模块简介2 模块入口函数2 1 主入口sensors main2 2 自定义子命令custom command2 3 模块状态print status 重载 3 Se
  • PX4模块设计之三十四:ControlAllocator模块

    PX4模块设计之三十四 xff1a ControlAllocator模块 1 ControlAllocator模块简介2 模块入口函数2 1 主入口control allocator main2 2 自定义子命令custom command
  • PX4模块设计之四十三:icm20689模块

    PX4模块设计之四十三 xff1a icm20689模块 1 icm20689模块简介2 模块入口函数2 1 主入口icm20689 main2 2 自定义子命令custom command2 3 模块状态print status 重载 3
  • 关于github px4 gps 驱动的开发的总结

    源码编译上边已经写过文章了 遇到的几个问题 1 解决虚拟机不能共享文件夹的问题 一开始虚拟机的更新 vmware tools 是灰色的 xff0c 不能点 xff0c 然后通过关掉虚拟机 xff0c 然后再开启的时候 xff0c 在没有启动
  • px4_simple_example和uorb机制

    px4 simple app PX4 Autopilot src exampes px4 simple app xff0c 这个程序是用c语言调用orb API和poll机制订阅和发布通讯数据 xff0c 但是这个例子并不是既有接收又有发送
  • pixhawk px4 commander.cpp

    对于复杂的函数 xff0c 要做的就是看函数的输入是什么 来自哪里 xff0c 经过处理后得到什么 给谁用 xff0c 这样就可以把程序逻辑理清 中间的分析就是看函数如何处理的 span class hljs keyword extern
  • PX4 OffBoard Control

    终于还是走上了这一步 xff0c 对飞控下手 xff0c 可以说是一张白纸了 记录一下学习的过程方便以后的查阅 目录 一 ubuntu18 04配置px4编译环境及mavros环境 二 PX4的OffBoard控制 1 搭建功能包 2 编写
  • PX4模块设计之二十七:LandDetector模块

    PX4模块设计之二十七 xff1a LandDetector模块 1 LandDetector模块简介2 模块入口函数2 1 主入口land detector main2 2 自定义子命令custom command 3 LandDetec
  • 【PX4 飞控剖析】06 树莓派加载安装ROS,Mavros以及PX4固件

    PX4 飞控剖析 06 树莓派加载安装Mavros以及PX4固件 1 树莓派 刷镜像1 1 用Win32DiskImager刷入ubuntu mate 16 04 2 desktop armhf raspberry pi的镜像 1 2 开机
  • PX4项目学习::(七)飞控栈:commander

    PX4的飞行控制程序通过模块来实现 xff0c 与飞控相关的模块主要有commander xff0c navigator xff0c pos control xff0c att control这几个 xff0c 分别可以在src modul
  • PX4项目学习::(五)模块代码启动流程

    54条消息 PX4 模块代码启动流程 zhao23333的博客 CSDN博客

随机推荐

  • 各种密码在线转换网址

    各种密码在线转换网址 链接装载自 xff1a http hack 0 lofter com post 1e5974f4 f81b8fe xssee http web2hack org xssee xssee http evilcos me
  • ros入门真的没有那么难,我一般不说有手就行^_^

    我本来不相信我能用ubuntu工作的 xff0c 但事实证明有些东西真的只是你还不会用 xff0c 还会不断有人问你类似的萌新问题 xff1a ubuntu是不是很难啊 xff0c ros怎么入门啊 但是大家三岁玩XP电脑的时候也差不多这样
  • 树莓派和机器人有啥关系(也有jetson tx2的知识主要)

    个人是这样理解的 xff0c master computer属于全嵌入式开发 xff0c slave computer属于半嵌入式开发 这个划断依据是根据是否运行了独立的os来划分的 xff0c 不是指能不能 xff0c 而是指实际应用中是
  • 7 AI系统伦理道德风险之透明度验证

    透明度是指让人工智能的工作原理 数据来源 决策依据和潜在影响更加清晰和可理解 以增强人们对人工智能的信任和理解 透明度是确保AI系统公正 可靠和负责任的重要实践之一 对于一个AI系统的透明度 应该从如下几个角度进行衡量 AI系统的目标和范围
  • 英伟达 Jetson TX2 开发板安装Xsens MTi 驱动

    TX2 的 ubuntu 18 04 不能自动将 MTi 的 USB 口识别成串口 xff0c 必须编译内核模块作为驱动程序 第一步 xff0c 下载内核源码到 TX2 的 usr src 文件夹 内核源码的下载链接在英伟达官网 xff0c
  • 利用 kalibr 标定多个相机(>=1)和 IMU 组合系统

    目录 1 准备工作 1 1 编译 kalibr 1 2 制作标定板 2 相机标定 2 1 相机话题降频 2 2 录制rosbag 2 3 相机标定 3 相机 IMU标定 3 1 准备文件 3 2 录制相机 43 IMU的 rosbag 3
  • 从 EuRoC MAV Dataset 的 .zip 文件生成 .bag 的 python 脚本

    EuRoc MAV Dataset 是 VSLAM 和 VIO 常用的一个数据集 每个场景同时保存了 bag 的 rosbag 文件和 zip 的压缩文件 xff0c 但是在国内的网络中下载 bag 文件异常缓慢 xff0c 而 zip 更
  • 在ros中使用 RPLIDAR_A1 激光雷达 8000点/秒 的配置方法

    下午拿到一个思岚科技的RPLIDAR A1 xff0c 具体版本型号是A1M8 R5 直接在 ros 环境下搞起 xff0c 配置与使用非常简单 xff0c 但是仔细阅读了源码却发现一些需要注意的地方 xff0c 在这里罗列下来 1 安装
  • 解决直接 apt-get 安装了 realsense2_camera,无法打开USB接口的问题

    要使用 intel realsense 的深度相机 xff0c 之前的流程是先按照官网教程安装 SDK xff0c 再下载 ros package 进行编译 xff1b 现在可以直接一个指令 sudo apt get install ros
  • PX4-Autopilot v1.11.1 Makefile 的一点解读

    好久没关注 PX4 的更新进度 xff0c 最近正好想重新搭一个仿真环境 xff0c 就下载了最新的代码来看 原本的下载地址 https github com PX4 Firmware 已经更名为 https github com PX4
  • Windows环境下,如何为TensorFlow-GPU选择正确的CUDA版本和cuDNN版本

    又双叒一次重新安装系统 xff0c 不得不再次安装Python3和TensorFlow GPU 其实如果在Python3下只安装的是TensorFlow CPU版本的话 xff0c 非常简单 xff0c 直接在命令行内敲 xff1a pip
  • PX4IO的编译过程、代码构架以及与PX4FMU的通讯分析

    看到很多教程中讲到PX4飞控的协处理器的作用 xff0c 包括各类遥控器信号的输入 PWM信号输出 以及与FMU的通讯 但是究竟如何实现的 xff0c 最近几天自己看代码总算搞懂了 xff0c 在这里分享一下 一 xff0c 代码的组成和编
  • PX4飞控手动位置控制POSCTL模式的实现流程

    第一步 xff0c POSCTL模式的进入 1 从遥控器模式开关进入 首先在PX4IO的主循环中调用了io publish raw rc xff0c 从IO芯片获取遥控器的各通道输入 xff0c 发布input rc消息 xff1b 然后
  • PX4自动任务飞行AUTO_MISSION的实现流程

    第一步 xff0c 进入方式 与之前分析的POSCTL模式类似 xff0c 主要有遥控器开关和指令两种模式 xff0c 实现过程完全相同 最终都是调用了main state transition 函数将新模式写入到internal stat
  • 8 AI系统伦理道德风险之可信任度验证

    可信度主要是评估用户或者其他干系人对AI系统的信任程度 ISO IEC TR 24028 2020 人工智能中的可信度概述 中给出了可信任度的明确定义 能够以一种可以验证的方式满足系统干系人的期望能力 这是一个广泛的定义 从能力描述上重点强
  • 禁用Nouveau,安装Linux Nvidia 显卡驱动

    https blog csdn net misiter article details 7652731 干掉Nouveau安装Linux Nvidia显卡驱动 首先说明下什么是Nouveau xff0c 为什么有些系统安装N卡驱动的时候会提
  • PX4代码中LIDAR-Lite v3激光测距仪I2C驱动

    调试LIDAR Lite v3激光测距仪 xff0c 通读了PX4代码中驱动相关的部分 在这里做一下记录 飞控硬件是pixhawk1 xff0c PX4软件版本为1 7 3 按照官方教程进行接线和配置 xff0c 链接为 https doc
  • PX4代码中LIDAR-Lite v3激光测距仪PWM驱动

    调试了LIDAR Lite v3激光测距仪PWM驱动 xff0c 在这里做一下记录 飞控硬件是pixhawk1 xff0c PX4软件版本为1 7 3 按照官方教程进行接线和配置 xff0c 链接为 https docs px4 io en
  • MAVROS 源码分析

    一 安装 MAVROS 利用机载计算机对 PX4 飞控进行 OFFBOARD 控制 xff0c 需要在机载计算机上安装 ROS 的 MAVROS 包 安装方式可以参考 PX4 开发者网站 xff0c 有二进制文件安装和源码安装两种方式 xf
  • 从 MAVROS 到 PX4 飞控的数据流向

    上一篇分析了 MAVROS 中数据收发的实现方法 当用户发送一个 ros 话题的消息后 xff0c 对应的 plugin 中的回调函数被处罚 xff0c ros 消息被包装成 mavlink 消息 xff0c 从链路中发送出去 下面以 34