ROSを使用したCRANE+の動かし方 その5

こんにちは!長谷川です。
前回はROSのパッケージの作成とビルドについて説明しましたが、今回はCRANE+を動かすための環境の構築について説明したいと思います。

CRANE+を動かすためのチュートリアル

ここを見ていただくとわかりますが、「CRANE+」はROBOTIS社製のサーボモーターDynamixelシリーズの一つ、AX-12Aを使用しております。ROSには、このDynamixelシリーズを動かすパッケージがすでに用意されていまして、ここにインストールの方法が書かれています。また、ここにチュートリアルがあるので、基本的にはこれに従えばCRANE+のモーターを動かすことができます。チュートリアルは、Connecting to Dynamixel busCreating a joint controllerの順になります。

通信環境の構築

まず、パッケージをインストールしましょう。端末(Terminal)を開き、
[php]sudo apt-get install ros-indigo-dynamixel-motor[/php]
と入力します。
パスワードを要求された場合は入力します。これで、必要なパッケージはインストールされました。

次に、チュートリアルに従って作業していきましょう。最初に、今回使用するパッケージを作成しなければならないのですが、ROS_PACKAGE_PATHに登録されたディレクトリに作らないとroscdとかが使えなくなっちゃいます。
試しに、ROS_PACKAGE_PATHに登録されているディレクトリを表示してみましょう。
端末に
[php]echo $ROS_PACKAGE_PATH[/php]
と入力します。すると、この連載の通りにインストールを行っていた場合は、3個のディレクトリが:で区切られて表示されると思います。このうち、/opt/ros/indigo/shareと/opt/ros/indigo/stacksはroot権限でしかアクセスできないので、ここに作ってしまうと後々困ったことになります。そして、(ホーム・ディレクトリ)/catkin_ws/srcは、catkin workspace内なので、ここに作るとビルドに巻き込まれる可能性があり、めんどくさいところです。
そこで今回は、新たなディレクトリを作って、そのディレクトリをROS_PACKAGE_PATHに登録しましょう。ディレクトリ名は、(ホーム・ディレクトリ)/ros_craneにします。私の環境でのホーム・ディレクトリは/home/turtlebotなので、/home/turtlebot/ros_craneになりますね。
ご自分のディレクトリにしたい場合は、そのディレクトリ名に読み替えてやっていただいて構いませんが、root権限のディレクトリにしてしまうと不具合が起きるので、気を付けてください。

それでは、実際に作業していきましょう。
[php]mkdir /home/turtlebot/ros_crane[/php]
と入力して、/home/turtlebot/ros_craneを作ります。
次に、ROS_PACKAGE_PATHに登録します。恒久的に登録しておいたままにするために、~/.bashrcに設定を追記しておきましょう。
[php]vi ~/.bashrc[/php]
と入力し、エディタviで~/.bashrcを開くなどして、次の2行を最終行に追加して保存します。
[php]
PATH=$PATH:/home/turtlebot/ros_crane
ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:/home/turtlebot/ros_crane
[/php]
端末でのエディタviの使い方については、ここでは省略させていただきます。慣れていないと混乱するので、必ず調べてください。
その後、端末に、
[php]source ~/.bashrc[/php]
と入力します。
これで~/.bashrcに書いた環境が設定されます。

次に、今回使用するパッケージを作成しましょう。
[php]cd /home/turtlebot/ros_crane[/php]
と入力してディレクトリを移動します。
その後、
[php]
$ catkin_create_pkg my_dynamixel_tutorial dynamixel_controllers
$ roscd my_dynamixel_tutorial
[/php]
と入力してパッケージを作成し、そのパッケージに移動します。なお、チュートリアルではroscreate-pkgを使っていますが、これはcatkin導入以前のパッケージ作成命令なので、catkin_create_pkgを使うべきだと思われます。

