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

Console 采用consoleprintf函数可以将调试信息输出到PC端。

2

Parameters

读写Crazyflie参数,这些参数在源码中用宏来表示。

3

Commander

发送roll\pitch\yaw\thrust控制指令。

5

Log

设置日志变量,这些日志变量将会以指定的周期发送。日志变量在源码中用宏来表示。

14

Client-side debugging

用于调试PC端UI界面程序,只针对Crazyflie Python API。

15

Link layer

用于控制和访问通信链路层

        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 实时通信协议(一)(转)的更多相关文章

  1. go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])

    目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...

  2. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  3. 《MFC游戏开发》笔记五 定时器和简单动画

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9332377 作者:七十一雾央 新浪微博:http:// ...

  4. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  5. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  6. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  7. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  8. Django开发笔记五

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.页面继承 定义base.html: <!DOC ...

  9. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

随机推荐

  1. HDU 5652 India and China Origins 二分优化+BFS剪枝

    题目大意:给你一个地图0代表可以通过1代表不可以通过.只要能从第一行走到最后一行,那么中国与印度是可以联通的.现在给你q个点,每年风沙会按顺序侵蚀这个点,使改点不可通过.问几年后中国与印度不连通.若一 ...

  2. jquery 展开关闭效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. [转]startActivityForResult的用法和demo

    有时候我们需要把A activity提交数据给B  activity处理,然后把结果返回给A 这种方式在很多种情况需要用到,比如我应用的程序需要有拍照上传的功能. 一种解决方案是  我的应用程序 〉调 ...

  4. jenkins插件 build-name-setter

    #${BUILD_NUMBER}-${PROJECT_NAME}-${ENV,var="VARIABLENAME"}-${ENV,var="BUILD_USER" ...

  5. display:block;inline;inline-block大总结

    总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通 ...

  6. 如何参与Hibernate-ORM项目

    1.注册 hibernate jira账户,hibernate中的issue和bug都会在此论坛发布 注册地址:https://hibernate.onjira.com 2.创建Hibernate-O ...

  7. .NET 4.0里异常处理的新机制

    非原创,转载自:   http://www.cnblogs.com/killmyday/archive/2010/09/05/1818533.html .NET里不能捕捉(catch)到一些异常了,而 ...

  8. PHPer转战Android的学习过程以及Android学习

    原文作者: eoeadmin原文地址: http://my.eoe.cn/shuhai/archive/19684.html-------------------------------------- ...

  9. javascript 按位或(|),无符号右移(>>>)运算,组合技巧来实现————密码强度提示,四种情况??

    直接上代码,原来的代码中,switch中的第一个case,判断之后,少加了个break 跳出判断语句,害得我查了半天,“怎么样式老是不对,不科学啊,呵呵,原来是没跳出case的判断了,还会执行后面的判 ...

  10. FACE++学习一、detect接口

    /detection/detect 描述 检测给定图片(Image)中的所有人脸(Face)的位置和相应的面部属性 目前面部属性包括性别(gender), 年龄(age), 种族(race), 微笑程 ...