在 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
)實現完整的運動控制。