rosserial_arduino控制舵机

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章