Extension v9.0 协议
适合您自己的客户的精确有线格式。首先阅读会话生命周期; 寄存器布局 定义字段大小、偏移量和范围。即使指令和块选择器的数值一致,它们也是单独的数据包字段。
本节描述主机和伺服器之间交换的确切消息。它旨在供读者连接自己的软件。
消息格式和数字编码
每条消息都是一个数据包:包含目的地、命令、数据以及用于检测传输错误的校验和的字节序列。 Extension命令使用标准STS数据包格式:
Request: FF FF ID LENGTH INSTRUCTION PARAMETERS... CHECKSUM
Response: FF FF ID LENGTH LEGACY_ERROR EXT_STATUS DATA... CHECKSUM
- 请求
LENGTH = parameter_bytes + 2。 - 响应
LENGTH = data_bytes + 3;扩展状态占据第一个响应参数,与正常的遗留错误字节分开。 CHECKSUM = ~(ID + LENGTH + instruction_or_error + all_parameter_bytes) & 0xFF。响应和包括EXT_STATUS和任何数据。- 占用多个字节的字段首先发送最低有效字节( 小端 )。例如,数字 256 以两个字节形式发送为
00 01。 u8、u16和u32是非负整数,分别占用 1、2 和 4 字节。i16和i32分别占用 2 和 4 字节,也能表示负数。Extension 的有符号值采用二进制补码:例如,−1 编码为FF FF(在i16字段中)。这与传统接口的有符号数编码不同。- Q8 表示在传输之前将值乘以 256,因此分数可以表示为整数。读取时除以256。例如,位置 1000 计数作为 256000 发送,增益 4.5 作为 1152 发送。
- 位置以编码器计数为单位,速度以计数/秒为单位。主机处理关节角度的任何转换,包括方向或零位置的变化。
- 单播 表示寻址到一个伺服器的消息。 广播 使用 ID
0xFE并到达所有舵机。广播扩展命令永远不会生成回复。
示例:从伺服 ID 1 读取 8 字节功能块:
FF FF 01 04 90 90 08 D2
选择器 标识完整的寄存器块,例如配置或反馈。使用扩展名 READ/WRITE 和下面列出的确切块大小来访问它。不支持仅读取或写入块的一部分,并且传统的 READ/WRITE 命令无法访问这些块。
使用说明
下面的参数大小不包括数据包标头和校验和。在回复中, EXT_STATUS 报告扩展命令是否成功,与伺服器的正常错误字节 LEGACY_ERROR 分开。成功读取会将请求的数据添加到 EXT_STATUS 后面;写入、其他命令和失败的读取没有额外的数据。
| 说明 | 名称 | 参数 | 广播 |
|---|---|---|---|
0x90 |
READ | selector:u8, count:u8 |
没有有用的回应 |
0x91 |
WRITE | selector:u8, block... |
不接受 |
0x99 |
GRAVITY | 6 字节,如下 | 不接受 |
0x9A |
TARGETS | session:u16 + 1 – 9 字节的 6 条目 |
已接受 |
指令号 0x92 、 0x93 、 0x94 、 0x95 、 0x96 、 0x97 和 0x98 以及选择器 0xA1 、 0xA3 、 0xB0 、 0xBA 、 0xE0 和 0xF0 是保留的,不得使用。
| Extension 状态 | 含义 |
|---|---|
0 |
好的 |
1 |
长度、选择器或字段值无效 |
2 |
当前状态下无法接受命令 |
3 |
保留 |
4 |
保留 |
5 |
不支持的指令 |
会话不匹配会返回状态失败。检查遗留错误字节和扩展状态。
会话和序列号
主机为每个会话分配一个从 1 到 65535 的编号,并将其包含在控制命令中。这让伺服器检查命令是否属于当前会话。为每次启动选择一个新号码;设置编号不会永久存储。
序列号 按顺序对接受的命令进行计数,允许主机和伺服器识别丢失、重复或无序的命令。
TARGETS 为每个舵机维护一个运动序列计数器,GRAVITY 使用独立的计数器。力矩使能启动控制时,两者都从零开始;通常首先发送 1。序号递增至 65535 后回绕到 0,不会结束会话。允许跳号:例如在 10 之后,即使 11 丢失或被拒绝,舵机仍可接受 12。相同或较旧的序号会被拒绝,且不会改变当前命令。
要进行精确比较,请计算 distance = (incoming − accepted) & 0xFFFF 。仅当 1 ≤ distance ≤ 32767 时命令才较新。恰好 32768 的跳转是不明确的并被拒绝。保持与最后接受的命令的间隙低于 32768 ;如果命令历史不确定,请关闭扭矩,准备新的会话 ID,然后再次启用扭矩。不要重复使用早期会话或计数器周期中的排队数据包。
验收仍然需要有效的字段、当前传感器读数和可行的运动。被拒绝的命令不会推进其计数器。这些命令取代绝对目标;它们不是航路点队列。要访问每个航点,请等待每个到达点,然后再发送下一个目的地。
发送组目标时,读取每个舵机的反馈以验证其接受的序列。每个舵机独立决定是否接受其目标;当其他人开始行动时,一个人可能会拒绝它。
目标 — 0x9A
前两个参数字节包含共享会话。以下每个条目都有此布局;偏移量是相对于该条目的开头的:
| 偏移量 | 类型 | 领域 |
|---|---|---|
| 0 | u8 |
伺服 ID,1 – 253 |
| 1 | u16 |
该伺服系统的较新运动序列 |
| 3 | i32 |
目的地位置,Q8 很重要 |
| 7 | u16 |
最大速度,计数/秒,非零 |
参数长度为 2 + 9 × entry_count ,最多 56 字节。 ID 必须是唯一的。每个伺服器在处理自己的条目之前都会检查 所有 条目的格式和所需字段。未列出的伺服系统不执行任何操作。列出的伺服系统会检查其会话、顺序、准备情况以及运动是否可以保持在其限制范围内。接受的目标会立即启动并保持活动状态,直到被替换或解除武装。值的上限为配置的限制,如 S 曲线运动中所述。
重力 — 0x99
| 偏移量 | 类型 | 字段/约束 |
|---|---|---|
| 0 | u16 |
当前会话 |
| 2 | u16 |
较新的重力序列 |
| 4 | i16 |
所需的重力作用;幅度 ≤ 配置的输出限制 |
参数长度正好是6字节。需要在电机电源打开、硬件准备就绪、没有报告的故障以及最近的传感器读数的情况下进行武装会话。它不会推进运动序列。所请求的值在更换或撤防之前保持活动状态。
检查客户端实现
分别检查长度、校验和、遗留错误和 Extension 状态。通过列出的每个伺服器的反馈确认组TARGETS:广播传输成功并不表示接受。如果序列历史不确定,请释放扭矩并准备新会话,而不是盲目地继续旧的数据包队列。
现有驱动程序通过host/servo-driver/registers/ArmCodec.js和host/servo-driver/bus/ArmExtension.js进行编码和解码。固件实现 firmware/app/arm_extension.c 中的有线格式。
