reBot Arm B601-RS で MIT 位置制御を始める
6+1 DOF · RobStride · CAN @ 1 Mbps · MIT 位置制御 · 温度保護 · 安全な原点復帰 · オープンソース Python API

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 関節でスタック保護が作動し、アームが落下する可能性があります。
- 初回使用時は、小さな角度と低速でテストし、作業空間内に人や障害物がないことを確認してください。
特長
-
MIT 位置制御
デフォルト 200 Hz の MIT 位置コマンド;制御ループ内でスムージングされた関節ごとの速度制限。 -
6+1 モータ
J1~J6 はアーム関節、J7(CAN ID 7)はエンドエフェクタのグリッパで、set_joint_angles/set_joint_angleで制御します。 -
3 段階の温度保護
MOS 温度をリアルタイム監視:警告を出して継続 → 過熱時は低速で原点復帰してから無効化 → 緊急停止(原点復帰なし)。 -
安全な終了と原点復帰
Esc / Ctrl+C /arm.stop()により smoothstep で原点復帰を実行;原点復帰中に 2 回目の Ctrl+C を押すと即座に中断し、モータを無効化します。 -
YAML ベースの設定
CAN チャネル、温度しきい値、原点復帰パラメータ、モータのkp/kdはconfig/rebotarm_rs.yamlに定義されており、コードを変更せずに調整できます。 -
ライブラリとして利用可能
明確なレイヤ構造(設定 / 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 | モデル | 備考 |
|---|---|---|---|
| J1 | 1 | RS06 | ベース |
| J2 | 2 | RS06 | |
| J3 | 3 | RS06 | |
| J4 | 4 | RS00 | |
| J5 | 5 | RS00 | |
| J6 | 6 | RS00 | 手首 |
| J7 | 7 | RS00 | エンドエフェクタグリッパ |
ソフトウェア機能(このリポジトリ)
| 機能 | 状態 |
|---|---|
| MIT 位置制御 | ✅ |
| 関節ごとの速度制限 | ✅ |
| グリッパ制御(CAN ID 7) | ✅ |
| MOS 温度監視と 3 段階保護 | ✅ |
| 安全な原点復帰 / 緊急無効化 | ✅ |
| YAML 設定 | ✅ |
| Python ライブラリ API | ✅ |
| 順運動学 / 逆運動学(Pinocchio) | ❌(reBotArm_control_py を参照) |
| MeshCat シミュレーション | ❌(上記リポジトリを参照) |
関節モータのパラメータ
| パラメータ | RobStride 00 | RobStride 06 |
|---|---|---|
| 定格電圧 | 48V | 48V |
| 定格電流 | 4.7 Apk ± 10% | 14.3 Apk ± 10% |
| 最大電流 | 15.5 Apk ± 10% | 57 Apk ± 10% |
| 定格トルク | 5 N.m | 11 N.m |
| 最大トルク | 14 N.m | 36 N.m |
| 定格回転数 | 100 rpm ± 10% | 100 rpm ± 10% |
| 無負荷最大回転数 | 315 rpm ± 10% | 480 rpm ± 10% |
| 減速比 | 10 : 1 | 9 : 1 |
| 制御インターフェース | CAN @ 1 Mbps | CAN @ 1 Mbps |
| 制御モード | MIT / Speed / Position / Torque | MIT / Speed / Position / Torque |
部品表 (BOM)
| 品目 | 数量 | 同梱 |
|---|---|---|
| reBot Arm B601-RS | 1 | ✅ |
| CAN アダプタ(CANABLE / PCAN-USB など) | 1 | ✅ |
| 電源(DC 48V 15A) | 1 | ✅ |
| USB-C ケーブル | 1 | ✅ |
| グリッパ | 1 | ✅ |
必要要件
| 項目 | 要件 |
|---|---|
| Python | 3.10+ |
| OS | Ubuntu 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.channel | CAN インターフェース名 | can0 |
can.host_id | ホスト ID | 0xFD |
control.control_hz | MIT コマンドレート(動作速度ではない) | 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 / kd | YAML を参照 |
不足しているキーにはコード側のデフォルトが使用されます。不明なキーはタイプミスを検出するためエラーになります。
コード構成
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.py | python3 examples/quick_start.py |
| 2. カスタム設定 | examples/custom_config.py | python3 examples/custom_config.py |
| 3. 実行中のモニタリング | examples/monitor_status.py | python3 examples/monitor_status.py |
| 4. 単一関節 + グリッパー | examples/single_joint_adjust.py | python3 examples/single_joint_adjust.py |
| 5. 位置の読み取り | examples/read_joint_angles.py | python3 examples/read_joint_angles.py |
| 6. 停止オプション | examples/stop_options.py | python3 examples/stop_options.py default |
| 7. 推奨プログラム構造 | examples/recommended_structure.py | python3 examples/recommended_structure.py |
| フルデモ | examples/mit_position_control.py | python3 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
デフォルトターゲット:
| J1 | J2 | J3 | J4 | J5 | J6 | J7 グリッパー |
|---|---|---|---|---|---|---|
| +25° | +15° | +15° | -15° | 0° | 0° | 180° |
joint_id: 1–6 はアームの関節、7 はグリッパー(CAN ID 7) です。
5. 実際の位置の読み取り (read_joint_angles.py)
python3 examples/read_joint_angles.py
Expected motion:
connect(): MIT モードに切り替えて有効化(通信を確立)、現在角度をターゲットの初期値として読み取ります。disable_motors(): すぐに無効化し、アームを手で動かせるようにします。- ターミナルに実際の関節角度が約 30 Hz で表示されます。アームを動かすと値が変化するはずです。
- 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 はアームをゼロ以外の姿勢のままにしてモーターを無効化します。周囲の安全を確保し、必要に応じて手でアームを支えてください。
7. 推奨プログラム構造 (recommended_structure.py)
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 linkにsudoを使用するか、udev ルールを確認します。 -
モーターが反応しない / 有効化に失敗する
- ビットレートが 1 Mbps であることを確認する;
config/rebotarm_rs.yaml内のchannel、host_id、モーター ID がハードウェアと一致していることを確認する;- USB CAN を挿し直した後に
ip linkを再実行する。
-
角度を設定してもアームがほとんど動かない
set_joint_angles()はターゲットのみを更新します。適切なset_max_speeds()を設定し、stop()を呼ぶ前にコマンド角度がターゲットに近づくまで待ってください。examples/quick_start.pyを参照してください。 -
グリッパーが動かない
グリッパーは J7 / CAN ID 7 です。set_joint_anglesに 7 個の値(最後がグリッパー)を渡すか、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 ガイドを参照してください。
連絡先
- リポジトリ: https://github.com/LAN-GER/rebot_control
- Issue: GitHub Issues
- フォーラム: Seeed Studio Forum
参考資料
- MotorBridge SDK
- reBotArm_control_py(運動学 / シミュレーション / 重力補償)
- RobStride モーター ドキュメント
- このリポジトリ内の中国語 README:
README_zh.md - このリポジトリ内の英語 README:
README.md