MAVLink协议的移植

2023-05-16

        mavlink协议被大众知晓应该是PX4项目发起之后,随着开源飞控神器PX项目进入国内。本次就只分析移植过程中的问题,协议具体内容及其他知识只稍作带过,有时间再更新。

        mavlink的源码有官方的代码生成器,或者从开源的px4或者px4flow(光流)的源代码中获得。目前版本只有v0.9和v1.0,0.9已经逐渐不更新了。要用1.0的。

  1.如果从mavlink官网下载的生成器生成代码的话,需要额外的一些改动,下载的文件如下,需要py环境,歪果仁好像很喜欢py。

        

  运行后的效果是这样的,通过xml文件定义数据结构,语言选C语言,就能生成标准的c代码了。

       

  不大推荐这种方式,不过需要新的数据帧结构的话,用这种方式可以保证代码比较规矩一致。

  2.px4或者光流的源码里的,和生成器的代码差别很小,要修改的地方只有一处。


  简单分析一下代码文件的功能和结构。代码在A/mavlink/include/mavlink/v1.0下,A是源代码的位置。

  checksum:校验和,用来在数据帧结尾加一个16bits校验码检查通讯出错。不需要改。

  mavlink_conversions:一些常用的转换函数方法,四元数、矩阵、欧拉等等的转换,不用改。

  mavlink_helpers:需要修改,翻到文件最下面,有注释说明了需要根据你使用的MCU重写字符发送的底层函数,常见的就是用串口,重写个串口发送单个字符函数就行。

       
MAVLINK_HELPER void _mavlink_send_uart(mavlink_channel_t chan, const char *buf, uint16_t len)
{
#ifdef MAVLINK_SEND_UART_BYTES
	/* this is the more efficient approach, if the platform
	   defines it */
	MAVLINK_SEND_UART_BYTES(chan, (const uint8_t *)buf, len);
#else
	/* fallback to one byte at a time */
	uint16_t i;
	for (i = 0; i < len; i++) {
		comm_send_ch(chan, (uint8_t)buf[i]);
	}
#endif
}

  可以在其他函数中定义宏#define MAVLINK_SEND_UART_BYTES mavlink_send_uart_bytes,并重写mavlink_send_uart_bytes为自己的函数就行。

  mavlink_types:定义了用到的各种数据结构,方法1生成的代码片段是这样的

  
MAVPACKED(
typedef struct __mavlink_message {
	uint16_t checksum; ///< sent at end of packet
	uint8_t magic;   ///< protocol magic marker
	uint8_t len;     ///< Length of payload
	uint8_t seq;     ///< Sequence of packet
	uint8_t sysid;   ///< ID of message sender system/aircraft
	uint8_t compid;  ///< ID of the message sender component
	uint8_t msgid;   ///< ID of message in payload
	uint64_t payload64[(MAVLINK_MAX_PAYLOAD_LEN+MAVLINK_NUM_CHECKSUM_BYTES+7)/8];
}) mavlink_message_t;

  需要改成 

  
typedef struct __mavlink_message {
	uint16_t checksum; ///< sent at end of packet
	uint8_t magic;   ///< protocol magic marker
	uint8_t len;     ///< Length of payload
	uint8_t seq;     ///< Sequence of packet
	uint8_t sysid;   ///< ID of message sender system/aircraft
	uint8_t compid;  ///< ID of the message sender component
	uint8_t msgid;   ///< ID of message in payload
	uint64_t payload64[(MAVLINK_MAX_PAYLOAD_LEN+MAVLINK_NUM_CHECKSUM_BYTES+7)/8];
} mavlink_message_t;
  从px源码得到的该函数就是已经修改好的了,结构体字节对齐在嵌入式编程里基本用不到,嵌入式基本都是单字节寻址,加上编译器优化,不会出现一个数据需要两次寻址的情况。
  protocol:处理大端小端什么的,没具体看,用不上改。
  common文件下的各种头文件就是定义了具体的数据结构的数据帧,包含发送接收等等编码译码函数等等。
  完成移植还需要解决过程中的各种小问题,可以参照px4flow的源代码里Flow-master/src/communication以及settings文件进行与main函数的关联。


  想要理解mavlink的设计思路的话,参照CANopen协议就行,后者的资料多,二者的思路我认为是极其类似的。

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

