kobuki通信协议.docx
《kobuki通信协议.docx》由会员分享,可在线阅读,更多相关《kobuki通信协议.docx(23页珍藏版)》请在冰豆网上搜索。
kobuki通信协议
附录:
协议说明
综述
Kobuki驱动程序与机器人通过预先设定好的协议进行通信。
通常,驱动会发送指令给机器人,并且得到机器人的反馈数据或传感器消息。
这些命令和反馈数据被转换为bytestream通过串口通信。
通信协议规定了bytestream的规则和形式。
一、流组成
一个bytestream可以分为四个部分:
headers,length,payload和checksum。
名字
Header0
Header1
Length
Payload
Checksum
大小
1字节
N字节
说明
0xAA
0x55
有效信息的字节数
有效信息
1、header
Header包括两个字节,header0和header1,它们是kobuki驱动命令和机器人反馈数据bytestream的固定值。
Headers用来检测bytestream的开始,相当于起始位。
2、length
Length表示一个bytestream中所包含的有效信息的长度。
Length占一个字节,它可以用来区别不同的bytestream,最小值为3。
3、payload
Payload中包涵了bytestream的中的实际数据即有效信息。
3.1payload
Payload有一些sub-payload组成。
Sub-payload0
Sub-payload1
Sub-payload2
…
Sub-payloadN-1
3.2sub-payload组成
sub-payload可以分为三部分:
header,length和data.
Header
Data
预定义的标识符
Data的字节位数
下面描述
4、checksum
Checksum是整个bytestream中出来headers外的异或值。
Checksum过程确保了bytestream的完整性。
下面是它的一段代码:
unsignedintpacket_size(buffer.size());
unsignedcharcs(0);
for(unsignedinti=2;i{cs^=buffer[i];}returncs?false:true;5、完整的bytestreamHeadersLengthPayloadChecksumHeader0Header1Sub-payload0Sub-payload1Sub-payload2…Sub-payloadN-1以上表格显示了整个bytestream结构。Payload的最小长度为3,payload中包含sub-payload,它的长度为1.理论上这个数据包(bytestream)的最小长度为7.二、数据类型Sub-payload的数据字段是下面三种数据类型的混合:byte,int和short。名字说明字节长度位长数据范围C/C++标识符Unsignedbyte8位无符号整型180-255UnsignedcharUint8_tUnsignedshort16位无符号整型2160-65535UnsignedshortUint16_tUnsignedint32位无符号整型4320-4294967295UnsignedintUint32_t1、序列化—反序列化序列化是将数据结构转化为bytestream的过程,反序列化是一个逆转过程。每个数据类型都通过LSB-First order序列化和反序列化。这就意味着有效字节中的最低位将最先进入bytestream。例如,整形数据2,864,434,397(0xAABBCCDD)序列化后是:0xDD0xCC0xBB0xAA所以,0xDD是最先进入bytestream的。这里有kobuki_driver的模板函数来解决这个问题,buildVariable()和buildBytes().三、命令包1、命令标识符IDNamedescription1Basecontrol(底盘控制)Controlwheelmotors(控制轮子电机)2Reserved3Sound(声音)Playcustomsounds(播放定制声音)4Soundsequence(声音序列)Playpredefinedsounds(播放预定义声音)5Reserved6Reserved7Reserved8Setpower(整机功率)ControlexternalPowers(控制外部功率)9Requestextra(额外请求)Requestextrainformations(请求额外信息)10Reserved11Reserved12Generalpurposeoutput(通用输出)Controlgeneralpurposeoutput(控制通用输出)2、底盘控制通过控制轮子的电机来移动机器人。机器人将按弧线行进,半径mm速度mm/sNamesize数值十六进制数值说明Identifier110x01固定Length数据字段大小140x04固定Data速度2单位mm/s半径2单位mm3、声音通过音符(note)和音长(duration)播放自定义声音Namesize数值十六进制数值说明Identifier130x03fixed(固定)LengthSizeofdatafield130x03fixed(固定)数据note2duration1播放音符的音长按毫秒计警告:这个命令是在kobuki的固件上实现的,而不是在驱动软件上。4、声音序列按以下说明播放预先定义的声音NamesizevalueValueinhexdescriptionIdentifier140x04fixedLengthSizeofdatafield110x01fixeddataSequencenumber10forONsound1forOFFsound2forrechargesound3forbuttonsound4forerrorsound5forcleaningstartsound6forcleaningendsound5、整机功率外部功率:3.3V,5V,12V1A,12V5A,它与外功率一样都是通用输出的一部分。NamesizevalueValueinhexDescriptionIdentifier180x08FixedLengthSizeofdatafield120x02fixedDataPowercontrolflags2设置打开外部功率的标记符0x01外部功率3.3Vch.0x02外部功率5Vch.0x04外部功率12V1Ach.0x08外部功率12V5Ach.警告:这个命令是在kobuki的固件上实现的,而不是在驱动软件上。也可以查看:GeneralPurposeOutput6、额外请求从机器人请求额外的数据,尤其是kobuki的版本信息:硬件版本,固件版本,和UniqueDeivceIdentifier(UDID),UDID是独一无二的设备,因此可以用来识别多个机器人。NamesizevalueValueinhexdescriptionidentifier190x09FixedLengthSizeofdatafield120x02FixeddataRequestflags2Settheflagstorequestextradata0x01硬件版本0x02固件版本0x08设备ID也可以查看:HardwareVersion FirmwareVersion, UniqueDeviceIDentifier(UDID)7、通用输出这条命令包含多个对象,它控制LEDs,数字输出和外部功率NamesizevalueValueinhexdescriptionIdentifier1120x0CFixedLengthSizeofdatafield120x02Fixeddata数字输出flags2Settheflagstosethighonoutputpinsofexpansionport为设置高压输出插脚的扩展端口,设置如下标识符:0x0001数字输出ch.00x0002数字输出ch.10x0004数字输出ch.20x0008数字输出ch.3Settheflagstoturnonenternalpowers打来外部功率时,设置如下标识符:0x0010外部功率3.3Vch.0x0020外部功率5Vch.0x0040外部功率12V1Ach.0x0080外部功率12V5Ach.SettheflagstoturnonLEDs打开LED时,设置如下标识符:0x0100LED1红色0x0200LED1绿色0x0400LED2红色0x0800LED2绿色也可以查看:Setpower四、反馈包反馈标识符机器人启动后,kobuki以50Hz的频率发送以下默认反馈。IDNamedescriptionavailability1Basicsensordata(传感器数据)Basiccoresensordata(基本核心传感器数据)Bydefault(默认)2Reserved3DockingIR(对接红外)SignalfromdockingstationBydefault4Inertialsensor(惯性传感器)Gyrodatabothangleandangularvelocity(陀螺仪数据:角度和角速度)Bydefault5Cliff(防跌落)PSDdatafacingfloor()Bydefault6Current(电流)Currentofwheelmotors(轮子电机电流)Bydefault7Reserved8Reserved9Reserved10Hardwareversion(硬件版本)Versionnumberofkobukihardware(kobuki的硬件版本号)Onrequest(按要求)11Firmwareversion(固件版本)Versionnumberofkobukifirmware(kobuki的固件版本号)Onrequest12Reserved13Rawdataof3-axisgyro(3轴陀螺仪原始数据)RawADCdataofdigital3-axisgyro(3轴陀螺仪的原始模数转换(ADC)数据)Bydefault14Reserved15Reserved16Generalpurposeinput(通用输入)Inputsfrom25-pinexpansionport(25针扩展端口输入)Bydefault17Reserved18Reserved19Uniquedeviceidentifier(UDID)Uniquenumbertoidentifyrobot(同过一个唯一的数字来识别或者辨别机器人)Bydefault(默认值)20Reserved1、基本传感器数据基本的核心传感器的数据 NamesizevalueValueinhexdescriptionFeedbackidentifier(反馈标识符)110x01FixedLengthSizeofdatafield(数据字段大小)1150x0FFixedDataTimestamp(时间戳/时间标记)2内部生成以毫秒为单位的时间戳:它从0到65535循环Bumper(减震器)1当减震器被碰到时,设置了如下标识符:0x01:右侧减震器0x02:中心减震器0x04:左侧减震器Wheeldrop(轮跌落)1当车轮掉下时,设置了如下标识符:0x01:右车轮0x02:左车轮Cliff(防跌落)1当悬崖被检测到时,设置了如下标识符:0x01:右侧防跌落传感器0x02:中心防跌落传感器0x04:左侧防跌落传感器Leftencoder(左轮编码器)2左,右车轮编码器数据累积,这个值的增加意味着前进的方向,它从0到65535循环。Rightencoder(右轮编码器)2LeftPWM(左侧脉宽调制)1PWM主要是应用于左右车轮的电机(马达)。为了正确的表达,这个数据应该被转换为有符号的数据类型。负号表示方向向后。RightPWM(右侧脉宽调制)1Button(按钮)1当按按钮时,设置如下标识符:0x01:按钮00x02:按钮10x04:按钮2Charge(充电)10:不充电状态2:对接充电状态(charged)6:对接充电状态(charging)18:适配器充电状态(charged)22:适配器充电状态(charging)Battery(电池)1电压0.1V的电池,完全充电时电压16.7VOvercurrentflags(过电流标志)1检测到过电流时,设置如下标识符:0x01:左车轮0x02:右车轮注意:sub-payload将默认发送。2、对接红外信号扩展坞 NamesizevalueValueinhexdescriptionIdentifier130x03FixedLengthSizeofdatafield(数据段大小)130x03FixeddataRightsignal1检测到信号时,设置如下标识符:0x01:接近左边0x02:接近中心0x04:接近右边0x08:远离中心0x010:远离左边0x020:远离右边Centralsignal1Leftsignal1Kobuki的对接站,有3个红外发射器,发射红外线灯覆盖了对接站前方的三个区域:左,中间,右,每一个区域又分为两个子字段:近和远。由于将这些信息进行编码,机器人随时都能知道它所处的区域和子字段。由于区域和子字段能够被独立的识别,所以他们的边界可以是重叠的。3、惯性传感器数据惯性传感器数据,只有1轴陀螺仪数据可用。NamesizevalueValueinhexDescriptionIdentifier140x04FixedLengthSizeofdatafield170x07FixedDataAngle(角度)2Factorycalibrated(工厂校准)Anglerate(角速率)2Factorycalibrated(工厂校准)Unused1Unused1Unused1注意:sub-payload将默认发送。4、防跌落传感器数据Sub-payload提供了PSD的ADC数据,当机器人在路面是行走过程中遇到台阶或者地面存在高度差时。这个值与传感器和地面之间的距离有关。可以查看数据表获得更加详细的信息。这个值也可以用于基本传感器数据方面的clifffield,kobuki以布尔类型进行处理。NamesizevalueValueinhexDescriptionidentifier150x05FixedLengthSizeofdatafield160x05FixedDataRightcliffsensor(右侧防跌落传感器)2每个PSD的ADC输出:数据范围:0-4095距离范囲:2-15m距离是非线性的。Centralcliffsensor(中间防跌落传感器)2Leftcliffsensor(左侧防跌落传感器)2注意:sub-payload将默认发送。也可以查看:basicsensordata5、电流利用电流传感器读取车轮电机的电流NamesizevalueValueinhexdescriptionIdentifier160x06FixedLengthSizeofdatafield120x02FixeddataLeftmotor210mARightmotor210mA注意:sub-payload将按请求发送6、硬件版本硬件版本信息是一种三联体形式的:..namesizevalueValueinhexDescriptionIdentifier1100x0AFixedLengthSizeofdatafield140x04FixeddataPatch1Minor1Major1unused100x00fixed注意:sub-payload将发送请求。也可以查看:requestextra7、固件版本固件版本信息是一种三联体形式的:..namesizevalueValueinhexDescriptionIdentifier1110x0BFixedLengthSizeofdatafield140x04FixeddataPatch1Minor1Major1unused100x00fixed注意:sub-payload将按请求发送也可以查看:requestextra8、3d陀螺仪的原始数据数字3d陀螺仪的原始ADC数据:L3G4200D由于采集率和更新率的差异,将得到2-3数据。Digittodeg/sratiois0.00875,itcomesfromdatasheetof3dgyro.数度比是0.00875,它来自3D陀螺仪的数据表。namesizevalueValueinhexdescriptionIdentifier1130x0DFixedLengthSizeofdatafield12+6NDataFrameid(帧标识符)1每个传感器读数可以通过帧标识符识别,它从0到255循环。Followeddatalength13NRawgyrodata0(陀螺仪原始数据0)x-axis2ADC输出每个轴的速率是0.00875度/s.y-axis2z-axis2…RawgyrodataN-1(陀螺仪原始数据N-1)x-axis2y-axis2z-axis2注意:sub-payload将默认发送。警告:3D陀螺仪传感器与机器人不匹配,z轴逆时针旋转90度,下面是转换关系:constdoubledigit_to_dps=0.00875;angular_velocity.x=-digit_to_dps*(short)raw_gyro_data.y;angular_velocity.y=digit_to_dps*(short)raw_gyro_data.x;angular_velocity.z=digit_to_dps*(short)raw_gyro_data.z;9、通用输入NamesizevalueValueinhexDescriptionIdentifier1160x10FixedlengthSizeofdatafield1160x10FixeddataDigitalinput数字输入2高电压
{
cs^=buffer[i];
}
returncs?
false:
true;
5、完整的bytestream
Headers
以上表格显示了整个bytestream结构。
Payload的最小长度为3,payload中包含sub-payload,它的长度为1.
理论上这个数据包(bytestream)的最小长度为7.
二、数据类型
Sub-payload的数据字段是下面三种数据类型的混合:
byte,int和short。
字节长度
位长
数据范围
C/C++标识符
Unsignedbyte
8位无符号整型
1
8
0-255
Unsignedchar
Uint8_t
Unsignedshort
16位无符号整型
2
16
0-65535
Uint16_t
Unsignedint
32位无符号整型
4
32
0-4294967295
Uint32_t
1、序列化—反序列化
序列化是将数据结构转化为bytestream的过程,反序列化是一个逆转过程。
每个数据类型都通过LSB-First order序列化和反序列化。
这就意味着有效字节中的最低位将最先进入bytestream。
例如,整形数据2,864,434,397(0xAABBCCDD)序列化后是:
0xDD
0xCC
0xBB
所以,0xDD是最先进入bytestream的。
这里有kobuki_driver的模板函数来解决这个问题,buildVariable()和buildBytes().
三、命令包
1、命令标识符
ID
Name
description
Basecontrol(底盘控制)
Controlwheelmotors(控制轮子电机)
Reserved
3
Sound(声音)
Playcustomsounds(播放定制声音)
Soundsequence(声音序列)
Playpredefinedsounds(播放预定义声音)
5
6
7
Setpower(整机功率)
ControlexternalPowers(控制外部功率)
9
Requestextra(额外请求)
Requestextrainformations(请求额外信息)
10
11
12
Generalpurposeoutput(通用输出)
Controlgeneralpurposeoutput(控制通用输出)
2、底盘控制
通过控制轮子的电机来移动机器人。
机器人将按弧线行进,半径mm速度mm/s
size
数值
十六进制数值
Identifier
0x01
固定
数据字段大小
0x04
速度
单位mm/s
半径
单位mm
3、声音
通过音符(note)和音长(duration)播放自定义声音
0x03
fixed(固定)
Sizeofdatafield
数据
note
duration
播放音符的音长按毫秒计
警告:
这个命令是在kobuki的固件上实现的,而不是在驱动软件上。
4、声音序列
按以下说明播放预先定义的声音
value
Valueinhex
fixed
data
Sequencenumber
0forONsound
1forOFFsound
2forrechargesound
3forbuttonsound
4forerrorsound
5forcleaningstartsound
6forcleaningendsound
5、整机功率
外部功率:
3.3V,5V,12V1A,12V5A,它与外功率一样都是通用输出的一部分。
Description
0x08
Fixed
0x02
Powercontrolflags
设置打开外部功率的标记符
0x01外部功率3.3Vch.
0x02外部功率5Vch.
0x04外部功率12V1Ach.
0x08外部功率12V5Ach.
也可以查看:
GeneralPurposeOutput
6、额外请求
从机器人请求额外的数据,尤其是kobuki的版本信息:
硬件版本,固件版本,和UniqueDeivceIdentifier(UDID),UDID是独一无二的设备,因此可以用来识别多个机器人。
identifier
0x09
Requestflags
Settheflagstorequestextradata
0x01硬件版本
0x02固件版本
0x08设备ID
HardwareVersion FirmwareVersion, UniqueDeviceIDentifier(UDID)
7、通用输出
这条命令包含多个对象,它控制LEDs,数字输出和外部功率
0x0C
数字输出flags
Settheflagstosethighonoutputpinsofexpansionport
为设置高压输出插脚的扩展端口,设置如下标识符:
0x0001数字输出ch.0
0x0002数字输出ch.1
0x0004数字输出ch.2
0x0008数字输出ch.3
Settheflagstoturnonenternalpowers
打来外部功率时,设置如下标识符:
0x0010外部功率3.3Vch.
0x0020外部功率5Vch.
0x0040外部功率12V1Ach.
0x0080外部功率12V5Ach.
SettheflagstoturnonLEDs
打开LED时,设置如下标识符:
0x0100LED1红色
0x0200LED1绿色
0x0400LED2红色
0x0800LED2绿色
Setpower
四、反馈包
反馈标识符
机器人启动后,kobuki以50Hz的频率发送以下默认反馈。
availability
Basicsensordata
(传感器数据)
Basiccoresensordata
(基本核心传感器数据)
Bydefault(默认)
DockingIR(对接红外)
Signalfromdockingstation
Bydefault
Inertialsensor
(惯性传感器)
Gyrodatabothangleandangularvelocity
(陀螺仪数据:
角度和角速度)
Cliff(防跌落)
PSDdatafacingfloor()
Current(电流)
Currentofwheelmotors(轮子电机电流)
Hardwareversion
(硬件版本)
Versionnumberofkobukihardware
(kobuki的硬件版本号)
Onrequest(按要求)
Firmwareversion
(固件版本)
Versionnumberofkobukifirmware
(kobuki的固件版本号)
Onrequest
13
Rawdataof3-axisgyro
(3轴陀螺仪原始数据)
RawADCdataofdigital3-axisgyro
(3轴陀螺仪的原始模数转换(ADC)数据)
14
15
Generalpurposeinput
(通用输入)
Inputsfrom25-pinexpansionport
(25针扩展端口输入)
17
18
19
Uniquedeviceidentifier(UDID)
Uniquenumbertoidentifyrobot
(同过一个唯一的数字来识别或者辨别机器人)
Bydefault(默认值)
20
1、基本传感器数据
基本的核心传感器的数据
Feedbackidentifier
(反馈标识符)
(数据字段大小)
0x0F
Timestamp
(时间戳/时间标记)
内部生成以毫秒为单位的时间戳:
它从0到65535循环
Bumper(减震器)
当减震器被碰到时,设置了如下标识符:
0x01:
右侧减震器
0x02:
中心减震器
0x04:
左侧减震器
Wheeldrop
(轮跌落)
当车轮掉下时,设置了如下标识符:
右车轮
左车轮
当悬崖被检测到时,设置了如下标识符:
右侧防跌落传感器
中心防跌落传感器
左侧防跌落传感器
Leftencoder
(左轮编码器)
左,右车轮编码器数据累积,这个值的增加意味着前进的方向,它从0到65535循环。
Rightencoder
(右轮编码器)
LeftPWM
(左侧脉宽调制)
PWM主要是应用于左右车轮的电机(马达)。
为了正确的表达,这个数据应该被转换为有符号的数据类型。
负号表示方向向后。
RightPWM
(右侧脉宽调制)
Button(按钮)
当按按钮时,设置如下标识符:
按钮0
按钮1
按钮2
Charge(充电)
0:
不充电状态
2:
对接充电状态(charged)
6:
对接充电状态(charging)
18:
适配器充电状态(charged)
22:
适配器充电状态(charging)
Battery(电池)
电压0.1V的电池,完全充电时电压16.7V
Overcurrentflags
(过电流标志)
检测到过电流时,设置如下标识符:
注意:
sub-payload将默认发送。
2、对接红外
信号扩展坞
(数据段大小)
Rightsignal
检测到信号时,设置如下标识符:
接近左边
接近中心
接近右边
0x08:
远离中心
0x010:
远离左边
0x020:
远离右边
Centralsignal
Leftsignal
Kobuki的对接站,有3个红外发射器,发射红外线灯覆盖了对接站前方的三个区域:
左,中间,右,每一个区域又分为两个子字段:
近和远。
由于将这些信息进行编码,机器人随时都能知道它所处的区域和子字段。
由于区域和子字段能够被独立的识别,所以他们的边界可以是重叠的。
3、惯性传感器数据
惯性传感器数据,只有1轴陀螺仪数据可用。
0x07
Angle(角度)
Factorycalibrated(工厂校准)
Anglerate(角速率)
Unused
4、防跌落传感器数据
Sub-payload提供了PSD的ADC数据,当机器人在路面是行走过程中遇到台阶或者地面存在高度差时。
这个值与传感器和地面之间的距离有关。
可以查看数据表获得更加详细的信息。
这个值也可以用于基本传感器数据方面的clifffield,kobuki以布尔类型进行处理。
0x05
Rightcliffsensor
(右侧防跌落传感器)
每个PSD的ADC输出:
数据范围:
0-4095
距离范囲:
2-15m
距离是非线性的。
Centralcliffsensor
(中间防跌落传感器)
Leftcliffsensor
(左侧防跌落传感器)
basicsensordata
5、电流
利用电流传感器读取车轮电机的电流
0x06
Leftmotor
10mA
Rightmotor
sub-payload将按请求发送
6、硬件版本
硬件版本信息是一种三联体形式的:
..
name
0x0A
Patch
Minor
Major
unused
0
0x00
sub-payload将发送请求。
requestextra
7、固件版本
固件版本信息是一种三联体形式的:
0x0B
8、3d陀螺仪的原始数据
数字3d陀螺仪的原始ADC数据:
L3G4200D
由于采集率和更新率的差异,将得到2-3数据。
Digittodeg/sratiois0.00875,itcomesfromdatasheetof3dgyro.
数度比是0.00875,它来自3D陀螺仪的数据表。
0x0D
2+6N
Frameid(帧标识符)
每个传感器读数可以通过帧标识符识别,它从0到255循环。
Followeddatalength
3N
Rawgyrodata0
(陀螺仪原始数据0)
x-axis
ADC输出每个轴的速率是0.00875度/s.
y-axis
z-axis
RawgyrodataN-1(陀螺仪原始数据N-1)
3D陀螺仪传感器与机器人不匹配,z轴逆时针旋转90度,下面是转换关系:
constdoubledigit_to_dps=0.00875;
angular_velocity.x=-digit_to_dps*(short)raw_gyro_data.y;
angular_velocity.y=digit_to_dps*(short)raw_gyro_data.x;
angular_velocity.z=digit_to_dps*(short)raw_gyro_data.z;
9、通用输入
0x10
length
Digitalinput
数字输入
高电压
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1