さて、次に実行ファイルを作成していくわけなのですが、そのファイル上ではCRANE+がパソコンのどのUSBポートに刺さっているのかが重要になります。それを調べましょう。
まず、CRANE+のアームから出ている信号線が電源供給用の基板(SMPS2DYNAMIXEL)につながっていることと、そこから出た信号線がUSBコネクタのついたデバイス(USB2DYNAMIXEL)につながっていることをご確認ください。
ROS_CRANE_5_1
次に、SMPS2DYNAMIXELから出た電源ケーブルが、kobukiの「12V 5A」と書かれたコネクタに接続されていることをご確認ください。
ROS_CRANE_5_2
以上が確認できれば、CRANE+を動かすためのハードウェアの準備は整っています。次に、USB2DYNAMIXELの側面にあるスイッチをTTLモードに切り替えます。
ROS_CRANE_5_3
これを忘れると、全く接続できないので、ご注意ください。最後に、USB2DYNAMIXELをパソコンに接続します。これで接続は完了です。
パソコンにつながっているUSBデバイスをUSB2DYNAMIXELだけにしてから、新しい端末を開き、そこに[php]ls /dev/ttyUSB*[/php]と入力します。すると、「/dev/ttyUSB0」とか「/dev/ttyUSB1」などと表示されます。これが、CRANE+が接続されているUSBポート名になります。
私の場合は、/dev/ttyUSB0と表示されたので、これを前提に以下の操作を進めます。ここで一旦USB2DYNAMIXELをパソコンから抜くと、ポート名が変わる恐れがあります。多くの場合では接続した順番でttyUSB0、ttyUSB1、・・・と命名されていくと思われますが、USB2DYNAMIXELを抜く場合は、再接続の際にポート名を再確認するなどした方が無難です。

ポートの情報が確認できたので、これをもとに実行ファイルを作成していきましょう。前に使っていた端末に[php]vi controller_manager.launch[/php]と入力し、エディタviを起動します。なぜ前に使っていた端末に入力するのかというと、controller_manager.launch ファイルはmy_dynamixel_tutorialの中に作らなければならないからです。viの画面が開いたら、iを押して編集モードに入ってから、以下の内容を貼り付けます。
[php]
<!– -*- mode: XML -*- –>

<launch>
<node name="dynamixel_manager" pkg="dynamixel_controllers" type="controller_manager.py" required="true" output="screen">
<rosparam>
namespace: dxl_manager
serial_ports:
pan_tilt_port:
port_name: "/dev/ttyUSB0"
baud_rate: 1000000
min_motor_id: 1
max_motor_id: 25
update_rate: 20
</rosparam>
</node>
</launch>
[/php]
なお、「port_name:」の右側には、CRANE+がつながっているUSBポート名を入力してください。また、チュートリアルにはbaud rate(ボーレート)をきちんと気にしろみたいなことが書いてありますが、ここをご覧になるとわかります通り、AX-12Aの通信速度の初期設定は1Mbps、つまり1000000bpsなので、上に書いてあるbaud rateのままで大丈夫です。
貼り付けたらEscapeを押してコマンドモードに戻り、「:wq」と打ち込んで、controller_manager.launchを保存してviを終了します。

チュートリアルでは、次に、[php]roslaunch my_dynamixel_tutorial controller_manager.launch[/php]と入力するように指示されています。モーターとの通信を開始する命令のようなので、Turtlebotの電源を入れ、USB2DYNAMIXELをパソコンに接続してから新しい方の端末に入力してみると、エラーが出てきてしまいます。
ROS_CRANE_5_4
エラー文の赤文字の少し上に、「could not open port /dev/ttyUSB0: [Errno 13] Permission denied: ‘/dev/ttyUSB0’」と書かれていました。つまり、USBポートに接続できないみたいです。これは、ユーザーがUSBポートを読み書きできる権限を持たないというLinuxの初期設定によるもののようです。これを解決するため、全てのユーザーに/dev/ttyUSB0の読み書きを認めてしまうことにします。端末に[php]sudo chmod 6666 /dev/ttyUSB0[/php]と入力し、パスワードを求められた場合は入力します。これで、全てのユーザーに/dev/ttyUSB0の読み書きが認められました。この状態で[php]roslaunch my_dynamixel_tutorial controller_manager.launch[/php]と入力してみます。
すると、何やら処理が行われました。
ROS_CRANE_5_5
「pan_tilt_port: Found 5 motors」と端末に出力されたので、CRANE+を構成する5つのモーターをきちんと認識したことがわかります。これで接続は成功です。なお、USB2DYNAMIXELをパソコンから抜くと、USBポートのアクセス権限も初期値にリセットされてしまうので、USB2DYNAMIXELをパソコンにさすたびに全てのユーザーに/dev/ttyUSB0の読み書きを認めなくてはなりません。

さて、次はモーターからの信号を見てみましょう。新しい端末を開いて[php]rostopic list[/php]と入力すると、存在しているトピックが表示されます。トピックとは何かについてまだ何も解説していませんが、今回の記事でCRANE+を動かすところまで行きたいので、説明は次回に回します。今はデータのようなものだと思っておいてください。存在しているトピックのうち、「/motor_states/pan_tilt_port」がモーターの状態についてのトピックです。これの内容を、[php]rostopic echo /motor_states/pan_tilt_port[/php]と入力して、見てみましょう。
ROS_CRANE_5_6
この画面には、IDが4と5のモーターの状態が表示されているようです。CRANE+のモーターのIDは、Turtlebotに一番近い根元のサーボモーターから順に1,2,3,4,5と設定されているので、4と5にあたるモーターを手で動かしてみると、errorやpositionなどが変化することが分かります。

