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