arduino
[ROS Beginner實作 : Arduino篇] 主題3 : Blink, 創建 Subscriber
<source : unsplash>
一、簡介
透過 LED 燈的明亮,通常是入門 Arduino 的第一步,只要在指定腳位輸入 High、Low的訊號,就可以很簡單地看到成果。因此,控制LED自然也成為從ROS出發來控制Arduino板的第一步。
二、範例程式成果與解說
(一)、完整程式碼
(二)、執行畫面
指令>>
$ rosrun rosserial_python serial_node.py /dev/ttyUSB0
備註 : 如果顯示非 ttyUSB0,則 ttyACM0 也可以。
然後再開啟另一個視窗,輸入以下指令,即可控制LED燈亮暗。
$ rostopic pub toggle_led std_msgs/Empty --once
最後,你會看到手指方向,LED燈亮起。若想讓LED燈熄滅,只要再輸入同樣( rostopic pub toggle_led std_msgs/Empty --once )指令即可。
(三)、程式碼解說
1.必備的ROS標頭檔
#include <ros.h>
#include <std_msgs/Empty.h>
ros.h 標頭檔包含了標準 ROS 類別,每支 ROS 程式都要 include 此標頭檔。
接著也需載入定義 message 的標頭檔,在此為 std_msgs/Empty.h,空的message
2.節點處理器
ros::NodeHandle nh;
為宣告一個 ROS 節點管理器,管理之後程式所創建的 publishers 和 subscribers。同時也會具備管理序列通訊埠的功能。
3.定義回調函式
void messageCb( const std_msgs::Empty& toggle_msg)
{
digitalWrite(13, HIGH-digitalRead(13)); // blink the led
}
回調函式是節點訂閱消息(message)的基礎機制,當有消息到達時,會自動以消息的指標作為參數,再呼叫回調函式,完成對消息內容的處理。以上程式用來接收 Publisher 發布的 Empty 消息,讓 Arduino 板子的第13支腳位的 LED 閃爍。
4. 創建 Subscriber
ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb );
訂閱節點首先須聲明訂閱的消息話題 (message topic),這些資訊會紀錄在 ROS Master中。Master會注意系統中是否存在發布該話題的節點,若存在,則會建立兩個節點的連接。
5.呼叫 Arduino 板
void setup()
{
pinMode(13, OUTPUT);
nh.initNode();
nh.subscribe(sub);
}
void setup...是啟動 Arduino 板的程式。 pinMode(13, OUTPUT)表示使用 Arduino 板子的腳位13做輸出,此處為LED。接下來的程式碼初始化節點與註冊subscriber。
6.定義處理狀態
void loop()
{
nh.spinOnce();
delay(1);
}
此部分的程式碼,定義讓節點進入循環狀態,當有消息到達時,會呼叫回調函式進行處理,處理時間為 1 毫秒。
---
參考資料 :
0 留言