rosserial_arduino控制舵機
舉個不算太恰當的例子,如果你的機械臂moveit包只配置到手腕,而沒有配置末端執行器,而重新配置又覺得太麻煩,這時候用一個arduino單獨控制夾持器就可以了。本文是通過rosserial_arduino包控制舵機。
目錄
一.準備工作
需要物品:一塊arduino,一紮線(三根就夠了),舵機
接線,舵機的紅線接5V,黑線接地,數據線(棕色或者橙色居多)接9(10也可),把程序燒到arduino板
程序如下:
/*
* rosserial Servo Control Example
*
* This sketch demonstrates the control of hobby R/C servos
* using ROS and the arduiono
*
* For the full tutorial write up, visit
* www.ros.org/wiki/rosserial_arduino_demos
*
* For more information on the Arduino Servo Library
* Checkout :
* http://www.arduino.cc/en/Reference/Servo
*/
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include <WProgram.h>
#endif
#include <Servo.h>
#include <ros.h>
#include <std_msgs/UInt16.h>
ros::NodeHandle nh;
Servo servo;
void servo_cb( const std_msgs::UInt16& cmd_msg){
servo.write(cmd_msg.data); //set servo angle, should be from 0-180
digitalWrite(13, HIGH-digitalRead(13)); //toggle led
}
ros::Subscriber<std_msgs::UInt16> sub("servo", servo_cb);
void setup(){
pinMode(13, OUTPUT);
nh.initNode();
nh.subscribe(sub);
servo.attach(9); //attach it to pin 9
}
void loop(){
nh.spinOnce();
delay(1);
}
然後是安裝rosserial_arduino包:
$ sudo apt-get install ros-kinetic-rosserial-arduino
$ sudo apt-get install ros-kinetic-rosserial
$ rospack profile
安裝之後會生成一個ros_lib文件夾,將其複製到arduino安裝目錄的sketchbook/libraries下,打開arduino界面,File->Examples,如果有ros_lib說明安裝成功。
爲了看上去直觀一點,我連的是小車的舵機雲臺。
二.簡單測試
$ roscore
$ rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
$ rostopic pub servo std_msgs/UInt16 <angle>
第二行的“ttyUSB0”照實際情況寫,arduino一般是通過接口/dev/ttyACM# 或者 /dev/ttyUSB#來連接Ubuntu系統的,可以使用
$ ls /dev/ttyACM*
或
$ ls /dev/ttyUSB*
查看。
也可以像我截圖的這樣直接在arduino連接的時候看,比如在這裏我應該改成ttyACM1
第三行的<angle>輸入你想讓舵機轉的角度,範圍視舵機而定,一般是0-180度
三.寫一個簡單的腳本
腳本代碼:
#!/usr/bin/env python
#edited by jiali zhang, 20181224
import rospy
import std_msgs
from std_msgs.msg import UInt16
class rotate:
def __init__(self):
rospy.init_node('rotate')
# Publisher to control
self.angle = rospy.Publisher('/servo', UInt16, queue_size=5)
rospy.sleep(2)
angle0 = UInt16(10)
self.angle.publish(angle0)
print "ready"
rospy.sleep(1)
# first angle
angle1 = UInt16(40)
self.angle.publish(angle1)
print "first"
rospy.sleep(1)
# second angle
angle2 = UInt16(120)
self.angle.publish(angle2)
print "second"
if __name__ == "__main__":
rotate()
以上代碼的功能就是初始化舵機的角度爲10度,一秒後轉向40度,再一秒後轉向120度。
在終端中
連接arduino
$rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB1
同樣的,ttyUSB1按實際情況寫,然後運行python文件就可以了。
效果如下
參考資料:
1.創客智造的教程https://www.ncnynl.com/archives/201610/918.html
https://www.ncnynl.com/archives/201610/925.html
2.wiki http://wiki.ros.org/rosserial_arduino