跳至正文

Extension v9.0 协议

已核对 2026-11-01

适合您自己的客户的精确有线格式。首先阅读会话生命周期; 寄存器布局 定义字段大小、偏移量和范围。即使指令和块选择器的数值一致,它们也是单独的数据包字段。

扩展协议单播请求和响应

本节描述主机和伺服器之间交换的确切消息。它旨在供读者连接自己的软件。

消息格式和数字编码

每条消息都是一个数据包:包含目的地、命令、数据以及用于检测传输错误的校验和的字节序列。 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 中的有线格式。


文档主页 · 源版本: a995f77 。 Extension 9.0 。