メインコンテンツまでスキップ

reBot Arm B601-RS で MIT 位置制御を始める

License: MITPython VersionPlatformMIT Mode

6+1 DOF · RobStride · CAN @ 1 Mbps · MIT 位置制御 · 温度保護 · 安全な原点復帰 · オープンソース Python API

traj_sim_geodesic

MotorBridge は RobStride / Damiao モータ向けの Python CAN SDK です。rebot_control はこれをラップし、reBot Arm B601-RS 用の MIT 位置制御 API を提供します:YAML 設定、関節ごとの速度制限、3 段階の MOS 温度保護、Esc / Ctrl+C / stop() によるスムーズな原点復帰。

このチュートリアルでは、環境構築 → CAN 設定 → サンプル実行 → ライブラリとしての利用、という流れで説明します。

重要な安全上の注意
  • このプロジェクトが提供するのは制御 API のみであり、ソフトウェアによる関節リミットや作業空間リミットはありません。 設定した目標角度はそのままモータに送信されます。
  • アームは作業空間のおおよそ 70% 以内で動作させてください。 作業空間外に長時間留まると、第 2 関節でスタック保護が作動し、アームが落下する可能性があります。
  • 初回使用時は、小さな角度と低速でテストし、作業空間内に人や障害物がないことを確認してください。

特長

  1. MIT 位置制御
    デフォルト 200 Hz の MIT 位置コマンド;制御ループ内でスムージングされた関節ごとの速度制限。

  2. 6+1 モータ
    J1~J6 はアーム関節、J7(CAN ID 7)はエンドエフェクタのグリッパで、set_joint_angles / set_joint_angle で制御します。

  3. 3 段階の温度保護
    MOS 温度をリアルタイム監視:警告を出して継続 → 過熱時は低速で原点復帰してから無効化 → 緊急停止(原点復帰なし)。

  4. 安全な終了と原点復帰
    Esc / Ctrl+C / arm.stop() により smoothstep で原点復帰を実行;原点復帰中に 2 回目の Ctrl+C を押すと即座に中断し、モータを無効化します。

  5. YAML ベースの設定
    CAN チャネル、温度しきい値、原点復帰パラメータ、モータの kp / kdconfig/rebotarm_rs.yaml に定義されており、コードを変更せずに調整できます。

  6. ライブラリとして利用可能
    明確なレイヤ構造(設定 / API / サンプル);from rebot import ReBotRSMITController でインポートできます。


仕様

このチュートリアルで使用するハードウェアは Seeed Studio によって提供されています。

パラメータ仕様
アームモデルreBot Arm B601-RS 組立済みキット(グリッパ付き)
自由度 (DOF)6+1(グリッパを含む)
動作半径754.7 mm(グリッパ付き) / 587.5 mm(グリッパなし)
可搬重量定格 2.5 kg / 最大 5 kg
関節可動範囲J1: ±150° / J2: 220° ~ 0° / J3: 220° ~ 0° / J4: ±90° / J5: ±90° / J6: ±180° / グリッパ: 345° ~ 0°
繰り返し精度0.1 mm
重量6.7 kg
サーボモータRobStride 06 × 3 / RobStride 00 × 4(グリッパ含む)
通信方式CAN Bus @ 1 Mbps
電源電圧DC 48V
電源DC 48V 15A
動作温度-20°C ~ 50°C
制御PC

本プロジェクトでのモータ割り当て

関節CAN IDモデル備考
J11RS06ベース
J22RS06
J33RS06
J44RS00
J55RS00
J66RS00手首
J77RS00エンドエフェクタグリッパ

ソフトウェア機能(このリポジトリ)

機能状態
MIT 位置制御
関節ごとの速度制限
グリッパ制御(CAN ID 7)
MOS 温度監視と 3 段階保護
安全な原点復帰 / 緊急無効化
YAML 設定
Python ライブラリ API
順運動学 / 逆運動学(Pinocchio)❌(reBotArm_control_py を参照)
MeshCat シミュレーション❌(上記リポジトリを参照)

関節モータのパラメータ

