ROSでRoombaを動かす(catkin対応)
はじめに
ROS Kinetic/Jade/Indigoのcatkinビルドで、Roombaを動かす方法を説明します。
catkin用Roombaパッケージ
ROSでRoombaを動かすPackageは、もともと古いビルドシステムであるrosbuildで作られたものなので、現行のビルドシステムであるcatkinではビルドできません。
しかしありがたいことに、これをcatkin用に作り変えたものが存在します。
上記2つのパッケージはcatkinシステムに対応しています。Roombaを動かすには両方が必要です。
ビルド後の使い方はrosbuild用のRoombaパッケージと同じですので、先人の方々が公開されている記事を参照してください。
- http://hyakuren-soft.sakura.ne.jp/hobby_robot_sdk/about_roomba_page.html
- http://ameblo.jp/morimoridiary/entry-12056565636.html
- http://cyberworks.cocolog-nifty.com/blog/2013/04/roombapython-bb.html
- http://daikimaekawa.github.io/ros/2013/08/25/RoombaTutorial/
私の方では、ROS Kinetic/Jade/Indigo全てにおいて、いくつか警告がでるもののcatkin_make
ビルドが通り、rosrun roomba_500_series roomba500_light_node
でRoomba500シリーズをROSから制御できました。
おわりに
参考: http://wiki.ros.org/Robots/Roomba ページ下部の"4. Related Repositories"
ROSでPS4のコントローラ(DualShock4)を使う方法
はじめに
ROSでPS4コントローラの入力を取得する方法およびキーアサインについて説明します。
最近になって私もROS勉強会やROSハッカソンに参加しはじめましたが、多くの人がいまだにPS3のDualShock3コントローラ(DS3)を使っているのを見かけます。
しかしPS4のDualShock4(DS4)のほうがスティックとL2R2トリガーの操作性がだんぜん良いのでオススメです。特にドローンのスラスト制御(プロペラの回転速度制御)等をR2トリガー等で行う場合、トリガーのリニアリティ(直線性)がDS4だととても良く、精密なマニュアル操作がしやすいです。
PCにBluetooth機能がついていれば、ワイヤレスで使うこともできます。
環境
- Ubuntu 16.04
- ROS Kinetic
- PS4 ワイヤレスコントローラー(DUALSHOCK®4)
本記事と同様の手法で、Jade/Indigoでも動作確認済みです。ただし無線接続の場合、Bluetoothデバイスの相性によってはds4drvがうまく動かない場合があります。
DualShock4を有線で使う
有線の場合、DS3と似たような感じで簡単です。
- PCとDS4をMicroUSBケーブルで接続
- ROSのjoyパッケージをインストール
sudo apt-get install ros-<DISTRO>-joy
- joy_nodeを起動
rosrun joy joy_node
これだけです。
rostopic list
をすると/joyというトピックが見つかり、これをrostopic echo
すると、sensor_msgs::Joy
型のメッセージが見えます。
あとはこのmessageをsubscribeして、ボタンやスティックの値に応じた処理を書けばOKです。
PCにDS4を接続すると、通常は/dev/input/js0に認識されます。しかし何らかの理由でjs1などjs0以外に認識される場合があります。この場合、下記コマンドでdevというrosparamをセットすると、joy_nodeで使うdeviceを指定することができます。
rosrun joy joy_node _dev:=/dev/input/js1
(js1に認識された場合の例)
DualShock4を無線で使う
ds4drvのインストール/起動
DS4とUbuntuPCをペアリングするためのPythonドライバds4drvをpipからインストールします。 (pip自体が未インストールの方は、こちらなどを参考に先にpipをインストールしてください)
sudo pip install ds4drv
Ubuntu16.04 + ROS Kineticでは、"Successfully installed ds4drv-0.5.1 evdev-0.6.1 pyudev-0.21.0"みたいな表示が出ればOKです。
次に、DS4とPCをペアリングします。
- 「システム設定」等からPCのBluetooth機能をONにします。
- ds4drvを起動します。
sudo ds4drv
- "[info][bluetooth] Scanning for devices" と表示されます。
- DS4の「PSボタン」と「SHARE」ボタンを同時に10秒くらい押し続けます。するとコントローラ背後のライトバーがチカチカッ、チカチカッという感じで白く点滅します。こうなったらもうボタンから手を話してOKです。
- 下記のような表示が出て、ライトバーが青く点灯すればペアリング完了です。
これで、DS4をPCに有線で接続したのと同じ状態になりました。 あとは有線の時と同様に、joy_nodeを起動するだけです。
なおペアリング後にds4drvを終了すると、DS4のライトバーが青点灯のまま残ってしまいますが、PSボタンを10秒くらい長押しすると消えます。
DS4におけるsensor_msgs/Joyのaxes,buttonsアサイン
自力で調べたので載せておきます。
axes
- axes[0]: L stick horizontal (left=+1, right=-1)
- axes[1]: L stick vertical (up=+1, down=-1)
- axes[2]: R stick horizontal (left=+1, right=-1)
- axes[3]: L2 (neutral=+1, full accel=-1)
- axes[4]: R2 (neutral=+1, full accel=-1)
- axes[5]: R stick vertical (up=+1, down=-1)
- axes[6]: Accelerometer Left(コントローラ左方向が正方向)
- axes[7]: Accelerometer Front(コントローラ手前方向が正方向)
- axes[8]: Accelerometer Up(コントローラ上方向が正方向)
- axes[9]: Axis button(十字キー) LR(L=+1, R=−1)
- axes[10]:Axis button(十字キー) Up/Down(Up=+1, Down=−1)
- axes[11]: Jyrometer Roll (手前から見て右回り:+、左回り:ー)
- axes[12]: Jyrometer Yaw (上から見て左回り:ー、右回り:+)
- axes[13]: Jyrometer Pitch (ライトバー側を上げる:ー, 下げる:+)
Accelerometer&Jyrometer
なぜか無線で接続しないと加速度・角速度の値はとれませんでした。
また、どうも加速度と角速度で軸が合っていない(加速度の正方向を右手親指の向きとした場合の右ねじの法則に、Gyroの回転方向が従っていない)ので注意が必要です。
buttons
- buttons[0]: □Square
- buttons[1]: ×Cross
- buttons[2]: ○Circle
- buttons[3]: △Triangle
- buttons[4]: L1
- buttons[5]: R1
- buttons[6]: L2 digital(1/3くらい引くと1になる)
- buttons[7]: R2 digital(1/3くらい引くと1になる)
- buttons[8]: Share
- buttons[9]: Options
- buttons[10]: L3
- buttons[11]: R3
- buttons[12]: PS button
- buttons[13]: Touchpad button
Touchpadのタッチ座標は、今のところ取得できないようです。
おわりに
今回はROSでPS4コントローラ(DualShock4)を使う方法について解説しました。
まぁDS3を持っている人が、わざわざロボット操作のためだけにDS4を買うかと聞かれたらそんなこと誰もしないとは思いますが、もし持ってたら使ってみてください。
参考書籍: ROSではじめるロボットプログラミング
ROS nodeletの使い方
はじめに
ROSのnodeletについて説明します。とりあえずこの記事を読んだ方は誰でもnodeletを使ったコードを書けて使えるようになる、ということを目指します。
nodeletを使う超簡単なサンプルを作ったので、これをもとに説明していきます。
github.com
pubもsubもしないHelloWorld的なコードなので、ROS Kinetic/Jade/Indigoどれでも動くと思います。
nodeletとは
こちらの資料で概要が掴めます。
覚えておいて欲しいのは、nodeletを使って開発するということはクラスライブラリをつくるようなことであり、nodeのような実行ファイルではなく.soファイルが生成される ということです。そして、ノードレット名として使われるのはクラス名 です。
(nodeletの仕組み自体、ROSのpluginlibを使っているので当然かもしれませんが、ここではpluginlibを知らない人でも分かるように書きます。)
nodeletの実行方法
基本的な使い方は下記の通りです。
- まずnodelet managerとなるnode立ち上げる
rosrun nodelet nodelet manager
- managerに自作のnodeletをロードする
rosrun nodelet nodelet load <PKG_NAME>/<NODELET_NAME> <MANAGER_NAME>
私が公開したsample_nodeletパッケージをビルドすると、workspace/devel/lib/libsample_nodelet.so
というファイルが出力されます。これがnodeletを含むライブラリファイルです。SampleNodeletClassとSampleNodeletClass2という2つのnodeletが入っています。
下記のようにすると使えます。
- roscoreを起動
- nodelet managerノードの起動
rosrun nodelet nodelet manager
rostopic list
で確認すると、/manager
というmanagerノードが起動しているのがわかります。- コマンド末尾に
__name:=<MANAGER_NAME>
を加えると、managerノードの名前を指定できます。
- managerにnodeletをロード
rosrun nodelet nodelet load sample_nodelet/SampleNodeletClass manager
- 上記コマンドは「manager」というmanagerノードに、sample_nodeletというパッケージの、SampleNodeletClassというノードレットをロード」という意味になります。
- これで
/sample_nodelet_SampleNodeletClass
というloaderノードが立ち上がり、managerノードにSampleNodeletClassがロードされます。 - コマンド末尾に
__name:=<LOADER_NAME>
を加えると、loaderノードの名前を指定できます。 - パッケージ名・ノードレット名の入力時、tab補完は効かないのでがんばってタイプしてください。
- managerに別のnodeletをロード
rosrun nodelet nodelet load sample_nodelet/SampleNodeletClass2 manager
これで1つのmanagerノードに2つのnodeletがロードされました。この2つのnodelet間はpub/subで通信が可能です。subscriber側コールバック引数のメッセージ型をConstPtrにすれば、SharedPtrを使ったzero copy通信が可能です。これは例えばsensor_msgs::Imageによるカメラ画像等のpub/subにおいて非常に有利です。
なお、2.でnodeletをロードしているのに、別のノードが立ち上がっているのを見て「nodeletって単一ノードで動くはずなのにノード分かれてるじゃん」と思ってしまうかもしれませんが、それは単なるローダーで、nodelet自体はmanagerノードで動いているのでご安心ください。
nodelet式コードの書き方
src
sample_nodeletの*.hと*.cppを読むのが早いと思いますが、一応Nodelet的な記述についてリストアップしておきます。
nodelet/nodelet.h
をインクルード- nodeletとして扱うクラスは、ROSのnodelet::Nodeletクラスのサブクラスとして実装
- nodelet起動時、クラスのコンストラクタが呼ばれた後、onInit関数が呼ばれる
pluginlib/class_list_macros.h
をインクルード- 末尾に
PLUGINLIB_EXPORT_CLASS(<NAMESPACE>::<NODELET_NAME>, nodelet::Nodelet)
マクロを追加
onInit関数は、どんなnodeletクラスでも必ず定義されている必要があります。基本的にこの関数内でpublisher/subscriberの登録などを行います。
なお、こちらでも触れられていますが、onInit内でwhile(ros::ok())
みたいなループを記述してはいけません。いつまで経ってもonInitを抜けられずハングアップします。一定周期で行う処理を書きたかったら、ros::Timerによるタイマコールバックを使いましょう。
CMakeLists.txt
通常のnodeとさほど変わりません。ただし、add_executables
がありません。つまり実行ファイルを作りません。
代わりに、add_librariesでソースを指定し、ライブラリを作るようになっています。ここではターゲット名がsample_nodelet
なので、ビルドするとworkspace/devel/libにlibsample_nodelet.so
が出力されます。
なおcatkin_EXPORTED_LIBRARIES
の部分については私もよく分かっていないので、どなたか分かる方がいたら教えてください。
package.xml
こちらも通常のnodeと大差ありませんが、末尾に少しだけnodelet用の記述があります。
<nodelet plugin="${prefix}/sample_nodelet.xml" />
の部分で、nodeletを定義する.xmlファイル(下記)を指定しています。
sample_nodelet.xml
ROSのpluginlibで使われるプラグイン定義ファイルです。pluginlibが何なのか知らなくても、とりあえず文法だけ分かればnodeletのコードは書けると思うのでpluginlibの説明は割愛します。
sample_nodeletパッケージでは、一つのライブラリ(libsample_nodelet.so)に2つのnodelet(SampleNodeletClassとSampleNodeletClass2)が含まれているので、1つの<library>
要素の中に2つの<class>
要素を記述しています。
.launchファイル
nodeletをコマンドラインから起動する場合、managerとloader2つの起動コマンド打つ必要があります。そのためターミナルを2つ占領するし、loaderの方はコマンドが長いくせにtab補完も効きません。
ということで、launchファイルを使ったほうが便利です。公開したlaunchファイルには、コマンドラインから起動する場合のコマンドをコメントで入れてあるので、照らし合わせながら読むと分かりやすいかと思います。
nodeとしての起動方法
nodeletとしてソースを書いておけば、nodeとして起動することもできます。 例えばSampleNodeletClassをnodeとして起動したかったら、下記のようにします。
rosrun nodelet nodelet standalone sample_nodelet/SampleNodeletClass
managerを起動する必要はありません。
nodeとして起動してしまうとプロセスが別になるので、zero copy等スレッド間通信の恩恵は受けられませんが、ソースはそのままに別のマシンで起動することもできてしまいます。またROS_INFO等の標準出力がmanagerのターミナルで共有されないので、(私のような)printfデバッガーにとってはデバッグがしやすいです。
おわりに
今回はROSのnodeletについて解説しました。
ここまでわかれば、ROS.orgのNodelet tutorialも理解できると思います。
Nodeletの活用が一般的にどこまで推奨されているのかわかりませんが、Nodelet Everythingという記事もあるぐらいなので、私は基本的にROSのコードをc++で書くときはnodeではなくnodeletで書くようにしています。
nodeletに関しては割と日本語記事が少ないようなので、本記事が日本のROSユーザの誰かの助けになれば幸いです。
Vstoneアカデミックスカラロボット VS-ASRのLinux版サンプル
はじめに
Vstone社のアカデミックスカラロボット VS-ASRというものがあります。
Academic SCARA Robot(アカデミック スカラロボット) | ヴイストン株式会社
主にRoboticsの教育・学習を目的に販売されています。
Vstone社からWindows用のC言語サンプルが公開されていますが、これをLinuxで動作するように改変したものです。
CP2110/4 SDKについては最新のものではうまく動作しない部分があるので、古いSDKを使うことをおすすめします。
github.com
なお"SCARA"とは、下記の意味だそうです。
スカラ(SCARA)とはSelective Compliance Assembly Robot Armの略であり、SCARA型ロボット、スカラロボットと言うことが多い。
以下、日本語版README.mdになります。
vsasr_linux
Vstone社のアカデミックスカラロボット VS-ASRを制御するLinux向けC言語サンプルプログラムです。
https://www.vstone.co.jp/products/scara_robot/index.html
Vstone社からWindows用のC言語サンプルが公開されていますが、これをLinuxで動作するように改変したものです。
Description
下記2つのサンプルがあります。
position_to_axis
Windows版サンプルのPositionToAxis.cppを出来る限り改変しないようにしてLinuxで動くようにしたものです。
使用方法はWindows版と同じで、アーム先端の目標位置(xyz)、yaw角、先端の爪の幅を設定するとその位置にアームが動きます。
get_position
Windows版サンプルのGetPosition.cppと同様の動作をしますが、ロボットとの通信・制御部分がクラス化されています。
ロボットの現在の位置を60Hzで取得し続けます。
Requirements
動作を確認した環境は以下の通りです。
- Ubuntu 16.04
- cmake 3.5.1
- CP2110/4 SDK v1.31
- 2016.09.01現在最新のSDKv6.7.2だと、ロボットとの通信が1秒おきにしかできず、モーター角度の取得もできません。
- バージョン情報はRelease Notesに参照してください。
Usage
Installation - CP2110/4 HID USB-to-UART SDK v1.31
- Linux用の古いSDK(v1.31)をダウンロードする。
- 実行権限を付与し、実行する。
chmod 755 CP2110_4_linux.bin
./CP2110_4_Linux.bin
- インストーラが起動するので、ここではデフォルトの
~/Silabs/MCU
にインストール。 - インストール後、$HOMEに余計なシンボリックリンクができるのでunlink(削除)する。
unlink CP2110_4 Device Customization Utility (AN721)
unlink Uninstall CP2110_4 Software Development Kit
- アンインストールしたい場合は単に
~/Silabs
ディレクトリを削除すればOK。
- インクルードファイル、ライブラリファイルをコピーする。
/usr/local/include/silabs
および/usr/local/lib/silabs
ディレクトリを作成~/Silabs/MCU/CP2110_4_SDK/Library/Linux
に存在する*.h
ファイルを/usr/local/include/silabs
にコピー~/Silabs/MCU/CP2110_4_SDK/Library/Linux
に存在するlibslabhidtouart.so.1.0
を/usr/local/lib/silabs
にコピー
- .soファイルのシンボリックリンクを2つ作成する。
cd /usr/local/lib/silabs
sudo ln -s libslabhidtouart.so.1.0 libslabhidtouart.so.1
sudo ln -s libslabhidtouart.so.1.0 libslabhidtouart.so
Build
git clone https://github.com/b4b4r07/awesome-tool
cd vsasr_linux
mkdir build
cd build
cmake ../
make
- 実行ファイル
position_to_axis
,get_position
が生成されます。
Run
予め、ロボットを接続したUSBデバイスへのアクセス権を与えておいてください。
- ロボットをPCに接続します。
- 下記コマンドで、ロボットとの接続に使われているBusとDevice番号を確認します。
lsusb
- 下記のような行が出力されると思います。
> Bus 001 Device 007: ID 10c4:ea80 Cygnal Integrated Products, Inc. CP210x UART Bridge
- この場合、Bus 001, Device 007 に接続されていることがわかります。この番号は環境によって変わります。
- read/write アクセスを上記デバイスに許可します。
cd /dev/bus/usb/001
sudo chmod 666 007
上記の方法でUSBデバイスへのアクセス権を与えていない場合、下記実行コマンドをsudo
権限で行う必要があります。
position_to_axisの実行
./position_to_axis
Run get_positionの実行: サーボ数をコマンドライン引数に入れて実行してください。
./get_position 3
or./get_position 5
Author
おわりに
今回はLinuxからVS-ASRを使うサンプルを公開しました。
Ubuntu+CMakeで動かせるということは、ROSから使うのも簡単なはずですので、近々ROS用パッケージも公開する予定です。
Ubuntu初心者がROSを使うときにおすすめのターミナル「terminator」
はじめに
ROSを使っていると、ターミナルを大量に立ち上げ、同時に表示したくなることがあると思います。例えばあるノードを起動して、そのノードのROS_INFOを見つつ、複数のトピックをrostopic echo
で監視したい時などがあります。
しかしUbuntu標準のgnome-terminalではタブ分割しかできず、複数の画面を同時に表示するには新しくWindowを立ち上げる必要があります。しかしそうなるとウインドウの配置&切り替えが面倒です。
そこで、簡単に画面切り替えができるTerminatorを紹介したいと思います。
環境
Ubuntu 16.04 LTS
Terminatorとは
画面分割やコマンドの自動実行など様々な拡張機能がついたターミナル(端末)ソフトウェアです。
この手のターミナルソフトはtmuxやscreen等が有名ですが、いくつか使ってみたところ、Ubuntu初心者の私がROS用途で一番使いやすかったのがTerminatorでした。
使いやすかった理由は、単純に 画面分割・移動が簡単なキーバインディングでできる からです。
後で書きますが、Alt+上下左右矢印キーで上下左右の分割画面に移動できるような手軽さが、今までWindowsしか使ったことがなかったlinux初心者にとっては嬉しいです。
vimもemacsも使ったことがない人間には、tmuxで使われるCtrl+bを押した後別のキーを押す、といった組み合わせに慣れていないのです。。。
Terminatorのインストール
簡単です。apt-getでできます。
sudo apt-get install terminator
一度インストールするとCtrl+Shift+tで起動するのはデフォルトのgnome-terminalではなくterminatorになります。
コマンドで起動したい場合はterminator
で起動します。
ROS向けの使い方
画面分割・移動
下記keybindingsでできます(デフォルト設定)
- Ctrl+Shift+o : 画面を上下に分割
- Ctrl+Shift+e : 画面を左右に分割
- Alt+上下左右矢印キー : 上下左右の画面に移動
文字列検索
grepと下記の検索機能を使い分けています。
- Ctrl+Shift+f : ターミナルのログから文字列検索(ESCキーで終了)
- Ctrl+Shift+g : ターミナルのログを全消去
例えばビルドログから文字列を抽出したいときなど、grepコマンドで抽出するよりも、
Ctrl+Shift+gでログを全消去 → ビルド → Ctrl+Shift+fで文字列検索
とやったほうが他のビルドログが残っていて便利だったりします。
コマンドを全ターミナルにbroadcast
他にも、source ~/.bashrc
や、環境変数の設定を分割した全ターミナルに反映させたいときは下記が役立ちます。デフォルトではkeybindingが無効になっているので、自分で適当なキーを割り当ててください。
- broadcast_all : 全ターミナルにコマンド入力
- brodcast_group : 現在のターミナルのみにコマンド入力
カスタマイズ
右クリック→設定から設定ウインドウが立ち上がります。
設定を変更した後、設定ウインドウを閉じると変更が反映されます。
設定は~/.config/terminator/config
に保存されており、このファイルをコピーすることでterminatorの設定をそっくりそのまま別環境に移すことが可能です。
画面レイアウトの保存・起動
Terminatorを起動する度に画面を分割しまくっていては面倒なので、よく使う画面レイアウトは保存しましょう。
まず一度好みのレイアウトに分割します。
そこの状態で設定ウインドウを開き、レイアウト->追加 で新しいレイアウトの名前を決めて保存します。
以後、Terminatorを起動するときに、terminator -l <レイアウト名>
というコマンドにすると、そのレイアウトでTerminatorが起動します。
私は、4行x2列=8画面レイアウトを"ros"というレイアウト名で保存し、.bashrc
に下記のaliasを登録しています。
alias rosterminator='terminator -l ros&exit'
こうすることで、PCを起動した後、下記コマンドでROS向けのレイアウトが立ち上がります。
- Ctrl+Shift+tでデフォルトレイアウトの1画面terminatorを起動する
rosterminator
コマンドでカスタムレイアウトのterminatorを起動&現在の1画面terminatorを終了
フォント
gnome-terminalと同じフォントにしたい場合は、Profiles->Fontを"Ubuntu Mono"にしましょう。
カーソル形状の変更
テキスト入力カーソルのこと。マウスカーソルではありません。
通常ターミナルでは1文字全体を覆う四角形だが、縦線一本にしたい場合は、
Profiles->General->Cursor shapeをI-Beamに変更。
テーマカラーの変更
Profiles->Colors->Built-in schemesをAmbienceに変更すると、 背景が真っ黒だったのがGnome Terminalと同じ濃い紫になる。
コマンドの自動実行
他にも、「このレイアウトを起動したらこのターミナルでこのコマンドを実行する」といった設定もできるので、roscoreや各種ノードを、terminatorを起動しただけで立ち上げることができたりします。
設定方法はこちらのページが参考になります。
http://tclip.blog.fc2.com/blog-entry-96.html
おわりに
他のROSユーザー数名にterminatorを紹介したらみんな使い始めてくれたので、多分ROS用途では使いやすいんだと思います。
ROSを使っていて、便利なターミナルソフトを探している方はぜひterminatorを試してみてください。
ROSブログはじめました
社会人になってから、社外の人と全く交流が無いことに不安を感じ、とりあえずよくある技術系ブログをはじめてみた次第です。 趣味でやってるRoboticsを中心に何か書いていきます。
これから記事を書きそうな分野
- ROS Kinetic
- Ubuntu
- C++
- Eclipse CDT
- cmake
- git
- Roomba
- Vstone VS-ASR
- Raspberry pi 3
- mbed
- Intel edison
- Intel RealSense
atomエディタでmarkdownプレビューしながらローカルで記事を書き、
完成したらはてなのブログ編集ページにコピペ、という方法で書いています。
現在ROS歴=Ubuntu歴=1年ちょいです。
開設したばかりなので、ブログデザインが頻繁に変わったりするかもしれませんがご了承ください。
ということで、よろしくお願いします。