Crazyflie笔记五: CRTP 实时通信协议(一)(转)
源:Crazyflie笔记五: CRTP 实时通信协议(一)
这里详细介绍了 Crazyflie 的 CRTP实时通信协议的相关内容,由于内容很长,分几篇博文来讲述。这里是第一节内容。欢迎交流:30175224@qq.com。新浪长沙@WalkAnt,转载本博客文章,请注明出处,谢谢。
7.1 CRTP通信包
英文参考:http://wiki.bitcraze.se/projects:crazyflie:firmware:comm_protocol
CRTP是Crazyflie的通信协议(Crazy RealTime Protocol)。该协议分3层。
第一层:CRTP Link。负责在PC与Crazyflie之间传输数据包。主要处理包长度,包错误信息。
第二层:CRTP Packet handling。将数据包传递给相应的飞行器子系统和PC控制软件。
第三层:Application/ports。代表发送和接受数据包的相应子系统。
1、数据通道
CRTP Link层对应的数据通道:
|
UART link |
主要用于早期开发。 |
|
USB link |
micro USB端口。 |
|
radio link |
主要使用2.4 GHz NordicSemi的nRF24L01芯片。 |
2、数据端口
当前端口分配:
|
端口号 Port |
数据端口 |
用途 |
|
0 |
Console 采用consoleprintf函数可以将调试信息输出到PC端。 |
|
|
2 |
读写Crazyflie参数,这些参数在源码中用宏来表示。 |
|
|
3 |
发送roll\pitch\yaw\thrust控制指令。 |
|
|
5 |
设置日志变量,这些日志变量将会以指定的周期发送。日志变量在源码中用宏来表示。 |
|
|
14 |
用于调试PC端UI界面程序,只针对Crazyflie Python API。 |
|
|
15 |
用于控制和访问通信链路层 |
A) 关于console数据端口:
英文参考:http://wiki.bitcraze.se/projects:crazyflie:firmware:console
Console 采用consoleprintf函数可以将调试信息输出到PC端。
Console端口用于Crazyflie飞行器向PC机单向打印信息,采用consoleprintf函数。飞行器端的console缓存长度为31个字节(0-30),当以下任一条件满足则发送。
1)输出缓存满31字节,字符串则自动发送到PC机;
2)字符串带\n或者\r,也触发字符串发送;
3)调用flush命令也会发送。
B) 关于Commander数据端口
英文参考:http://wiki.bitcraze.se/projects:crazyflie:crtp:commander
Commander端口,用来发送roll\pitch\yaw\thrust控制指令。一旦通信连接建立,这些roll\pitch\yaw\thrust数据包将被发送,这些值将会不断更新。
|
Name |
Byte |
Size |
Type |
Comment |
|
Roll |
0-3 |
4 |
float |
Roll值 |
|
Pitch |
4-7 |
4 |
float |
Pitch值 |
|
Yaw |
8-11 |
4 |
float |
Yaw值 |
|
Thrust |
12-13 |
2 |
uint16_t |
Thrust值 |
C) 关于LOG数据端口
英文参考:http://wiki.bitcraze.se/projects:crazyflie:firmware:log#communication_protocol
LOG数据端口就是用来在Crazyflie飞行期间,实时将log数据传回PC端显示。每一个日志变量都属于一个group组,并有一个name名字。
在log.h源码中,日志变量通过一系列宏指令来定义。所有的日志变量都被定义在一个log group组里,例如:
LOG_GROUP_START(stabilizer)
LOG_ADD(LOG_FLOAT, roll, &eulerRollActual)
LOG_ADD(LOG_FLOAT, pitch, &eulerPitchActual)
LOG_ADD(LOG_FLOAT, yaw, &eulerYawActual)
LOG_GROUP_STOP(stabilizer)
|
宏 |
用法 |
|
LOG_GROUP_START(grp_name) |
开始一个log group的定义,其中grp_name为组名 |
|
LOG_GROUP_STOP(grp_name) |
停止一个log group的定义 |
|
LOG_ADD(type, name, address) |
添加一个log变量。 type 是变量类型; name 是发送到地面站的变量名字; address 是源码中真实变量的地址。 |
日志变量的变量类型,列举如下:
|
类型定义 |
对应的C99变量类型 |
说明 |
|
LOG_UINT8 |
uint8_t |
|
|
LOG_UINT16 |
uint16_t |
|
|
LOG_UINT32 |
uint32_t |
|
|
LOG_INT8 |
int8_t |
|
|
LOG_INT16 |
int16_t |
|
|
LOG_INT32 |
int32_t |
|
|
LOG_FLOAT |
float |
IEEE 754 binary32 (single precision float) |
|
LOG_FP16 |
N/A? |
IEEE 754 binary16, intended for log report only (not in memory) |
3、CRTP通信包的结构
CRTP数据包,由一个8-bit header头,和0-30数据字节组成。
|
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
|
目标数据端口 Port 例:Log=5; Commander= 3 ; Parameters=2 |
Res 保留 |
目标通道 Channel |
|||||
|
DATA 0 |
|||||||
|
DATA1 |
|||||||
|
… |
|||||||
|
… |
|||||||
|
DATA30 |
|||||||
目标数据端口,指的是通信子系统。通信子系统可以是Console、Parameters、Commander、Log、Client-side debugging、Link layer等等。
4、物理接口层
下面所讲述的数据通信包适用于有线和无线传输。但是数据包大小为31字节,所以无线传输时最好将所有数据能够完整放在一个数据包以内传输。
对于无线传输接口,会增加额外的CRC数据头。对于串口的参数配置为,波特率115200,8N1。CRTP数据包格式如下。
|
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
|
0xAA |
|||||||
|
0xAA |
|||||||
|
目标数据端口 Port 例:Log=5; Commander= 3 ; Parameters=2 |
Res 保留 |
目标通道 Channel |
|||||
|
Packet length 数据字节长度(DATA长度) |
|||||||
|
DATA 0 |
|||||||
|
DATA1 |
|||||||
|
… |
|||||||
|
… |
|||||||
|
DATA30 |
|||||||
|
Cksum 校验码 |
|||||||
进一步的解释如下:
|
0xAA |
0xAA |
Header 数据头 |
Length 数据长度 |
Data0…………………….Data30 |
Cksum |
举例如下:
例1:Commander命令:
0xaa 0xaa 0x30 0x0e 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x3e
其中:0x30表示Commander命令;0x0e表示数据长度为14字节。
例2:数据链路ping指令(类似以太网ping指令)
--> 0xaa 0xaa 0xf0 0x01 0x01 0xf2 # Sent to the copter 发往copter飞行器
<-- 0xaa 0xaa 0xf0 0x01 0x01 0xf2 # Received from the copter 接收自飞行器
其中0xf0表示用于控制和访问通信链路层的link layer数据端口命令。0x01表示数据长度1个字节。
关于Crazyflie笔记的其他文章,请参考http://blog.sina.com.cn/antinformation
Crazyflie笔记五: CRTP 实时通信协议(一)(转)的更多相关文章
- go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])
目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- 《MFC游戏开发》笔记五 定时器和简单动画
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9332377 作者:七十一雾央 新浪微博:http:// ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Django开发笔记五
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.页面继承 定义base.html: <!DOC ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
随机推荐
- HDU 5455 Fang Fang 水题,但题意描述有问题
题目大意:f[1]=f,f[2]=ff,f[3]=ffc,以后f[n]每增加1,字符串增加一个c.给出一个字符串,求最少有多少个f[]组成.(字符串首尾相连,比如:ffcf可看做cfff) 题目思路: ...
- POJ 1182 食物链 经典并查集+关系向量简单介绍
题目: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有 ...
- Spark集群搭建中的问题
参照<Spark实战高手之路>学习的,书籍电子版在51CTO网站 资料链接 Hadoop下载[链接](http://archive.apache.org/dist/hadoop/core/ ...
- webstrom自定义代码块的设置方法
webstrom里面的自定义代码块叫做活动模版 在文件 -> 设置 -> 编辑器 -> 活动模版可以打开 里面的$var$ 代表一个变量 两个相同的$var$在不全后可以同时修改, ...
- HDU - 1865 1string(大数)
题目链接:http://acm.hust.edu.cn/vjudge/contest/121397#problem/F http://acm.hdu.edu.cn/showproblem.php?pi ...
- Oracle Sql优化之分层查询(connect by)
1.对于表中行与行存在父子关系时,可以通过connect by查询方式,查询行与行之间的父子关系 ),'-')|| empno as tempno, ename,mgr,level, decode(, ...
- 转:webdriver驱动未在默认目录安装的firefox
刚开始用webdriver的朋友一定会苦恼它时常不能启动firefox,很多时候是因为firefox安装在默认路径下.此时,我们有些常用方法,可以解决此问题. [1] System.setProper ...
- the.book.of.gimp.pdf文字不显示
逆天了,不是中文也不显示. https://bugs.freedesktop.org/show_bug.cgi?id=70529 说要升级libfreetype,可是已经是wheezy最新了,其他不稳 ...
- 前端HR告诉你—如何面试Web前端开发
分享一篇HR前端面试心得: 面试前端工程师对我来说是一件非常有意思的事,因为面试过程很大程度上也是自我提升的过程.无论大公司还是小公司,之所以在如何招聘到真正有能力的,前端工程师方面会遇到同样的问题. ...
- android4.0 的图库Gallery2代码分析(二)
最近迫于生存压力,不得不给人兼职打工.故在博文中加了个求点击的链接.麻烦有时间的博友们帮我点击一下.没时间的不用勉强啊.不过请放心,我是做技术的,肯定链接没病毒,就是我打工的淘宝店铺.嘻嘻.http: ...