arduino
[ROS Husky主題實作] 單元6 : 讓 Husky 動起來的利器 - ROSSERIAL 和 ARDUINO
一、前言
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
安裝完畢後執行 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 的套件庫中。
補充 :
讓普通帳戶也能加入 "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
步驟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發動作訊息
<source : clearpathrobotics>
如上圖,給數位腳位pin8 "High"的訊號,Husky 會前進。給數位腳位pin4 "High"的訊號,Husky 會後退。
此技巧是利用寄生電容的現象。或許這不是一個非常可靠的方法,但對於最少的設備來實現這個簡單的例子是綽綽有餘。
若在移動模擬Husky上遇到任何困難,可試著使用以下指令來確認當你接觸腳位時,實際上被傳送的指令有哪些。
rostopic echo /husky/cmd_vel
若還想了解更多rosserial相關資訊,可見參考資料。
---
參考資料 :
- clearpathrobotics : DRIVING HUSKY WITH ROSSERIAL AND AN ARDUINO
- ROS.org : rosserial
- Ubuntu 串口權限問題
- 維基百科 : 寄生電容 (Parasitic capacitance)
#ROS #rosserial #Arduino #husky #launch
0 留言