ROSによるプログラミング(Python)

目的

ROSにおけるワークスペース及びファイルシステムの概念を理解します.また,演習によりワークスペース及びパッケージの作成方法,ROSにおけるPythonによるプログラミング方法を習得します.本内容は1週(1コマ)を想定しています.

ワークスペースの作成及びビルド

ワークスペース及びパッケージの作成方法,ROSによるプログラミング方法を学びます.まず,ワークスペースを作成しましょう.ここでは,practice_wsというワークスペースを作成します.まず,ワークスペースとなるディレクトリを作成後,その一つ下の階層にsrcというディレクトリを作成します.最後にcatkin_init_workspaceというコマンドによりワークスペースを作成します.

$ mkdir practice_ws
$ cd practice_ws
$ mkdir src
$ cd src
$ pwd
/home/yuu/practice_ws/src
$ catkin_init_workspace

実行するとディレクトリにCMakeLists.txtというファイルが作成されます.このファイルは,catkin_makeによりビルドする際に必要なファイルです.catkinとは,ROSにおけるビルドシステムを指します.CMakeと似ていますが,ROSに特化することで汎用性が高いビルドシステムとなっています.実際にビルドしてみましょう.ビルドするためには,ワークスペースの最上位のディレクトリに移動し,catkin_makeを実行します.

$ cd ../
$ pwd
/home/yuu/practice_ws
$ catkin_make

実行すると下記のように出力されます.

yuu@VB:practice_ws$ catkin_make
Base path: /home/yuu/practice_ws
Source space: /home/yuu/practice_ws/src
Build space: /home/yuu/practice_ws/build
Devel space: /home/yuu/practice_ws/devel
Install space: /home/yuu/practice_ws/install
####
#### Running command: "cmake /home/yuu/practice_ws/src -DCATKIN_DEVEL_PREFIX=/home/yuu/practice_ws/devel -DCMAKE_INSTALL_PREFIX=/home/yuu/practice_ws/install -G Unix Makefiles" in "/home/yuu/practice_ws/build"
####
-- The C compiler identification is GNU 9.3.0
-- The CXX compiler identification is GNU 9.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Using CATKIN_DEVEL_PREFIX: /home/yuu/practice_ws/devel
-- Using CMAKE_PREFIX_PATH: /opt/yuu/noetic
-- This workspace overlays: /opt/yuu/noetic
-- Found PythonInterp: /usr/bin/python3 (found suitable version "3.8.5", minimum required is "3") 
-- Using PYTHON_EXECUTABLE: /usr/bin/python3
-- Using Debian Python package layout
-- Found PY_em: /usr/lib/python3/dist-packages/em.py  
-- Using empy: /usr/lib/python3/dist-packages/em.py
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /home/yuu/practice_ws/build/test_results
-- Forcing gtest/gmock from source, though one was otherwise available.
-- Found gtest sources under '/usr/src/googletest': gtests will be built
-- Found gmock sources under '/usr/src/googletest': gmock will be built
-- Found PythonInterp: /usr/bin/python3 (found version "3.8.5") 
-- Found Threads: TRUE  
-- Using Python nosetests: /usr/bin/nosetests3
-- catkin 0.8.9
-- BUILD_SHARED_LIBS is on
-- BUILD_SHARED_LIBS is on
-- Configuring done
-- Generating done
-- Build files have been written to: /home/yuu/practice_ws/build
####
#### Running command: "make -j2 -l2" in "/home/yuu/practice_ws/build"
####

ROSのバージョンが同じであれば,アカウント名以外は全く同じ内容が出力されます.正常にビルドできた人は,lsコマンドを使用してpractice_wsの中に変化がないか確認しましょう.catkin_makeにてdevel及びbuildという名前のディレクトリが作成されているはずです.これらのディレクトリの中に実行ファイルやライブラリが保存されます.作成されるファイルの一つにsetup.bashがあります.このファイルは,作成したワークスペース及びパッケージの情報が記述されています.ROSに関連する環境変数にsetup.bashを用いてワークスペースのパスを追加します.

$ source devel/setup.bash

上記は,新しくワークスペース内にパッケージやノードを作成した際に実行する必要があります.また,それ以外にも新しい端末(新しいタブ)を開いた際にも上記を実行する必要があるので,覚えておきましょう.(作成したノードを実行しようとしても見つからない場合には,環境変数の設定ができていない場合が多いです.注意してください.)環境変数にパスが追加されているか確認します.下記を実行しましょう.

$ echo $ROS_PACKAGE_PATH

下記のように作成したワークスペースのsrcのパスが出力されていれば問題ありません.

/home/yuu/practice_ws/src:/opt/yuu/noetic/share
パッケージの作成

次にパッケージを作成しましょう.パッケージの作成にはcatkin_create_pkgを実行します.

$ catkin_create_pkg [パッケージ名] [依存パッケージ1 依存パッケージ2 ...]

