#概要
前回,「athrillでLチカしてみる」において,仮想環境上で手軽にLチカを体験しました.
今回,これを mROS で試してみたいと思います.
※mROSについて詳しく知りたい方は,本家サイトを参照ください.
※https://qiita.com/takasehideki/items/7d783ecd605dcee29ee0
※https://qiita.com/m_ksg/items/0060a8738e6a34a0f237
#構成
今回のでデモでは,ROSのトポロジー構成を以下のようにしました.
led_node1とled_node2がmROS上で動作しており,WSL上のROSコマンド(rostopic)でLEDトグル用のトピック(led1_toggle, led2_toggle)を出版します.
#mROS アプリケーションプログラム
mROS上で動作するアプリケーションプログラムは以下の通りです.
##タスク側
void usr_task1(void)
{
syslog(LOG_NOTICE,"========Activate user task1========");
int argc = 0;
char *argv = NULL;
ros::init(argc,argv,"led2_node");
ros::NodeHandle n;
ros::Subscriber sub;
sub = n.subscriber("led2_toggle",1, Callback2);
ros::spin();
}
void usr_task2(void)
{
syslog(LOG_NOTICE,"========Activate user task2========");
int argc = 0;
char *argv = NULL;
ros::init(argc,argv,"led1_node");
ros::NodeHandle n;
ros::Subscriber sub;
sub = n.subscriber("led1_toggle",1, Callback1);
ros::spin();
}
##トピック購読コールバック関数側
void Callback1(string *msg)
{
sprintf(callback_buffer1, "I heard [%s]",msg->c_str());
syslog(LOG_NOTICE, "%s", callback_buffer1);
sample_program(DIGITAL_LED1);
}
void Callback2(string *msg)
{
sprintf(callback_buffer2, "I heard [%s]",msg->c_str());
syslog(LOG_NOTICE, "%s", callback_buffer2);
sample_program(DIGITAL_LED2);
}
##LEDトグル関数側
void sample_program(uint8 led_bit)
{
uint8 data = sil_reb_mem(DIGITAL_REG_ADDR);
if ((data & led_bit) != 0) {
data &= ~led_bit;
sil_wrb_mem(DIGITAL_REG_ADDR, data);
}
else {
data |= led_bit;
sil_wrb_mem(DIGITAL_REG_ADDR, data);
}
return;
}
#ソース配置場所
上記のアプリケーションプログラムは,以下で公開しています.
#デモ内容
それでは,実際にデモをしてみます.
デモ手順は以下の流れです.
- roscore コマンドで,ROSマスタを起動する
- athrill-run コマンドで,アプリケーションを起動する
- led コマンドで,仮想マイコン(athrill)の LED状態を表示する
- rostopic pub コマンドで,LED1 のトグル用トピックを出版する
- rostopic pub コマンドで,LED2 のトグル用トピックを出版する
#デモ
以下,上記手順で実施したデモ動画です.
#最後に
mROSは,マイコン上で動作するアプリケーションでも簡単に ROS を利用できるようにしてくれるありがたいOSS組込みミドルウェアです.
これを athrill 上でさらに手軽に使えるように,昨年末から開発を進めてきました.
今回の成果は,「athrill の Lチカの成果」と「上記の成果」を組みあわせたものです.
今後の展開としては,仮想環境上で動作確認したアプリケーションプログラムを実機に持っていき,同じようにLチカできるようにしてみたいと思います.
乞うご期待ください.