本シリーズ前回の記事では 900 シリーズのルンバと Ubuntu PC を USB ケーブルで 接続して ROS からルンバを有線操縦する方法を紹介しました.
今回の記事ではルンバが独立して動きやすいようにバッテリー駆動のラズベリーパイ(ラズパイ・Raspberry Pi)をルンバと USB 接続し,併せて USB カメラもそのラズパイに接続することで,ルンバ 900 シリーズを WiFi を介した ROS 遠隔操作ロボットのようにしてみる様子を紹介します.
前回の記事においてルンバを Ubuntu PC から ROS を使って USB 有線操縦することを目的としたハードウェア・ソフトウェア構成は以下のようになっていました.
今回はこれらのハードウェアに加えて下記のラズパイとその周辺機器のセットをルンバに接続したシステムも使用します.
OS などの環境については本記事執筆直近の動作検証では Ubuntu 24.04 と ROS Jazzy (ROS2) の組み合わせで行っていますが,過去に行った検証では Ubuntu 22.04 と ROS Humble の組み合わせでも動作確認しています.
使用コードについては前回の記事と同様に今回のシステム構成において使いやすいように Create Robot のソフトウェア GitHub リポジトリ https://github.com/AutonomyLab/create_robot からフォーク https://github.com/y-yosuke/create_robot/tree/humble-add-setmode して利用しています.
今回追加した Raspberry Pi 4B に Ubuntu 24.04 + ROS Jazzy と必要なソフトウェアをインストール・ビルドします.
Ubuntu 24.04 ディスクイメージを microSD カードに書き込みます.
Install Ubuntu on a Raspberry Pi を参照して microSD カードに Ubuntu 24.04.1 以降ののインストーライメージを書き込みます.
Raspberry Pi への ROS Jazzy と必要なパッケージのインストール・ビルドについては基本的に前回の記事のインストール手順 ルンバ 900 シリーズを ROS で遠隔操作ロボットに – USB 有線操縦編 : インストール・ビルド と同じですのでそちらを参照して進めてください.
1ヶ所 libcreate/include/create/packet.h
を編集するときに gnome-text-editor
がコマンドラインから起動できないことがありました.
$ gnome-text-editor ~/roomba_ws/src/libcreate/include/create/packet.h
その場合は本記事最後にあるトラブルシューティングの項目を参考に nano
や gedit
その他お好みの gnome-text-editor
以外のテキストエディタを使用してください.
Ubuntu 24.04.1 インストール時点では ssh サーバが入っていないのでインストールして「設定(Settings)」で ssh 接続を有効化してください.
$ sudo apt update $ sudo apt install openssh-server
今回使用するパッケージで依存関係記述から漏れていたパッケージ v4l2_camera
をインストールします.
$ sudo apt install ros-jazzy-v4l2-camera
Raspberry Pi にルンバ,USB カメラ,バッテリーを接続します.Ubuntu PC 側にはゲームコントローラなどを接続します.
次の画像はルンバ側のハードウェアを接続した様子です.
次の画像は Ubuntu PC 側のハードウェアを接続した様子です.この画像内の PC ディスプレイには後述する「ソフトウェアの実行」を行ったときのルンバに設置した USB カメラからの映像が映し出されています.
Ubuntu PC のターミナルからルンバと USB 接続されている Raspberry Pi に ssh 接続します.
下記の例では robotuser-rp4b
というホスト名をつけた Raspberry Pi に robotuser
というユーザ名で接続しています.ホスト名やユーザ名,接続時のパスワードは適宜読者の環境に沿ったもので実行してください.
ssh 接続ができたらルンバとのシリアル通信ポートの権限を chmod
で変更します.
Ubuntu PC: Raspberry Pi に ssh 接続するターミナル
$ ssh robotuser@robotuser-rp4b.local robotuser@robotuser-rp4b:~$ sudo chmod 777 /dev/ttyACM0
このターミナルの ssh は接続したままににします.
Raspberry Pi に ssh 接続したターミナルで次のコマンドを実行して create_1_camera.launch
を起動します.
Ubuntu PC: Raspberry Pi に ssh 接続したターミナル
robotuser@robotuser-rp4b:~$ source ~/roomba_ws/install/setup.bash robotuser@robotuser-rp4b:~$ ros2 launch create_bringup create_1_camera.launch
次にルンバを遠隔操作する側の Ubuntu PC 上の2つのターミナルで次のコマンドを実行してルンバに接続した Raspberry Pi のカメラ映像を表示しながらゲームパッドノードからルンバへの速度指令のトピックを発行します.
Ubuntu PC: ターミナル 1(カメラ映像の表示)
$ source ~/roomba_ws/install/setup.bash $ ros2 run rqt_image_view rqt_image_view
画像トピック名に image_raw
を選択するとウィンドウ内に映像が表示されます.
Ubuntu PC: ターミナル 2(速度指令発行ノードの実行)
ルンバへの速度指令を出すためのゲームパッドもしくは 3D マウスのノードを実行するためにターミナルをもう1つ開いて実行します.
< Xbox360 互換ゲームパッド使用の場合 >
joy_teleop.launch
を起動します.
$ source ~/roomba_ws/install/setup.bash $ ros2 launch create_bringup joy_teleop.launch
< 3Dマウス( 3DConnexion SpaceMouse Wireless )使用の場合 >
spacenav_telelop.launch
を起動します.
$ source ~/roomba_ws/install/setup.bash $ ros2 launch create_bringup spacenav_teleop.launch
次の動画ではルンバとラズパイのシステムが外部接続ケーブルが無く独立しており,Ubuntu PC 側のゲームパッドで操縦されルンバ上の USB カメラの映像も取得できている様子が見て取れると思います.
この動画内では撮影の都合で Ubuntu PC で操作を行っている操縦者の有視界内にルンバもありますが,Ubuntu PC とルンバは WiFi ネットワークを介してつながっているので例えば別の部屋などの視界外からもルンバ上の USB カメラからの映像や他の ROS トピックを参照しながら遠隔操縦できそうであることは想像できるのではないでしょうか.
ルンバ操作を終了するときは各ターミナルで実行しているプロセスを Ctrl+C で終了してください.
ルンバから派生した趣味や教育用をターゲットとした Create Robot は掃除機能を廃してしまっていますが今回使用しているのはお掃除ロボットのルンバそのものです.
ルンバが普通に掃除している間もその状態を Roomba Open Interface (ROI) を通じて取得できるのが ROI のパッシブモードです.
create_1_camera.launch
でも launch オプションで control_mode:=passive
を指定すると,ROI のパッシブモードでルンバを操作せずに通信してその状態を ROS トピックとして発行します.
Ubuntu PC: Raspberry Pi に ssh 接続したターミナル
robotuser@robotuser-rp4b:~$ source ~/roomba_ws/install/setup.bash robotuser@robotuser-rp4b:~$ ros2 launch create_bringup create_1_camera.launch control_mode:=passive
パッシブモードを実行中にルンバの CLEAN ボタンを押すか iRobot アプリから開始することで掃除が始まります.
create_1_camera.launch
パッシブモード時に発行される ROS トピックのリスト出力は次の様になっています.
Ubuntu PC: ターミナル 1
$ source ~/roomba_ws/install/setup.bash $ ros2 topic list /battery/capacity /battery/charge /battery/charge_ratio /battery/charging_state /battery/current /battery/temperature /battery/voltage /bumper /camera_info /check_led /clean_button /cliff /cmd_vel /day_button /debris_led /define_song /diagnostics /dock /dock_button /dock_led /hour_button /image_raw /ir_omni /joint_states /main_brush_motor /minute_button /mode /odom /parameter_events /play_song /power_led /robot_description /rosout /set_ascii /side_brush_motor /spot_button /spot_led /tf /tf_static /undock /vacuum_motor /wheeldrop
Ubuntu 24.04.1 でターミナルが起動しなかったのですが,その時は /etc/default/locale の内容を LANG="en_US.UTF-8"
に修正したら起動するようになりました.
/etc/default/locale
LANG="en_US.UTF-8"
gnome-text-editor がコマンドラインから起動できない場合は他のテキストエディタ nano や gedit などを使用してください.
$ nano ~/roomba_ws/src/libcreate/include/create/packet.h
$ sudo apt update $ sudo apt install gedit $ gedit ~/roomba_ws/src/libcreate/include/create/packet.h
今回の記事はここまでです.
iRobot 社のお掃除ロボット「ルンバ(Roomba)」は 700 シリーズ以前のモデルでは mini-DIN のインターフェースポートがありシリアル通信にて外部からルンバを操作するためのインタフェース Roomba Open Interface (ROI) が提供されていました.またルンバ 900 シリーズではシリアルポートが micro USB となり USB ケーブル経由で外部コンピュータと簡単につなげて ROI が利用できるようになっていました.
そしてルンバから派生した掃除機能を廃して趣味や教育用をターゲットとした Create ロボットもルンバと共通の ROI で操作可能です.なおかつ Create 向けとして ROI の ROS インタフェースが GitHub で提供されているので この ROI-ROS インタフェースを用いることでシリアルポートの付いているルンバを ROS から操作することが可能となっています.
本シリーズの記事では PC やラズパイから USB ケーブルで 900 シリーズのルンバに接続して ROS からルンバを操縦する方法を紹介します.
記事のシリーズ構成は次のようになる予定です.
ルンバを Ubuntu PC から ROS を使って USB 有線操縦することを目的とした今回の記事におけるハードウェア・ソフトウェア構成は以下のようになっています.
OS などの環境については本記事執筆直近の動作検証では Ubuntu 24.04 と ROS Jazzy (ROS2) の組み合わせで行っていますが,過去に行った検証では Ubuntu 22.04 + ROS Humble の組み合わせでも動作確認しています.
使用コードについては今回のシステム構成において使いやすいように Create Robot のソフトウェア GitHub リポジトリ https://github.com/AutonomyLab/create_robot から
フォーク https://github.com/y-yosuke/create_robot/tree/humble-add-setmode して利用しています.
Ubuntu 24.04 に ROS Jazzy のインストールする手順は下記リンク先の ROS 2 Documentation: Jazzy – Installation Ubuntu (deb packages) を参照して実行してください.
依存パッケージをインストールできるように rosdep をセットアップしておきます.
$ sudo apt install python3-rosdep $ sudo rosdep init $ rosdep update
ビルドのために colcon 関連パッケージをインストールします.
$ sudo apt install python3-colcon-common-extensions
ROS ワークスペースを作成して GitHub からコードをクローンし,インストール・ビルドを実行します.
$ source /opt/ros/jazzy/setup.bash $ mkdir -p ~/roomba_ws/src $ cd ~/roomba_ws/src/ $ git clone -b humble-add-setmode https://github.com/y-yosuke/create_robot.git $ git clone https://github.com/AutonomyLab/libcreate.git $ gnome-text-editor ~/roomba_ws/src/libcreate/include/create/packet.h $ cd ~/roomba_ws/ $ rosdep install -r -y --from-paths src --ignore-src $ colcon build $ source ~/roomba_ws/install/setup.bash
上記手順の libcreate を git clone したあとに下記コマンドを追加しています.
$ gnome-text-editor ~/roomba_ws/src/libcreate/include/create/packet.h
本コマンドを実行するとテキストエディタが起動して修正が必要なファイル packet.h が開かれます.
下のように packet.h の 35行目 に #include <string>
を挿入してファイルを保存してからテキストエディタを閉じます.
libcreate / include / create / packet.h
#define CREATE_PACKET_H #include <mutex> #include <string> namespace create { class Packet {
これはビルドするのに必要な下記リンク先の修正のプルリクエストがまだ反映されていないための修正作業です.今後このプルリクエストが libcreate の master ブランチにマージされた後は不要となります.
Ubuntu PC のソフトウェアのセットアップが終了したら Ubuntu PC にルンバとゲームパッドもしくは 3D マウスを接続します.
ルンバ 900 シリーズの micro USB ソケットは上面右側にある細長いカバーを外すとあります.このカバーは工具なしで手で外すことができます.
ルンバが接続されているシリアルポートの権限を変更してユーザからもアクセス可能な状態にします.
$ sudo chmod a+rw /dev/ttyACM0 $ sudo usermod -a -G dialout $USER
ターミナル 1
$ source ~/roomba_ws/install/setup.bash $ ros2 launch create_bringup create_1.launch
launch 後,正常に Ubuntu PC からルンバに通信が確立されているとルンバ側で短いビープ音が鳴ります.
ターミナル 2
ルンバへの速度指令を出すためのゲームパッドもしくは 3D マウスのノードを実行するためにターミナルをもう1つ開いて実行します.
< Xbox360 互換ゲームパッド使用の場合 >
$ source ~/roomba_ws/install/setup.bash $ ros2 launch create_bringup joy_teleop.launch
< 3Dマウス( 3DConnexion SpaceMouse Wireless )使用の場合 >
$ source ~/roomba_ws/install/setup.bash $ ros2 launch create_bringup spacenav_teleop.launch
spacenav_teleop.launch においてはデッドマン・スイッチの設定はないので SpaceMouse の前後・ヨー軸のねじり入力がそのままルンバへの速度指令として出力されます.
次の動画はゲームパットを用いてルンバを動かしたときのものです.デッドマン・スイッチの L1 を押しながらアナログスティック R を操作することでルンバへの速度指令が出力されている様子が見て取れるかと思います.
ルンバ操作を終了するときは各ターミナルで実行しているプロセスを Ctrl+C で終了してください.
今回の記事はここまでです.
本シリーズ次回の記事ではルンバが動きやすいようにバッテリー駆動のラズベリーパイをルンバと USB 接続し,カメラも併せてラズパイに接続することで,ルンバ 900 シリーズを WiFi を介した ROS 遠隔操作ロボットのようにしてみる様子を紹介する予定です.
ROS(ロス/Robot Operating System)の学習は実際にロボットがなくてもロボットのシミュレータが入手できるのでネットワークにつながるパソコンが1台あればできますので結構自習に向いています.この記事では ROS の学習を始める,進めるにあたり必要な情報がある Web へのリンクを中心に紹介します.
大まかに言うと次のインストールを行えば ROS の学習をスタートすることができます.
ROS と Ubuntu Linux のバージョンは後述する ROS 学習のチュートリアルが現時点では ROS Kinetic というバージョンを基本としているので下記の組み合わせをお勧めします.
ROS Melodic は ROS Kinetic と基本的な操作のほとんどは変わらないので ROS Kinetic で学習してから ROS Melodic に移行しても難なく可能です.
パソコンはどのようなものを使えば良いのか?については下記記事を参考にしてください.
最新高性能パソコンよりも数年型落ちや廉価の機種のほうが Ubuntu Linux をインストールしやすい傾向にあるように思います.
下記リンク先に各 ROS のバージョンにおけるインストール手順が書かれています.
また,Ubuntu のバージョンと ROS のバージョンには1対1の対応関係があるので組み合わせを気をつける必要があります.
各チュートリアルを進めるとそれらの中で ROS シミュレータなどのインストールも行います.
ROS の入門には TORK MoveIt チュートリアルをお薦めします.MoveIt は ROS のマニピュレーションロボット動作計画ソフトウェアです.このチュートリアルでは数種のロボットの ROS シミュレータのインストールや基本的な操作,プログラムでのロボット操作を学習することができます.TORK MoveIt チュートリアルではプログラミング言語に Python を用いていますが,プログラミングの経験がほとんどない人にもプログラムによるロボット操作の体験と学習ができるように構成しています.
ROS を初めて使う方に TORK MoveIt チュートリアルを学習したときのレポートも下記の記事に書いてもらっています.学習過程でいろいろと疑問をもった点などの体験を書いてもらいましたので参考にしてみてください.
より発展的な ROS プログラミングを学習したい場合は ROS-Industrial トレーニングを行ってみるのも良いでしょう.この教材で取り上げられているプログラミング言語は主に C++ と Python です.C++ によるロボット制御や画像処理,3D ポイントクラウド処理などとそれらの組み合わせのプログラムの学習ができます.
ROS Discourse やチュートリアル,パッケージの GitHub Issues に質問を投稿してみてください.
1台のパソコンだけ,シミュレータだけでなく入門的な実機マニピュレータを利用してみたいと思った方は入門的なマニピュレーションロボット2例の導入検証を行った記事を参考にしてみてください.