パラメータRobStride 00RobStride 06
定格電圧48V48V
定格電流4.7 Apk ± 10%14.3 Apk ± 10%
最大電流15.5 Apk ± 10%57 Apk ± 10%
定格トルク5 N.m11 N.m
最大トルク14 N.m36 N.m
定格回転数100 rpm ± 10%100 rpm ± 10%
無負荷最大回転数315 rpm ± 10%480 rpm ± 10%
減速比10 : 19 : 1
制御インターフェースCAN @ 1 MbpsCAN @ 1 Mbps
制御モードMIT / Speed / Position / TorqueMIT / Speed / Position / Torque

部品表 (BOM)

品目数量同梱
reBot Arm B601-RS1
CAN アダプタ(CANABLE / PCAN-USB など)1
電源(DC 48V 15A)1
USB-C ケーブル1
グリッパ1

必要要件

項目要件
Python3.10+
OSUbuntu 22.04+(推奨)
CAN インターフェースデフォルト can0
電源DC 48V 15A
依存パッケージmotorbridge, pyyaml;オプションで pynput(Esc キー用)

インストール

ステップ 1. リポジトリをクローンする

git clone https://github.com/LAN-GER/rebot_control.git
cd rebot_control

ステップ 2. 依存パッケージをインストールする

pip install motorbridge pynput pyyaml
ヒント

pynput は Esc キーのリスニングを有効にします。これがない場合、Esc のみが無効になり、Ctrl+C と arm.stop() は引き続き動作します。

ステップ 3. CAN インターフェースを設定する

# List interfaces (PCAN-USB, etc.)
sudo modprobe peak_usb # if using a PEAK adapter
ip -br link

# Set can0 to 1 Mbps (RobStride default)
sudo ip link set can0 down 2>/dev/null
sudo ip link set can0 up type can bitrate 1000000
注意

USB CAN アダプタを一度抜き差しした場合、通常は再度 ip link コマンドを実行する必要があります。

ステップ 4. (任意)設定ファイルを編集する

config/rebotarm_rs.yaml を編集します:

キー説明デフォルト
can.channelCAN インターフェース名can0
can.host_idホスト ID0xFD
control.control_hzMIT コマンドレート(動作速度ではない)200 Hz
control.telemetry_hz温度読み取りレート2 Hz
temperatures.alarm_c温度警告しきい値80°C
temperatures.return_zero_c過熱時の原点復帰しきい値125°C
temperatures.disconnect_c緊急無効化しきい値140°C
return_zero.max_speed_deg_s通常の原点復帰のピーク速度30°/s
return_zero.thermal_max_speed_deg_s熱保護時の原点復帰ピーク速度30°/s
return_zero.min_time_s原点復帰の最短時間3.0 s
return_zero.settle_time_s原点復帰後にゼロで保持する時間0.30 s
motorsモータ ID / モデル / MIT kp / kdYAML を参照

不足しているキーにはコード側のデフォルトが使用されます。不明なキーはタイプミスを検出するためエラーになります。


コード構成

rebot_control/
├── config/
│ └── rebotarm_rs.yaml # CAN / motors / temperature / return-to-zero
├── rebot/
│ ├── __init__.py # Public API
│ ├── config.py # Config loading and validation
│ └── controller.py # ReBotRSMITController
└── examples/
├── _bootstrap.py # Path setup + wait-for-target helpers
├── quick_start.py # Tutorial 1: quick start
├── custom_config.py # Tutorial 2: custom config
├── monitor_status.py # Tutorial 3: monitor status
├── single_joint_adjust.py # Tutorial 4: single joint + gripper
├── read_joint_angles.py # Tutorial 5: read actual positions
├── stop_options.py # Tutorial 6: stop options
├── recommended_structure.py # Tutorial 7: recommended structure
└── mit_position_control.py # Full editable demo

レイヤ構造:

  • 設定ファイル:調整可能なパラメータの単一の情報源。
  • 設定レイヤload_config()ControllerConfig
  • API レイヤ:デモ用の値をハードコードしない制御ロジック。
  • サンプルレイヤ:目標角度、速度、および実行フロー。

動作の仕組み

