カエデ自動機械

ちょっとしたものづくりや電子工作のメモなど。技術開発とは今は呼べないかな。

近藤科学のサーボモータを動かすROSパッケージ

記事の内容

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
    • generate_command_autodetect_joy.py : ゲームコントローラジョイスティック)の情報を受け取り、サーボ指令値を生成・パブリッシュするノード
    • Kondo_B3M_functions.py : サーボへのコマンド関数の集まり
    • position_control.py : 位置(角度)制御用のノード
    • torque_control.py : トルク制御用のノード
    • velocity_control.py : 速度制御用のノード
  • config
    • change_config.py : サーボの設定値を変更するpythonスクリプト
    • config_function.py : サーボの設定値変更のためのコマンド関数の集まり
    • show_config.py : 接続されているサーボの設定値をコンソールに表示するスクリプト
  • 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

近藤科学が純正で用意している通常の位置制御、速度制御、トルク制御の他に、位置を目標値/フィードバックしてトルク制御を行うモードを実装しています。
ゲインを下げると、位置決めはするものの「グニグニと動かせる」ような挙動になります。
が、現状は若干使い勝手が悪くなっています・・・