简介
SLAMWARE Core模块与外部系统通过Control Bus低速总线连接。通过Control Bus总线协议,SLAMWARE Core可以获取外部系统的状态参数,例如外部系统的电池电量信息,是否在充电状态,外部系统的电机转速,传感器状态等信息。同时,SLAMWARE Core也通过Control Bus总线协议控制外部系统的电机运动,从而实现完整的室内定位导航功能。
Control Bus总线协议是运行在串口上的,波特率为115200bps,外部系统必须实现此总线协议才可以使SLAMWARE Core正常工作。
SLAMWARE Core Control Bus通讯协议使用的是Inter-chip通讯协议的扩展模式。Inter-chip通讯协议是SLAMTEC专门为底层电子系统,诸如微控制器之间、微控制器与宿主系统、微控制器与设备之间相互通讯而设计的协议。它以数据包为单位在通讯媒介上传递数据,通讯包中包含了数据校验机制以及帧同步机制,可以实现可靠的通讯链路。目前该协议广泛用于SLAMTEC的机器人系统、传感器和模块设备中,并可在USART、USB、I2C、TCP以太网中使用。
功能概览
内部模块框图和使用方法
下图描述了SLAMWARE Core和外部系统之间的通信连接框图。
SLAMWARE Core内部模块框图
Inter-chip通讯协议规范
Inter-chip通讯协议简介
通讯特性
本协议所假设的通讯介质是以点对点或者总线方式组织的网络,其中同一时间最多只有2个通讯端点(Peer)可以相互之间通讯,但是如果通讯介质网络允许实现广播,则可以允许由一个通讯端点同时向多个其他端点单向的发送消息。
通讯介质本身可以是基于字节流模式的信道,比如USART、TCP以太网,也可以是基于数据包的信道,比如USB、I2C。Inter-chip Protocol并不要求通讯介质实现数据包的同步机制,协议本身可以利用每个数据包头部的同步信号自动实现同步。
当通讯发生时,传输在通讯介质上的消息永远是以具有固定格式的数据包形式存在的。每个数据包允许承载不同长度的数据,但在数据包头部均具有长度一致、数据结构定义一致的数据,该数据用语描述数据包自身的信息以及期望接收端采取的处理方式。
数据传输顺序
Inter-chip Protocol要求信道传输数据时遵循FIFO原则,并且要求使用小字端传输数据包中协议所定义的公共数据结构,如包头部的描述数据。
协议子模式
基于不同应用场合的需求,Inter-chip Protocol包含了几个具体的子模式(sub-profile)。不同的子模式定义了各自的网络通讯方式、具体采用的包头数据结构等信息。在当前的实现中,Standard Profile是协议默认使用的子模式。它定义了一种采用请求-应答机制的通讯网络。
Inter-chip通讯协议规范
数据包结构纵览
每个Inter-chip Protocol规范的数据包均符合如下的格式定义。
数据类型 | u8 | u8[n] | u8 | u8[n] | u8 | u8 | u8 | u8[n] | u8 |
---|---|---|---|---|---|---|---|---|---|
字段 | Flag | ExFlag[n] | Addr | ExAddr[n] | Len | LenH | CMD | Payload[n] | CHKSUM |
发送顺序 | → |
其中,底色为灰色的字段为可选字段。不同的Sub-Profile会使用这些可选字段的某些部分。其它字段是所有Inter-chip Protocol规范的数据包均会带有的。后文将就单个字段进行描述。
Flag字段
存储顺序 | MSB +7 | +0 LSB | ||||||
---|---|---|---|---|---|---|---|---|
Flag: | ExtBit | LongFrame | AddrEn | CheckSumEn | 0 | 0 | 0 | 0 |
该字段为一个数据包的起始标识,占用一个字节。随着Sub-Profile的不同,其取值有着不同的定义。其每个标志位的具体解释如下:
字段名 | 描述 |
---|---|
ExtBit | 设置为1时表示数据包的下一个字节是ExFlag字段,即ExFlag[n]将出现在本数据包中。其中将携带更多的标志位信息。 |
LongFrame | 设置为1时表示本数据包将使用16bit的长度字段,此时LenH字段将包含在本数据包中。该数据包可以装载最多65534字节的数据。 |
AddrEn | 设置为1时表示Addr将包含在数据包中,并且ExAddr[n]也可能存在于本数据包。Inter-chip Protocol协议栈将可能解析存在于Addr以及ExAddr[1..n]中的地址进行相应处理。 |
CheckSumEn | 设置为1时,本数据包将在最末尾包含一个校验和字节数据。即CHKSUM字段将包含在本数据包中。Inter-chip Protocol协议栈将被要求对本数据包的数据进行校验并和CHKSUM做对比。 |
Len与LenH字段
存储顺序 | MSB +7 | +0 LSB | ||||||
---|---|---|---|---|---|---|---|---|
Len: | Len[7..0] | |||||||
LenH: | Len[15..8] |
该字段用于表示本数据包携带的数据长度信息。其定义为Payload字段和CMD字段长度的总和,即:
Len=sizeof(Payload[n])+1 |
由于Len字段为一个字节,因此当只有Len字段出现时,当前的数据包只能携带至多254字节的Payload数据。
当Flag字段的LongFrame位设置为1时,LenH字段也将出现在数据包中,并与Len字段构成一个16bit的联合字段。此时数据包可以携带65534字节的数据。
Note | ||
---|---|---|
| ||
当Len/LenH字段设置为0时,本数据包将被视为无效数据包而被协议栈丢弃。 |
CMD字段
存储顺序 | MSB +7 | +0 LSB | ||||||
---|---|---|---|---|---|---|---|---|
CMD: | CMD[7..0] |
该字段带有期望协议栈或者接收方处理程序对本数据包执行操作的命令信息。不同的Sub-Profile会保留一部分的CMD取值用于实现协议栈自身的通讯机制。例如在Standard Profile下,0x0至0xF被用于协议栈占用。其具体含义请参考本文的后续章节。
Payload[n]字段
存储顺序 | MSB +7 | +0 LSB | ||||||
---|---|---|---|---|---|---|---|---|
Payload[0]: | Data[0] | |||||||
Payload[1]: | Data[1] | |||||||
... | ||||||||
Payload[n-1]: | Data[n-1] |
该字段记录了数据包发送方希望携带的有效信息负载。其数据长度由Len/LenH字段表示。如果发送方没有任何需要传输的信息时,该字段将被省略。
CHKSUM字段
存储顺序 | MSB +7 | +0 LSB | ||||||
---|---|---|---|---|---|---|---|---|
CHKSUM: | CHKSUM[7..0] |
当Flag中CheckSumEn位被设置为1时,该字段将附加在数据包的末尾,用于记录对数据包中正确数据的校验和。其计算方式如下:
CHKSUM[0..7]=0 xor Packet[0] xor Packet[1] xor…xor Packet[N] |
其中, Packet表示即将发送的当前数据包去除CHKSUM字段的其他所有部分。Packet[N]表示即将发送的当前数据包的第N个字节。
当CHKSUM字段启用后,接收方协议栈将会在完成一个数据包接收后,重新计算一个新的CHKSUM并和数据包中附带的原始CHKSUM字段进行对比。如果不匹配,协议栈将丢弃当前数据包,并按照Sub-Profile所定义的行为,进行额外的处理。
ExFlag[n]字段
存储顺序 | MSB +7 | +0 LSB | ||||||
---|---|---|---|---|---|---|---|---|
ExFlag[N]: | ExtBit | ExFlagN[6..0] |
当Flag中ExtBit位被设置为1时,数据包中将包含一个或多个字节的ExFlag字段。该字段包含了额外的标志位用于描述数据包本身的信息或者Sub-Profile所额外定义的内容。同时,用户应用程序也可以将额外的信息附加在本字段中。
每一个字节ExFlag中的ExtBit位用于表示是否还存在一个额外的ExFlag字节紧跟在本ExFlag字节之后。当设置为0时,表示当前的ExFlag字节即是整个ExFlag[N]字段的终结。请参考具体Sub-Profile的定义了解本字段具体位定义。
Addr与ExAddr[N]字段
存储顺序 | MSB +7 | +0 LSB | ||||||
---|---|---|---|---|---|---|---|---|
Addr: | ExtBit | Addr[6..0] | ||||||
ExAddr[N]: | ExtBit | ExAddrN[6..0] |
当Flag中AddrEn位被设置为1时,数据包中将包含一个Addr字段,用于记录本数据包需要发送的目标设备地址。不同的Sub-Profile实现下,协议栈将对该字段的数据作出不同的处理。
在Addr字段中,使用了7个bit的区域用于表示0-127个设备地址号。如果希望使用更长的设备地址,则可以将Addr字段的ExtBit设置为1,此时,更多的地址数据位将被使用。它们将存储在后续的ExAddr[N]字段当中。
当Addr以及每个ExAddr[N]字段字节中的ExtBit设置为1时,表示当前字节后将紧跟一个ExAddr字节,直到ExtBit为0时为止。
Standard Profile
Inter-chip Protocol的Standard Profile定义了一种基于应答请求通讯模式的可靠点对点包交换网络。并且预留了一定的CMD取值用于协议栈内部实现通讯机制。
通讯模式和术语
Standard Profile要求网络中同一时刻只有2个通讯端点相互进行通讯。并且,其中一方将始终首先向另一方发送数据。另一方将始终在接收到发送数据方的数据包后做出回应,发送对应的回应数据。
这里定义上述始终首先发送数据的通讯端点为宿主(Master),而始终先接收数据再发出回应数据包的通讯端点为从机(Slave)。
Standard Profile使用了相同的格式用于Master以及Slave发出的数据包,即Flag字段的定义一致。不过根据通讯角色的不同,其发送的数据包的某些字段具有不同的含义。
对于由Master发出的数据包被称为请求命令数据包(简称请求命令),而由Slave发出的数据包被称为应答数据包(简称应答)。
请求命令与应答必须是成对出现的,每个应答总对应与一个请求命令。而Master必须在发送一个请求命令后,在接收到Slave发送应答数据包或者通讯超时后,方可进行下一个请求命令的发送。
Flag字段定义
存储顺序 | MSB +7 | +0 LSB | ||||||
---|---|---|---|---|---|---|---|---|
Standard: | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
Long Frame: | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
Standard Profile允许使用如下2种Flag字段的数据包格式:
包类型 | Flag取值 | 描述 |
---|---|---|
Standard | 0x10 | Payload最大254字节长度,无地址信息,带有CHKSUM |
Long Frame | 0x50 | Payload最大65534字节长度,无地址信息,带有CHKSUM |
采用Standard Profile的协议栈必须支持Standard类型的数据包。而当协议栈支持Long Frame模式的数据包时,Master和Slave在通讯过程中均可以随意的按照实际需要选择Standard或者Long Frame模式的数据包进行发送。
请求命令数据包
数据类型 | u8 | u8 | u8 | u8[n] | u8 |
---|---|---|---|---|---|
Standard: | 0x10 | Len[7..0] | CMD | Payload[n] | CHKSUM |
数据类型 | u8 | u16 | u8 | u8[n] | u8 |
Long Frame: | 0x50 | Len[15..0] | CMD | Payload[n] | CHKSUM |
由Master发送的请求命令数据包采用如上2种固定的数据包结构。其中,CMD字段的大部分取值可由应用程序使用。用于对Slave具体功能的调用或者数据请求。其具体取值请参考对应的设备文档。
符合Standard Profile规范的协议栈将保留如下的CMD字段取值,用于完成协议栈本身的处理任务:
保留的CMD取值 | 描述 |
---|---|
0x00 | 强制同步帧。用于实现通讯信道同步 |
0x01 | ECHO帧,用于测试Slave通讯状况 |
0x02 – 0x0F | 保留 |
应用程序需要避免使用上述保留的CMD字段取值。
应答数据包
数据类型 | u8 | u8 | u8 | u8[n] | u8 |
---|---|---|---|---|---|
Standard: | 0x10 | Len[7..0] | Resp | Payload[n] | CHKSUM |
数据类型 | u8 | u16 | u8 | u8[n] | u8 |
Long Frame: | 0x50 | Len[15..0] | Resp | Payload[n] | CHKSUM |
由Slave发送的应答数据包满足上述2种格式。其中,CMD字段被用于对Slave先前收到的请求命令处理情况的回应。其取值必须为如下的几种:
保留Resp(CMD) | 描述 |
---|---|
0x00 | 强制同步帧的应答包 |
0x01 | ECHO帧的应答包 |
0x02 | <OK> 表示上一个请求命令被正确执行或者从协议栈角度没有遇到问题。 |
0x03 | <Error> 表示上一个请求命令执行过程出现问题 |
0xFF | <Invalid> 表示上一个请求命令接收的不完整、或者数据包本身结构不正确 |
Payload[n]字段在应答数据包中用于存放Slave对先前Master发来的请求命令的执行结果。当本次应答的Resp为<OK>时,Paylaod[N]包含的具体数据定义与相关的请求命令有关。请参考具体的Slave设备手册了解详情。
当Resp为<Error> (0x03)或者<Invalid>(0xFF)时,Payload[N]将存放一个16bit的错误码,描述出错情况。Standard Profile规范要求协议栈保留如下的错误码取值,具体含义请参考下表。Slave上的应用程序也可以定义更多的错误代码。
错误码 | 描述 |
---|---|
0x40 | 请求命令包校验和不匹配 |
0x20 | 请求命令包长度超过了当前Slave协议栈缓冲区承受范围 |
0x10 | Slave协议栈信道没有完成同步 |
0x8000 | 请求命令包中的CMD字段不被Slave支持 |
0x8001 | 请求命令在执行中遇到格式类错误,例如请求参数不符合规范 |
0x8002 | 请求命令在执行中遇到操作类错误,例如执行过程遇到问题而无法继续 |
SLAMWARE Core 协议命令
SLAMWARE Core Ctrl Bus通讯协议
SLAMWARE Core Ctrl Bus通讯协议使用Inter-chip通讯协议的扩展模式。
它的数据包类型域为标识SLAMWARE Core Ctrl Bus扩展模式的0xF8。在此扩展模式下,数据负载的格式为请求/应答通讯模式,应答数据包格式与标准Inter-chip通讯协议一致。根据数据包长度的类型分为如下两种格式:
格式一:
协议栈数据 | SLAMWARE Core Ctrl Bus扩展模式 | 协议栈数据 | |||
---|---|---|---|---|---|
同步标志字节 (0x50) | 数据包长度 u16 | 0xF8 | 请求命令 u8 | 数据负载 ... | 校验字节 u8 |
格式二:
协议栈数据 | SLAMWARE Core Ctrl Bus扩展模式 | 协议栈数据 | |||
---|---|---|---|---|---|
同步标志字节 (0x10) | 数据包长度 u8 | 0xF8 | 请求命令 u8 | 数据负载 ... | 校验字节 u8 |
SLAMWARE Core和外部系统之间的Ctrl Bus通讯协议设计为单向通讯模式,始终由SLAMWARE Core发起数据包请求。
外部系统需要及时回应SLAMWARE Core的请求命令,否则SLAMWARE Core将认为外部系统连线中断,可能停止正常工作。
请求命令与应答必须是成对出现的,每个应答总对应于一个请求命令。SLAMWARE Core在发送一个请求命令后,总会在接收到外部系统发送应答数据包或者通讯超时后,才会进行下一个请求命令的发送。
SLAMWARE Core也可以接受外部系统的控制命令,但由于单向通讯的模式,外部系统只能在SLAMWARE Core定期发送外部系统控制命令查询请求的时候才可以发送控制命令。但外部系统可以通过#CMD信号通知SLAMWARE Core尽快发送外部系统控制命令查询请求。
SLAMWARE CORE 请求命令
SLAMWARE Core室内定位导航模块会发送以下请求命令,外部系统可以根据需要响应请求命令,否则SLAMWARE Core Ctrl Bus协议栈会做默认响应。标*的命令为外部系统必须响应的请求命令。否则SLAMWARE Core将不能正常工作。
请求命令 | 命令代码 | 描述 |
---|---|---|
外部系统连接请求(CONNECT_BASE) * | 0x10 | 请求连接外部系统,外部系统将会返回硬件、固件版本信息表示连接成功。 |
外部系统参数获取请求(GET_BASE_CONF) * | 0x20 | 请求外部系统的配置参数,包括尺寸类型,尺寸半径,轮组类型,传感器位置角度等。 |
外部系统配置获取请求(GET_BINARY_CONF) | 0x21 | 请求外部系统配置参数。该指令用于替代上述的0x20指令,具有更大的可扩展性。SLAMWARE Core会首先尝试该指令,如果该指令返回了Not Support,则再调用0x20获取外部系统配置。 |
外部系统状态获取请求(GET_BASE_STATUS) * | 0x30 | 请求获取外部系统的状态,包括电池电量,充电状态等。 |
外部系统轮组状态获取请求(GET_BASE_MOTOR_DATA) * | 0x31 | 请求外部系统返回轮组运行距离累计值。 |
外部系统距离传感器数据获取请求(GET_BASE_SENSOR_DATA) * | 0x32 | 请求外部系统返回距离传感器的数据。 |
外部系统触碰传感器数据获取请求(GET_BASE_BUMPER_DATA) * | 0x33 | 请求外部系统返回触碰传感器的数据。 |
外部系统自动回充数据获取请求(GET_AUTO_HOME_DATA) * | 0x34 | 请求外部系统返回自动回充的数据。 |
外部系统辅助定位数据获取请求(GET_AUXILIARY_ANCHOR) | 0x35 | 请求辅助定位传感器数据 |
外部系统运动控制请求(SET_BASE_MOTOR) * | 0x40 | 请求外部系统控制轮组运动。 |
外部系统设置速度及获取Deadreckon请求 SET_V_AND_GET_DEADRECKON * | 0x41 | 请求外部系统设置速度变量并获取上一个周期的Deadreckon数据。 |
外部系统命令查询请求POLL_BASE_CMD * | 0x50 | 查询外部系统是否有命令发送。 |
外部系统命令回应请求 POLL_BASE_ANS_CMD * | 0x5F | 回应外部系统命令请求 |
SLAMWARE Core系统事件通知命令(SEND_EVENT) * | 0x60 | 通知外部系统SLAMWARE Core事件 |
外部系统健康管理命令请求(HEALTH_MGMT) * | 0x90 | 获取外部系统健康状况 |
Info | ||
---|---|---|
| ||
关于SET_V_AND_GET_DEADRECKON,GET_BASE_MOTOR_DATA,SET_BASE_MOTOR指令使用的说明:
|
外部系统连接请求(CONNECT_BASE)
SLAMWARE Core室内定位导航模块在准备好后会一直发送外部系统连接请求确认外部系统已正常工作。直到外部系统响应此请求后SLAMWARE Core才会开始正常工作。
请求数据包 | ||||||
---|---|---|---|---|---|---|
命令代码 | 负载数据 | |||||
0x10 | 协议版本(u8) | |||||
应答数据包 | ||||||
应答代码 | 负载数据 | |||||
<OK> | 型号(u8[12]) | 固件版本(u16) | 硬件版本(u16) | 序列(u32[3]) |
该命令数据域描述如下:
数据域 | 类型 | 描述 |
---|---|---|
协议版本 | u8 | 协议的版本信息,版本信息不匹配时外部系统应应答错误 |
型号 | u8[12] | 外部系统的型号,最多12个字符 |
固件版本 | u16 | 外部系统的固件版本 |
硬件版本 | u16 | 外部系统的硬件版本 |
序列号 | u32[3] | 外部系统的序列号,最多12个字节 |
外部系统参数获取请求(GET_BASE_CONF)
SLAMWARE Core室内定位导航模块在与外部系统连接后会发送参数获取请求以获得外部系统的基本结构信息,包括尺寸类型,尺寸半径,轮组类型以及传感器安装位置信息等。目前版本SLAMWARE Core只支持圆形和方形尺寸以及两轮差动轮组。
请求数据包 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
命令代码 | 负载数据 | |||||||||||
0x20 | 无 | |||||||||||
应答数据包 | ||||||||||||
应答代码 | 负载数据 | |||||||||||
<OK> | 尺寸类别 (u8) | 尺寸半径 (u32) | 轮组类别 (u8) | 距离传感器数量(u8) | 距离传感器安装位置(pose[8]) | |||||||
触碰传感器数量(u8) | 触碰传感器安装位置(pose[8]) |
该命令数据域描述如下:
数据域 | 类型 | 描述 |
---|---|---|
尺寸类型 | u8 | 外部系统的尺寸类型,目前只支持圆形和方形 |
尺寸半径 | u32 | 外部系统的尺寸半径,以mm为单位,Q8定点小数 |
轮组类型 | u8 | 外部系统的轮组类型,目前只支持两轮差动轮组 |
距离传感器数量 | u8 | 外部系统的距离传感器数量,最多支持8组 |
距离传感器安装位置 | pos[8] | 外部系统的距离传感器安装位置 |
触碰传感器数量 | u8 | 外部系统的触碰传感器数量,最多支持8组 |
触碰传感器安装位置 | pos[8] | 外部系统的触碰传感器安装数据 |
Note | ||
---|---|---|
| ||
当使用0x20底盘配置指令时,最多可支持8组距离传感器;当使用0x21 Binary Config指令配置时,最多可支持16组距离传感器 |
目前支持的尺寸类型有:
类型编号 | 描述 |
---|---|
0x00 | 圆形 |
0x01 | 方形 |
目前支持的轮组类型有:
类型编号 | 描述 |
---|---|
0x00 | 两轮差动 |
传感器安装位置的pos数据表示为:
数据域 | 类型 | 描述 |
---|---|---|
X轴向距离 | s32 | 传感器中心距离外部系统中心的X轴向距离,Q8定点小数 |
Y轴向距离 | s32 | 传感器中心距离外部系统中心的Y轴向距离,Q8定点小数 |
Z轴向距离 | s32 | 传感器中心距离外部系统中心的Z轴向距离,Q8定点小数 |
角度 | u32 | 传感器中心跟外部系统中心点的逆时针夹角,Q8定点小数 |
外部系统配置获取请求(GET_BINARY_CONF)
这是上述0x20指令的升级指令,SLAMWARE Core模块会优先使用该指令获取外部系统的配置信息,如果外部系统返回Not Support的话才会选择去调用0x20指令。
这个指令相对于0x20指令来说提供了更多的功能,如雷达安装位置的配置等。
请求数据包 | ||||||
---|---|---|---|---|---|---|
命令代码 | 负载数据 | |||||
0x21 | 无 | |||||
应答数据包 | ||||||
应答代码 | 负载数据 | |||||
<OK> | 外部系统配置数据(u8*n) |
外部系统的配置数据由SDK中所附的Slamware Configuration Tool自动生成。只需将生成的.c文件加入到工程项目中,将其中的slamware_config变量作为外部系统配置数据字段数据即可。
Note | ||
---|---|---|
| ||
当使用0x21 Binary Config指令配置时,请将 0x20底盘配置指令中的所有传感器数据设置为0。 |
外部系统状态获取请求(GET_BASE_STATUS)
SLAMWARE Core室内定位导航模块在准备好后会一直发送外部系统连接请求确认外部系统已正常工作。直到外部系统响应此请求后SLAMWARE Core才会开始正常工作。SLAMWARE Core正常工作后将不断轮询获取外部系统的状态,外部系统应当在规定的时间内给予答复。否则SLAMWARE Core将认为外部系统断开连接。
请求数据包 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
命令代码 | 负载数据 | |||||||||||
0x30 | 无 | |||||||||||
应答数据包 | ||||||||||||
应答代码 | 负载数据 | |||||||||||
<OK> | 电池电量百分比(u8) | 电池充电状态(u8) |
数据域 | 类型 | 描述 |
---|---|---|
电池电量百分比 | u8 | 外部系统的电池电量百分比,0-100 |
电池充电状态 | u8 | 外部系统的电池状态,该变量为一个位图。 当机器人正在通过充电座进行充电,该状态应为5,即二进制00000101 |
外部系统轮组状态获取请求(GET_BASE_MOTOR_DATA)
SLAMWARE Core室内定位导航模块正常工作后将不断轮询获取外部系统的轮组状态,外部系统应当在规定的时间内给予答复。否则SLAMWARE Core将认为外部系统断开连接。
请求数据包 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
命令代码 | 负载数据 | |||||||||||
0x31 | 无 | |||||||||||
应答数据包 | ||||||||||||
应答代码 | 负载数据 | |||||||||||
<OK> | 左轮电机累计里程(s32) | 右轮电机累计里程(s32) |
数据域 | 类型 | 描述 |
---|---|---|
左轮电机累计里程 | s32 | 外部系统的左轮电机累计运动里程,单位为mm。 |
右轮电机累计里程 | s32 | 外部系统的右轮电机累计运动里程,单位为mm。 |
Note | ||
---|---|---|
| ||
该命令支持的轮组类型为两轮差动。。 |
外部系统距离传感器数据获取请求(GET_BASE_SENSOR_DATA)
SLAMWARE Core室内定位导航模块正常工作后将不断轮询获取外部系统的距离传感器数据,外部系统应当在规定的时间内给予答复。
如果在系统参数获取请求时外部系统告知没有配置距离传感器,SLAMWARE Core将不会发送此请求。
请求数据包 | ||||||
---|---|---|---|---|---|---|
命令代码 | 负载数据 | |||||
0x32 | 无 | |||||
应答数据包 | ||||||
应答代码 | 负载数据 | |||||
<OK> | 距离传感器数据(u32[16]) |
该命令数据域描述如下:
数据域 | 类型 | 描述 |
---|---|---|
距离传感器数据 | u32[16] | 外部系统的距离传感器数据。 结果为距离传感器到障碍物的距离信息,单位为mm,Q16定点小数,最多支持16组距离传感器。 当使用0x20底盘配置指令时,最多可支持8组距离传感器,此时最多可获取8组距离传感器数据; 当使用0x21 Binary Config指令配置时,最多可支持16组距离传感器,此时最多可获取16组距离传感器数据。 |
外部系统触碰传感器数据获取请求(GET_BASE_BUMPER_DATA)
SLAMWARE Core室内定位导航模块正常工作后将不断轮询获取外部系统的触碰传感器数据,外部系统应当在规定的时间内给予答复。
如果在系统参数获取请求时外部系统告知没有配置触碰传感器,SLAMWARE Core将不会发送此请求。
请求数据包 | ||||||
---|---|---|---|---|---|---|
命令代码 | 负载数据 | |||||
0x33 | 无 | |||||
应答数据包 | ||||||
应答代码 | 负载数据 | |||||
<OK> | 触碰传感器数据(u32) |
该命令数据域描述如下:
数据域 | 类型 | 描述 |
---|---|---|
触碰传感器数据 | u32 | 表示外部系统的触碰传感器数据。自最低位开始,每个bit代表一个碰撞传感器的状态,顺序与配置中的顺序相同。 指定位为1时,表示该碰撞传感器未触发,指定位为0时,表示该碰撞传感器触发。最多支持32组触碰传感器。 |
外部系统自动回充数据获取(GET_AUTO_HOME_DATA)
SLAMWARE Core室内定位导航模块在试图进行自动回充时,会通过该指令获取自动回充相关的信息。当前主要用于获得对接灯塔Beacon信息。
请求数据包 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
命令代码 | 负载数据 | |||||||||||
0x34 | 数据类型(u8) | |||||||||||
应答数据包 | ||||||||||||
应答代码 | 负载数据 | |||||||||||
<OK> | 信标数量(u8) | 接收头数量(u8) | 接收头数据(u8) |
0x34命令代码请求数据包中数据域定义如下:
数据域 | 类型 | 描述 |
---|---|---|
数据类型 | u8 | SLAMWARE Core想要获取的自动回充的数据类型,当前支持的类型只有一种: |
信标数量 | u8 | 外部系统充电座上的信标的数量。 当前只支持3个信标时,0号信标指的是左信标,1号信标指的是主信标,2号信标指的是右信标。 |
接收头 | u8 | 外部系统机器人上接收头的数量。 当前只支持3个接收头,0号接收头指的是左接收头,1号接收头指的是主接收头,2号接收头指的是右接收头。 |
接收头 | u8[n] | 每个接收头对应一个字节,每个字节代表这个接收头能接收到的信标。 例如1号接收头能接收到0号和1号信标的数据,那么 Data[1]=(1≤0)(1≤1)。 |
备注:机器人前进方向为红色箭头所示,对应的机器人的左边和右边定义如下。
外部系统运动控制请求(SET_BASE_MOTOR)
SLAMWARE Core室内定位导航模块通过发送运动控制请求控制外部系统运动。外部系统需要根据请求数据包的内容准确控制系统运动才能使SLAMWARE Core正常工作。
请求数据包 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
命令代码 | 负载数据 | ||||||||||
0x40 | 运动速度(s32[4]) | ||||||||||
应答数据包 | |||||||||||
应答代码 | 负载数据 | ||||||||||
<OK> | 无 |
该命令数据域描述如下:
数据域 | 类型 | 描述 |
---|---|---|
运动速度 | s32[4] | 外部系统的轮子运动速度,单位为mm/s |
外部系统设置速度及获取Deadreckon数据请求(SET_V_AND_GET_DEADRECKON)
该指令用于设置外部系统运动速度。
请求数据包 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
命令代码 | 负载数据 | |||||||||||
0x41 | X轴向速度量(s32) | Y轴向速度量(s32) | 角速度量(s32) | |||||||||
应答数据包 | ||||||||||||
应答代码 | 负载数据 | |||||||||||
<OK> | X轴向位移(s32) | Y轴向位移(s32) | 角度位移(s32) |
数据域 | 类型 | 描述 |
---|---|---|
X轴向速度量 | s32 | X轴向速度,Q16定点小数 |
Y轴向速度量 | s32 | Y轴向速度,Q16定点小数 |
角速度量 | s32 | 逆时针角速度,Q16定点小数 |
X轴向位移 | s32 | 外部系统整体相对于上一次应答此请求时的X轴向位移,单位为mm,Q16定点小数。 |
Y轴向位移 | s32 | 外部系统整体相对于上一次应答此请求时的Y轴向位移,单位为mm,Q16定点小数。 |
角度位移 | s32 | 外部系统整体相对于上一次应答此请求时的逆时针角度位移,单位为度,Q16定点小数。 |
Note | ||
---|---|---|
| ||
此处的坐标轴是以机器人自身为中心的右手坐标系, 机器人正前方为x轴。 |
示例
以两轮差动机器人为例,当机器人收到该指令时,应当:
- 根据左右轮的里程累积计算三个位移量(dx, dy, dyaw);
- 将指令中提供的速度量(vx, vy, omega)转换成左右轮的线速度(vl, vy);
- 返回第一步中的计算结果
通过里程累积计算三个位移量的方法:
变量定义:
变量名称
定义
单位
dl
左轮位移,机器人向前为正
m
dr
右轮位移,机器人向前为正
m
dx
机器人正方向位移,机器人前方为正
m
dy
机器人侧向位移,机器人左侧为正
m
dyaw
机器人角位移,逆时针为正
rad
- 计算公式:
dyaw=(dr-dl)/2R
dx=cos(dyaw)×(dl+dr)/2
dy=sin(dyaw)×(dl+dr)/2
Note title 注意 R是机器人轮距半径,单位为m,下文同。
示例代码
Code Block language text title base_set_velocity_request linenumbers true float d_yaw = (d_dist_r_mm_f - d_dist_l_mm_f)/2.0f/robot_radius_mm; float displacement = (d_dist_l_mm_f + d_dist_r_mm_f)/2.0f; float dx = cos(d_yaw)*displacement; float dy = sin(d_yaw)*displacement; ans_pkt->base_dx_mm_q16 = (_32)(dx*(1<<16)) ans_pkt->base_dy_mm_q16 = (_32)(dy*(1<<16)) ans_pkt->base_dtheta_degree_q16 = (_32)(d_yaw/M_PIF*180*(1<<16))
根据速度量计算左右轮线速度的方法:
变量定义
变量名称
定义
单位
vx
机器人正向线速度,前进方向为正
m/s
vy
机器人侧向线速度,向左为正, 对于二轮差动机器人,该值为0
m/s
omega
机器人角速度,逆时针为正
rad/s
vl
机器人左轮线速度,机器人向前为正
m/s
vr
机器人右轮线速度,机器人向前为正
m/s
- 计算公式(以二轮差动模型为例)
vl=vx-omega*R
vr=vx+omega*R 示例代码
Code Block language cpp title base_set_velocity_request linenumbers true base_set_velocity_request_t *req = (base_set_velocity_request_t*)request->payload; float speed_l_mm = (float)req->velocity_x_q16 * 1000.0 / (1 << 16); float speed_r_mm = speed_l_mm; float line_speed_mm = (float)req->angular_velocity_q16 / (1 << 16) * robot_radius_mm; speed_l_mm -= line_speed_mm; speed_r_mm += line_speed_mm;
外部系统命令查询请求(POLL_BASE_CMD)
SLAMWARE Core室内定位导航模块可接受外部系统的命令,但由于单向通讯的模式,外部系统只能在SLAMWARE Core发送外部系统控制命令查询请求的时候才可以发送控制命令。SLAMWARE Core会定期向外部系统查询控制命令。对于外部系统希望SLAMWARE Core尽快响应的控制命令可以通过#CMD信号通知SLAMWARE Core尽快发送外部系统控制命令查询请求。在#BUSY信号置高电平的时候表示SLAMWARE Core正处于忙碌状态,无法响应外部系统的控制命令。但外部系统仍需及时响应SLAMWARE Core发送的请求命令。请注意,SLAMWARE Core不会应答外部系统的命令,当SLAMWARE Core接受外部系统的命令后,外部系统可以检测到#BUSY信号的脉冲。外部系统必须在应答外部系统命令查询请求后拉高#CMD信号,否则系统将会工作在未知状态。
请求数据包 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
命令代码 | 负载数据 | ||||||||||
0x50 | 无 | ||||||||||
应答数据包 | |||||||||||
应答代码 | 负载数据 | ||||||||||
<OK> | 外部系统命令代码(u8) |
该命令数据域描述如下:
数据域 | 类型 | 描述 |
---|---|---|
外部系统命令代码 | u8 | 外部系统的命令代码,只能是SLAMWARE Core支持的命令代码。详情请见下表。 |
SLAMWARE Core支持的命令代码如下:
外部系统命令代码 | 命令名称 | 描述 |
---|---|---|
0x51 | GET_INFO | 获取SLAMWARE CORE系统信息,包含软硬件版本,网络配置。 |
0x52 | RESET_WIFI | 重置SLAMWARE CORE无线网络 |
0x53 | FW_UPGRADING | 更新SLAMWARE CORE固件 |
0x80 | START_SWEEP | 开始清扫(仅针对扫地机版本) |
0x81 | STOP_SWEEP | 结束清扫(仅针对扫地机版本) |
0x82 | SPOT_SWEEP | 定点清扫(仅针对扫地机版本) |
0x90 | GET_HEALTH | 获取健康状况 |
0xA0 | MOVE_FORWARD | 向前 |
0xA1 | MOVE_BACKWARD | 向 后 |
0xA2 | TURN_LEFT | 向左 |
0xA3 | TURN_RIGHT | 向右 |
0xAF | CANCEL_ACTION | 取消上一步操作 |
0xB0 | GET_AUXILIARY_ANCHOR | 获取辅助定位传感器 |
外部系统命令回应请求(POLL_BASE_ANS_CMD)
SLAMWARE Core在处理完外部系统的命令请求后会给予回应,回应请求总是与外部系统命令查询请求成对出现。
SLAMWARE Core支持的外部系统命令代码暂未定义。
请求数据包 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
命令代码 | 负载数据 | ||||||||||
0x5F | 无 | ||||||||||
应答数据包 | |||||||||||
应答代码 | 负载数据 | ||||||||||
<OK> | 应答数据(u8) |
该命令数据域描述如下:
数据域 | 类型 | 描述 |
---|---|---|
应答数据 | u8 | 外部系统命令的应答数据,与SLAMWARE CORE命令代码相关 |
SLAMWARE CORE系统事件通知命令(SEND_EVENT)
SLAMWARE CORE室内定位导航模块会不定期的向外部系统发送系统事件通知。外部系统可以根据系统事件通知作出相应反应。
注意,SLAMWARE CORE支持的系统事件代码可能会增减。
请求数据包 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
命令代码 | 负载数据 | ||||||||||
0x60 | 系统事件代码(u8) | ||||||||||
应答数据包 | |||||||||||
应答代码 | 负载数据 | ||||||||||
<OK> | 无 |
该命令数据域描述如下:
数据域 | 类型 | 描述 |
---|---|---|
系统事件代码 | u8 | SLAMWARE CORE的系统事件代码,详见下表 |
目前支持的系统事件代码有:
系统事件代码 | 命令名称 | 描述 |
---|---|---|
0x61 | LIDAR_CONN_FAIL | LIDAR连接失败 |
0x62 | LIDAR_RAMPUP_FAIL | LIDAR启动失败 |
0x63 | SYSTEM_UP_OK | 系统启动成功 |
0x64 | FIRMWARE_UPDATE | 系统固件升级 |
0x65 | CORE_DISCONNECT | 系统断开连接 |
0x66 | FIRMWARE_UPDATE_OK | 固件升级成功 |
0x80 | START_SWEEP | 通知外部系统清扫开始(仅针对扫地机版本) |
0x81 | END_SWEEP | 通知外部系统清扫结束(仅针对扫地机版本) |
外部系统健康管理命令请求(HEALTH_MGMT)
SLAMWARE CORE室内定位导航模块会不定期的向外部系统发送健康管理相关的命令请求。外部系统可以根据具体的命令请求作出相应的反应。具体支持的事件代码如下:
健康管理事件代码 | 命令名称 | 描述 |
---|---|---|
0x01 | HEALTH_GET_HEALTH | 获取外部系统健康状况 |
0x02 | HEALTH_GET_ERROR | 请求取外部系统错误的详细信息 |
0x03 | HEALTH_CLEAR_ERROR | 请求清除外部系统错误信息 |
HEALTH_GET_HEALTH
请求数据包 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
命令代码 | 负载数据 | |||||||||||
0x90 | 0x01 | |||||||||||
应答数据包 | ||||||||||||
应答代码 | 负载数据 | |||||||||||
<OK> | Health_flag(u8) | Error_count(u8) |
数据域 | 类型 | 描述 |
---|---|---|
Health_flag | u8 | 表示健康信息按照严重程度的分类,具体定义请参考下表 |
Error_count | u8 | 表示错误信息的数目 |
Health flag定义如下:
Health Flag | Bit | 描述 |
---|---|---|
保留 | [7:3] | 保留 |
FATAL | [2] | 表示是否有FATAL。 0 = Has no FATAL 1 = Has FATAL |
ERROR | [1] | 表示是否有ERROR。 0 = Has no ERROR 1 = Has ERROR |
WARN | [0] | 表示是否有WARN。 0 = Has no WARN 1 = Has WARN |
HEALTH_GET_ERROR
请求数据包 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
命令代码 | 负载数据 | |||||||||||
0x90 | 0x02 | error id(u8) | ||||||||||
应答数据包 | ||||||||||||
应答代码 | 负载数据 | |||||||||||
<OK> | error_code(u32) | error_message(u8[32]) |
数据域 | 类型 | 描述 |
---|---|---|
error_id | u8 | 表示第几个error,是一个小于error count的整数. |
error_code | u32 | 具体请参考下表。 |
error_message | u8[32] | 表示具体错误信息的字符串. |
Error code定义如下:
Error Code | Bit | 描述 |
---|---|---|
错误等级 | [31:24] | 表示错误的严重程度。 |
错误组件 | [23:16] | 表示发生错误的具体位置或组件。 |
具体信息 | [15:8] | 表示具体的错误信息。 |
具体组件 | [7:0] | 表示具体某个组件有错误。 |
示例代码
Code Block | ||||
---|---|---|---|---|
| ||||
// sensor errors #define BASE_SENSOR_FATAL_CONTROLLER_DOWN (SLAMWARECORE_HEALTH_ERROR_FATAL | BASE_COMPONENT_SENSOR | 0x0000u) #define BASE_SENSOR_WARN_BUMPER_DOWN (SLAMWARECORE_HEALTH_ERROR_WARN | BASE_COMPONENT_SENSOR | 0x0100u) #define BASE_SENSOR_ERROR_BUMPER_DOWN (SLAMWARECORE_HEALTH_ERROR_ERROR | BASE_COMPONENT_SENSOR | 0x0100u) #define BASE_SENSOR_FATAL_BUMPER_DOWN (SLAMWARECORE_HEALTH_ERROR_FATAL | BASE_COMPONENT_SENSOR | 0x0100u) #define BASE_SENSOR_WARN_CLIFF_DOWN (SLAMWARECORE_HEALTH_ERROR_WARN | BASE_COMPONENT_SENSOR | 0x0200u) #define BASE_SENSOR_ERROR_CLIFF_DOWN (SLAMWARECORE_HEALTH_ERROR_ERROR | BASE_COMPONENT_SENSOR | 0x0200u) #define BASE_SENSOR_FATAL_CLIFF_DOWN (SLAMWARECORE_HEALTH_ERROR_FATAL | BASE_COMPONENT_SENSOR | 0x0200u) #define BASE_SENSOR_WARN_SONAR_DOWN (SLAMWARECORE_HEALTH_ERROR_WARN | BASE_COMPONENT_SENSOR | 0x0300u) |
HEALTH_CLEAR_ERROR
请求数据包 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
命令代码 | 负载数据 | |||||||||||
0x90 | 0x03 | error code(u32) | ||||||||||
应答数据包 | ||||||||||||
应答代码 | 负载数据 | |||||||||||
<OK> | 无 |
外部系统辅助定位数据获取请求(GET_AUXILIARY_ANCHOR)
SLAMWARE CORE室内定位导航模块会不定期的向外部系统发送获取辅助定位数据相关的命令请求。
请求数据包 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
命令代码 | 负载数据 | |||||||||||
0x35 | 无 | |||||||||||
应答数据包 | ||||||||||||
应答代码 | 负载数据 | |||||||||||
<OK> | Flag(u8) | Anchors(u8[*]) |
数据域 | 类型 | 描述 |
---|---|---|
Flag | u8 | 具体请参考后附表格说明。 |
Anchors | u8[*] | 表示多个AnchorInfo的数据域。具体格式请参考后附表格说明。 |
Flag字段定义如下:
Flag | Bit | 描述 |
---|---|---|
辅助传感器类型 | [7:5] | 表示辅助传感器的类型。 |
辅助传感器标准差域 | [4] | 表示辅助数据是否支持标准差测量。 |
辅助传感器锚数量 | [3:0] | 表示辅助传感器锚数量。 |
AnchorInfo数据格式如下:
AnchorInfo[0] | 第0个AnchorInfo | 注:n 为辅助传感器数量。 |
AnchorInfo[1] | 第1个AnchorInfo | |
... | ||
AnchorInfo[n] | 第n个AnchorInfo |
AnchorInfo数据域定义如下:
AnchorInfo数据域 | 类型 | 描述 |
---|---|---|
id | u16 | 表示Anchor的id。 |
distance | u16 | 表示当前Anchor的距离单位为毫米。 |
Max error | u8 | 表示距离的标准差。单位为毫米。(如果传感器不支持标准差测量,则没有此数据域。) |