rosserial_arduino 中文教程 2:Hello World:创建发布器

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 10:30   11   0

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 LimitationsNodeHandle以及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 。 另请参阅有关更复杂数据类型的信息的限制

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP