Arduino的 的 是一款出色的开发板,可用于从各种传感器读取数据并控制机器人’直流电动机。 树莓派擅长在Linux上运行ROS。因此,我们可以从这两个系统中受益来构建智能机器人。最简单的方法是通过USB电缆连接这些板,并使它们通过ROS节点进行通信。
在本教程中,我’ll向您展示如何使用两个Arduino开发板作为Raspberry Pi计算机的扩展。在开始编写ROS节点之前,我必须 设置Pi以识别每个Arduino。当机器人’的体系结构很复杂。
Arduino的 的 板上只能运行一个ROS节点。而且由于我有两个Arduino,我将使用一个生成一个随机数,另一个使用它来控制连接到插针13的LED。
我将运行一个ROS节点,它将根据此流程图发送和接收数据
流程图说明
- 用户将通过运行以下命令来启动所有ROS节点 。发射 文件。
- 第一个Arduino开发板将运行一个随机数脚本并将数据发送到Raspberry Pi。
- ROS 节点将从第一个Arduino板接收随机数。该节点将在Raspberry Pi上运行,并命令第二个Arduino板上的LED。
- 第二块Arduino板将根据从Pi板上运行的ROS节点收到的命令来打开和关闭LED(引脚13)。
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 | #包括<ros.h> #包括<ros/time.h> #包括<std_msgs/Int32.h> 整型 分 =1; 整型 最高 =5000; 整型 rand_no ; 罗斯 :: 节点句柄 h ; std_msgs :: Int32 rand_msg ; 罗斯 :: 发行人 酒馆 _random(“ / 随机 _number”, &rand_msg); 烧焦 框架编号 [] = “ / 随机 Data”; #此函数返回随机数 整型 随机 _number(){ rand_no = 随机 ( 分 , 最高 ); 返回 rand_no ; } 虚空 设定 () { h . 初始化节点 (); h .广告 ( 酒馆 _random); } 虚空 循环 () { rand_msg . 数据 = 随机 _number(); 酒馆 _random. 发布 (&rand_msg); h . 自旋 (); 延迟 (1000); } |
测试节点
第1步:打开Linux终端并输入命令:
罗斯科尔
步骤2:打开第二个Linux Terminal,然后键入以下命令:
罗斯 run 罗斯 serial_python serial_node.py / dev / ttyACM *
步骤3:要查看Arduino节点生成的随机数,请打开第三个终端,然后键入以下命令:
罗斯 topic回声/ 随机 _number
显示和计算LED的ROS节点’s stage
Python中的此ROS节点将在Raspberry Pi上运行。在开始编写Python代码之前,必须创建工作空间和包含该节点的包。您需要做的就是 文章 .
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 | #!/ usr / bin / env python 进口 红润的 从 std_msgs . 味精 进口 Int32 从 std_msgs . 味精 进口 串 变种 = 没有 #定义显示文字 定义 打回来 ( 味精 ): 全球 变种 变种 = 味精 . 数据 如果 __名称__ == '__主要__': 红润的 .init_node('random_LED') 红润的 .订户('random_number',Int32, 打回来 ) 酒馆 = 红润的 .发行人( 'LED' , 串 , queue_size=1) 率 = 红润的 . 率 (10) 而 不 红润的 .is_shutdown(): 如果 变种 <=2500: #send message to turn 关 the LED 变种 ="关" 红润的 . 日志信息 ("The output is 关 and the 变种 is: %s", 变种 ) 其他 : #发送消息以打开LED 变种 = “上” 红润的 . 日志信息 (“输出为ON,变量为:%s”, 变种 ) 酒馆 . 发布 ( 变种 ) 率 . 睡觉 () |
控制LED的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 | #包括<ros.h> #包括<std_msgs/String.h> 罗斯 :: 节点句柄 h ; 虚空 messageCb( const std_msgs :: 串 & 味精 ) { 如果 ( 味精 . 数据 == “上” ) digitalWrite(13, 高 -digitalRead(13)); //闪烁LED 其他 digitalWrite(13, 低 -digitalRead(13)); //关闭LED } 罗斯 :: 订户 子 ( “LED” , &messageCb); 虚空 设定 () { pinMode (13, 输出值 ); h . 初始化节点 (); h .订阅( 子 ); } 虚空 循环 () { h . 自旋 (); 延迟 (1000); } |
编写启动文件
<launch>
<node pkg=”rosserial_python” type=”serial_node.py” name=”twoArduino_LED” output=”screen”>
<param name=”port” value=”/dev/ttyACM0″/>
<param name=”baud” value=”57600″/>
</node>
<node pkg=”rosserial_python” type=”serial_node.py” name=”twoArduinos_RandNo” output=”screen”>
<param name=”port” value=”/dev/ttyACM1″/>
<param name=”baud” value=”57600″/>
</node>
<node name=”random_number” pkg=”pi_and_arduino” type=”twoArduinos_Pi.py” output=”screen” />
</launch>
参考文献:
非常感谢这个很棒的入门教程!
当我尝试编译用于控制arduino LED的ROS节点时,出现错误消息:
没有参数列表的模板名称ros :: 订户的无效使用
我认为接收控制命令的董事会应该订阅‘LED’话题。可能是一个简单的遗漏。
在上一个脚本中,有一个错字
罗斯 :: 订户 子 (“OFF”, &messageCb);
arduino节点应订阅“LED” topic 不 “OFF”
罗斯 :: 订户 子 (“LED”, &messageCb);
你有权利。谢谢。我更改脚本
是arduino’通过USB电缆与rPi进行通讯?你没有’关于将arduino的串行引脚连接到Rpi的串行引脚的任何事情,因此必须使用USB。
最后一个脚本中仍然有错字;“控制LED的ROS节点”
以下不会编译…
罗斯 :: 订户 子 (“ LED”,&messageCb);
这对我的设置有效…
罗斯 :: 订户 子 (“LED”, &messageCb);
感谢您的教程。
我以前的回复评论没有出现,因为我键入了它。
“ros::Subscriber 子 (“LED”, &messageCb);”
std_msgs :: 串 需要在row :: 订户和sub(之间“LED”, &messageCb);它需要用“”
罗斯 :: 订户 子 (“LED”, &messageCb);
令人沮丧…此网页评论应用会删除小于符号和大于符号之间的所有内容…
看着 …
http://wiki.ros.org/rosserial_arduino/Tutorials/Blink
示例代码的第15行类似于此处所需的内容。