好久以前我寫過這麼一篇博客,當時是爲了單獨控制機械臂夾爪。前些天突然發現我一直都弄錯了,我以爲我用的是ros_arduino_bridge,事實上我用的是rosserial_arduino。
這是當初的標題,現在已經改掉了,文章鏈接在此。
這篇博客會先提一下在ros中使用ros_arduino_bridge和rosserial_arduino控制舵機的區別,在寫一個ros_arduino_bridge控制舵機的例子。
目錄
一、ros_arduino_bridge和rosserial_arduino控制舵機的區別
正文
github連接:https://github.com/zhangjiali1201/ros_arduino_servo(未完)
一、ros_arduino_bridge和rosserial_arduino控制舵機的區別
最主要的區別就是rosserial_arduino將控制舵機這件事視爲一個話題,通過往話題發消息來控制舵機,這種方法易操作,也不需要獲知通信協議。
ros_arduino_bridge如其名所言,在ros和arduino直接搭建了一座橋樑,可以直接從ros通過串口和arduino通信,穩定性高。如果下位機代碼都是自己寫的,知道通信協議,用這種方式更好。然後用服務,或者用話題都可以控制舵機。
二、arduino部分
arduino部分代碼主要參考了ROS小課堂人臉追蹤雲臺的開源代碼。具體鏈接我會全部列在參考2裏。
ROS小課堂使用的是DFROBOT的arduino uno+拓展版,我們這裏就簡單一些,直接使用arduino uno接個小舵機。接線方式還是老樣子,舵機的紅線接5V,黑線接地,數據線(棕色或者橙色居多)接9或10。
在arduino主程序代碼中,增加了一個z指令方便控制舵機,在串口監視器輸入z 1舵機旋轉到45°,輸入z 2旋轉到90°,以此類推。
case SERVO_TEST: // 'z'
if (serialObj.arg1 == 0)
{
myServos[0].setTargetPos(0, 10);
}
else if (serialObj.arg1 == 1)
{
myServos[0].setTargetPos(45, 10);
}
else if (serialObj.arg1 == 2)
{
myServos[0].setTargetPos(90, 10);
}
else if (serialObj.arg1 == 3)
{
myServos[0].setTargetPos(120, 10);
}
Serial.println("Done");
break;
在servos.h文件中根據實際情況,把舵機引腳設爲9、10.
//Define All Servos's Pins
byte myServoPins[N_SERVOS] = {9, 10};
三、ros部分
1.下載ros_arduino_bridge包
ros_arduino_bridge的wiki界面:http://wiki.ros.org/ros_arduino_bridge
$ cd ~/catkin_ws/src
$ git clone https://github.com/hbrobotics/ros_arduino_bridge.git
參考:
1.ROS技巧系列 - ROS與Arduino進行高效穩定的串口通信(兩種通信方式對比)
2.ROS小課堂官網