<source : unsplash>

一、前言

Arduino 簡單易上手,廣受makers(創客們)的歡迎,然而在ROS機器人開發上,仍須仰賴一個通訊協議來讓這些嵌入式系統,如Arduino,可以和電腦溝通。這就是 "rosserial" 誕生的理由了!"rosserial"是一種在序列通訊上用來傳遞ROS訊息的通用通訊協議,像是 UART on Arduino。有了 "rosserial" ,幫助開發者在ROS開發世界中,更容易控制安裝在 Arduino 上的各種感測器。

接下來,我們將實作如何設定 Arduino IDE 並安裝 "rosserial" 套件,並使用 Arduino 來驅動 Husky 模擬進行測試。若尚未安裝 Husky 模擬器,可參考這篇文章<連結>。


二、安裝步驟

步驟1.在terminal中輸入安裝 Arduino IDE 和 rosserial 指令

sudo apt-get install arduino arduino-core ros-kinetic-rosserial ros-kinetic-rosserial-arduino
ros-kinetic-rosserial

安裝完畢後執行 arduino。你可以點擊 "search your computer"的圖示,在搜尋框中輸入 " a ",下方就會出現 Adruino IDE 的圖示,接著點擊執行。


接著會出現一個 Arduino Permission Checker 的對話框,直接點擊 "Add"。


輸入密碼,按下 "Authenticate"。



備註 : 請留意,安裝完畢後,必須要執行 Arduino IDE,才會生成一個名為 "sketchbook"的資料。後續的套件也會安裝於此。

步驟2.將 rosserial 載入到 Arduino IDE


先檢視"sketchbook"資料夾,若"sketchbook"資料夾是空的,則在裡面建立一個名為 "libraries" 的資料夾。

進入"sketchbook"的"libraries"資料夾
cd ~/sketchbook/libraries

若"sketchbook"資料夾是空的,則在裡面建立一個名為 "libraries" 的資料夾。
mkdir ~/sketchbook/libraries

進入 "libraries"資料夾
cd ~/sketchbook/libraries

接著將 rosserial 載入到 Arduino IDE中。
rosrun rosserial_arduino make_libraries.py .
請留意到此行指令最後還有一個"點",勿忘,請見下圖。


步驟3.重啟 Arduino IDE

重啟後,你會看到 ros_lib 在 Arduino 的套件庫中。

ros-kinetic-rosserial-arduino


補充 :

讓普通帳戶也能加入 "Dailout"群組,獲得訪問 /dev/ttyS* 設備的權限,指令如下 :
groups "username”
若沒看到 "dailout",可輸入以下指令 :
sudo gpasswd --add "username" dialout



為了讓後續開發作業更輕鬆,可藉由創建 udev 規則,所以當 Arduino 插入時,將會被賦予正確的權限。

如果使用虛擬機,當Arduino插入時,在選單上也要進行相關設定來連接Arduino。如下圖 :




確認系統是否與 Arduino 連線可輸入以下指令 :
---------------------------------------------
ls -l /dev
若連線成功,可看到類似以下訊息 :
Bus 002 Device 005: ID 2341:0043
---------------------------------------------

以上是clearpathrobotics官網的原始內容,然而經我實作後,並未出現以上訊息。因此指令要修改成以下指令後,就能見到所需的訊息。 

lsusb  或是 ls -l /dev/ttyACM0

從termainl中,我們得知 2341 是 vendor ID,0043 是 product ID。那麼來檢視一下 udev 規則。
cd /etc/udev/rules.d/


接著創建新的檔案規則,命名的傳統規則遵循 “##-name.rules”。先選擇一個尚未使用的號碼。
sudo gedit 97-arduino.rules


將以下內容複製到新規則,用你的product ID和vendor ID取代####。更多關於 udev 的資訊,請見 單元5
SUBSYSTEMS=="usb", ACTION=="add", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="00[0-f][0-f]", MODE="0666", SYMLINK+="arduino arduino_$attr{serial}", GROUP="dialout",

剩下要做的就是更新你的 udev 規則,並且重啟系統
sudo udevadm control --reload-rules && sudo service udev restart && sudo udevadm trigger



如果你沒重啟系統,arduino 檔案權限並未有改變,如下圖。



重啟系統後,如下圖,你會看到 “arduino” 的接口,已擁有一個完全的權限(rw-rw-rw-)。


三、驅動Husky

步驟1. 上傳程式到 Arduino

#include <ArduinoHardware.h>
#include <ros.h>
#include <geometry_msgs/Twist.h>

ros::NodeHandle nh;

geometry_msgs::Twist msg;

ros::Publisher pub("husky/cmd_vel", &msg);

void setup()
{
 nh.initNode();
 nh.advertise(pub);
} void loop()
{
 if(digitalRead(8)==1)
 msg.linear.x=-0.25;

else if (digitalRead(4)==1)
msg.linear.x=0.25;

else if (digitalRead(8)==0 && digitalRead(4)==0)
msg.linear.x=0;

pub.publish(&msg);
nh.spinOnce();
}

完成程式後,接下來就是將程式碼上傳到 Arduino 板子上。若遇到任何錯誤,用 "ls -l"的指令確認 Arduino 被賦予的權限。你也必須要將 Arduino IDE 指向正確的USB連接埠 (選單 : tools >> serial port)。

步驟2. 啟動 husky 的 launch檔 

承上步,Arduino能發布速度指令,因此我們要將這些訊息傳送到我們的ROS環境,輸入以下指令開啟 husky的相關設定 :
roslaunch husky_gazebo husky_empty_world.launch

步驟3. 將 Arduino 與 ROS環境連接

rosrun rosserial_python serial_node.py _port:=/dev/arduino

步驟4. 用Arduino發動作訊息



如上圖,給數位腳位pin8 "High"的訊號,Husky 會前進。給數位腳位pin4 "High"的訊號,Husky 會後退。

此技巧是利用寄生電容的現象。或許這不是一個非常可靠的方法,但對於最少的設備來實現這個簡單的例子是綽綽有餘。

若在移動模擬Husky上遇到任何困難,可試著使用以下指令來確認當你接觸腳位時,實際上被傳送的指令有哪些。

rostopic echo /husky/cmd_vel

若還想了解更多rosserial相關資訊,可見參考資料。


---
參考資料 :

0 留言