RobStride RS02モーターをCANバス経由で制御するためのPython実装です.PrivateプロトコルとMITプロトコルの両方に対応予定です.公式のROS BridgeのC++クラス実装を参考にPythonへ移植しています.
- 複数の制御モード:
- 運控モード (Mode 0): 目標位置,目標速度,補正トルク,比例ゲイン,微分ゲインの5パラメータを指定して制御
- 位置PPモード (Mode 1): Profile Position 位置制御
- 速度モード (Mode 2): 速度制御
- 電流モード (Mode 3): 電流制御
- 位置CSPモード (Mode 5): Cyclic Synchronous Position制御
- OS: Ubuntu24.04
- SocketCANインターフェース (Linux)
- CANアダプタ: DSD TECH SH-C30G
- Python 3.11以上
- uvパッケージマネージャ
# uvをインストール(まだの場合)
curl -LsSf https://astral.sh/uv/install.sh | shuv syncライブラリを使用する前に,CANインターフェースが適切に設定されていることを確認してください:
# 1 MbpsでCANインターフェースを起動
sudo ip link set up can0 type can bitrate 1000000
# インターフェースが起動していることを確認
ip link show can0examples/ディレクトリにサンプル実装が用意されています.
CANバス上のモーターを検出します:
# RobStrideのデフォルトID 127を指定してスキャン
uv run examples/scan_motors.py --start 127 --end 127
# デフォルト範囲(1~127)をスキャン
uv run examples/scan_motors.py
# ID範囲を指定してスキャン
uv run examples/scan_motors.py --start 1 --end 10
# CANインターフェースを指定
uv run examples/scan_motors.py --interface can1 --start 125 --end 128# ID 127 を 1 に変更
uv run examples/set_motor_id.py --current-id 127 --new-id 1 --save運控モード(Mode 0)を使用した位置制御です.ホスト側で軌道を計算し,トルク・位置・速度・Kp/Kdを毎制御周期送信します:
# 制御周期を精度良く保つループでゼロ点へ移動
uv run examples/move_to_zero_mit.py --motor-id 127
# リアルタイムプロット付き
uv run examples/move_to_zero_mit_plot.py --motor-id 127
# その場でトルクをオンする
uv run examples/enable_torque_mit.py --motor-id 127
# 柔らかめの位置制御
uv run examples/enable_torque_mit.py --motor-id 127 --kp 2 --kd 0.02 PPモード(Mode 1)を使用した位置制御です.目標位置・速度・加速度を指定すると,モーター内部で軌道を生成して移動します:
uv run examples/move_to_zero_pp.py --motor-id 11現在のモーター位置をエンコーダのゼロ点として設定します:
uv run examples/set_custom_zero.py --motor-id 127
# CANインターフェースを指定する場合
uv run examples/set_custom_zero.py --interface can0 --motor-id 127# 現在のzero_sta値を表示
uv run examples/set_zero_sta.py --motor-id 127
# zero_staを1に設定(-π~πモード)
uv run examples/set_zero_sta.py --motor-id 127 --set 1
# zero_staを0に設定(0~2πモード、デフォルト)
uv run examples/set_zero_sta.py --motor-id 127 --set 0uv run examples/get_firmware_version.py --motor-id 127from robstride_motor import RobStrideMotor, ActuatorType
# モータを初期化
motor = RobStrideMotor(
can_interface="can0",
master_id=255,
motor_id=1,
actuator_type=ActuatorType.ROBSTRIDE_00,
)
# モータを有効化
motor.enable_motor()
# 運控モードコマンドを送信
feedback = motor.send_motion_command(
torque=0.0,
position=1.57, # rad
velocity=0.1, # rad/s
kp=0.1,
kd=0.1,
)
print(f"位置: {feedback.position} rad")
print(f"速度: {feedback.velocity} rad/s")
print(f"トルク: {feedback.torque} Nm")
print(f"温度: {feedback.temperature} °C")
# モータを無効化
motor.disable_motor()motor = RobStrideMotor(
can_interface: str, # CANインターフェース名 (例: "can0")
master_id: int, # マスターデバイスID (通常 255)
motor_id: int, # モータデバイスID
actuator_type: ActuatorType # パラメータマッピング用のアクチュエータタイプ
)enable_motor() -> MotorFeedback- モータを有効化disable_motor(clear_error: bool = False) -> None- モータを無効化send_motion_command(torque, position, velocity, kp, kd) -> MotorFeedback- 運控モードsend_velocity_command(velocity, acceleration) -> MotorFeedback- 速度制御モードsend_position_pp_command(angle, speed, acceleration) -> MotorFeedback- PP位置モードsend_position_csp_command(angle, speed) -> MotorFeedback- CSP位置モードsend_current_command(iq, id_val) -> MotorFeedback- 電流制御モードset_zero_position() -> None- 現在位置を零点に設定get_feedback() -> MotorFeedback- 現在のモータ状態を取得
ActuatorType.ROBSTRIDE_00 # ROBSTRIDE_06まで各アクチュエータタイプには,事前定義された動作パラメータ(位置範囲,速度範囲,トルク範囲,Kp/Kd範囲)があります.
@dataclass
class MotorFeedback:
position: float # rad
velocity: float # rad/s
torque: float # Nm
temperature: float # °Cuv run mypy robstride_motor# Linter
uv run ruff check robstride_motor
# Formater
uv run ruff format robstride_motor- Orginal Implementation: