# RM_ARM_Plus_Protocol **Repository Path**: RealManRobot/rm_arm_plus_protocol ## Basic Information - **Project Name**: RM_ARM_Plus_Protocol - **Description**: 机械臂末端工具通用控制标准协议 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2025-01-21 - **Last Updated**: 2026-03-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # “RM\_ARM+”末端工具生态建设-协议标准V1.0.6 # 版本说明 | **版本号** | **更新内容** | **日期** | | --- | --- | --- | | V1.0.0 | * 定义初始协议 | 20241102 | | V1.0.1 | * 协议中增加cmd字段,用于预留和兼容 * 反馈协议中增加出错后的错误标志与错误代码,并给出错误代码表 * 增加异或校验计算方法 | 20241105 | | V1.0.2 | * operation\_len表示operation\_data的实际长度,方便不同指令的跳转 | 20241112 | | V1.0.3 | * 寄存器表添加力控、急停、保存参数寄存器 | 20241120 | | V1.0.4 | * 寄存器扩充灵巧手寄存器,新增1009、1010、1510、1530、1550 * 删除"总帧长度不超过300个字节"的限制 * 修改发送和接收总协议帧中数据长度为2字节 | 20241210 | | V1.0.5 | * 添加寄存器1011、1026、1027、1560 * 修改寄存器1550关节错误码 * 修改1220寄存器系统错误码 | 20250108 | | V1.0.6 | * 1010寄存器添加可写功能 * 明确部分寄存器数据类型和单位 * 去掉速度下限寄存器(1200)定义,地址预留 | 20250117 | # 一、协议需求 为提高用户使用机械臂与末端工具一起使用时的易用性,满足用户无论使用何种末端工具,均能得到一致的产品使用体验,可基于机械臂控制接口完成末端工具的查询与功能控制,避免在使用时需要查询末端工具寄存器地址表,使用多种调试工具进行使用等问题,可以简单的基于机械臂的示教器进行末端工具的控制和状态查询,并在图形化编程、API、ROS等机械臂开发资源中,快速的使用,构建"机械臂+"的技术与产品生态,产生的需求如下: (1)兼容基于485总线的末端工具设备,包括灵巧手、两指夹爪、三指夹爪等 (2)具有不低于50Hz高速透传闭环控制接口,支持一条指令可完成位置控制、角度控制、速度控制、力控制,并获取速度、位置、角度、力、电流、触觉、状态等信息 (3)具备厂商信息设备识别接口,可快速识别厂商信息、设备软件版本、设备硬件版本、设备类型等信息 (4)波特率支持修改,115200 、256000 、460800波特率,默认支持256000,最好支持460800或更高 ~~(5)每个周期返回的数据总量不得超过300个字节~~ (6)支持控制动作手势和动作序列的接口,并提供预置的动作和手势,支持通过官方工具修改 # 二、协议说明 本协议约定了一种“RM\_ARM+”协议格式,末端工具需要支持此协议,并与其原有Modbus-RTU协议、私有协议等支持同时使用,在使用时,设备支持自动识别协议类型,无需手动切换灵巧手的协议模式。 该协议基于应答方式,要求设备接收到发送帧后,以最快速度响应,响应时间不得超过1ms,不允许在未接收到任何指令时主动上报数据,防止造成总线冲突。 # 三、协议内容 ## 1、发送协议 ### (1)总协议格式 | **head** | **device\_id** | **master\_id** | **cmd** | **len** | **data** | **checksum** | | --- | --- | --- | --- | --- | --- | --- | | 2bytes | 1bytes | 1bytes | 1bytes | 2bytes | n bytes | 1bytes | 说明如下: | 字段 | 说明 | | --- | --- | | head | 起始符,2个bytes,固定为0x55 0xAA | | device\_id | 设备ID,需要控制的从站设备ID号,例如灵巧手ID,当为0xFF时,代表广播,任何ID均需回复 | | master\_id | 代表主站ID,回复是需要回应正确的主站ID | | cmd | 代表协议命令标识,固定为0x5E | | len | 数据长度,2个bytes,代表数据段data的长度,低字节在前、高字节在后 | | data | 数据段,n个bytes,动态长度,详情见数据段协议格式说明 | | checksum | 校验位,采用异或校验,除帧头外的所有数据异或校验 | ### (2)数据段协议格式说明 | **operation\_type** | **start\_address** | **operation\_len** | **operation\_data** | **...** | **...** | | --- | --- | --- | --- | --- | --- | | 1bytes | 2bytes | 1bytes | n bytes | ... | ... | 说明如下: 数据段支持对末端设备的读写控制,由operation\_type、start\_address、operation\_len、operation\_data构成,可以循环多个,进行多组寄存器的读取和写入。 | 字段 | 说明 | | --- | --- | | operation\_type | 操作类型,1bytes,00代表读取请求,01代表写入请求 | | start\_address | 起始地址,2bytes,低字节在前、高字节在后 | | operation\_len | 操作长度:1bytes,代表操作的数据长度,读写需要为偶数 | | operation\_data | 操作数据:nbytes,写入时使用,每2bytes为写入一个寄存器,n需要与operation\_len一致 | ## 2、响应协议 ### (1)总协议格式 | **head** | **master\_id** | **device\_id** | **cmd** | **len** | **data** | **checksum** | | --- | --- | --- | --- | --- | --- | --- | | 2bytes | 1bytes | 1bytes | 1bytes | 2bytes | n bytes | 1bytes | 说明如下: | 字段 | 说明 | | --- | --- | | head | 起始符,2个bytes,固定为0x55 0xAA | | master\_id | 代表主站ID,回复发送帧的master\_id | | device\_id | 设备ID,需要控制的从站设备ID号 | | cmd | 操作命令返回,如果正常执行 为0x5E,如果指令执行错误,那么最高位为 1,低七位为操作命令,即为0xDE,另外,增加Data\[0\]为错误代码,参考错误代码表,其他data数据则顺延 | | len | 数据长度,2个bytes,代表数据段data的长度,低字节在前、高字节在后 | | data | 数据段,n个bytes,动态长度,详情见数据段协议格式说明 | | checksum | 校验位,采用异或校验,除帧头外的所有数据异或校验 | ### (2)数据段协议格式说明 | **operation\_type** | **start\_address** | **operation\_len** | **operation\_data** | **...** | **...** | | --- | --- | --- | --- | --- | --- | | 1bytes | 2bytes | 1bytes | n bytes | ... | ... | 说明如下: 数据段支持对末端设备的读写控制,由operation\_type、start\_address、operation\_len、operation\_data构成,可以循环多个,进行多组寄存器的读取和写入。 | 字段 | 说明 | | --- | --- | | operation\_type | 操作类型,1bytes,00代表读取请求,01代表写入请求 | | start\_address | 起始地址,2bytes,低字节在前、高字节在后 | | operation\_len | 操作长度:1bytes,代表反馈的operation\_data的数据长度 | | operation\_data | 操作数据:nbytes, 读取操作类型返回时,表示寄存器数据,每2bytes为一个寄存器,n与operation\_len一致 写入操作类型返回时,表示成功或失败,1bytes,0x01表示成功,0x00表示失败 | ### (3)错误代码 | 值 | 说明 | | --- | --- | | 0x01 | 校验码错误 | | 0x11 | 无效的命令 | | 0x12 | 字节数不正确 | | 0x13 | 无效的值 | | 0x21 | 正在等待初始化命令或者正在初始化 | | 0x22 | 等待校正 | | 0x23 | 电机堵转 | | 0x31 | 操作失败 | | 0x32 | 保存失败 | ## 3、异或校验计算方法 ```c uint8_t buf[...]; uint8_t bcc = 0; uint8_t cmd_data_len = 4/* sizeof(MasterID) + sizeof(HandID) + sizeof(Command) + sizeof(DataLen) */ + DataLen; /* Fill buf */ buf[0] = 0x55; buf[1] = 0xAA; ... for (int i=0; i