几周前,我开始编写一系列教程,以简化ROS中的初学者的工作。第一个教程是关于 发布者节点的模板,第二个教程是关于 ROS中的订户节点,第三个教程很简单 ROS的Python订阅者和发布者.
今天,我继续使用Arduino开发板上的rosserial为ROS发布者提供模板的系列教程。另外,我’ll测试模板并编写一个发布者节点。
在下面,您将在Arduino板上找到使用rosserial的ROS发布者的模板。要在Arduino上使用rosserial编写自己的发布者,请将模板复制到Arduino IDE,删除您所输入的信息’需要并替换大写字母中的文本。

ROS和Arduino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #在Arduino上使用rosserial的ROS发布者的模板 //不同的特定库 #包括<ros.h> #包括<ros/time.h> #包括<sensor_msgs/Range.h> #包括<std_msgs/Float32.h> #包括"DHT.h" //创建ros节点nh。该节点将用于发布到Arduino 罗斯::节点句柄 h; //例如,如果您使用的是超声波传感器,则传感器消息为范围 sensor_msgs::SENSOR_RETURN_TYPE 味精; 罗斯::发行人 酒馆(“ / TOPIC_NAME”, &msg); 虚空 设定() { h.初始化节点(); h.广告(酒馆); } 虚空 循环() { 未签名 长 目前的Millis = 毫(); 如果 (目前的Millis-范围_timer >= 50) //每50毫秒发布一次 { 范围_timer = 目前的Millis+50; 酒馆.发布(&msg); } h.自旋(); } |
我使用上面的模板编写了一个ROS节点,该节点将通告超声波传感器检测到的物体的距离。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #include“ 新平.h” //超声波传感器专用库 #包括<ros.h> #包括<sensor_msgs/Range.h> //定义引脚 #define TrigPin 5 #定义echoPin 4 //定义常量 #定义maxDistance 400 #定义间隔R 200 新平 声纳(TrigPin, 回声针, maxDistance); //变量 浮动 范围; 未签名 长 范围_timer; 浮动 持续时间, 距离; 罗斯::节点句柄 h; sensor_msgs::范围 范围_msg; 罗斯::发行人 酒馆_range_ultrasound(“ /超声波”, &range_msg); 浮动 返回Distance() { digitalWrite(TrigPin, 低); delayMicroseconds(2); digitalWrite(TrigPin, 高); delayMicroseconds(10); digitalWrite(TrigPin, 低); 持续时间 = 脉冲输入(回声针, 高); //将时间转换为距离 返回 持续时间/58; // 持续时间/ 29/2,返回厘米 } 虚空 设定() { //超声波传感器的引脚模式 pinMode(TrigPin, 输出值); pinMode(回声针, 输入); h.初始化节点(); h.广告(酒馆_range_ultrasound); } 虚空 循环() { 未签名 长 目前的Millis = 毫(); 如果 (目前的Millis-范围_timer >= 间隔R) { 范围_timer = 目前的Millis+间隔R; 范围_msg.范围 = 返回Distance(); 酒馆_range_ultrasound.发布(&range_msg); } h.自旋(); } |
如何运行节点
步骤1:打开一个新的终端,键入 罗斯科尔 然后按Enter键
步骤2:打开另一个终端,然后键入以下命令:
1 | 罗斯伦 罗斯serial_python serial_node.py /开发者/ttyACM0 |
步骤3:验证节点’的输出,打开一个新的Terminal并键入以下命令:
1 | 罗斯topic 回声 超音波 |
您可能会注意到输出:
目前的Millis-range_timer(当currentMillis = 间隔R时将获得错误的值)可能更改为:currentMillis>= 范围_timer + 间隔R