記事の内容
ROSの勉強がてら、昔買った近藤科学のB3M-SC-1170-AというサーボモータをROSで動かすためのパッケージを作った話。
コードは下記で公開しています。
github.com
実は既に作っている人が居るということに途中で気づきました。。。
パッケージ説明
ROSメッセージを介して、サーボに指令値を送信し、位置制御、速度制御、トルク制御ができます。
位置、速度、トルクの各制御モードは、立ち上げるノードを選ぶことで切り替えます。
同じくROSメッセージを介して、エンコーダ値、バッテリ電圧などを取得可能です。
近藤科学のB3Mシリーズサーボは予めIDが振られていますが、
このパッケージでは、接続されたサーボのIDを自動検出します。
指令値は対象のサーボIDが小さい順に並んだ配列として送信します。
対応環境、使った部品など
PC環境
Ubuntu 16.04.6 LTS
ROS Kinetic Kame
python2.7.12
使った部品
近藤科学 B3M-SC-1170-A
近藤科学 RS485USB/シリアル変換アダプター
バッテリ リチウムイオンポリマーバッテリ(3セル11.1V)
ロジクール F710 Wireless Gamepad F710r
今回対象としたサーボモータは非常に高価な品ですが、重量100g前後でストールトルク約7N・m(約70kg・cm)まで出る高性能なものです。5000円くらい安い価格で、80g、40kg・cmのものも売られています(B3M-1040シリーズ)
近藤科学のシリアル変換アダプタをUbuntuで使用するためには、事前にドライバのインストールが必要です。(やり方はこちら)
また、シリアル変換アダプタのUbuntu上での設定を何点か変更しています。
-
- デバイス名をKondo_USB-RS485_converterに固定
- シリアル通信のレイテンシタイマを1msに固定(デフォルトは16msのため、サーボへのコマンド送信ごとに16msかかり、制御周期が上げられない)
参考リンク:udev_rulesでデバイス名固定とファイル書き込み
今回はこちらのファイルを/etc/udev/rules.d/に配置して設定しました。
最後に以下のコマンドでルールの再読み込みが必要です。
$ sudo udevadm control --reload-rules
.
インストール(catkin_wsという名前のディレクトリで作業している場合)
$ cd ~/catkin_ws/src $ git clone git@github.com:KTD-prototype/kondo_b3mservo_rosdriver.git $ cd ~/catkin_ws $ catkin_make
.
使い方
パッケージの構成
ディレクトリ構成は以下のようになっています(一部略)
- scripts
- config
- launch
- position_control_by_torque_sample.launch : ジョイスティックの右スティック(上下)の値に応じたトルク制御(位置フィードバック)を行うlaunchファイル
- position_control_sample.launch : ジョイスティックの左スティック(左右)の値に応じた位置制御を行うlaunchファイル
- torque_control_sample.launch : ジョイスティックの左スティック(上下)の値に応じたトルク制御を行うlaunchファイル
- velocity_control_sample.launch : ジョイスティックの右スティック(左右)の値に応じた速度制御を行うlaunchファイル
ROSメッセージで直接制御指令を送る場合
最もシンプルなやり方です。
$ roscore
別のターミナルでサーボ制御ノードを立ち上げます
(位置制御の場合) $ python position_control.py (トルク制御の場合) $ python torque_control.py (速度制御の場合) $ python velocity_control.py
ROSノードが立ち上がり、接続されたサーボの個数とIDを自動で検出します。
別のターミナルから指令値を送ればサーボが動きます。
サーボ2個接続の場合は以下のようになります。(1個接続でも、指令値は[]で囲む必要アリ)
(位置制御の場合) $ rostopic pub /multi_servo_command kondo_b3mservo_rosdriver/Multi_servo_command "{target_position:[1000, 1000]}" (トルク制御の場合) $ rostopic pub /multi_servo_command kondo_b3mservo_rosdriver/Multi_servo_command "{target_torque:[500, 500]}" (速度制御の場合) $ rostopic pub /multi_servo_command kondo_b3mservo_rosdriver/Multi_servo_command "{target_velocity:[1000, 1000]}"
.
ジョイスティックによる制御
先ほどのノードの他に、ジョイスティックのノードを立ち上げれば動きます。
先述のlaunchファイルを使うのが便利です。
(位置制御の場合) $ roslaunch kondo_b3mservo_rosdver position_control_sample.launch (トルク制御の場合) $ roslaunch kondo_b3mservo_rosdver torque_control_sample.launch (速度制御の場合) $ roslaunch kondo_b3mservo_rosdver velocity_control_sample.launch
同じように接続されたサーボの個数とIDを自動で検出し、制御が始まります。
ジョイスティックのサンプルでは、全てのサーボに同じコマンドが送られます。
サーボから情報を取得する
各制御ノードが、サーボに制御指令値を送るごとにサーボから情報を取得し、ROSメッセージとしてPublishしています。
メッセージ名:/multi_servo_infoをSubscribeすることで購読可能です。
$ rostopic echo /multi_servo_info
取得可能な情報は以下の通り。
- エンコーダのカウント値[count]
- 電源電圧[mV]
- サーボ回転速度[*0.01deg/sec]
- サーボ電流値[mA]
今後のアップデート計画
ROSパッケージを自分で作るというのは初めてで、
一方で(お恥ずかしながら)類似のパッケージ、例えばDynamixelのROSドライバとかを研究したわけではないので、
この界隈の常識に沿ったパッケージ構成となっているのか、あまり自信がありません。
今度Dynamixelのサーボも入手できそうなので、そのROSパッケージをよくよく分析して、同じような構成にできたら良いのでは思っています。
その辺、余裕があれば改修していきたいです。
それ以外は検討中・・・何か必要が生じたりリクエストあれば。
ROS2化は進めたいと思っています!
アップデート
複数接続したサーボの制御モードを個別に設定できるようにしました(2020/1/10)
ktd-prototype.hatenablog.com
トラブルシュート、備忘録
PCがシリアル変換アダプタ以下の近藤科学系システムを認識しなくなりましたが、解決しました(2019/12/25)
ktd-prototype.hatenablog.com
近藤科学が純正で用意している通常の位置制御、速度制御、トルク制御の他に、位置を目標値/フィードバックしてトルク制御を行うモードを実装しています。
ゲインを下げると、位置決めはするものの「グニグニと動かせる」ような挙動になります。
が、現状は若干使い勝手が悪くなっています・・・