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