ROS----ROSSerial的使用


OS: ubuntu 16.04

ROS:kinetic

1.安裝arduino  sudo apt-get install arduino

2.安裝ros包  sudo apt-get install ros-kinetic-rosserial-arduino

sudo apt-get install ros-kinetic-rosserial

3.設置arduino的SketchBook,將ros_lib弄進去,關於SketchBook的文件目錄,在File->Preferences

也可以自己定義該目錄.

cd <sketchbook>/libraries 如果沒有libraries目錄,自己創建這個目錄就可以啦,如果里面已經包含ros_lib目錄,請使用rm -rf ros_lib ,防止發生沖突.
rosrun rosserial_arduino make_libraries.py .   用來生成ros_lib庫,(注意使用.,當前目錄)

 

 由於ubuntu下截圖不怎么好用,就用了官網的圖,道理是一樣的。可以依據這些demo來制作ardunio下的節點,和服務。

關於arduino IDE的串口鏈接,在 Tools->Serial Port下,選材/dev/ttyACM×(× 可能是0,1,2,3...)

關於brltty和Arduino之間沖突,但在unbuntu 16.04下沒什么影響,在Tools->Serial Port 依然可以看到/dev/ttyACM*,並且成功燒入。

並不是一定要卸載brltty,這個我覺得要實際試過才可以這么說.

rosrun rosserial_python serial_node.py /dev/ttyACM* 用來啟動rosserial節點。

跑的時候,如果arduino 串口監聽,rosserial一起啟動,經常導致串口異常,導致串口插拔,才可以重新使用。
這個問題,比較不好理解,linux串口非獨占的。目前還在解決中。

由於linux串口的跳動,必須固定串口。

 

lsusb 可以查看當前的usb口。

當然也可以用dmesg

可以查看具體的設備。我覺得用arduino 的serial port看起來更合理點。

如果當前arduino的串口好是/dev/ttyACM0,

使用udevadm info /dev/ttyACM0 查看串口的具體信息。

這中方式查看我覺得不是很好,就使用lsusb -vv

可以看得更清楚

可以清楚的看到 idVendor 和idpProduct,這兩個是自定義串口的重要參數。

 

根據這些信息重寫串口設備命名規則,采用Linux的udev來自定義規則來管理設備名稱

(1)https://unix.stackexchange.com/questions/66901/how-to-bind-usb-device-under-a-static-name?noredirect=1&lq=1

具體步驟如下。

/etc/udev/rules.d/10-local.rules

修改這個文件,我發現不存在這個文件(ubuntu 16.04),那么我 touch 10-local.rules (其實這個文件名可以隨便定義,但是畢竟不是太了解,所以按照Q&A來做,防止無法復現)

接着 根據查詢的idVendor 和idpProduct

ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="MyAruduino"添加到10-local.rules文件中
udevadm info -a -p $(udevadm info -q path -n /dev/ttyACM0)

然后重啟電腦。

但發現Arduino IDE中顯示的還是/dev/ttyACM0,所以我覺得直接使用cutecom串口調試工具來使用.

cutecom -> sudo apt-get install cutecom(安裝)

Device:直接寫/dev/MyArduino ,下拉是無法選擇的,

我在Arduino中寫serial.write("ggg"); 在cutecom中已經顯示數據,說明可用。

有一點要說明,當你直連Arduino的燒入線的時候,/dev/ttyACM0,當你用擴展板的是/dev/ttyUSB*.(這個是有區別的)。

 

至於ROSSerial其他的問題,必須在長期使用中慢慢積累。

 

(2接下來詳細的使用ROSSerial

開啟 一個console  : roscore

再重新開起一個console

 

再開起一個console :

rostopic pub [topic] [msg_type] [args]

當跑一段時間,Serial_node就會報錯(無法同步),關於這個問題,

我覺的是我開啟來Ardunio IDE 的Serial Monitor.所以我關閉Ardunio IDE的Serial Monitor,發現沒有出現這個錯誤。(大概測試來半個小時)

雖然說linux 串口是非獨占的,但同時使用可能會導致無法同步的問題,這樣的話對於調試感覺很麻煩。

所以在Arduino 中加來發布代碼,在rostopic中看是否接受正確,以下是Arduino代碼:

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

ros::NodeHandle  nh;
std_msgs::String str_msg;
ros::Publisher ServoPub("ServoPub", &str_msg);
void servo_cb( const std_msgs::String &cmd_msg)
{
  str_msg =cmd_msg;
  ServoPub.publish(&str_msg);
  nh.spinOnce();
  delay(1);
}

ros::Subscriber<std_msgs::String> sub("ServoControl", servo_cb);

void setup()
{

  nh.initNode();
  nh.advertise(ServoPub);
  nh.subscribe(sub);
}

void loop()
{
  nh.spinOnce();
  delay(1);

}

接着啟動 :  rosrun rosserial_python serial_node.py /dev/MyArduino

接着: rostopic echo ServoPub
接着發布消息:rostopic pub ServoControl std_msgs/String 'gg'

下圖是接受到的數據:

接受到publish 的String消息.

 以上就是rosserial的一些基本使用,如果有新的內容繼續更新。

 

 

 




 

 

 

 
        

 

 

 

 

 





 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM