• 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层。

    Crazyflie笔记五: <wbr>CRTP <wbr>实时通信协议(一)  

            第一层: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

    发送rollpitchyaw hrust控制指令。

    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)字符串带 或者 ,也触发字符串发送;

                    3)调用flush命令也会发送。

            B)       关于Commander数据端口

            英文参考:http://wiki.bitcraze.se/projects:crazyflie:crtp:commander

            Commander端口,用来发送rollpitchyaw hrust控制指令。一旦通信连接建立,这些rollpitchyaw hrust数据包将被发送,这些值将会不断更新。

    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名字。

    Crazyflie笔记五: <wbr>CRTP <wbr>实时通信协议(一)
            在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

  • 相关阅读:
    linux-centos7 安装 maven 代码管理工具,以及常见配置
    linux-centos7 安装 jre + tomcat 实现 web 服务器
    python 开发语言 博客目录
    生存分布函数
    债务偿还
    密度聚类算法
    POI兴趣点搜索
    区域地址搜索
    地址之间的距离
    地理坐标转换
  • 原文地址:https://www.cnblogs.com/LittleTiger/p/4729142.html
Copyright © 2020-2023  润新知