MAVLink协议的移植 的相关文章

  • 项目使用多个maven库的方法

    有时在项目中需要使用第三方提供的SKD xff0c 然而这些Jar包是没有在Maven中央仓库的 需要导入一个知识的Maven库 导入方法有以下两种 xff1a 第一种方法是在POM中指定要使用的Maven span class token
  • mysql8初始密码及root密码修改

    安装mysql8之后没有办法登录 xff0c 初始密码是多少 xff1f 初始密码在 etc mysql debian cnf 修改root帐号 ALTER USER span class token string 39 root 39 s
  • ros学习(一): ros的bag包读取错误问题及解决方法

    一 ERROR bag unindexed 2021 6 23 0103all bag Run rosbag reindex 1 问题 想要跑一个很久没有用的 bag文件 xff0c 运行命令 xff1a rosbag info xxx b
  • BaiduPCS-Go出现403 Forbidden错误解决方法

    今天使用BaiduPCS Go下载百度云资源时 xff0c 下载一个比较大的文件时下载到一半就出现了403 Forbidden错误 xff0c 之后就再也无法下载了 上网查了下 xff0c 发现很多人都说时账号被封 xff0c 但是我试了下
  • ubuntu创建桌面快捷方式

    有些软件是自己安装的 xff0c 并不有在启动器创建快捷方法 使用起来很不方便 xff0c 那么就需要自己来手动创建了 在 usr share applications 目录下创建与应用程序同名的 desktop文件 Typora desk
  • SSH配置公钥快速登录服务器

    使用多个git服务器每次都需要输入帐号密码 xff0c 这个是不能忍受的 可以使用ssh配置公钥快速登录 xff0c 不需要再输入密码了 xff0c 很快捷 生成 添加SSH公钥 ssh keygen t rsa C span class
  • Xdebug 2升级到3指南

    官方文档 xff1a https xdebug org docs upgrade guide 升级指南 xff0c 详细介绍了Xdebug 2和3之间的哪些更改 xff0c 以及如何重新配置 您的设置以执行类似的操作 新概念 xff03 与
  • git clone提示matching host key type found. Their offer: ssh-rsa

    win11系统在使用git clone时 xff0c 提示matching host key type found Their offer ssh rsa 在 ssh config增加 xff1a HostkeyAlgorithms 43
  • vue项目打包后卡死

    element使用el tabs导致浏览器卡死 使用ElementUi开发后台本地是好的 xff0c 打包后有一个页面打开就卡死浏览器 xff0c 经排查发现在是由于引起的 将vue vue template compiler elemen
  • Win11运行VMware延迟卡顿

    最近在使用VMware时 xff0c 开机提示如下 xff1a 您在运行该虚拟机时启用了侧通道缓解 侧通道缓解可增强安全性 xff0c 但也会降低性能 要禁用缓解 xff0c 请在虚拟机设置的 高级 面板中更改侧通道缓解设置 有关更多详细信
  • MacBookPro制作Windows 11 U盘启动盘

    下载 Windows ISO 文件 你可以直接从 Windows 官网下载 ISO 文件 插入U盘 官方iso镜像文件大约5GB xff0c U盘需要大于5G 通过命令确认U盘所在的驱动器 在终端输入如下命令 diskutil list 可
  • Git彻底删除历史记录中大文件

    在做项目时 使用Git为版本控制时 经常会有小伙伴提交一些二进制的大文件到git xff0c 使用版本库变的臃肿 等到发现用git rm删除那个文件 但这样做显然是不够的 xff0c 这些文件并没有真正在项目中被用到 xff0c 与此同时这
  • Archlinux在升级后无法进入图形桌面

    Archlinux系统在经历了一个多小时的升级后 终于升级完成 但重启后 xff0c 就进不了系统 xff0c 出现错误提示 系统出问题 请联系管理员 Archlinux升级命令 yay span class token parameter
  • Docker使用普通用户运行

    Docker 守护程序绑定到 Unix 套接字 xff0c 而不是 TCP 端口 默认情况下 xff0c 拥有 Unix 套接字的是用户 xff0c 其他用户只能使用 Docker 守护程序始终以用户身份运行 span class toke
  • OpenCV学习实践(2) 获取当前工作空间目录

    0 前言 因为opencv涉及导入本地图片 cv imread函数 又不想一直使用绝对路径 使用相对路径有一直出错 所以想先看看当前工作目录在哪 此外 这里还使用roslaunch启动程序 使当前工作目录更难找了 感谢tjf ym两位师兄的
  • STM32的SPI

    1 SPI硬件层共有4个引脚SCK MISO MOSI NSS 不需要接上拉及下拉电阻等 2 SPI跟I2C一样是一种通讯总线 所以可以挂载多个从机 通过NSS片选引脚控制从机 3 SPI主模式时钟与挂载总线相关 STM32时钟为fpclk
  • AC-AC变换电路

    1 工频变压器变换 隔离变压器安全性高 xff0c 但效率低于自耦变压器 2 自耦变压器变换电压 非隔离型变压器 xff0c 效率高但安全性不高 3 阻容降压电路 利用电容隔直通交的特性 xff0c 容抗 Xc 61 1 2 fc 当频率非
  • 使用matlab曲线拟合

    1 excl中的x y变量参数 2 使用matlab中的导入数据 选择刚刚的表格 3 导入选项中选择列向量 4 在matlab命令行中输入函数plot M1 M2 其中M1 M2是x y变量 5 然后会显示新窗口 在新窗口中使用工具的基本拟
  • LLC软开关笔记

    1 增益 当工作在谐振频率时 LLC的增益为1 开关频率高于谐振频率 增益降低 开关频率低于谐振频率时 增益大于1 当开关频率过高 增益过小时 需要进入打嗝模式 2 mos零电压开通 要保证mos的软开 首先要保证一定的死区时间 在死区时间
  • simulink PID自动整定

    使用此方法可以快速得出PID参数而不用经过复杂的计算 电压电流环均可使用此方法 1 模型搭建完成后点击PID模块的Tunne 选项进入PID Tunner模块 2 由于模型为非线性对象需要识别控制对象 点击 plant gt Identif

