Arduino開發闆經常用于制作一些小型的機器人,并具有簡單的邏輯定義控制。但是,由于闆載計算能力和軟體有限,開發人員常常無法更新到更複雜的機器人。通常,随着開發人員變得越來越有經驗,他們會尋找專門用于機器人的軟體,因為Arduino僅提供部分控件。
在本篇文章中,我們主要介紹了中間件軟體架構Robot Operating System(ROS),并引導您通過Arduino設定和使用ROS來建立更智能的機器人系統。
什麼是ROS?
機器人作業系統(ROS)是最流行和使用最廣泛的機器人中間件軟體架構之一。這是一個開放源代碼平台,可幫助創客和開發人員在無需重新發明輪子的情況下開始使用機器人軟體。ROS提供了一種标準的通信體系結構,用于無縫內建、使用、開發和部署機器人系統的不同元件,包括控制、感覺、計劃等。這是一個與語言無關的平台,無論部署在何處,都可以為不同的計算機提供跨平台的通信支援。
Arduino可能是最常用的開源微控制器開發闆,它提供了易于使用的軟體-硬體界面以及不斷擴充的使用者社群。Arduino幾乎與所有數字和模拟電路以及支援串行通信接口(如SPI、I2C和UART)的外部裝置相容。
基于ROS的軟體架構運作進階算法和流程,例如機器人模型的推理、過濾、運動政策生成、控制器算法等。安裝在機器人上的Arduino控制器用于執行低級/嵌入式控制和傳感。它包括、電動機控制、溫度和超聲傳感器、IMU和車輪編碼器以及其他裝置。
ROS-Arduino互動管道
ROS與Arduino之間的通信
ROS通信子產品基于自定義的TCPROS協定進行操作,使用兩種方式:多對多釋出者-訂閱者方法和點對點更快服務方法。本篇文章使用釋出者/訂閱者在Arduino開發闆和機器上運作的ROS之間進行通信。
rosserial ROS軟體包使用Arduino的通用異步接收器/發送器(UART)通信,并将開發闆轉換為ROS節點,該節點可以釋出ROS消息,也可以訂閱消息。Arduino ROS節點釋出者可以從闆上将資料(從傳感器或機器人狀态)發送到運作ROS的機器,而Arduino ROS節點訂閱者可以從機器擷取指令。ros_lib Arduino庫使Arduino開發闆能夠與ROS通信。
建立基礎架構
軟體設定
1. 在計算機(筆記本電腦/ PC)上安裝ROS。此處提供詳細步驟。注意:這可以在Linux機器上運作的ROS 1。
2. 在計算機上安裝rosserial(發行版可以是kinetic/indigo/melodic)。
sudo apt-get install ros--rosserialsudo apt-get install ros--rosserial-arduino
3. 根據此處提到的說明在計算機上安裝Arduino IDE。
4. 在IDE中安裝ros_lib軟體包。
a. 安裝軟體包的最簡單方法是使用Arduino IDE。導航到IDE中的Sketch > Include Library > Manage Library,然後搜尋rosserial軟體包
下拉菜單搜尋新的Arduino軟體包
b. Arduino IDE将所有外部庫存儲在〜/ Arduino / libraries檔案夾位置下。它将這些庫加載到開發環境中,并且可以在IDE中看到。安裝後,可以在下拉清單中看到Rosserial Arduino庫。
外部庫顯示在清單中
C. 安裝後,應該在IDE中看到示例草圖。
庫中的可用示例草圖
硬體設定
我們使用簡單的設定将Arduino開發闆用作釋出者和訂閱者。
1. 釋出者:一個按鈕連接配接到Arduino開發闆上,并且被切換以通過ROS将數字高/低信号發送到機器。該消息顯示在機器的終端中。
2. 訂閱者:一個LED連接配接到Arduino開發闆上,并使用通過終端從ROS使用者那裡獲得的指令來打開/關閉LED。
硬體連接配接
代碼和說明
Arduino代碼
#include #include #include #define BUTTON 8#define LED 13ros::NodeHandle node_handle;std_msgs::String button_msg;std_msgs::UInt16 led_msg;void subscriberCallback(const std_msgs::UInt16& led_msg) { if (led_msg.data == 1) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); }}ros::Publisher button_publisher("button_press", &button_msg);ros::Subscriber<:uint16> led_subscriber("toggle_led", &subscriberCallback);void setup(){ pinMode(LED, OUTPUT); pinMode(BUTTON, INPUT); node_handle.initNode(); node_handle.advertise(button_publisher); node_handle.subscribe(led_subscriber);}void loop(){ if (digitalRead(BUTTON) == HIGH) { button_msg.data = "Pressed"; } else { button_msg.data = "NOT pressed"; } button_publisher.publish( &button_msg ); node_handle.spinOnce(); delay(100);}
代碼說明
該代碼導入了ros_lib庫和std_msgs :: String和std_msgs :: UInt16的标準ROS消息。聲明了用于存儲ROS資料類型和Arduino闆引腳的變量。
該代碼聲明了一個名為button_publisher的釋出者,該釋出者将std_msgs :: String資料類型的button_msg釋出到button_press主題。同樣,名為led_subscriber的訂閱者訂閱了toggle_led主題,該主題擷取std_msgs :: UInt6資料類型。
聲明ROS節點句柄,然後在setup()方法中對其進行初始化。節點句柄為釋出者做廣告,并訂閱該主題。
SubscriberCallback()是在Arduino訂閱者節點上接收資料時調用的方法。回調方法檢查ROS主題資料是否為HIGH,并相應地切換連接配接的LED。
最後,loop()方法運作一個無限循環,并從按鈕中讀取資訊并将其釋出到ROS。節點句柄調用spinOnce()來處理通信。
程式執行
通過USB電纜将Arduino Uno開發闆連接配接到筆記本電腦,并确認該闆出現在Arduino IDE的可用串行端口清單中。編譯代碼,選擇闆子類型并将其上傳到開發闆。
上載代碼後,在機器的終端上執行以下指令。
1. 啟動ROS Master-roscore
2. 在計算機上運作rosserial用戶端-rosrun rosserial_python serial_node.py / dev / tty
3. 在運作時确定ttyUSB或ttyACM的串行端口。可以從Arduino IDE或使用dmesg | grep tty找到确切的端口号。
4. 讀取是否按Arduino闆上的按鈕傳回的已釋出資料-rostopic echo button_press
5. 釋出資料以切換Arduino上連接配接的LED-rostopic pub toggle_led std_msgs / UInt16“ data:0”資料為“ 0”關閉LED,“ 1”打開LED。
使用多個終端頁籤執行指令并在同一螢幕上觀察響應
rosserial提供了一個非常标準的平台,允許創客和開發人員在Arduino和ROS之間無縫連接配接。它可以使用兩種非常著名和有用的技術來探索機器人技術的新機遇。這種方法允許以非常低的成本為機器人系統提供分布式計算、集中控制、控制抽象以及其他一些好處。
歡迎打賞+點贊+留言+轉發!
更多内容請點選“” 》》