一、簡介


"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 留言