ROS与Arduino-Hello World
说明:
• 这个教程介绍如何通过rosserial创建发布者并且显示主题chatter
• 例子来自Arduino IDE,File->Example->ros_lib下的hello world
• 本例子在Arduino MEGA 2560开发板验证通过
代码:
/*
* rosserial Publisher Example
* Prints "hello world!"
*/
#include <ros.h>
#include <std_msgs/String.h>
ros::NodeHandle nh;
std_msgs::String str_msg;
ros::Publisher chatter("chatter", &str_msg);
char hello[13] = "hello world!";
void setup()
{
nh.initNode();
nh.advertise(chatter);
}
void loop()
{
str_msg.data = hello;
chatter.publish( &str_msg );
nh.spinOnce();
delay(1000);
}
代码分析:
**1. 代码**#include <ros.h>
#include <std_msgs/String.h>
解释:
• <ros.h>库包含Arduino-to-ROS客户端功能。节点会发布String类型的消息,所以需要先包含该消息类型的头文件String.h。该头文件根据Sring.msg的消息结构定义自动生成,我们也可以自定义消息结构,并生成所需要的头文件。
2. 代码
ros::NodeHandle nh;
解释:
• 创建一个节点句柄,方便对节点资源的使用和管理。初始化节点实例,可以用它创建发布或订阅
3. 代码
std_msgs::String str_msg;
ros::Publisher chatter("chatter", &str_msg);
解释:
• 在ROS Master 端注册一个Publisher,并告诉系统Publisher节点将会发布以chatter为话题的String类型消息。
4. 代码
void setup()
{
nh.initNode();
nh.advertise(chatter);
}
解释:
• Arduino的Setup函数,需要初始化ROS节点处理,并宣告所有的发布或订阅
5. 代码
void loop()
{
str_msg.data = hello;
chatter.publish( &str_msg );
nh.spinOnce();
delay(1000);
}
解释:
• 在Arduino的loop函数,定义发布的内容,并调用nh.spinOnce(),这样所有的ROS回调函数就会被处理。设置delay函数延时。
代码上传
• 利用Arduino IDE编译代码,如下图:
• 然后使用upload功能上传代码到Arduino
• 代码上传过程可能会提示如下图所示错误:
• 可以通过更改权限:一般使用USB口,无论USB转什么口,串口之类的,启动时容易出现:/dev/ttyUSB0 permission denied.
• 因为一般情况下不是root用户,对端口没有权限.
• 遇到这种情况,一般这样做:
终端输入:sudo chmod 777 /dev/ttyUSB0
• 修改权限为可读可写可执行,但是这种设置电脑重启后,又会出现这种问题,还要重新设置.因此查询资料,可以用下面这条指令:
• 终端输入:sudo usermod -aG dialout wsh
• 其中wsh是我的用户名,换成你想用USB的用户名即可.把此用户名加入dialout用户组,然后注销下电脑,即可.这样下次重启也不用修改权限了
ROS运行代码
- 新终端运行roscore
$ roscore
- 新终端运行,/dev/ttyUSB0为Arduino设备端口号
rosrun rosserial_python serial_node.py /dev/ttyUSB0
或
rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
3. 新端口显示主题chatter,获取Arduino板反馈的信息
rostopic echo chatter