本页面介绍了外部系统将如何通过Control Bus 协议与底盘进行通讯。Control Bus通信协议可以点击此链接:文档下载


本页内容





简介

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以太网中使用。

Ctrl Bus协议和Inter-chip协议关系示意图

功能概览

内部模块框图和使用方法

下图描述了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规范的数据包均符合如下的格式定义。

数据类型u8u8[n]u8u8[n]u8u8u8u8[n]u8
字段FlagExFlag[n]AddrExAddr[n]LenLenHCMDPayload[n]CHKSUM
发送顺序

其中,底色为灰色的字段为可选字段。不同的Sub-Profile会使用这些可选字段的某些部分。其它字段是所有Inter-chip Protocol规范的数据包均会带有的。后文将就单个字段进行描述。

Flag字段

存储顺序MSB +7
+0 LSB
Flag:

ExtBit

LongFrame

AddrEnCheckSumEn0000

该字段为一个数据包的起始标识,占用一个字节。随着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字节的数据。

注意

当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]

FlagCheckSumEn位被设置为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]:ExtBitExFlagN[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:ExtBitAddr[6..0]
ExAddr[N]:ExtBitExAddrN[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:00010000
Long Frame:01010000

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模式的数据包进行发送。

请求命令数据包

数据类型u8u8u8u8[n]u8
Standard:

0x10

Len[7..0]CMDPayload[n]CHKSUM
数据类型u8u16u8u8[n]u8
Long Frame:

0x50

Len[15..0]CMDPayload[n]CHKSUM

由Master发送的请求命令数据包采用如上2种固定的数据包结构。其中,CMD字段的大部分取值可由应用程序使用。用于对Slave具体功能的调用或者数据请求。其具体取值请参考对应的设备文档。
符合Standard Profile规范的协议栈将保留如下的CMD字段取值,用于完成协议栈本身的处理任务:

保留的CMD取值

描述

0x00

强制同步帧。用于实现通讯信道同步

0x01

ECHO帧,用于测试Slave通讯状况

0x02 – 0x0F

保留

应用程序需要避免使用上述保留的CMD字段取值。

应答数据包

数据类型u8u8u8u8[n]u8
Standard:

0x10

Len[7..0]RespPayload[n]CHKSUM
数据类型u8u16u8u8[n]u8
Long Frame:

0x50

Len[15..0]RespPayload[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

获取外部系统健康状况

注意

关于SET_V_AND_GET_DEADRECKON,GET_BASE_MOTOR_DATA,SET_BASE_MOTOR指令使用的说明:

  1. slamware 会先下发SET_V_AND_GET_DEADRECKON, 如果能正确返回, 则不下发另外两个指令。 如果不能正常返回,则下发SET_BASE_MOTOR及GET_BASE_MOTOR_DATA;
  2. 如果要使用GET_BASE_MOTOR_DATA,SET_BASE_MOTOR指令这两条指令,那么SET_V_AND_GET_DEADRECKON下发的时候返回不支持。


外部系统连接请求(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]

外部系统的触碰传感器安装数据


注意

当使用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变量作为外部系统配置数据字段数据即可。

注意

当使用0x21 Binary Config指令配置时,请将 0x20底盘配置指令中的所有传感器数据设置为0。

外部系统状态获取请求(GET_BASE_STATUS)

SLAMWARE Core室内定位导航模块在准备好后会一直发送外部系统连接请求确认外部系统已正常工作。直到外部系统响应此请求后SLAMWARE Core才会开始正常工作。SLAMWARE Core正常工作后将不断轮询获取外部系统的状态,外部系统应当在规定的时间内给予答复。否则SLAMWARE Core将认为外部系统断开连接。

请求数据包
命令代码负载数据
0x30

应答数据包
应答代码负载数据
<OK>电池电量百分比(u8)电池充电状态(u8)


数据域

类型

描述

电池电量百分比

u8

外部系统的电池电量百分比,0-100

电池充电状态

u8

外部系统的电池状态,该变量为一个位图。
从低位到高位分别是:是否处于充电状态、是否连接了外部电源、是否连接了充电座。
当机器人通过电缆连接了充电器,且电池处于充电状态时,该状态应为3,即二进制00000011;

当机器人正在通过充电座进行充电,该状态应为5,即二进制00000101

返回顶部

外部系统轮组状态获取请求(GET_BASE_MOTOR_DATA)

SLAMWARE Core室内定位导航模块正常工作后将不断轮询获取外部系统的轮组状态,外部系统应当在规定的时间内给予答复。否则SLAMWARE Core将认为外部系统断开连接。

请求数据包
命令代码负载数据
0x31

应答数据包
应答代码负载数据
<OK>左轮电机累计里程(s32)右轮电机累计里程(s32)


数据域

类型

描述

左轮电机累计里程

s32

外部系统的左轮电机累计运动里程,单位为mm。

右轮电机累计里程

s32

外部系统的右轮电机累计运动里程,单位为mm。

注意

该命令支持的轮组类型为两轮差动。。

外部系统距离传感器数据获取请求(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想要获取的自动回充的数据类型,当前支持的类型只有一种:
0 – 获取自动回充灯塔信息
如果这个值不为0,请使用not support错误信息回复该请求(0x8000)

信标数量

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)

该指令用于设置外部系统运动速度。

请求数据包
命令代码负载数据
0x41X轴向速度量(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定点小数。

注意

此处的坐标轴是以机器人自身为中心的右手坐标系, 机器人正前方为x轴。

示例

以两轮差动机器人为例,当机器人收到该指令时,应当:

  1. 根据左右轮的里程累积计算三个位移量(dx, dy, dyaw);
  2. 将指令中提供的速度量(vx, vy, omega)转换成左右轮的线速度(vl, vy);
  3. 返回第一步中的计算结果
通过里程累积计算三个位移量的方法:
  1. 变量定义:

    变量名称

    定义

    单位

    dl

    左轮位移,机器人向前为正

    m

    dr

    右轮位移,机器人向前为正

    m

    dx

    机器人正方向位移,机器人前方为正

    m

    dy

    机器人侧向位移,机器人左侧为正

    m

    dyaw

    机器人角位移,逆时针为正

    rad

  2. 计算公式:

    dyaw=(dr-dl)/2R

    dx=cos(dyaw)×(dl+dr)/2

    dy=sin(dyaw)×(dl+dr)/2

    注意

    R是机器人轮距半径,单位为m,下文同。

  3. 示例代码

    base_set_velocity_request
    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))
根据速度量计算左右轮线速度的方法:
  1. 变量定义

    变量名称

    定义

    单位

    vx

    机器人正向线速度,前进方向为正

    m/s

    vy

    机器人侧向线速度,向左为正, 对于二轮差动机器人,该值为0

    m/s

    omega

    机器人角速度,逆时针为正

    rad/s

    vl

    机器人左轮线速度,机器人向前为正

    m/s

    vr

    机器人右轮线速度,机器人向前为正

    m/s

  2. 计算公式(以二轮差动模型为例)
    vl=vx-omega*R
    vr=vx+omega*R
  3. 示例代码

    base_set_velocity_request
    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

请求数据包
命令代码负载数据
0x900x01
应答数据包
应答代码负载数据
<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

请求数据包
命令代码负载数据
0x900x02error 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]

表示错误的严重程度。
0x01 = warn;
0x02 = error;
0x03 = fatal

错误组件

[23:16]

表示发生错误的具体位置或组件。
0 = USER;
1 = SYSTEM;
2 = POWER;
3 = MOTION;
4 = SENSOR

具体信息

[15:8]

表示具体的错误信息。

具体组件

[7:0]

表示具体某个组件有错误。

示例代码

Sensor Errors
// 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

请求数据包
命令代码负载数据
0x900x03error code(u32)
应答数据包
应答代码负载数据
<OK>

返回顶部

外部系统辅助定位数据获取请求(GET_AUXILIARY_ANCHOR)

SLAMWARE CORE室内定位导航模块会不定期的向外部系统发送获取辅助定位数据相关的命令请求。

请求数据包
命令代码负载数据
0x35
应答数据包
应答代码负载数据
<OK>Flag(u8)Anchors(u8[*])


数据域

类型

描述

Flag

u8

具体请参考后附表格说明。

Anchors

u8[*]

表示多个AnchorInfo的数据域。具体格式请参考后附表格说明。

Flag字段定义如下:

Flag

Bit

描述

辅助传感器类型

[7:5]

表示辅助传感器的类型。
0x00 = UWB;

辅助传感器标准差域

[4]

表示辅助数据是否支持标准差测量。
0 = 不支持;
1 = 支持;

辅助传感器锚数量

[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

表示距离的标准差。单位为毫米。(如果传感器不支持标准差测量,则没有此数据域。)

返回顶部