今回は依存するパッケージはrospyパッケージのみです.rospyは,Python言語でプログラミングする際に必要なパッケージです.下記のように実行してください.

$ cd src
$ pwd
/home/yuu/practice_ws/src
$ catkin_create_pkg practice rospy
Created file practice/package.xml
Created file practice/CMakeLists.txt
Created folder practice/src
Successfully created files in /home/ros/practice_ws/src/practice. Please adjust the values in package.xml.

上記を実行することにより,幾つかのファイルとディレクトリが作成されます.その中の一つであるpackage.xmlには,パッケージに関する情報が記述されます.中身を見てみましょう.

$ cd practice
$ pwd
/home/yuu/practice_ws/src/practice
$ vim package.xml

パッケージ作成者はパッケージの説明や作成者及び連絡先,ライセンス,依存関係について記述します.書き方の例もありますので参考に書くと良いでしょう.今回はpackage.xmlの詳細は省略します.

プログラミング

今回は画面に「hello ros」という言葉を出力するプログラムを作成します.なお,プログラミング言語にはPythonを使用します.Python言語で記述したプログラムはscriptsディレクトリに保存します.下記の操作でscriptsディレクトリ内にhello.pyファイルを作成しましょう.

$ mkdir scripts
$ cd scripts
$ pwd
/home/yuu/practice_ws/src/practice/scripts
$ vim hello.py

それでは,hello.pyに下記のサンプルプログラムを入力しましょう.

#!/usr/bin/env python3
import rospy

rospy.init_node('greeting_node', anonymous=True)
rospy.loginfo("hello ros")

1行ずつ説明します.

#!/usr/bin/env python3

先頭の「#!」は,シバン(shebang)と呼ばれ,Linuxのスクリプトが始まることを意味し,このプログラムをどのように実行するかを指定します./usr/bin/にあるenv(コマンド)により環境変数を指定してpython3コマンドを実行することができます.すなわち,サンプルプログラムの1行目は下記のように言い換えられます.

/usr/bin/env python3 hello.py

ターミナルからpython3コマンドにより実行する場合には上記のような処理は不要となりますが,ROSのコマンドによりPythonプログラムを実行する際には必要となります.

import rospy

rospyと呼ばれるモジュールをimportにより読み込んでます.rospyはPython言語でプログラミングするために必要なライブラリを含んでいますので,必ずインポートしなければいけないライブラリとなっています.

rospy.init_node('greeting_node', anonymous=True)

init_nodeによりノードを作成します.
init_nodeの第1引数で与えた文字列「greeting_node」という名前のノードを作成します.この行が実行されないとノードとしてマスターに登録されないため通信ができません.プログラムの冒頭に記述しましょう.

ROSでは同じ名前のノードを複数同時に起動することができません.しかし,init_nodeの第2引数を「anonymous=True」とすると,同一の名前のノードを複数同時に起動した際に,自動的に異なる名前のノードに変更してくれます.

rospy.loginfo("hello ros")

loginfoによりターミナルに「hello ros」という文字列を表示します.書式はPythonのprintと同じです.また,ターミナルに表示以外にも,標準出力機能を持つrosoutノードを経由して/rosoutトピックとして配信され,ログとして出力されます.

プログラムを作成したら,ROSのコマンドにより実行するために権限を変更します.変更する前にlsコマンドによりファイルの権限を確認しましょう.

$ ls -l
-rw-rw-r-- 1 yuu yuu 113  4月 28 15:35 hello.py

ファイルの権限についての詳細な説明は省略しますが,左から4つ目のユーザーに対するファイルの実行権が「-」となっており,実行権限がないことを表しています.このままではプログラムを実行できないため,下記のコマンドにより実行権限を与えます.

$ chmod u+x hello.py

上記のコマンドでユーザー(u)に実行権限(x)を与えることができます.先ほどと同様にlsコマンドで権限を確認しましょう.

$ ls -l
-rwxrw-r-- 1 yuu yuu 113  4月 28 15:35 hello.py

左から4つ目が「-」から「X」となり実行権限が与えられたことを確認しました.実行するためにcatkin_makeでビルドしましょう.PythonはC言語と異なりコンパイルを必要としないため,catkin_makeはパッケージを作成した後に1度だけの実行で構いません.既にcatkin_makeは実行済みですので,プログラムを実行します.実行する前に,新しいターミナルでroscoreにより忘れずにマスターを起動しておきましょう.最後にrosrunによりプログラムを実行しましょう.

yuu@VB:practice_ws$ rosrun practice hello.py
[ INFO] [1429117039.438860201]: hello ros

画面にhello rosという文字が表示されました.ROSによるプログラムでは,ワークスペースの作成,パッケージの作成が必須となります.また,プログラミングを通して行った作業は,ROSにおけるロボットプログラミングで最低限必要作業となります.覚えることが多いので,もし忘れてしまったらこのwebページを参考に復習してください.次回以降も同様の作業が必要となりますので,繰り返し作業して一連の流れを覚えましょう.