rosserial_arduino学习笔记10《Servo Controller Example》

本教程介绍如何使用Arduino和rosserial基于ROS控制R/C 。

这可用于控制release mechanism,廉价机器人手臂,ROS动力两足动物或任何需要廉价执行器的地方。

提供的代码是一个非常基本的例子,显示了对单个可爱伺服的控制。

1 硬件

arduino_servo.png

这个例子假设你有一个Arduino和一个r/c servo。r/c servo可以从当地的爱好商店,TowerhobbiesSparkfun等等购买。

伺服遥控器是很棒的小型执行器,因为它们比较便宜(低至10美元),不过包含齿轮箱和电机控制电子设备。

它们通过每20毫秒发送1-2毫秒宽的方波脉冲来控制。

这通常会使伺服臂从0-180度转动。伺服系统有各种尺寸,扭矩和角度精度。

2 程序

通过使用Arduino Servo库,本教程的程序变得非常简单。该伺服库处理所有low level的控制的生成,并维持伺服脉冲。

您需要做的所有代码都是指定伺服器所连接的引脚,然后将角度写入伺服对象。

在下面,Servo库使用Arduino的内置定时器中断来生成正确的脉冲。

在这个例子中,我们只控制一个伺服,但是同一个库可以用来控制大多数Arduino板上的12个伺服器和Arduino Mega上的48个伺服器。

/*
 * 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);
}

 

关键地方是,增加全局Servo对象,连接到正确的Arduino引脚,在每个伺服订阅主题,调用回调函数,写入一个新的角度到Servo对象。

这个程序可以参考《》基于ROS系统使用Arduino控制舵机》https://blog.csdn.net/qq_27806947/article/details/83153934

3 测试

首先,在他们自己的终端窗口中启动你的roscore和rosserial python节点。

roscore
rosrun rosserial_python serial_node.py /dev/ttyACM0

现在,在一个新的终端窗口中,使用rostopic pub来控制你的伺服!只需指定0-180的角度并观察它的移动。


rostopic pub servo std_msgs/UInt16  <angle>

猜你喜欢

转载自blog.csdn.net/qq_27806947/article/details/83513876