コンテンツへスキップ

教育用ロボットビュートローバーを使用して簡単な制御を行ったので、その方法を紹介します。

前回=>教育用ロボットビュートローバー開発環境構[

ビュートシリーズ用 赤外線センサ(1個) -ROBOT SHOP

目次

  • ライントレースとは
  • 使用する機能の詳細
  • プログラム
  • 雑記
  • 参考

ライントレースとは

ライントレースというのは、その名の通り、「線に追従する」ことで、ロボットに電車のように線の上を走らせます。 自動運転技術の1つとして、高速道路の白線を認識していることもあります。

ライントレースの精度や速さを競う大会がいくつもあります。私が知ってるのはこれとか =>ロボトレース -NIF 共益財団法人ニューテクノロジー振興財団

使用する機能の詳細

  • モータードライブ
  • アナログ入力

モーターのサンプルコード

サンプルコードをダウンロードしてビルドします。(詳細は環境構築編)

VS-WRC003LV-ヴイストン株式会社
電池をいれてスイッチを倒して接続します。すると、前後に動いているのがわかります。モーターを動かす関数は以下の通りです。

Mtr_Run_lv(-20000,20000,0,0,0,0);

左端の値は右モータ、右隣の値は左モータで、正転逆転出力は32767~-32767で調節します。モーターが向かい合わせについているので、左のモータは-にします。 上の関数で信号を与えますが、それは一瞬の事です。走らせるにはそのまま待機させなければいけません。そのための関数が下の関数です。

Wait(1000);

たとえばWait(1)だと、1m秒(=1/1000秒)そのまま待機します。

アナログ入力

光センサとアナログ入力について

ビュートローバーには赤外線距離センサがついてきます。距離センサなので、今回の使用方法は邪道ですね。

受光素子と発光素子が並んでついています。発光素子が発した赤外線が、床を反射して受光素子に入ってきます。このときの光の量で距離を判断しています。(量というのはだいぶアバウトですが。)

ビュートローバーでは、帰ってきた光の量をAdRead関数0~1023までの1024段階(10bit)で入手できます。センサ入力はアナログ(連続)で、それをデジタル(離散)に変換しています。このとき、プルアップという方法をとっているので、センサの感度に対して光が最小以下のとき1023,最大以上のとき0になります。

ちなみにプルアップについて
マイコンにセンサから信号が来ないときはどうなるでしょうか。この時、人間からは何レベルか解りませんし、マイコンに取っては不安定な信号になります。これはマイコンにとってとても良くない状態なので、何も入力されていないときには回路的に1023レベルか0レベルに決定できるようにしたのがプルアップ/プルダウンです。

コード

アナログ入力取得する関数が予め定義されていますので、それを使用します。

 AdRead(1);

入力(引数)はチャンネル(0~7 = 1~8)で、出力(戻り値)はA/D 変換の値(0~1023)です。

試験的にアナログ入力情報を取得してLEDを光らせます。

	while(1){
		
		Rightdata = AdRead(0);
		Leftdata = AdRead(1);
		if(Rightdata< 500){
			LED(1);		//緑のLED点灯
			Wait(500);	//1000msec待つ
		}
		if(Leftdata< 500){
			LED(2);
			Wait(500);		//オレンジのLED点灯
		}
		else{
			LED(0);	
		}
	}
左センサが感知右センサが感知左LEDが点灯右LEDが点灯
OOOO
OXOX
XOXO
XXXX

Border以上: 反射がない/黒=>光る
Border以下: 反射がある/白=>光らない

このボーダーは自分で設定する事が出来ます。 50にすると、センサと床の距離が同じなままで白黒を判別できました。私の手元に青いテープしかなかったのでうまく調整します。

プログラム

ライントレース

機体がラインにまたがり、センサがラインの両端に来るような状況を考えています。

作成したコードです。後半で解説しています。簡単なコードなのでかなり改良の余地があります(^^ゞ
使用するセンサの質や数、配置によってコードが変わってくるでしょうが、今回は製品を使用するので誤差は小さめかと思います。

#ifdef __cplusplus
extern "C" {
void abort(void);
#endif
void main(void);
#ifdef __cplusplus
}
#endif

/*インクルード***********************************************************/
#include<36064s.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include "vs-wrc003lv.h"

/*グローバル変数***********************************************************/

int Leftdata;
int Rightdata;
int Borderr = 50;
int Borderl = 55;
/*メイン関数***********************************************************/
void main(void)
{
	//制御周期の設定[単位:Hz 範囲:30.0~]
	const BYTE MainCycle = 60;
	Init((BYTE)MainCycle);		//CPUの初期設定
	
	//ループ
	while(1){
		Rightdata = AdRead(0);
		Leftdata = AdRead(1);
		if(Rightdata > Borderr){
			LED(1);		//緑のLED点灯
			Mtr_Run_lv(-10000,-10000,0,0,0,0);
			Wait(100);	//100msec待つ
		}
		
		if(Leftdata>Borderl){
			LED(2);
			Mtr_Run_lv(10000,10000,0,0,0,0);
			Wait(100);		//オレンジのLED点灯
		}
		else{
			Mtr_Run_lv(0,0,0,0,0,0);//停止
			Wait(100);
			LED(0);	
			Mtr_Run_lv(-10000,10000,0,0,0,0);//前進
			Wait(100);
		}
	}
}

#ifdef __cplusplus
void abort(void)
{
	
}
#endif

アルゴリズム

コードを実行する時、処理は上から順に行われますので、私がやったコードの実行手順は以下のようになっています(たぶん)。

実行手順

これを実行すると、下のように動作すると思います。センサは白に反応するので注意してください。

状態左センサ右センサ機体動作
持つXXLED左右交互に点滅
線の上OOLED消灯、前進
右に脱線OX左朱LED点灯、反時計回り
左に脱線XO右緑LED点灯、時計回り

ライントレースの動作

実際に走らせてみたところ、完走です。 センサのボーダーの値はそれぞれの機体で走らせてみて調整してください。動画は諸事情によりありません。


雑記

紹介したコードの場合、手に持っている時にもモーターが左右交互に回転しようとしますので、効率が悪いです。 また、機体進行方向に対して水平なラインに出会ったときにも、左右交互に回転しようとしてしまい、脱出出来ません。

ロボットで勉強してみようという方がいらっしゃいましたら、コードを改良したりセンサを増やしてみたりして、様々な場合に対応できるように改良してみると楽しいのではないでしょうか。

参考

関連商品紹介

これからマイコンを使ってプログラミングの勉強を使用という方へ向けて、

プログラミング教育用ロボットのビュートローバーの開発環境構築とサンプルコードの実行までを、参考本に沿いつつ、(古い本なので)変更点などを書いていきます。

追記: つづき=>教育用ロボットビュートローバーで簡単制御:ライントレース

目次

  • マイコンとは
  • H8マイコンとビュートローバー
  • 組み立て
  • 環境構築
  • LED点滅
  • 雑記
  • 参考

マイコンとは

そもそもマイコンとは、マイクロコンピュータ、つまり小型計算機のことです。かつてはマイコンコンピュータを指していたそうですが、最近はPICマイコンのような部品を指すことが多いと思います。

家電製品を分解してみると回路が入っていますが、その中の計算処理をする部分です。こんな感じの物です。

手元にあったPICマイコン

これにプログラムを書き込んで、LEDを点滅させてリモコンにしたり、モーターに電気を流してタイヤを回したりするというわけです。

私聞いたことがあるのはPIC、LPC、R8C、H8ですが、他にも様々なものが販売されています。これにプログラムを書き込んでいくと、自立的に走行させたりできます。

H8マイコンとビュートローバー

ビュートローバーは専用ソフトウェアでフォーチャートから比較器簡単にプログラミングを学べる教育用ロボットです。統合開発環境HEWを使用することでC言語で開発することもできます。

プログラミング教育用ロボット ビュートローバー H8 [学習教材] [vstone]

プログラミング教材 ビュートローバーARM ビュートローバーH8 -ヴイストン株式会社

搭載されているのはH8/36064G搭載のVS-WRC003LVです。

組み立て

箱の中身

組み立てマニュアルに沿って組み立てます。

この時点で電池を入れると、前後左右に動きます。持ち上げると音が鳴り、その状態で左右のセンサを覆ってみて対応するLEDが点滅します。

ギアボックス

うまく動作しなかったら組み立てに失敗しているので確認しましょう。配線やモーターのギアに注意です。

完成!(左側が前)

環境構築

環境構築の前に

プログラムを書き込んでマイコンを動かすわけですが、C言語というプログラミング言語で命令する場合、一度機械語に翻訳する必要があります。

たとえば2+3=5をする場合、人間は「2+3」と書けば「5」と答えますし、C言語でもそのように書きます。一方、機械は以下のような計算をしています(機械語にかなり近い言語であるアセンブリ言語のイメージ)。

計算のイメージ

A ← 0    Aに初期値0を入れます
A ← A + (79) Aに79番地の値を加えます
A ← A + (80) Aに80番地の値を加えます
(81) ← A   81番地にAのもつ値を入れます

アセンブリ言語では ADD (M) がA ← A + (M)です。計算そのものは回路的に行えます。数値は16進数です。また、加算命令もとある番地に入っていて加算したり値を移動したりするたびに番地を指定して呼び出して...という感じに計算していきます。

ただ、最近一般的に使われているPCやラズパイは計算能力が高いのでこんなめんどうな部分は意識する必要がありません。マイコンは計算能力が低いので、プログラムを作る私たちはこのような部分を知っておくと便利です。宇宙開発のような機械を小さくしたい時や省消費電力化したいとき、あるいは簡単なロボットが作りたいときや教育等にマイコンを使用します。

統合開発環境HEW

統合開発環境とはC/C++によるプログラム作成に必要なソフトウェアが全部入っているソフトウェアのことです。

C言語などを機械語に変換してくれるソフトウェアをコンパイラといいます。機械語はハードウェアごとに違うので、マイコンにあったコンパイラをインストールしなければいけません。

【無償評価版】H8SX,H8S,H8ファミリ用C/C++コンパイラパッケージ V.7.00 Release 00 -RENESASのページの無償評価版のものを選択します。 ([無償評価版]H8SX,H8S,H8ファミリ用C/C++コンパイラパッケージv.700 Release 00)

ログインしてh8v7000_ev.exeをダウンロードして実行し、推奨設定でインストールします。

HEW

Flash Development Toolkit

フラッシュ開発ツールキットとはフラッシュメモリに対して書き込みを行うためのソフトウェアです。

フラッシュ開発ツールキット Flash Development Toolkit (Programming GUI)の最新版(【無償評価版】フラッシュ開発ツールキット V.4.09 Release 03)をインストールします。

特に変更なしでインストールします。言語だけAsia(japanese)にします。

H8 Writer

書き込み用ツールをインストールします。同じくVS-WRC003LV-ヴイストン株式会社からインストールします。

モニタプログラム

H8/300H、H8/300H Tinyシリーズ用サンプルプログラム -Renesasから、HEW3,HEW4(C/C++ Compiler Ver. 6.0)対応版 H8/300H Tiny用 モニタプログラムをダウンロードします。

デフォルトの設定ならC:\300tに保存されるので、そのフォルダのmonitor.hwsをクリックしてHEWを起動します。何か言われたら「はい」でHEWをアップデートします。

モニタプログラムの設定

ユーザ・イニシャライズ・モジュールを設定します。monitor.cを以下のように設定します。

/************************************************************************/
/*      H8/300H Monitor Program (Normal Mode)           Ver. 2.0B       */
/*              Copyright (C) 2003 Renesas Technology Corp.             */
/************************************************************************/
#include "36064s.h"                              /*変更                 */
#pragma global_register(monitor=R5)             /* Return Address       */
void (*monitor)(void);                          /*                      */
/************************************************************************/
/*      User Initialize Module                                          */
/*              Input   R5  <-- Return Address                          */
/*              Output  Nothing                                         */
/*              Used Stack Area --> 0(0) Byte                           */
/************************************************************************/
#pragma noregsave(INITIALIZE)                   /* Non Register Save    */
void INITIALIZE(void)                           /*                      */
{ 
  WDT.TCSRWD.BYTE=0x92;                         /* 追加分               */
  WDT.TCSRWD.BYTE=0x92;				/* 追加分    			*/
  monitor();                                    /* Goto Monitor Program */
}      

マイコンにはウォッチドックタイマと呼ばれるマイコンの暴走を検知する機能が備わっています。モニタを使用する場合これは邪魔なので、機能を停止させるためのコードを追加しました。H8/36064が搭載されているので、マイコンの種類を指定するために36064s.hに変更します。

リンケージ・サブコンド・ファイルを以下のようにカスタマイズします。 monitor.subを以下のように変更します。

INPUT      NORMAL,MONITOR
LIST       MONITOR.MAP
SHOW       SYMBOL
OUTPUT     MONITOR.MOT
FORM       STYPE
CHANGE     INFORMATION=1320
NOOPTIMIZE
LIBRARY    NORMAL,36064
LIBRARY    MONITOR
DEFINE     $BRR=17
DEFINE     $STACK=FF00
START      VECTOR/0,ROM/100,RAM/F780,USER/F840,SCI/FFA8

変更したのは8行目と10行目です。8行目はマイコンの指定、10行目に通信速度を指定します。参考書p.230に記載されています。

書き換えたらメニューバーからビルドします。ビルドとは、マイコンが実行可能なプログラムに変換することです。ビルドは多少時間がかかりますのでのんびり待ちます。下記のように出たらが完了です。

Build Finished
0 Errors, 0 Warnings

モニタプログラムの書き込み

マイコンのスイッチを押したまま電源を入れると書き込みモードで起動します。 デバイスマネージャーなど(windws10ならスタートを押した後そのままデバイスマネージャーなどと打って検索)でどのポートにつながっているか確認します。USBコネクタを抜き差ししながら確認してください。この場合はCOM3なのでポート3でした。

デバイスマネージャー

H8 Writerを起動して、C:300t\moniter\Release\MONITOR.MOT、COM3を指定して書き込みを行います。

H8 Writer

本との差異について

モニタプログラム専用通信ソフトHtermは配布が終了していたので、参考本に記載されているシリアルコンバータVS-WRC003LV とHtermはインストールしませんでした。

サンプルプログラムのテスト走行

VS-WRC003LV -ヴイストン株式会社からサンプルプログラムをダウンロードできます。zipファイルを解凍し、ドキュメントなど好きなフォルダに張り付けてください。 HEWを起動し、ワークスぺースを開くから先ほど保存したフォルダの中からhwsファイルを開きます。バージョンが異なる場合何か聞かれますが、すべて「OK」です。

サンプルプログラムを開く

メニューバーのビルドから一番上の[H8S,H8/300 Standard Toolchain..]を選択してコンパイラ、リンカなどを設定します。

相対パスはCustom directory、ディレクトリに各 CPU 用のインクルードファイルがあるiodefine フォルダのパスを設定し、OKを押します。このサブディレクトリは各自のPCで必ず確認してください。私の場合はC:\Program Files (x86)\Renesas\Hew\System\Pg\Renesas\H8\H8_7_0\Generate\iodefineを指定しました。

(追記)あとからビルドのインクルードファイル設定を変更する場合

ビルド→RX Standard Toolchain→コンパイラタブ→オプション項目(S)からインクルードファイルディレクトリを選択(Custom directoryから、iodefineを指定。私はC:\Program Files (x86)\Renesas\Hew\System\Pg\Renesas\H8\H8_7_0\Generate\iodefine)→追加ボタン

wirter \WRC003LV_SampleProject_MOTOR_20100826_0926\FILES\Debugの中の.motを開きます

参考

LED点滅

ビルドからすべてをビルドします。pdfの通りにやるとデバックの体験のために必ずerrorを吐きます。 36064S.hの一行目を削除します。保存してすべてをビルド。このとき、保存が拒否されることがありますが、その場合はHEWの起動を右クリック/その他から管理者権限で行ってください。0 Errors, 0 Warningsと出ればOKです。

1: void main(void)
2: {
3:   //制御周期の設定[単位:Hz 範囲:30.0~]
4:   const BYTE MainCycle = 60;
5:
6:   Init((BYTE)MainCycle); //CPU の初期設定
7:   //I2C_init(void); //IXBUS 初期化
8:
9:   //ループ
10:   while(1){
11:     LED(1); //緑の LED 点灯
12:     Wait(1000); //1000msec 待つ
13:     LED(2); //オレンジの LED 点灯
14:     Wait(1000); //1000msec 待つ
15:   }
16: }

VS-WRC003LV -ヴイストン株式会社のページで配布されているLED点滅サンプルコードより引用。

再びH8 Writerを起動して今ビルドしたファイルを (C:\Users\user\Documents\HEW\WRC003LV_SampleProject_LED_20100826_0926\LED\Debug\LED.motなど)を指定します。すると、マイコンのLEDが交互に点滅します。wait関数の引数を1000から500に帰ると点滅が早くなります。

書き込み

雑記

使っているのはDCモーターなので動かすのは簡単そうです。来週やってみようと思います。今後これを使ってなにをしようかな。センサを増やしてフィードバック制御出来たらうれしいですね。

追記(2019/4/22):続編、あとからビルドのインクルードファイル設定を変更する場合について追記しました。

参考

これまで、ROSをラズパイにいれ、デバックしやすいようにエディタを用意し、Topicを軽く紹介しました。今回はその続きで、service,parameterに関しての記事です。

目次

  • はじめに
  • Service
  • Service のサンプルコード
  • service の動作
  • service の他の項目
  • Parameter
  • Parameter のサンプルコード
  • Parameter の動作
  • roslaunch
  • 雑記
  • 参考

はじめに

OSとは、ロボット開発を促進するミドルウェアで、特に取り上げる基本要素は以下の3つです。

  • Topic
  • Service
  • Parameter

これまでインストールやTopicについて書いてきましたので良ければ参考にしてください。ROSの詳細についても書いています。Ubuntuに入れた回でROSの理念の概要、Topicの回でROSの通信や構造について多少詳しく書いています。

また、この記事では参考本に沿ってやっていきます。サンプルコードとして記載したのは一部です。全文は本に載っているので参考にしてください。

参考本

Service

Topic回と同様に濃い青が実際に作るプログラム、薄い青がプログラムによって作られたもの、矢印がデータの流れを表しています。

serviceのイメージ図

serviceはNode間の1対1の双方向同期通信です。Topicは複数のNodeにmessageを送っていましたが、serviceは送ったデータを相手が受け取ったかどうかを知りたい場合などに使用します。

非連続的な通信であり、応答が終了すると通信の接続は切断されます。

serviceのサンプルコード

tutorial_serviceを作成します。依存パッケージはmessage_generation , roscpp, std_srvs です。

service_server.cpp

int main(int argc, char **argv){
  ros::init(argc, argv, "service_server");
  ros::NodeHandle nh;
  ros::ServiceServer srv = nh.advertiseService("say_hello", serviceSayHello);
  ros::spin();
  return 0;
}

service_serverノードは、"say_hello"サービスを提供し、コールバック関数serviceSayHelloを呼び出します。 serviceSayHelloはコンソールで"Hello World"と言うだけの関数ですので、カットしました。 ros::spin関数で永遠にコールバックを待機させています。

service_client.cpp

int main(int argc, char** argv)
{
  using std_srvs::Empty;
  ros::init(argc, argv, "service_client");
  ros::NodeHandle nh;
  ros::ServiceClient cli = nh.serviceClient<Empty>("say_hello");
  Empty args;
  bool ret = cli.call(args);
  if(ret) ROS_INFO("Sucess");
  else ROS_INFO("Failure");
  return 0;
}

service_clientノードは、"say_hello"サービスを利用するクライアントです。 ros::ServiceClient::callでサービスビスを呼び出し、戻り値をうけとり、呼び出しの成否をbool型retで受け取ります(ちょっと自信無いですが)。 成功した場合はコンソールで"Sucess"と表示します。"成功"は正しくは"Success"ですが、綴りを間違えました。

CMakeListでservice_server,service_clientノードを指定し、ビルドします。

serviceの動作

serviceの動作

以下のように表示されてますね(Sucess は Successです)。

  • Client ->Sucess
  • Server ->Hello World

ノードの様子を確認します。グラフを表示するときには以下のようにコマンド入力します。

$rosrun rqt_graph rqt_graph
tutorial_service動作中のノード

service_serverノードが起動されていることがわかります。serverしか表示されないみたいですね。

Serviceの他の項目

  • 独自型
  • 非同的な使用方法 actionlib

actionはサービスに似た双方向非同期通信です。目標(Goal)、結果(Result)、中間結果(Feedback)で構成されます。 要請から応答までの時間が長い場合や処理中に中間結果が必要な場合に利用されます。

parameter

parameterのイメージ図

ParameterはROSに用意されている設定ファイルに当たる機能です。変数とデフォルトが設定されます。 実機の設定値を決定するのは大変ですが、parameterを利用すると、毎回ソースファイルから変更する手間を省くことができます。

parameterのコード

tutorial_paramパッケージを作成します。依存パッケージはroscppだけです。

param_test.cpp

int main(int argc, char **argv)
{
    ros::init(argc, argv, "param_test");
    ros::NodeHandle nh;
    std::string text = nh.param<std::string>("text", "Hello World");
    int repeat_times = nh.param<int>("repeat_times", 10);
    double frequency = nh.param<double>("frequency", 0.5);
    ros::Rate loop_rate(frequency);
    for(int i = 0; i < repeat_times; i++){
        ROS_INFO("%s", text.c_str() );
        loop_rate.sleep();
    }
    return 0;
}

パラメータの登録とコンソールへの表示を指示しています。

ros::NodeHandle::paramでパラメータを登録します。text,repeat_time,frequencyを指定し、第一引数の名前のParameterがParameter Server上にない場合、第2引数で与えた値を引数に返すように設定します。

param_testノードを作成してビルドします。

parameterの動作

Parameterの動作
  • text ->"Hello World"
  • repeat_times -> 10回
  • frequency -> 0.5Hz

Parameterを指定せずに実行すると、それぞれが指定されていないのでparam_test.cppで記述した通りの規定値(デフォルト)で実行されました。

tutorial_paramのノード

Parameterの登録

以下のようにコマンドを入力すると、Parameter test,5回,2Hzで実行されます。

$ rosparam set /text "Parameter test"
$ rosparam set /repeat_times 5
$ rosparam set /frequency 2.0
$ rosrun tutorial_param param_test

この設定ファイルを外部に保存する場合dump、書き込む場合load機能を実行します。

$rosparam dump ~/params.yaml

作成されたファイルは以下のようになっています。

frequency: 2.0 //記述した部分
repeat_times: 5 //記述した部分
rosdistro: 'melodic

  '
roslaunch:
  uris: {host_ubuntu__38799: 'http://ubuntu:38799/'}
rosversion: '1.14.3

  '
run_id: 74601454-52ee-11e9-94d4-000c2958b845
text: Parameter test //記述した部分

roscoreを再起動すると、これらのパラメータが起動していない状態になりますが、loadするとパラメータが復元できます。

$ rosparam load ~/params.yaml
inomata@ubuntu:~/catkin_ws/src/tutorial_param$ rosparam list
/frequency
/repeat_times
/text
~省略(重要部分のみ表記)~

roslaunch

rosrun以外でノードを起動する方法にroslaunchがあります。roslaunchは複数のノードを実行するときなどに使用される機能です。

tutorial_paramパッケージ内にlaunchディレクトリを作成し、launchファイルを作成し、node,parameterを記述します。

param_test.launch.txt

<?xml version="1.0"?>
<launch>
    <node pkg="tutrial_param" type="param.test" name="param.test" output="screen" />
    <param name="text" value="parameter test" type="string" />
    <param name="repeat_times" value="5" type="int" />
    <param name="frequency" value="2.0" type="double" />
</laaunch>

roslaunchを実行します。roscoreを事前に起動しておかなくてもlaunchと同時に起動します。以下のように使用します。

$roslaunch [パッケージ] [launchファイル]
$roslaunch tutorial_param param_test.launch 
... logging to /home/inomata/.ros/log/74601454-52ee-11e9-94d4-000c2958b845/roslaunch-ubuntu-14888.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://ubuntu:42297/

SUMMARY
========

PARAMETERS
 * /frequency: 2.0
 * /repeat_times: 5
 * /rosdistro: melodic
 * /rosversion: 1.14.3
 * /text: parameter test

NODES
  /
    param_test (tutorial_param/param_test)

ROS_MASTER_URI=http://localhost:11311

process[param_test-1]: started with pid [14912]
[ INFO] [1553954248.157679236]: parameter test
[ INFO] [1553954248.658104672]: parameter test
[ INFO] [1553954249.158001451]: parameter test
[ INFO] [1553954249.658660154]: parameter test
[ INFO] [1553954250.157878784]: parameter test
~省略~
shutting down processing monitor complete done 

このように、launchファイルの設定が読み込まれるので、パラメータの設定や動作のログの保存が簡単にできます。 以下のようにしてノードを複数作成することもできます。

<?xml version="1.0"?>
<launch>
    <node pkg="tutorial_param" type="param_test" name="param_test1" output="screen" >
        <remap from="text" to="param_test1/text" />
        <remap from="repeat_times" to="param_test1/repeat_times" />
        <remap from="frequency" to="param_test1/frequency" />
        <param name="text" value="parameter test1" type="string" />
        <param name="repeat_times" value="5" type="int" />
        <param name="frequency" value="2.0" type="double" />
    </node>
    <node pkg="tutorial_param" type="param_test" name="param_test2" output="screen" >
        <remap from="text" to="param_test2/text" />
        <remap from="repeat_times" to="param_test2/repeat_times" />
        <remap from="frequency" to="param_test2/frequency" />
        <param name="text" value="parameter test2" type="string" />
        <param name="repeat_times" value="10" type="int" />
        <param name="frequency" value="1.0" type="double" />
    </node>
</launch>

実行結果

$roslaunch tutorial_param param_test_multi.launch 
                  ~省略~
process[param_test1-2]: started with pid [16453]
process[param_test2-3]: started with pid [16461]
[ INFO] [1553955293.937496298]: parameter test2
[ INFO] [1553955293.950236042]: parameter test1
[ INFO] [1553955294.448465352]: parameter test1
[ INFO] [1553955294.922201847]: parameter test2
[ INFO] [1553955294.930736280]: parameter test1
[ INFO] [1553955295.430756405]: parameter test1
[ INFO] [1553955295.921917747]: parameter test2
[ INFO] [1553955295.930332254]: parameter test1
[param_test1-2] process has finished cleanly
log file: /home/inomata/.ros/log/2a93dc86-52f6-11e9-94d4-000c2958b845/param_test1-2*.log
[ INFO] [1553955296.921807747]: parameter test2
[ INFO] [1553955297.921376642]: parameter test2
[ INFO] [1553955298.922054324]: parameter test2
[ INFO] [1553955299.922576736]: parameter test2
[ INFO] [1553955300.921124094]: parameter test2
[ INFO] [1553955301.921790482]: parameter test2
[ INFO] [1553955302.921487235]: parameter test2
[param_test2-3] process has finished cleanly
~省略~
done

雑記

ROSシリーズはなんの独自性もない記事になってしまい、反省してます。ラズパイにモータを取り付けるか、Scamperを動かしてもう少し面白い記事にしていきます。

参考