本稿はACCESS Advent Calenderの9日目としてお送りします!
はじめに
こんばんは.年末いかがお過ごしですか?
私の今年のアドカレは流行りのQDD BLDCをUbuntuからCANで回してみる話です.
作ったもの
今回はRobStride社のQDD BLDCであるRS02モーターを,CANバス経由で制御するためのPython実装を作ってみました.最初は仕様書ベースでライブラリの構成そのものを1から書き起こしていましたが,色々試した結果公式のROS BridgeのC++クラス実装を参考にPythonへ移植するので落ち着きました.
以下のリポジトリで公開しています.FBコメントもお待ちしています!
用語集
まずは本稿に出てくるいくつかの用語をご紹介します.
QDDとは
QDDとはQuasi Direct Driveの頭文字をとった略称です.日本語では擬似ダイレクトドライブと呼ばれる,モータの特性種別の名前の1つです.減速機を一切経由せずに出力トルクを取り出す方式のモータを"ダイレクトドライブ"と呼びますが,これに対して低い減速比の減速機が取り付けられたものを「擬似」ダイレクトドライブと呼びます.低減速比(相場的には6:1 ~ 20:1程度)の減速機を使用することで,高トルク・高応答性・バックドライバビリティを両立し,ロボットの関節駆動に適した特性を得ています.
BLDCとは
BLDCとはBrushless DC motorの頭文字をとった略称です.日本語でもそのままブラシレスDCモーターと呼ばれる,モータの動作原理種別の名前の1つです.ミニ四駆などで使われるブラシ付きモーターと異なり,電子回路からコイルの磁場そのものを回転させることで回転力を生み出すのが特徴です.大電流を消費する代わりに高回転・高トルクを得やすいことから,最近はドローンやロボットなどで目覚ましい普及を遂げています.
本稿で「QDD BLDC」を「BLDCで擬似ダイレクトドライブを実現しているモータ」の意で使っています.(語順に強い意味はなく,口馴染みが良いので個人的によくこう呼んでいる程度のものです.)
CAN通信とは
CAN通信とはController Area Network通信の頭文字をとった略称です.自動車や産業機械で広く使われている通信プロトコルであり,差動駆動によって高いノイズ耐性を実現しているのが特徴です.最近のロボット分野では,上記のBLDCの制御インターフェースに利用するのがトレンドのようです.
特徴
RSシリーズのモータは複数の制御モードを利用できるため.今回のライブラリではそれら全部を利用できるようになっています.
- 運控モード (Mode 0): 目標位置,目標速度,補正トルク,比例ゲイン,微分ゲインの5パラメータを指定して制御
- 位置PPモード (Mode 1): Profile Position 位置制御
- 速度モード (Mode 2): 速度制御
- 電流モード (Mode 3): 電流制御
- 位置CSPモード (Mode 5): Cyclic Synchronous Position制御
また,最近の流行りに乗っかって依存関係の解消まわりはuvを利用しました.大変便利です.
想定動作環境
- OS: Ubuntu24.04
- SocketCANインターフェース
- CANable互換CANアダプタ: DSD TECH SH-C30G
- Amazon: https://amzn.asia/d/4n2BXfD
- Python 3.11以上
- uvパッケージマネージャ
インストール
uv
# uvをインストール(まだの場合)
curl -LsSf https://astral.sh/uv/install.sh | sh
依存関係の解消
uv sync
CAN Interfaceのセットアップ
ライブラリを使用する前に,CANインターフェースが適切に設定されていることを確認してください:
# 1 MbpsでCANインターフェースを起動
sudo ip link set up can0 type can bitrate 1000000
# インターフェースが起動していることを確認
ip link show can0
サンプルコード
examples/ディレクトリにサンプル実装が用意されています.
モーターのスキャン
CANバス上のモーターを検出します:
# デフォルト範囲(0x01〜0x7F)をスキャン
uv run examples/scan_motors.py
# ID範囲を指定してスキャン
uv run examples/scan_motors.py --start 0x01 --end 0x10
# startとendに同じIDを指定してスキャンするとping的に使える.0x7FはRobStrideのデフォルトID
uv run examples/scan_motors.py --start 0x7F --end 0x7F
# CANインターフェースを指定してスキャン
uv run examples/scan_motors.py --interface can1 --start 0x7D --end 0x80
ゼロ点の設定
現在のモーター位置をエンコーダのゼロ点として設定します:
uv run examples/set_custom_zero.py --interface can0 --motor 0x7F
位置制御(運控モード / MIT方式)
運控モード(Mode 0)を使用した位置制御です.日本語(や英語でも?)では,MIT方式位置制御と呼ばれています.単に位置だけを指示するのではなく,位置,速度,位置ゲイン,速度ゲイン,定常トルクを毎制御周期送信します.DYNAMIXELなどのサーボで例えると,内部PIDのパラメータを毎ステップ変更しながら位置指令値を投げられるようなイメージです.
# 制御周期を精度良く保つループでゼロ点へ移動
uv run examples/move_to_zero_mit.py
# リアルタイムプロット付き
uv run examples/move_to_zero_mit_plot.py
# その場でトルクをオンする
uv run examples/enable_torque_mit.py
# 柔らかめの位置制御
uv run examples/enable_torque_mit.py --kp 2 --kd 0.02
こんな感じで回ります.この動画では現在の位置をゼロ点に設定→適当に指で回す→設定したゼロ点まで移動を実演しています.
RobStride RS02のPython向けライブラリとUbuntuでぐるぐるするサンプル、置いておきますね。流行りのuvで依存解消できて便利に仕上げました!!(おしごとで使って覚えた#RobStridehttps://t.co/BgWFQBOKPs pic.twitter.com/FO8dCXBvOf
— 孔明@B-SKY Lab (@eternalfriend17) November 7, 2025
こっちではRSシリーズの05をsin波で揺動させています.最後ピタッと止まる瞬間とか特にパワーを感じますね.
ブンブンブンブン…ビタッ…
— 孔明@B-SKY Lab (@eternalfriend17) November 28, 2025
RobStride EduLite 05、良い動き#RobStride@RobStride_com
(vive coding便利ですね、そのうち弊社アドカレあたりで書こうと思います) pic.twitter.com/0I6JtyXWqN
他の動作モードは個人的に使い道がまだないので動画撮っていません...ご利用されたかたは感想お待ちしています.
おわりに
いかがでしたか?流行りのBLDC,冬休みの工作にぜひ.
明日の担当は @sifi_border さんです,お楽しみに!
それでは.
Reference
- Orginal Implementation: