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

 

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