目录
前言
基于ros如果可以直接控制舵机的话,如果后面想做项目就会比较容易一些。
目前来说用ros控制舵机一般有两种方式:
一、直接通过舵机驱动板控制舵机。
二、通过向下位机通讯的方式控制舵机。
第一种方式一般适用于有舵机驱动板的情况,比如一些串口舵机和专用的舵机驱动器。
这些一般有固定的协议,根据协议控制,适用于有专用协议或者舵机数量较多的情况。
第二种方式通过下位机通讯,让下位机去控制舵机,需要用下位机的io口直接控制舵机,比较适用于舵机数量不多的情况。
今天学习,主要是控制一个舵机了解以下具体的运作,通过第二种方式控制一个舵机。
电脑做上位机,arduino uno板子做下位机,上位机给下位机发布消息,下位机订阅消息(这里的消息主要就是舵机转角数据),根据
消息内容控制舵机旋转。
上位机的程序我们还是用serial包里面带的例程,不需要自己编程。
下位机arduino需要我们自己编程。
1.烧录Arduino程序
首先将以下程序下载到arduino uno板子上面:
#include <ros.h>
#include <std_msgs/UInt16.h>
#include <Servo.h>
ros::NodeHandle nh;
Servo myservo;
int servoPin=3;
void messageCb(const std_msgs::UInt16& servo_msg){
digitalWrite(13,HIGH);
myservo.write(servo_msg.data); // tell servo to go to position in variable 'pos'
delay(15);
digitalWrite(13,LOW);
}
ros::Subscriber<std_msgs::UInt16> sub("servo_led", &messageCb);
void setup()
{
pinMode(13, OUTPUT);
myservo.attach(servoPin);
nh.initNode();
nh.subscribe(sub);
}
void loop()
{
nh.spinOnce();
delay(1);
}
可以根据自己的实际情况修改servoPin变量更改舵机控制引脚。
我这里用了arduino扩展板子方便舵机接线(直接插拔就可以,不需要杜邦线。没有的话可以用杜邦线连接),所以选择了3号io口来进行控制。
2.运行程序并发布消息
第二行和第三行运行其中一行就可以,第二行不带波特率参数,使用默认57600波特率,第三行可以通过参数设置与arduino板子通讯的波特率。
roscore
rosrun rosserial_python serial_node.py /dev/ttyACM1 或
rosrun rosserial_python serial_node.py _port:=/dev/ttyACM1 _baud:=115200(如果想要更改波特率的话,一定一定要在arduino程序里面也改成一致的波特率,比如我这里写115200,那么arduino程序里也一定改成115200)要不然连接不上话题。
(黑色加粗这里可以通过命令查看具体自己的串口或者在arduino IDE里查看,一定要填写正确)
发布舵机转角消息:
rostopic pub -1 /servo_led std_msgs/UInt16 30(这里黑色加粗的参数就是舵机转角数值)
每次发布一个新的角度回车,然后舵机就会旋转过去那个角度了。
格式:rostopic pub 话题名 消息类型名 消息内容 -r [频率]
例如:rostopic pub /servo_led std_msgs/UInt16 30 -r 1
含义:在servo_led 话题上发布一条std_msgs/UInt16格式的消息,消息内容为30,频率为1Hz。
3.注意事项
(1)上下位机波特率要一致。
(2)通过rosrun rosserial_python serial_node.py _port:=/dev/ttyACM1 _baud:=115200命令行传参的方式更改了波特率之后,下次没有参数的话,会把上次传递的参数当默认值,比如默认波特率57600,当执行上述命令之后,再次执行命令时不带波特率参数,默认也是115200
(3)添加新硬件之后,需要重构ros_lib库。