|
rosserial_arduino 中文教程 专栏
原文:http://wiki.ros.org/rosserial_arduino/Tutorials
代码
我们将通过为Arduino创建一个“hello world”程序来开始探索rosserial。 (注意:Arduino社区经常将程序的源代码称为“草图”,我们将使用下面的相同约定)。 如果你已经按照Arduino IDE安装教程,你将能够通过从Arduino 示例菜单中选择ros_lib - > HelloWorld来打开下面的草图。

这应该在IDE中打开ros_lib - > HelloWorld,就是以下代码:
/*
* rosserial Publisher Example
* Prints "hello world!"
*/
// Use the following line if you have a Leonardo or MKR1000
//#define USE_USBCON
#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);
}
代码解释
现在,让我们解释代码吧。
//如果您有Leonardo或MKR1000,请把下面这行前面的两个//注释去掉!
//#define USE_USBCON
如果您有Leonardo或MKR1000或任何其他具有本机USB端口的设备,请使用以下这行,
#define USE_USBCON
该端口与Arduino UNO,MEGA不同。
#define USE_USBCON
否则您将收到类似于以下内容的错误:
[ERROR] [1524089506.982801]: Unable to sync with device;
possible link problem or link software version mismatch such as hydro
rosserial_python with groovy Arduino
#include <ros.h>
#include <std_msgs / String.h>
作为每个ROS Arduino程序的一部分,您需要包含ros.h头文件和头文件,这些将用于后面将使用的任何消息。
ros :: NodeHandle nh;
接下来,实例化节点句柄,这允许我们的程序创建发布器和订阅器。 节点句柄还负责串行端口通信。
std_msgs :: String str_msg;
ros :: Publisher chatter("chatter",&str_msg);
char hello [13] ="hello world!";
我们需要实例化将要使用的发布器和订阅器。
在这里,我们实例化一个主题名称为“chatter”的发布器。
Publisher的第二个参数(&str_msg)是用于发布的消息实例的引用(就是第一行最后的str_msg)。
void setup()
{
nh.initNode();
nh.advertise(chatter);
}
在Arduino设置功能中,您需要初始化ROS节点句柄,声明正在发布的任何主题,并订阅您想要接收的任何主题。
void loop()
{
str_msg.data =hello;
chatter.publish(&str_msg);
nh.spinOnce();
delay(1000);
}
最后,在循环函数中,节点发布“Hello World”并调用ros :: spinOnce() ,spinOnce处理所有ROS通信回调。
编写代码
要编译代码,请使用Arduino IDE中的compile函数。 编译完成后,您将收到有关程序存储空间和动态内存使用情况的消息,类似于:
Sketch uses 9,392 bytes (29%) of program storage space. Maximum is 32,256 bytes.
Global variables use 1,356 bytes (66%) of dynamic memory, leaving 692 bytes for local variables. Maximum is 2,048 bytes.
程序存储空间不太重要,只要您使用的存储空间少于可用存储空间,您的代码就可以正常运行。
动态内存使用是你应该注意的事情,因为函数内部的局部变量,未分配的对象,中断和堆栈都可以改变你的可用内存。如果内存不足,您的微控制器将冻结且无调试信息。
如果您遇到随机冻结或者您的Arduino无法与ROS通信,而您的代码编译良好,但动态内存使用率很高,则可能需要减少rosserial使用的内存。 有关更多信息,请参阅rosserial Limitations和NodeHandle以及ArduinoHardware 。
上传代码
要将代码上传到Arduino,请使用Arduino IDE中的上传功能。
运行代码
现在,在新的终端窗口中启动roscore :
roscore
接下来,运行rosserial客户端应用程序,将Arduino消息转发给ROS的其余部分。 确保使用正确的串口:
rosrun rosserial_python serial_node.py /dev/ttyUSB0
注意最后那个 ttyUSB0,你要注意你的串口是0还是1你要改变为 ttyUSB1之类的。
或者,如果您希望能够以编程方式重置Arduino(软重启Arduino),请使用以下命令运行:
rosrun rosserial_arduino serial_node.py _port:=/dev/ttyUSB0
这将自动提供~reset_arduino的服务端点,您可以调用它,跟按Arduino的重置按钮具有相同的效果。
最后,通过启动一个新的终端窗口并输入以下内容,观看来自Arduino的问候:
rostopic echo chatter
进一步阅读
有关发布者和订阅者的详细信息,请参阅rosserial / Overview 。 另请参阅有关更复杂数据类型的信息的限制 。 |