基于ros如果可以直接控制舵机的话,如果后面想做项目就会比较容易一些。

目前来说用ros控制舵机一般有两种方式:

一、直接通过舵机驱动板控制舵机。

二、通过向下位机通讯的方式控制舵机。

第一种方式一般适用于有舵机驱动板的情况,比如一些串口舵机和专用的舵机驱动器。

这些一般有固定的协议,根据协议控制,适用于有专用协议或者舵机数量较多的情况。

第二种方式通过下位机通讯,让下位机去控制舵机,需要用下位机的io口直接控制舵机,比较适用于舵机数量不多的情况。

今天学习,主要是控制一个舵机了解以下具体的运作,通过第二种方式控制一个舵机。

电脑做上位机,arduino uno板子做下位机,上位机给下位机发布消息,下位机订阅消息(这里的消息主要就是舵机转角数据),根据

消息内容控制舵机旋转。

上位机的程序我们还是用serial包里面带的例程,不需要自己编程。

下位机arduino需要我们自己编程。

1.首先将以下程序下载到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。

参考链接:https://blog.csdn.net/qq_27806947/article/details/83153934