MIT 制御と速度スムージング

  • control_hz(デフォルト 200 Hz)はコマンド送信レートのみを設定します。
  • 実際の動作速度は set_max_speeds([...])(deg/s)で決まります。
  • set_joint_angles()目標値のみを更新し、制御ループが速度制限の範囲内でコマンド角度を目標に向けてランプさせます。
ヒント

目標を設定した直後に stop() を呼び出すと、ほとんど動かないように見える場合があります。サンプルでは wait_for_command_targets()examples/_bootstrap.py を参照)を使用し、コマンド角度が目標に近づくまで待ってから原点復帰しています。

接続と有効化のシーケンス

connect() の内部では、順序は次の通りです:モータ登録 → MIT モードへ切り替え → 有効化 → 現在の機械角度を読み取り(目標値を初期化し、有効化後の急激なジャンプを防ぐため)。RobStride の mechPos (0x7019) は有効化後に確実に読み取ることができます。

パッシブな位置読み取り(チュートリアル 5)の場合は、connect() の後に disable_motors() を呼び出すことで、アームを手で動かしながら角度を読み取り続けることができます。

3 段階の温度保護

しきい値(デフォルト)動作
≥ 80°C温度警告(モータごとに過熱に入るたび 1 回)、動作継続
≥ 125°C動作停止、熱保護用ピーク速度で低速原点復帰後に無効化
≥ 140°C即時の緊急無効化、原点復帰なし

安全な原点復帰

原点復帰には smoothstep 軌道を使用します。時間:

duration = max(min_time_s, per-joint time estimated from peak speed)

ピーク速度は max_speed_deg_s(通常)または thermal_max_speed_deg_s(サーマル)です。どちらもデフォルトは 30°/s で、min_time_s のデフォルトは 3.0 s です。

終了方法動作
Esc / 1 回目の Ctrl+C / arm.stop()ゆっくりゼロ位置に戻る → 無効化 → CAN をクローズ
ゼロ復帰中の 2 回目の Ctrl+Cゼロ復帰を中断し、即座に無効化
通信エラー緊急無効化、ゼロ復帰なし

単位

コンテキスト単位
外部 API(角度、速度)度、deg/s
MotorBridge MIT 内部ラジアン、rad/s

チュートリアル

すべてのサンプルはプロジェクトルートから実行してください。各スクリプトの先頭には Expected motion(期待される動き) が記載されており、起動時に [Expected / 预期] 行を出力します。

チュートリアルファイルコマンド
1. クイックスタートexamples/quick_start.pypython3 examples/quick_start.py
2. カスタム設定examples/custom_config.pypython3 examples/custom_config.py
3. 実行中のモニタリングexamples/monitor_status.pypython3 examples/monitor_status.py
4. 単一関節 + グリッパーexamples/single_joint_adjust.pypython3 examples/single_joint_adjust.py
5. 位置の読み取りexamples/read_joint_angles.pypython3 examples/read_joint_angles.py
6. 停止オプションexamples/stop_options.pypython3 examples/stop_options.py default
7. 推奨プログラム構造examples/recommended_structure.pypython3 examples/recommended_structure.py
フルデモexamples/mit_position_control.pypython3 examples/mit_position_control.py

1. クイックスタート (quick_start.py)

Expected motion: J1 が約 15°/s で +20° まで動き、他の関節とグリッパーは 0° に留まり、その後ゆっくりゼロ位置に戻って無効化されます。

python3 examples/quick_start.py

フロー:start()set_max_speeds()set_joint_angles()動作完了を待機stop()


2. カスタム設定ファイル (custom_config.py)

python3 examples/custom_config.py
python3 examples/custom_config.py config/rebotarm_rs.yaml

Expected motion: J1 → +15°(約 15°/s)、他は 0°、その後ゼロ位置に戻ります。


3. 実行中のモニタリング (monitor_status.py)

python3 examples/monitor_status.py

Expected motion: J1 → +30°。ターミナルにはターゲット / 送信値 / MOS 温度が連続して表示されます。終了してゼロ位置に戻るには Esc または Ctrl+C を押します。

注意:

  • ターゲット vs 送信値: 送信角度はターゲット角度に対して遅延します(速度制限付きスムージング)。
  • 温度: arm.last_temperatures を読み取ります。自分で CAN をポーリングする必要はありません。

4. 単一関節調整とグリッパー (single_joint_adjust.py)

python3 examples/single_joint_adjust.py

デフォルトターゲット:

J1J2J3J4J5J6J7 グリッパー
+25°+15°+15°-15°180°

joint_id: 1–6 はアームの関節、7 はグリッパー(CAN ID 7) です。


5. 実際の位置の読み取り (read_joint_angles.py)

python3 examples/read_joint_angles.py

Expected motion:

  1. connect(): MIT モードに切り替えて有効化(通信を確立)、現在角度をターゲットの初期値として読み取ります。
  2. disable_motors(): すぐに無効化し、アームを手で動かせるようにします。
  3. ターミナルに実際の関節角度が約 30 Hz で表示されます。アームを動かすと値が変化するはずです。
  4. Ctrl+C を押して終了します。stop(return_to_zero=False)ゼロ位置に戻さずに CAN をクローズします。

このサンプルは start()呼び出しません。そのため MIT 制御スレッドは動作せず、モーションターゲットも送信されません。

コードフロー:

arm.connect()           # MIT → enable → read current angles
arm.disable_motors() # disable — arm can be moved by hand

while True:
actual = arm.read_joint_angles() # ~30 Hz
print(actual)

# After Ctrl+C
arm.stop(return_to_zero=False, wait=True)
ヒント

read_joint_angles() は CAN に同期アクセスします(7 つすべてのモーターから順番に mechPos を読み取る)ので、達成可能なレートはバスの往復時間に依存します。このサンプルは 30 Hz を目標としていますが、各読み取りに時間がかかる場合、実際のレートはそれより低くなります。MIT 制御が動作中は、高頻度で read_joint_angles() を呼び出す代わりに、get_command_angles() を使用して指令モーションを監視してください。


6. 安全な停止オプション (stop_options.py)

各モードはまず J1 を約 +20° まで動かし、その後モードに応じて停止します:

python3 examples/stop_options.py default      # slow return-to-zero (recommended)
python3 examples/stop_options.py no_return # disable without return-to-zero
python3 examples/stop_options.py async # stop(wait=False) + wait_until_stopped()
python3 examples/stop_options.py emergency # emergency disable, no return-to-zero
危険

no_return / emergency はアームをゼロ以外の姿勢のままにしてモーターを無効化します。周囲の安全を確保し、必要に応じて手でアームを支えてください。


try / except / finally を用いて、エラー発生時でも stop() が必ず実行されることを示します。

python3 examples/recommended_structure.py

フルパラメータデモ (mit_position_control.py)

ファイル先頭の TARGET_ANGLES(長さ 7)と JOINT_SPEEDS_DEG_S を編集し、次を実行します:

python3 examples/mit_position_control.py

デフォルト: J1 → +50°(20°/s)、他の関節とグリッパーは 0°。ターミナルにはターゲット / 送信値 / 温度が表示され、Esc / Ctrl+C でゼロ位置に戻って終了します。

危険

MIT モードではアームが高速で動作する場合があります。人や機器を離し、おおよそ作業空間の 70% 以内に収まるようにしてください。


ライブラリとして使用する

最小サンプル

from rebot import ReBotRSMITController

arm = ReBotRSMITController() # loads config/rebotarm_rs.yaml

arm.start(enable_esc=True)
arm.set_max_speeds([15.0] * 7)
arm.set_joint_angles([20.0, 0, 0, 0, 0, 0, 0]) # J1–J6 + gripper J7

# Wait for motion to finish before stop; see examples/quick_start.py
arm.stop() # slow return-to-zero → disable → close CAN

カスタム設定とグリッパー

from rebot import (
ReBotRSMITController,
load_config,
GRIPPER_JOINT_ID,
)

arm = ReBotRSMITController(load_config("config/rebotarm_rs.yaml"))
arm.start()
arm.set_max_speeds([20.0] * 7)
arm.set_joint_angles([25, 15, 15, -15, 0, 0, 0])
arm.set_joint_angle(GRIPPER_JOINT_ID, 180.0) # gripper = J7

受動的な位置読み取り

from rebot import ReBotRSMITController

