今回からリバストが販売しているロボットを、ROSに対応させる方法を紹介していきます。
ROSは、Robot Operating Systemの略で、ロボットのソフトウェア開発で有用なライブラリとツールを提供するオープンソースです。オペレーティングシステムという名が付いているように、ROSは、ハードウェアの抽象化、デバイスドライバ、可視化、メッセージのやりとりおよびパッケージ管理など、オペレーティングシステムのような機能を提供します。
今回は、Ubuntu14.04へのROSのインストール方法と簡単な動作確認について説明します。
Ubuntu向けにビルドされたROSのパッケージが、Ubuntuレポジトリにより提供されており、下記のページに従い簡単にインストールすることができます。
具体的には、まず、下記のコマンドを実行し、ROS用のUbuntuレポジトリを構築します。
> sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list' > ls /etc/apt/sources.list.d cuda-7-0-local.list ros-latest.list
公式外のUbuntuリポジトリを利用するので、承認するための鍵をダウンロードし、ローカルキーチェーンに取り込みます。
> wget http://packages.ros.org/ros.key -O - | sudo apt-key add - > sudo apt-get update
次に、ROS、rqt、rviz、ロボットの一般的なライブラリ、2D/3Dシミュレータ、ナビゲーション、および2D/3D認識など、全てのROSのデスクトップ環境が含まれたパッケージをインストールします。ROSの本体は、/opt/ros/indigoにインストールされます。
> sudo apt-get install ros-indigo-desktop-full > ls /opt/ros/indigo _setup_util.py env.sh include setup.bash setup.zsh bin etc lib setup.sh share
次に、ROSパッケージを利用する際に必要となるシステム依存を自動的に取得してくれるrosdepの初期化を行います。
> sudo rosdep init > rosdep update
次に、シェルの起動時に、ROSの環境変数を設定するスクリプトを実行するように、.bashrcを設定します。
> echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
次に、.bashrcを読み込み環境変数を設定し、設定された環境変数の内容を確認します。
> source ~/.bashrc > export | grep ROS declare -x PWD="/home/hachiya/Works/ROS" declare -x ROSLISP_PACKAGE_DIRECTORIES="" declare -x ROS_DISTRO="indigo" declare -x ROS_ETC_DIR="/opt/ros/indigo/etc/ros" declare -x ROS_MASTER_URI="http://localhost:11311" declare -x ROS_PACKAGE_PATH="/opt/ros/indigo/share:/opt/ros/indigo/stacks" declare -x ROS_ROOT="/opt/ros/indigo/share/ros"
最後に、ROSパッケージをインストールする際に利用するrosinstallをインストールします。
> sudo apt-get install python-rosinstall
これで、無事ROSのインストールは完了となります。
ROSでは、パブリッシャーとサブスクライバーという2種類のノードで構成される分散システムが採用されています。パブリッシャーとサブスクライバーは、特定のトピックのメッセージやりとりする関係になっており、パブリッシャーはメッセージを提供し、サブスクライバーはメッセージを利用する役割を持ちます。
例えば、レーザーレンジファインダーなどのセンサデバイスは、センサ値に関するトピックのメッセージを提供するパブリッシャーです。一方、NaoやPioneerなどのロボットは、センサ値に関するトピックのメッセージを利用するサブスクライバーとなります。
このROSにおけるパブリッシャーとサブスクライバーのトピックのメッセージのやりとりを、turtlesimシミュレータを用いて確認してみます。
まず、ノード全体を統括し,ノードを実行する前にあらかじめ起動しておく必要があるroscoreを起動します。
> roscore
次に、2つのシェルでrosrunを用いてturtlesim_nodeと、turtle_teleop_keyを起動します。
> rosrun turtlesim turtlesim_node [ INFO] [1438394727.357450628]: Starting turtlesim with node name /turtlesim [ INFO] [1438394727.361221277]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]
> rosrun turtlesim turtle_teleop_key Reading from keyboard --------------------------- Use arrow keys to move the turtle.
次のようなウィンドウが起動し、テンキーで亀を動かすことができます。
次に、これら2つのノードturtlesim_nodeとturtle_teleop_keyとがどのようなやりとりをしているかを、可視化してみます。
まず、rqt_graphとういツールを用います。
> rosrun rqt_graph rqt_graph
この図のように、turtle_teleop_keyはパブリッシャーであり、/turtle1/cmd_velというトピックのメッセージを提供し、turtlesim_nodeはサブスクライバーであり、該メッセージを利用しています。しかし、これでは、/turtle1/cmd_velというトピック上をどのようなメッセージが送られているのかがわかりません。そこで、rostopicというツールを用いてトピック上のメッセージを可視化してみます。
> rostopic echo /turtle1/cmd_vel linear: x: 2.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0 --- linear: x: 0.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: -2.0 ---
このように、テンキーの操作に応じて、速度、角速度に関するメッセージがturtle_teleop_keyパブリッシャーから、turtlesim_nodeサブスクライバーに提供されています。
そして、turtlesim_nodeサブスクライバーでは、該メッセージに基づき、亀のアイコンを移動させています。