arduino
[ROS Beginner實作 : Arduino篇] 主題2 : Hello World, 創建 Publisher
一、簡介
"Hello World" 的範例程式碼可從 Arduino IDE >> File >> Examples >>ros_lib中找到,名稱為"HelloWorld"。如下圖 :
二、範例程式成果與解說
(一)、完整程式碼
(二)、執行畫面
指令>>
$ rosrun rosserial_python serial_node.py /dev/ttyUSB0
或
$ rosrun rosserial_arduino serial_node.py _port:=/dev/ttyUSB0
備註 : 如果顯示非 ttyUSB0,則 ttyACM0 也可以。
(三)、程式碼解說
1.關於Arduino USB Port
// Use the following line if you have a Leonardo or MKR1000
//#define USE_USBCON
解說 : 因為 Arduino Leonardo or MKR1000的USB port和其他Arduino的板子不同,為了避免資料傳輸上的錯誤,必須要加上 #define USE_USBCON。
2.必備的ROS標頭檔
#include <ros.h>
#include <std_msgs/String.h>
解說 :
ros.h 標頭檔包含了標準 ROS 類別,每支 ROS 程式都要 include 此標頭檔。
std_msgs/String.h 標頭檔定義了 ROS message 相關資訊。
因此,以上2個標頭檔為撰寫ROS程式所必須 include 的標頭檔。
3. 節點處理器
ros::NodeHandle nh;
此行程式在ROS wiki中是表示將node hadle 實例化,我的理解為可將此程式視為宣告一個 ROS 節點管理器,管理之後程式所創建的 publishers 和 subscribers。同時也會具備管理序列通訊埠的功能。
4. 創建 Publisher
std_msgs::String str_msg;
ros::Publisher chatter("chatter", &str_msg);
char hello[13] = "hello world!";
我們創件的 publishers 和 subscribers 也需要被實例化。此處,我們建立的Publisher,賦予 "chatter" 的topic名稱。
接著利用 char hello[13] 的程式碼 ,宣告一個名為 hello 的字元陣列,內容為 "hello world!"
5. 節點初始化
void setup()
{
nh.initNode();
nh.advertise(chatter);
}
在 Arduino 的 setup() 函式中,功能是設定程式參數,在此是對 ROS node handle 初始化。發布或訂閱 topic 也會在此處做設定,此處程式碼為 " nh.advertise(chatter); "。
6.發布節點內容
void loop()
{
str_msg.data = hello;
chatter.publish( &str_msg );
nh.spinOnce();
delay(1000);
}
loop()函式的功能是設定不斷執行的動作。此處的動作為讓節點發布 "Hello World" 的資料。
spinOnce為處理節點訂閱話題的所有回調函式。spinOnce 和 spin的差別在於,前者呼叫後會繼續執行後面的程式,而後者則執行到這就部會再執行下去。也就是spinOnce會一直呼叫,而spin只會呼叫一次。
delay(1000)則為1秒鐘執行一次。
---
參考資料 :
0 留言