arm = ReBotRSMITController()
arm.connect() # MIT → enable → read current angles
arm.disable_motors() # disable — move arm by hand

actual = arm.read_joint_angles()
print(actual)

arm.stop(return_to_zero=False, wait=True) # close CAN, no return-to-zero

コントローラのライフサイクル

MIT モーション制御:

create → start() → set_max_speeds() → set_joint_angles() / set_joint_angle() → … → stop()

受動的な位置読み取り(指令モーションなし):

create → connect() → disable_motors() → read_joint_angles() → … → stop(return_to_zero=False)

メイン API

メソッド / 属性説明
connect()CAN に接続し、MIT モード、有効化、現在角度の読み取りを行います。start() によって自動的に呼び出されます
disable_motors()CAN を閉じずにすべてのモーターを無効化します(受動的な読み取り用)
start(enable_esc=True, install_signal_handlers=True)制御スレッドと温度スレッドを開始します
set_joint_angles(angles_deg)7 つのターゲット角度(度)を設定します
set_joint_angle(joint_id, angle_deg)1 つの関節 / グリッパー(1–7)を設定します
set_max_speeds(speeds_deg_s)7 つの最大速度(deg/s)を設定します
get_target_angles() / get_command_angles()ターゲット角度 / スムージングされた指令角度
read_joint_angles()実際の機械角度(度)を同期的に読み取ります。CAN を使用します
last_temperaturesモーターごとの MOS 温度
is_stopped安全なシャットダウンが完了しているかどうか
stop(return_to_zero=True, wait=True)停止します(デフォルトでゼロ位置に戻る)
request_stop(..., emergency=True)高度な停止 / 緊急無効化

エクスポートされる定数: GRIPPER_MOTOR_ID = 7, GRIPPER_JOINT_ID = 7.


FAQ

  • Permission denied / can0 を開けない
    CAN インターフェースが up になっており、ユーザーがネットワークデバイスにアクセスできることを確認してください。必要に応じて ip linksudo を使用するか、udev ルールを確認します。

  • モーターが反応しない / 有効化に失敗する

    1. ビットレートが 1 Mbps であることを確認する;
    2. config/rebotarm_rs.yaml 内の channelhost_id、モーター ID がハードウェアと一致していることを確認する;
    3. USB CAN を挿し直した後に ip link を再実行する。
  • 角度を設定してもアームがほとんど動かない
    set_joint_angles() はターゲットのみを更新します。適切な set_max_speeds() を設定し、stop() を呼ぶ前にコマンド角度がターゲットに近づくまで待ってください。examples/quick_start.py を参照してください。

  • グリッパーが動かない
    グリッパーは J7 / CAN ID 7 です。set_joint_angles7 個の値(最後がグリッパー)を渡すか、set_joint_angle(7, angle) を使用してください。

  • 位置読み取りタイムアウト / 角度を読み取れない
    mechPos は、有効化後の MIT モードで安定して読み取ることができます。チュートリアル 5 では、connect() の後に disable_motors() を使用することで、アームを手で動かしながら読み取りを継続できます。ensure_mode やパラメータ読み取りがタイムアウトする場合は、CAN 配線、終端、およびモーター電源を確認してください。

  • 温度アラームが大量に出る
    アラームはヒステリシス付きのエッジトリガーです:過温イベントごとにモーターごと 1 回のアラームのみで、温度が alarm_c - 2°C 未満に下がった後にのみ再度アラームが発生します。

  • ジョイント 2 のスタック保護 / アームが落下する
    おおよそ 70% を超えるワークスペース伸長状態を維持していることが原因であることが多いです。電源を入れ直して保護を解除し、ターゲット角度と滞留時間を減らしてください。

  • 通信エラー後の挙動
    制御ループの通信が失敗した場合、プログラムはゼロ位置への復帰なしで緊急的に無効化し、不良な通信状態での動作を避けます。

  • Pinocchio / MeshCat / 重力補償
    このリポジトリは MIT 位置制御に焦点を当てています。運動学、シミュレーション、および重力補償については、reBotArm_control_py と Seeed Wiki の Pinocchio & MeshCat ガイドを参照してください。


連絡先


参考資料

Loading Comments...