ROS(Robot Operating System)を使う
安曇野の森から > ROS(Robot Operating System)を使う > 簡単なプログラムを作って動かしてみる
これまでの説明だけで簡単なプログラムであればビルドして実行することが出来ます。
以下で周期的に文字列を表示するプログラムを書いてビルドし実行してみます。
手順は以下のようになります。
制御系でよく使う周期的な繰り返し処理のプログラムをサンプルに作ります。
まずはターミナルを開いて以下のコマンドでワークスペースを作ります。ここでは
ワークディレクトリを「~/sample_ws」とします。
これまでの説明で既にワークスペースを作っている場合は、新しくワークスペースを作る必要はありません。作成済みのワークスペースを使ってください。
次に以下のコマンドでワークスペースのsrcディレクトリに移動しパッケージを作成します。
ここではパッケージ名を「sample」とします。続く「std_msgs roscpp rospy」はROSプログラムで依存する可能性の高いパッケージなので、ここであらかじめ指定しておきます。
ビルドをやらないと生成されないファイルもあるので、次に以下のコマンドで空ビルドをやっておきます。
次にパッケージディレクトリのsrcディレクトリ内にプログラムを書き込みます。
以下のプログラムをエディタに丸ごとコピー&ペーストしてファイル名「hello.cpp」としてディレクトリ~/sample_ws/sample/srcに保存してください。
以下のプログラムは1秒周期で"Hello World!"を表示するノードを作るものです。
次の2行はノードを作る際に、お約束で必ず呼び出さないといけないAPIです。
1行目のros::init()はノードに名前を付けノードを初期化します。以下のサンプルプログラムでは「hello」というノード名を付けています。
2行目のros::NodeHandle nhはnhというNodeHandleオブジェクトを生成すると同時にマスターへノードを登録します。
次のAPIでrateというRateオブジェクトを生成すると共にwhileループ内のrate.sleep()が
スリープする周期[Hz]を設定します。
ここでは1Hzに設定しています。
次のAPIはCtrl+Cが押されたらfalse、押されなければtrueを返します。
次のマクロで"Hello World!"をターミナルに表示します。
次のAPIでrateオブジェクトを使ってスリープに入ります。
スリープからの起床間隔は周期1Hz = 1秒からループ内の他の処理時間を引いた時間になります。
これによってROS_INFO_STREAM()による処理に時間がかかっても周期が1Hzに保たれます。
ここで~/sample_ws/src/sample/CMakeLists.txtを編集します。
CMakeLists.txtをエディタで開いて似たような記述をしてある2ヶ所の下に、それぞれ以下の行を追加し、ファイル保存してください。
ここではプログラムファイル名を「hello.cpp」、実行ファイル名を「hello」としています。
次に、以下のコマンドでワークスペースディレクトリに戻り、プログラムをビルドします。
パッケージを作成した後にセットアップファイルsetup.bashが~/sample_ws/develディレクトリの下に出来ますので、以下のをコマンドし環境変数等のセットアップを行います。
毎回セットアップファイルを実行するのは面倒なので~/.bashrcの最後に以下の行を追加しておきます。
ビルドが正常に終わったら、以下のコマンドでマスターをバックグランドで起動します。
マスターの起動メッセージ表示が終わったらEnterを押して、プロンプトを表示させます。このターミナルで他のプログラムを動かすことが出来ますが、ターミナル自体はROSを使い終わるまで閉じないで下さい。
次に以下のコマンドでプログラムを実行します。
ターミナルに以下のように「Hello World!」が1秒周期で表示されれば正常にプログラムが動作しています。
表示の2番目の[ ]内の数字が文字列を出力した時間を表しています。表示される時間は1970/1/1からの累積の秒数です。ここが1秒毎の表示になっているのが分かります。
このプログラムの場合は、プログラムの裏でLinuxが動かしている高優先度のプロセスによりプログラムが中断されることがありますので、時間に若干のバラツキ(数マイクロ秒)が出ています。
簡易的にプログラムを終了させるにはノードを実行させたターミナルで「Ctrl + C」キーを押します。
正規にプログラムを終了させるには別のターミナルを開いて以下のコマンドを実行します。