安曇野の森から > ROS(Robot Operating System)を使う > 簡単なプログラムを作って動かしてみる

簡単なプログラムを作って動かしてみる

これまでの説明だけで簡単なプログラムであればビルドして実行することが出来ます。

以下で周期的に文字列を表示するプログラムを書いてビルドし実行してみます。

手順は以下のようになります。

  1. ワークスペースの作成
  2. パッケージの作成
  3. プログラムの作成
  4. パッケージのビルド
  5. マスターの起動
  6. プログラムの実行
  7. プログラムの停止

ワークスペースの作成

制御系でよく使う周期的な繰り返し処理のプログラムをサンプルに作ります。

まずはターミナルを開いて以下のコマンドでワークスペースを作ります。ここでは ワークディレクトリを「~/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に保たれます。




パッケージのビルド

CMakeLists.txtの編集

ここで~/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」キーを押します。

正規にプログラムを終了させるには別のターミナルを開いて以下のコマンドを実行します。





inserted by FC2 system