HARD2021は終わりましたが、ワークショップでは触れることのできなかったこと紹介します。つまり、補講ですね。本記事ではノートPCで本物のルンバを動かす方法を紹介します。ここでは、create_autonomyパッケージは既にインストールされて、シミュレータで動かしていることを前提にします。また、シミュレータで動かしていない場合は先に次の記事を読んで実行してください。
先に読む記事
環 境
- ノートPC
- Ubuntu18.04
- ROS Melodic
- Roomba 600シリーズ
- 本記事では3万円弱で購入できる606で実行した。本記事で使用するCreate_autonomyパッケージは800シリーズまで対応しているので、そのシリーズまで大丈夫だと思うが未検証。なお、900シリーズ以上はRoombaからシリアルポートがなくなり、Create_autonomyパッケージも対応していないので使えない。
- Roomba通信ケーブル
- Pi4とRoombaを接続するケーブル。以下を参考に自作するか、ここから購入する。本記事では2011年に購入したルンバ研究開発キットに付属していた通信ケーブルを使っている。
- SONY DualShock4 (DS4)コントローラ
設 定
- udev
- Linuxはデバイスをファイルとして扱い、Pi4とRoombaを通信するときは/dev/ttyUSB0。USB-Serial変換ICでttyUSBではなくttyACMの場合もあるり、ttyUSBの後の番号は他の接続機器により0ではない場合もある。一般ユーザはデバイスファイルを扱えないのでパーミッションを変更する必要があるがUSBを接続する度に変更するのは面倒なのでudevを設定する。
- まず、Pi4とroombaを通信ケーブルで接続する。
- 次に、以下のコマンドでデバイスを確認する。本記事で使用しているUSB-Serial変換用ICはFuture Technology Devices Internatinal社のFT232だとわかる。Future Technologyの左の数字0403はベンダーID、6001はプロダクトIDなのでメモしておく。
- $ lsusb
-
- /etc/udev/rules.d/77-roomba.rulesというファイルをつくり、以下を保存する。ここで、ベンダーIDは上でメモったベンダーID、プロダクトIDも同様な数字を入れる。この例では、ベンダーIDは0403、プロダクトIDは6001になる。
KERNEL=="ttyUSB*", ATTRS{idVendor}=="ベンダーID", ATTRS{idProduct}=="プロダクトID", GROUP="dialout", MODE="0666"
- Room通信ケーブルを抜き差しするとudevの設定が反映される。確認はls -l デバイスファイル名でパーミッション設定を確認する。この例だと、上がケーブルを抜き差しする前で、下が後。すべてのユーザに対してrw(読み書き)可能となっていることがわかる。
- /etc/udev/rules.d/77-roomba.rulesというファイルをつくり、以下を保存する。ここで、ベンダーIDは上でメモったベンダーID、プロダクトIDも同様な数字を入れる。この例では、ベンダーIDは0403、プロダクトIDは6001になる。
Roombaを動かそう!
- Roombaと通信ケーブルを接続してから、Roombaの電源を入れる。
- Roombaを動かすために次のlaunchファイルを起動する。
- $ roslaunch ca_driver create_2.launch
- 前進
- ROSではトピック/cmd_velに速度指令値を設定して、配信(pub)するだけでロボットは動く。ここで、geometry_msgs/Twistは速度指令値の型、'{linear: {x: 0.2}, angular: {z: 0.0}}’が指令値で、linearは並進速度(x軸方向に0.2m/s)、angularは角速度(z軸まわりに0 rad/s)、オプション-rは配信する周期[Hz]デフォルトは10Hzなので動きがガタつくのでここでは100Hz、10ms周期にしている。
- $
rostopic pub /create1/cmd_vel geometry_msgs/Twist '{linear: {x: 0.2}, angular: {z: 0.0}}' -r 100
- $
- ROSではトピック/cmd_velに速度指令値を設定して、配信(pub)するだけでロボットは動く。ここで、geometry_msgs/Twistは速度指令値の型、'{linear: {x: 0.2}, angular: {z: 0.0}}’が指令値で、linearは並進速度(x軸方向に0.2m/s)、angularは角速度(z軸まわりに0 rad/s)、オプション-rは配信する周期[Hz]デフォルトは10Hzなので動きがガタつくのでここでは100Hz、10ms周期にしている。
- Teleopで動かそう
- いちいちコマンドを打っていてはRoombaをうまく制御できないので、キーボードを使って動かしてみる。
- 実行
- 次のコマンドを実行する
- $ roslaunch ca_tools keyboard_teleop.launch
- 以下の画面になる。キーボードのu i o j k l m, , . キーで操作できる。止めるときは’q’キーを押す。
- 次のコマンドを実行する
DS4コントローラのROSパッケージps4_rosの導入
- サイト
- インストール
- $ cd ~/catkin_ws/src
- $ git clone https://github.com/solbach/ps4-ros.git
- launchファイルの変更
- ~/catkin_ws/src/ps4-ros/launch/ps4.launchの下から3~5行目を以下のように変更する。Roombaに合うように最大速度とTopic名を変更する。
<param name=”scale_linear” value=”0.5″/>
<param name=”scale_angular” value=”0.25″/>
<param name=”pub_topic” value=”/create1/cmd_vel”/>
- ~/catkin_ws/src/ps4-ros/launch/ps4.launchの下から3~5行目を以下のように変更する。Roombaに合うように最大速度とTopic名を変更する。
SONY DualShock4 (DS4)コントローラの設定( Bluetooth)
- 以下のサイトを参照した。
- ds4drvドライバのインストール。ds4drvはLinuxのSONY DualShock 4 用ドライバ。
- python2のパッケージ管理システムpipをインストールする。
- $ sudo apt install python-pip
- DS4のドライバをインストールする。
- $ sudo pip install ds4drv
- python2のパッケージ管理システムpipをインストールする。
- DS4とノートPCのペアリング
- DS4をノートPCの近くに置く。
- ds4drvの起動
- $ sudo ds4drv
- 以下のように表示される。
[info][controller 1] Created devices /dev/input/js0 (joystick) /dev/input/event8 (evdev)
[info][bluetooth] Scanning for devices
- ペアリング
- DS4左上のSHAREボタンとDSボタンを同時に5秒程度長押しする。LEDが白く点滅したらボタンから手を話す。
- LEDが青くなりds4drvを起動した端末で以下のように表示されたら成功。
DS4コントローラでRoombaを動かそう!
- これで準備ができたので始めからDS4コントローラを使いロボットを動かすまでの一連の手順を説明する。
- PCとRoombaを通信ケーブルで接続する。
- Roombaの電源を入れる。
- PCの電源を入れ起動して端末を3つ開き次のコマンドを実行する。
- 1番目の端末
- 以下のコマンドを実行する。
- $ sudo ds4drv
- DS4コントローラのShareとPSキーを長押しペアリングする。
- 以下のコマンドを実行する。
- 2番目の端末
- Roombaの制御パッケージを起動する。
- $ roslaunch ca_driver create_2.launch
- Roombaの制御パッケージを起動する。
- 3番目の端末
- 遠隔操作パッケージを起動する。
- $ roslaunch ps4_ros ps4.launch
- 上のコマンドを実行した直後にキャリブレーションが必要。L2とR2を同時に押すと以下のように表示される。Release L2 and R2と表示されたら指を話すとキャリブレーションが終了し、利用可能となる。
なお、[ERROR] [1589086134.806825552]: Couldn’t open joystick force feedback! [error][controller 1] Failed to create input device: “/dev/uinput” cannot be opened for writingとエラーが出るが無視する。[ WARN] [1562730896.630287264]: Press L2 and R2 to calibrate: 0%
[ WARN] [1562730896.731446432]: Press L2 and R2 to calibrate: 5%
[ WARN] [1562730896.832234176]: Press L2 and R2 to calibrate: 10%
[ WARN] [1562730896.933098464]: Press L2 and R2 to calibrate: 15%
[ WARN] [1562730897.034052928]: Press L2 and R2 to calibrate: 20%
[ WARN] [1562730897.135351008]: Press L2 and R2 to calibrate: 25%
[ WARN] [1562730897.236488864]: Press L2 and R2 to calibrate: 30%
[ WARN] [1562730897.337511264]: Press L2 and R2 to calibrate: 35%
[ WARN] [1562730897.438300640]: Press L2 and R2 to calibrate: 40%
[ WARN] [1562730897.539139328]: Press L2 and R2 to calibrate: 45%
[ WARN] [1562730897.640097056]: Press L2 and R2 to calibrate: 50%
[ WARN] [1562730897.741000544]: Press L2 and R2 to calibrate: 55%
[ WARN] [1562730897.842041696]: Press L2 and R2 to calibrate: 60%
[ WARN] [1562730897.943081120]: Press L2 and R2 to calibrate: 65%
[ WARN] [1562730898.044020896]: Press L2 and R2 to calibrate: 70%
[ WARN] [1562730898.144871008]: Press L2 and R2 to calibrate: 75%
[ WARN] [1562730898.245700928]: Press L2 and R2 to calibrate: 80%
[ WARN] [1562730898.346876544]: Press L2 and R2 to calibrate: 85%
[ WARN] [1562730898.447959104]: Press L2 and R2 to calibrate: 90%
[ WARN] [1562730898.548941536]: Press L2 and R2 to calibrate: 95%
[ WARN] [1562730898.649878528]: Press L2 and R2 to calibrate: 100%
[ WARN] [1562730898.750981568]: Release L2 and R2
[ INFO] [1562730900.952626016]: Calibrated – Ready to use
- 1番目の端末
- DS4コントローラの操作方法は次のとおり。ルンバが動作したら成功。
- L2ボタン:前進
- R2ボタン:後進
- 左ジョイステック:回転
終わり
コメント