在 ROS 2 中更改从设备(如电机控制器)的运动模式(例如从位置模式切换到速度模式),需要通过操作模式(Mode of Operation,对应对象字典索引0x6060
) 进行设置。结合你的配置(rpdo
已映射0x6060
),可以通过以下两种方式发送指令:
方法 1:直接调用 CANopen 服务(底层控制)
利用 ROS 2 的COWrite
服务直接写入0x6060
索引,适用于需要精准控制对象字典的场景。
步骤:
-
确认服务名称
从节点的服务名称格式通常为:/<namespace>/<node_name>/co_write
- 你的配置中,从节点命名空间是
/test1
,节点名为cia402_node_1
,因此服务名称为:
/test1/cia402_node_1/co_write
- 你的配置中,从节点命名空间是
-
发送操作模式指令
CiA 402 协议定义的常用操作模式值如下(需根据设备手册确认):1
:位置模式(Profile Position Mode)3
:速度模式(Profile Velocity Mode)4
:力矩模式(Profile Torque Mode)6
:回零模式(Homing Mode)
可以通过
ros2 service call
命令直接调用服务:
# 示例:切换到速度模式(值为3)
ros2 service call /test1/cia402_node_1/co_write canopen_interfaces/srv/COWrite "{index: 0x6060, subindex: 0, value: 3, type: 8}"
- 参数说明:
index: 0x6060
:操作模式的对象字典索引subindex: 0
:子索引(固定为 0)value: 3
:目标模式(此处为速度模式)type: 8
:数据类型(8 表示 8 位无符号整数)
方法 2:通过运动控制接口(高层封装)
如果你的驱动(canopen_402_driver
)提供了高层 ROS 接口(如JointTrajectory
或SetOperationMode
服务),可以更便捷地切换模式(推荐)。
步骤:
-
检查高层接口
查看从节点提供的服务或话题:
ros2 topic list | grep /test1/cia402_node_1
ros2 service list | grep /test1/cia402_node_1
方法 3:编写 Python 节点(程序控制)
如果需要在代码中动态切换模式,可以编写 ROS 2 节点调用COWrite
服务。
示例代码:
import rclpy
from rclpy.node import Node
from canopen_interfaces.srv import COWriteclass ModeSetter(Node):def __init__(self):super().__init__('mode_setter')# 创建服务客户端self.client = self.create_client(COWrite, '/test1/cia402_node_1/co_write')while not self.client.wait_for_service(timeout_sec=1.0):self.get_logger().info('服务未就绪,等待中...')def send_request(self, mode):# 构造请求:写入0x6060索引,设置操作模式req = COWrite.Request()req.index = 0x6060req.subindex = 0req.value = mode # 模式值(如3表示速度模式)req.type = 8 # 8位无符号整数self.future = self.client.call_async(req)rclpy.spin_until_future_complete(self, self.future)return self.future.result()if __name__ == '__main__':rclpy.init()mode_setter = ModeSetter()# 切换到位置模式(值为1)response = mode_setter.send_request(1)if response.success:mode_setter.get_logger().info('模式切换成功!')else:mode_setter.get_logger().error('模式切换失败!')mode_setter.destroy_node()rclpy.shutdown()
注意事项
-
模式切换的前提
电机必须处于 “就绪状态”(状态字0x6041
的 bit 0 为 1,bit 1 为 1),否则模式切换会失败。若设备处于故障状态,需先通过控制字(0x6040
)发送复位指令(值为0x80
)。 -
设备兼容性
部分设备可能只支持部分模式(如仅支持位置 / 速度模式),需参考电机控制器的 EDS 文件或手册确认可用模式值。 -
同步生效
模式切换后,需等待 1-2 个通信周期(你的配置中period: 10ms
)才能生效,可通过读取0x6061
(操作模式显示)确认当前模式:
# 读取当前模式
ros2 service call /test1/cia402_node_1/co_read canopen_interfaces/srv/CORead "{index: 0x6061, subindex: 0}"
通过以上方法,你可以灵活地在 ROS 2 中更改从设备的运动模式,结合目标位置 / 速度指令(通过0x607A
/0x60FF
)实现完整的运动控制。