随机推荐

  • 以Boost为例的type3电压环补偿器实例

    因为零极点控制在开关电源当中对于控制系统稳定性具有较大的自由度 最近半年一直在研究学习开关电源中的零极点控制 零极点控制对于我在内的大部分人来说应该是难点 因为数学模型推导计算复杂 难度较高 最近半年一直翻书查阅资料还是没有完全掌握 所幸通
  • Simulink 使用C语言发PWM波 (一)

    1 在matlab中安装C语言模块mingw 2 在simulink中引用S Function模块 和S Function Examples模块 3 使用S Function Examples模块创建C文件 双击S Function Exa
  • Simulink 使用C语言发PWM波 (二)触发采样

    1 定义结构体 2 定义S Function输出端口数量 3 定义采样时间 4 初始化参数 5 用代码实现三角波载波 根据调制波配置占空比并在计数器为0时采样电感电流 6 simulink图 至此实现了电感电流使用C语言采样
  • c++的几个刷题网站(不只有c++)

    oj joyskid cn 116 55 251 18 9902 ybt ssoier cn 8088 http hihocoder com https www lintcode com https vjudge net https www
  • Putty登陆root输入密码被拒绝(没开启ssh)

    输入密码 xff0c 提示Access denied 考虑是因为没有开启ssh xff0c 检查后发现未安装ssh yum y install openssh 提示出错 xff0c yum install tree也不行 xff0c 猜是源
  • ubuntu系统(三):c++ serial使用与学习

    0 前言 目前讲解单一知识点 xff0c 觉得最好的就时c 43 43 官方 xff08 官方网站 xff09 给的说明 xff0c 链接如下 xff1a serial 1 1 0 http wjwwood io serial doc 1
  • python编程入门书籍-最适合Python初学者的6本书籍推荐「必须收藏」

    原标题 xff1a 最适合Python初学者的6本书籍推荐 必须收藏 Python是一种通用的解释型编程 xff0c 主要用于Web开发 机器学习和复杂数据分析 Python对初学者来说是一种完美的语言 xff0c 因为它易于学习和理解 x
  • Pixhawk遥控器无法检测&bootloader烧写

    Pixhawk detected 0 radio channel 导火索 xff1a 最近毕设想用pixhawk来做个东西 于是跟着官方的wiki xff0c 搭建起了编译环境 但是奇怪的事情突然发生了 我clong的是官方最新版的mast
  • 远程SSH连接Putty失败解决办法

    1 vi etc ssh sshd config 将PermitRootLogin的注释取消 xff0c 或者将no改为yes 2 service sshd restart 先测试此方法 xff0c 我测试通过 3 setup命令进入将防火
  • 面向服务的架构

    SOA 是一种在计算环境中设计 开发 部署和管理离散逻辑单元 xff08 服务 xff09 模型的方法 虽然 SOA 是基于对象的 xff0c 但是作为一个整体 xff0c 它却不是面向对象的 服务之间通过交互和协调完成业务的整体逻辑 所有
  • 百分百成功的ros安装教程,有手就能看懂!!!

    肯定有许多人在安装ros的过程中遇到过各种各样的问题 xff0c 接下来我将对ros安装进行详细的描述 1 下载操作系统 首先是版本的对应问题 xff0c ros安装一定要对应相应的操作系统版本 xff0c 这里我们要安装的是Ros Mel
  • 嵌入式研发工作划分

    什么是嵌入式研发 嵌入式研发的标志是 xff1a 软件研发和硬件研发相互配合 互联网是固定硬件平台 xff0c 纯软件开发 xff1b 机械是没有软件 xff0c 纯硬件开发 当今的大部分电子 xff0c 除去硬件部分就是软件 xff0c
  • 激光雷达, ToF 与传统雷达的异同

    原文 https www computationalimaging cn 2019 01 zotero html 根据之前对ToF的了解 它似乎就是将传统雷达的电磁波改为了激光器发射的光子束 而激光雷达的顾名思义似乎也是如此 因此本文专门讨
  • 英伟达再发边缘AI计算设备:仅信用卡大小,性能比TX2强15倍

    晓查 发自 凹非寺 量子位 报道 公众号 QbitAI 英伟达最近发布了Jetson Xavier NX xff0c 这是一个用于在无人机 汽车和机器人等边缘设备上的AI系统模块 Jetson Xavier NX的大小仅相当于一张信用卡 x
  • 国外同行举报CVPR 2020中国论文一稿多投,作者之一华科教授还是本届CVPR领域主席...

    贾浩楠 发自 凹非寺 量子位 报道 公众号 QbitAI CVPR 2020主会议开幕在即 xff0c 本次大会中榜的两位中国学者却被指责 一稿多投 而且 xff0c 原论文的作者之一 xff0c 华中科大的白翔教授 xff0c 还是本届C
  • 小米技术高管崔宝秋离职,雷军武大舍友,「创业派」已所剩无几

    梦晨 Pine 发自 凹非寺 量子位 公众号 QbitAI 小米高层调整还在持续 xff0c 又一高管被曝离职 副总裁崔宝秋 xff0c 历任小米首席架构师 人工智能与云平台副总裁 小米集团技术委员会主席 集团学习发展部总经理 可以说提起小
  • Cartographer(三)思岚雷达rplidar ros驱动使用报错与解决

    0 参考 https github com Slamtec rplidar ros issues 5 https github com Slamtec rplidar ros issues 5 https github com Slamte
  • 零代码入门GitHub,图形化交互让你轻松存代码 | 附Git GUI推荐

    鱼羊 发自 凹非寺 量子位 报道 公众号 QbitAI 传说 xff0c 程序员遇到火灾时有三个注意事项 xff1a 真的不能直接跑路吗 Git是目前世界上最流行的分布式版本控制系统 xff0c 用上了它 xff0c 就不必再面对这样的惨剧
  • OBS录课时的参数设置

    OBS Studio是一款功能强大的免费开源软件 xff0c 无广告 录屏只是它的一部分功能 xff0c 对于需要录制屏幕又要录制摄像头的也很适合 xff0c 有不少人将它用于直播 下面介绍我在用OS录制在线课程内容时 xff0c 如何进行
  • MAVLink协议的移植

    mavlink协议被大众知晓应该是PX4项目发起之后 xff0c 随着开源飞控神器PX项目进入国内 本次就只分析移植过程中的问题 xff0c 协议具体内容及其他知识只稍作带过 xff0c 有时间再更新 mavlink的源码有官方的代码生成器