モーターの駆動

ここまででCRANE+とパソコンとの通信はできるようになったので、次はモーターを実際に動かしてみましょう。USB2DYNAMIXELを一旦抜く場合は、その前に処理中の2つの端末それぞれでCtrlを押しながらcを押し、処理を終わらせて下さい。
最初に開いた端末に
[php]vi tilt.yaml[/php]
と入力します。最初に開いた端末を閉じてしまっていた場合は、新しい端末を開いて[php]roscd my_dynamixel_tutorial[/php]と入力し、my_dynamixel_tutorialに移動してからviを起動してください。
編集モードに入り、以下の内容を貼り付けます。
[php]
tilt_controller:
controller:
package: dynamixel_controllers
module: joint_position_controller
type: JointPositionController
joint_name: tilt_joint
joint_speed: 1.17
motor:
id: 4
init: 512
min: 0
max: 1023
[/php]
なお、「id:」の右側には、今回操作するモーターのIDを入力します。貼り付けたらEscapeを押してコマンドモードに戻り、「:wq」と打ち込んで、tilt.yamlを保存してviを終了します。
次に、同じ端末に[php]vi start_tilt_controller.launch[/php]と入力し、viを起動します。編集モードに入り、以下の内容を貼り付けます。
[php]
<launch>
<!– Start tilt joint controller –>
<rosparam file="$(find my_dynamixel_tutorial)/tilt.yaml" command="load"/>
<node name="tilt_controller_spawner" pkg="dynamixel_controllers" type="controller_spawner.py"
args="–manager=dxl_manager
–port pan_tilt_port
tilt_controller"
output="screen"/>
</launch>
[/php]
貼り付けたらEscapeを押してコマンドモードに戻り、「:wq」と打ち込んで、start_tilt_controller.launchを保存してviを終了します。
そこまでできたら、CRANE+とパソコンを接続し、USBポートのアクセス権限を変更し、[php]roslaunch my_dynamixel_tutorial controller_manager.launch[/php]を入力する、という先ほどやったのと同じ操作を行います。先ほどUSB2DYNAMIXELを抜かず、処理も終了していなかった場合は、やらなくても大丈夫です。その後、新しい端末が必要な場合は開いて、[php]roslaunch my_dynamixel_tutorial start_tilt_controller.launch[/php]と入力します。すると、以下のように表示されるはずです。
ROS_CRANE_5_7
「Controller tilt_controller successfully started」と表示されているので、大丈夫でしょう。
最後に、[php]rostopic pub -1 /tilt_controller/command std_msgs/Float64 — 1.5[/php]と入力すると、IDが4のサーボモーターが一定の位置に固定されるはずです。モーターが動けば当然アームが動くので、アーム可動範囲にモノを置かないようにして行ってください。
動くサーボモーターはtilt.yamlに記述するIDを変更することで変えられます。このコマンド自体の意味は、次回で解説したいと思います。

以上、CRANE+を動かすための環境の構築について説明しました。
次回は、CRANE+の全ての関節を同時に、かつ自動で動かす方法について説明したいと思います。

※(2015/3/26追記)
上では、デバイスをUSBポートに接続し直すたびに、
[php]sudo chmod 6666 /dev/ttyUSB0[/php]
と書いて権限付与を行っていますが、これをいちいち書かなくてもよくなる方法があるそうです。以下でその方法を述べますが、当方では動作確認をしておりませんので、実行は自己責任でお願いします。
/dev/ttyUSB0などはdialoutグループだそうです。そして、グループ内からはポートを読み書きできる権限があります。つまり、ユーザをdialoutに追加してやれば、ポートを読み書きできるようになるということだそうです。例えば、turtlebotというユーザをdialoutグループに追加したい場合は、
[php]sudo usermod -a -G dialout turtlebot[/php]
と入力します。ここで、-aを忘れてしまうと、既に設定されていた他のグループの設定が全て飛んでしまい、sudoが効かなくなるなど大変なことになるので注意してください。リカバリーモードに頼らなければいけなくなってしまいます。
ともかく、これが成功すれば、いちいち権限付与しなくても接続できるようになります。