ROS+arduino串口通信控制舵机

ROS+arduino串口通信控制舵机

在此我假设各位读者已经装好了ROS,笔者使用的Ubuntu16.04+ROS(Kinetic),如果读者使用的是Ubuntu18.04+ROS(Melodic)可能出现一些其他问题。

安装arduinoADE

arduino具有支持Linux的官方ADE:

  1. arduino官网下载Linux版ADE 选择你所使用版本Linux对应的ADE
    在此笔者选择LINUX64位
  2. 下载完之后在DOWNLOADS文件夹中将其解压*
  3. 在所下载版本的arduino文件夹中新建终端,输入 ./install.sh

安装rosserial arduino

sudo apt-get install ros-kinetic-rosserial-arduino

sudo apt-get install ros-kinetic-rosserial

rospack profile

将ros_lib添加到ADE中

cd Downloads

cd arduino-1.8.8

./ arduino

ADE运行后可在Sketch栏中找到Include Library再选择Manage Libraries(可通过快捷键Ctrl+shift+I打开) 搜索Rosserial Arduino Library并添加。完成后在File栏中的Examples便可以看到Rosserial Arduino Library的例程。

硬件

ARDUINO UNO
舵机
在此笔者使用的是arduino UNO控制板和一个RC遥控车的舵机(舵机转动角度被限制在了60°之内)

代码

#include <ros.h>
#include <std_msgs/UInt16.h>
#include <Servo.h>
 
ros::NodeHandle nh;
Servo myservo;  
int servoPin=9;
 
void messageCb(std_msgs::UInt16 servo_msg)
{   
    myservo.write(servo_msg.data);             
    delay(15); 
}
 
ros::Subscriber<std_msgs::UInt16> sub("servo_control", &messageCb );
 
void setup()
{
  myservo.attach(servoPin);
  nh.initNode();
  nh.subscribe(sub);
}
 
void loop()
{
  nh.spinOnce();
  delay(1);
}

运行

打开终端1

sudo chmod 777 /dev/ttyACM0

运行roscore

roscore

打开另一个终端2

rosrun rosserial_python serial_node.py /dev/ttyACM0

打开终端3

rostopic pub -1 /servo_control std_msgs/UInt16 <POS>
例如:rostopic pub -1 /servo_led std_msgs/UInt16 180 即转动180度(本文使用的舵机的输入被限制在50度开始到110度结束)
ROSArduino之间进行串口通信可以使用以下步骤: 1.在Arduino上安装ROS串口通信库,例如rosserial库。 2.编写Arduino代码,将其上传到Arduino板上,该代码应该包含ros.h头文件和串口初始化函数。 3.在ROS上创建一个节点,使用rosserial库与Arduino进行通信。 4.在ROS节点中使用发布者和订阅者来发送和接收数据。 下面是一个简单的例子,演示如何在ROS中使用rosserial库与Arduino进行通信: 1.安装rosserial库 在Arduino IDE中,选择"Sketch -> Include Library -> Manage Libraries",然后搜索"rosserial"并安装。 2.编写Arduino代码 以下是一个简单的示例代码,该代码将读取来自ROS的整数,并将其写入到串口: ``` #include <ros.h> #include <std_msgs/Int32.h> ros::NodeHandle nh; void messageReceived(const std_msgs::Int32& msg) { int value = msg.data; Serial.println(value); } ros::Subscriber<std_msgs::Int32> sub("topic_name", messageReceived); void setup() { nh.initNode(); nh.subscribe(sub); Serial.begin(9600); } void loop() { nh.spinOnce(); } ``` 3.创建ROS节点 在终端中,输入以下命令来创建ROS节点: ``` rosrun rosserial_python serial_node.py /dev/ttyUSB0 ``` 其中,/dev/ttyUSB0应该是Arduino连接到计算机上的串口设备名称。 4.使用ROS发布者和订阅者 在ROS节点中,使用以下代码来发布数据: ``` ros::NodeHandle nh; ros::Publisher pub = nh.advertise<std_msgs::Int32>("topic_name", 10); std_msgs::Int32 msg; msg.data = 42; pub.publish(msg); ``` 使用以下代码来订阅数据: ``` ros::NodeHandle nh; ros::Subscriber<std_msgs::Int32> sub = nh.subscribe("topic_name", 10, messageReceived); void messageReceived(const std_msgs::Int32& msg) { int value = msg.data; ROS_INFO("Received value: %d", value); } ``` 注意:在使用rosserial库进行通信时,需要确保Arduino板上的程序正常运行,并且串口设备名称正确。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值