發表於

透過 LED 燈的明亮,通常是入門 Arduino 的第一步,只要在指定腳位輸入 High、Low的訊號,就可以很簡單地看到成果。因此,控制LED自然也成為從ROS出發來控制Arduino板的第一步.

1.連線準備

使用裝備:

  • ASUS筆電win10 VM ubuntu
  • Arduino

2.測試架構: 

3.上傳程式

程式碼如下:

#include <ros.h>
#include <std_msgs/Empty.h>

ros::NodeHandle nh; //
  
void messageCb( const std_msgs::Empty& toggle_msg){
    digitalWrite(13, HIGH-digitalRead(13));
    delay(3000);  
    digitalWrite(13, HIGH-digitalRead(13));
}
  
ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb );
  
void setup()
{
    pinMode(13, OUTPUT);
    nh.initNode();
    nh.subscribe(sub);
}
  
void loop()
{
    nh.spinOnce();
    delay(1);
}

程式鍵入後,上傳.

如跳錯誤訊息:

證明USB權限沒開.到命令字元鍵入 :

sudo chmod 666 /dev/ttyUSB0

/dev/ttyUSB0 是 接收USB資料位置,可到 arduino -> Tools -> Port 查詢

4.ROS架設初始化,命令字元鍵入:

roscore

5.ROS運行Arduino,命令字元鍵入:

rosrun rosserial_python serial_node.py /dev/ttyUSB0 _baud:=57600

如有報錯,有可能是USB權限沒開.上面有寫.

6.傳送訊息給arduino,命令字元鍵入:

rostopic pub toggle_led std_msgs/Empty --once

結果arduino的pin13腳位,閃3秒關閉

7.程式範列講解:

#include <ros.h>
#include <std_msgs/Empty.h>

ros.h 標頭檔包含了標準 ROS 類別,每支 ROS 程式都要 include 此標頭檔. 接著也需載入定義 message 的標頭檔,在此為 std_msgs/Empty.h,空的message.

ros::NodeHandle nh; //創建一個ros的節點

在系統內部,NodeHandle 維護著一個引用計數,且只有當第一個物件被宣告時才會通報 ROS Master 註冊一個新的節點。同樣地,當所有的 NodeHandles 都被關閉後,節點才會被取消註冊。

void messageCb( const std_msgs::Empty& toggle_msg){
    digitalWrite(13, HIGH-digitalRead(13)); 
    delay(3000);  //停(3000為3秒)
    digitalWrite(13, HIGH-digitalRead(13)); 
}

回調函式是節點訂閱消息(message)的基礎機制,當有消息到達時,會自動以消息的指標作為參數,再呼叫回調函式,完成對消息內容的處理。以上程式用來接收 Publisher 發布的 Empty 消息,讓 Arduino 板子的第13支腳位的 LED 閃爍 

HIGH-digitalRead(13)->13腳位如果是HIGH得LOW,如果是low就得HIGH

ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb );   

ros::訂閱者 <訊息rostopic pub /ardrone/takeoff std_msgs/Empty> 子(“name”,位置物件) . 訂閱節點首先須聲明訂閱的消息話題 (message topic),這些資訊會紀錄在 ROS Master中.Master會注意系統中是否存在發布該話題的節點,若存在,則會建立兩個節點的連接.

void setup()
{
    pinMode(13, OUTPUT);//設pin13為輸出
    nh.initNode();//初始化
    nh.subscribe(sub);//添加子節點
}
void loop()
{
    nh.spinOnce();//執行一次
    delay(1);//停1毫秒
}

結束~~~~

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>