ROS2與Arduino發佈訂閱

  • 2019 年 10 月 8 日
  • 筆記

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/ZhangRelay/article/details/101394537

Arduino直接從庫中安裝ros2arduino:

ros2arduino

然後,就可以在示例中打開代碼學習。

一個訂閱發佈代碼如下:

#include <ros2arduino.h>      #define XRCEDDS_PORT  Serial  #define PUBLISH_FREQUENCY 1 //hz    void publishString(std_msgs::String* msg, void* arg)  {    (void)(arg);      static int cnt = 0;    sprintf(msg->data, "Hello ROS2 From Arduino %d", cnt++);  }    class StringPub : public ros2::Node  {  public:    StringPub()    : Node("ros2arduino_pub_node")    {      ros2::Publisher<std_msgs::String>* publisher_ = this->createPublisher<std_msgs::String>("ros2_chatter");      this->createWallFreq(PUBLISH_FREQUENCY, (ros2::CallbackFunc)publishString, nullptr, publisher_);    }  };    void subscribeLed(std_msgs::Bool* msg, void* arg)  {    (void)(arg);      digitalWrite(LED_BUILTIN, msg->data);  }    class LedSub : public ros2::Node  {  public:    LedSub()    : Node("ros2arduino_sub_node")    {      this->createSubscriber<std_msgs::Bool>("ros2_led", (ros2::CallbackFunc)subscribeLed, nullptr);    }  };      void setup()  {    XRCEDDS_PORT.begin(115200);    while (!XRCEDDS_PORT);      ros2::init(&XRCEDDS_PORT);    pinMode(LED_BUILTIN, OUTPUT);  }    void loop()  {    static StringPub StringNode;    static LedSub LedNode;    ros2::spin(&StringNode);    ros2::spin(&LedNode);    }

代碼實現功能如下:

IDE

主題

Arduino發佈消息到主題ros2_chatter,並訂閱主題ros2_led。

使用如下命令控制LED燈:

點亮:ros2 topic pub /ros2_led std_msgs/msg/Bool "{data: 1}"

關閉:ros2 topic pub /ros2_led std_msgs/msg/Bool "{data: 0}"

思考題:如何實現LED閃爍?

LED閃爍(不修改代碼)

如何修改代碼實現?

  if(ledblink%2==1)      digitalWrite(LED_BUILTIN, 1);    else      digitalWrite(LED_BUILTIN, 0);      ledblink++;

對YAML不熟悉參考:YAML語法規則

接收到主題消息如下:

pubsub

直接用串口工具看到信息如下:

串口工具

ROS1和Arduino的示例,通過代碼移植完全適用與ROS2。

4年前(2015年12月)花費1周時間搭建的小車,同樣可以用ROS2實現。

之前案例鏈接:基於ROS_Arduino室內移動機械人SLAM實驗測試

基於ROS2_Arduino移動機械人cartographer(SLAM)小車,課程結束後發佈。

ros2cartographer參考:https://github.com/ros2/cartographer

Arduino使用說明參考:https://www.arduino.cc/en/Guide/ArduinoDue

下面詳細介紹一下如何使用ros2arduino:

必須安裝ROS2,必須安裝Micro-XRCE-DDS。

ROS2安裝可以參考:

1. (博客)https://blog.csdn.net/ZhangRelay/article/details/90695078

2. (文檔)https://blog.csdn.net/ZhangRelay/article/details/100774016

Micro-XRCE-DDS:

$ git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git  $ cd Micro-XRCE-DDS-Agent && git checkout v1.1.0  $ mkdir build && cd build  $ cmake ..  $ make  $ sudo make install  $ sudo ldconfig /usr/local/lib/

eProsima Micro XRCE-DDS

完整具體的eProsima Micro XRCE-DDS使用文檔參考:https://micro-xrce-dds.readthedocs.io/en/latest/index.html

這裡如果網絡不行,可能涼涼,推薦使用git代理。

git config –global http.proxy <address>:<port>

體驗飛一般的感覺。

如果想了解Fast-RTPS,參考eProsima Fast RTPS文檔:http://eprosima-fast-rtps.readthedocs.io/

如果想在ros1中使用arm版本的arduino:

1 第一個可行的解決方案。在Arduino Libraries目錄中的ArduinoHardware.h版本中,將第75行更改為:

iostream = &Serial;

可行,但無法使用Arduino其他開發板(例如Leonardo)

2 在包含ROS庫之前放置以下代碼

#define USE_USBCON

可行,但是,必須在每次使用DUE的情況下都添加它,而這容易忘記。

3 將第73行修改為:

#if defined(USBCON) and !(defined(USE_USBCON)) and !(defined(_SAM3XA_))

需修改位置

解決所有以前的問題,但是,如果另一個使用SAM3X …處理器的主板,會成為問題。

ros1與arduino

arduino完美支持ROS1和ROS2。

編譯和使用也會遇到各種各樣的小問題,都有成熟解決方案的,查找即可。

具體使用,ROS1略,ROS2。

  • Serial $ MicroXRCEAgent serial –dev /dev/ttyACM0 -b 115200
  • UDP $ MicroXRCEAgent udp -p 2018
  • TCP $ MicroXRCEAgent tcp -p 2018

ros2 arduino node topic


更多課程資料參考:機械人編程實踐-ROS2基礎與應用- https://blog.csdn.net/ZhangRelay/article/details/101351969