我之前已经写过关于安装rosserial_arduino以便将Arduino微控制器与ROS机器人平台进行交互的文章。。rosserial_arduino是为ROS平台设计的rosserial堆栈的软件包,并将Arduino开发板“变成”独立的ROS节点,系统的其他组件可以与之交互。在将Arduino用于机器人项目时,存在一个重大限制:Arduino不能用作可以处理机器人正常功能所需的所有操作的成熟计算节点。例如,您不能在其上运行OpenCV脚本来执行计算机视觉任务。在本文中,我想谈谈我使用熟悉的rosserial_arduino软件包安装ROS系统并将Arduino连接到Raspberry Pi微型计算机的经验。
动机
了解了rosserial_arduino平台后,我有一个问题:我可以以某种方式使Arduino与功能更强大的微型计算机结合使用,从而使机器人与笔记本电脑更加独立。然后我有了在Raspberry Pi微型计算机上尝试ROS的想法。 Raspberry Pi是板上的独立微型计算机。它具有一个CPU芯片,一个图形芯片,一个SD卡插槽,一个以太网输入,几个USB接口和一个用于连接显示器的HDMI视频输出。您可以将鼠标,键盘和外部HDD连接到USB输入。Raspberry Pi和Arduino的组合非常有前途,并且已在机器人项目中反复使用。Raspberry Pi还允许您连接摄像头(网络摄像头或特殊的RPi Board摄像头)。一年前,一个经过改造的Arduino Uno板上的简单轮式机器人落入了我的手中。刚才在我手中的是Raspberry Pi ModelB。
在Raspberry Pi上安装操作系统
首先,您需要在“树莓派”上安装Linux发行版。最简单的方法是使用NOOBS OS安装管理器。如何执行此操作,可以在Raspberry Pi官方门户网站上的本手册中阅读。我选择安装Raspbian,这是专门为Raspberry设计的经过修改的Debian发行版。注意:连接显示器时,通常会出现图片显示问题,特别是在没有HDMI输入的老式显示器上会发生这种情况。此处的config.txt文件可为我们提供帮助-用于监视器设置的Raspberry配置文件。在某些情况下,它已经在系统映像归档文件(Raspbian)中,对于NOOBS,需要在SD卡的根目录中创建它。将以下行插入文件:
hdmi_safe=1
hdmi_force_hotplug=1
config_hdmi_boost=4
在这种情况下,重要的几行是:hdmi_safe=1
…
hdmi_force_hotplug=1
…
config_hdmi_boost=4
以我为例,这些设置可以在具有VGA输入的监视器上获取正确的图像。配置对Raspberry Pi的远程访问
您可以通过SSH通过网络连接到Raspberry Pi板。为此,必须通过以太网电缆(板上有一个特殊的输入)或通过连接到USB端口的Wi-Fi适配器将Raspberry Pi连接到网络。当您连接以太网电缆时,Raspberry会自动在网络上接收一个IP地址并立即可用。如果使用适配器,则需要执行许多简单的过程。我使用了以下TPLINK Wi-Fi适配器:
将适配器连接到USB端口,并检查命令是否检测到系统中的设备$ iwconfig
现在,我们扫描空间以搜索可用的无线网络:$ sudo iwlist wlan0 scan
命令输出中的ESSID字段指示访问点的名称。现在,使用wpa_supplicant实用程序连接到WPA加密的访问点。使用wpa_supplicant软件包中的wpa_passphrase实用程序,我们根据访问密钥生成密码:$ wpa_passphrase <hotspot_name> <hotspot_access_key>
其中hotspot_name和hotspot_access_key分别是访问点和访问密钥的名称。该实用程序返回生成的psk字符串。接下来,将包含网络ssid和psk行的整个网络块插入到配置文件/etc/wpa_supplicant/wpa_supplicant.conf的末尾并保存。最后,我们重新启动Raspberry Pi并检查网络连接。要在计算机的终端中通过SSH连接,您需要运行以下命令:$ ssh pi@<raspi_ip>
其中<raspi_ip>是树莓派IP地址,可以通过直接在树莓派终端中执行的ifconfig命令来识别。要通过SSH连接并运行图形应用程序,请使用以下命令:$ ssh -X pi@<raspi_ip>
您可以使用虚拟网络计算(VNC)程序在远程桌面模式下连接到“ Malinka”。通过将键盘上的击键和鼠标移动从一台计算机传输到另一台计算机并通过计算机网络中继屏幕内容来进行管理。VNC系统是独立于平台的。首先,使用终端中的命令在Raspberry Pi上安装VNC服务器:$ sudo apt-get install tightvncserver
安装完成后,运行命令:$ vncserver :1 -geometry 1280x800 -depth 16
此命令将启动VNC服务器。在这种情况下,这意味着虚拟X会话正在运行(Raspberry Pi桌面的虚拟表示)。现在,启动VNC客户端并连接到它之后,您将连接到该虚拟桌面。参数:1定义将在其上运行VNC进程的端口号。geometry参数设置虚拟桌面的分辨率(在这种情况下为大小)。depth参数以位(8、16和24,默认值为16)确定桌面显示器的颜色深度。首次启动时,VNC服务器将要求您输入密码,连接到远程桌面时会要求输入密码。现在,在台式计算机上安装VNC客户端:$ sudo apt-get install xtightvncviewer
我们准备连接到“ Malinka”远程桌面:$ vncviewer <raspi_ip>:1
并输入密码。将打开一个窗口,其中包含类似于以下内容的桌面映像:
值得注意的是,每次重新启动树莓派时,都需要重新启动VNC服务器。将Arduino连接到Raspberry Pi
Arduino可以像连接普通计算机一样容易地连接到Raspberry Pi。首先,在Raspberry Pi上安装Arduino IDE:$ sudo apt-get update
$ sudo apt-get install arduino
启动Arduino IDE命令:$ arduino
Arduino IDE通过其USB编程电缆连接到Raspberry Pi。这种连接需要断开串行控制台。默认情况下,Raspberry Pi配置串行端口(GPIO14-GPIO15)以提供启动信息。它还允许您通过连接的设备登录Raspberry Pi。为了能够对Arduino进行编程,您需要默认禁用此选项。要禁用授权,请编辑inittab系统文件:$ sudo nano /etc/inittab
找到这行:T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
注释掉:
之后,保存并关闭文件。引导时,Raspberry Pi将调试消息发送到串行端口。在某些情况下这可能很有用,但是现在我们需要禁用此功能。为此,请编辑cmdline.txt系统文件:$ sudo nano /boot/cmdline.txt
找到这行:dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
并删除控制台参数块以获取如下所示的行:dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
保存并关闭文件。为了使系统应用更改,您需要重新启动Raspberry Pi:$ sudo reboot
现在,您可以将Arduino开发板连接到Raspberry Pi的USB端口,为您的Arduino开发板模型配置Arduino IDE,然后将草图上传到其中。设置ROS和rosserial_arduino
我选择安装ROS Indigo。ROS Indigo安装说明在官方页面上有详细描述。我建议安装ROS-Comm安装选项。根据我自己的经验,我可以说安装“桌面”选件可能花费很长时间(正午)。安装完ROS并使用rosdep实用程序解决了所有依赖关系后,我们只需编译catkin_workspace:$ catkin_make
$ catkin_make install
在Raspberry Pi上运行rosserial_arduino草图
现在我们已经安装了rosserial_arduino,我们可以运行它:$ roslaunch rosserial_python serial_node.py /de/ttyACM0
启动rosserial服务器时,可能会发生错误:没有名为diagnostic_msgs.msg的模块。要解决此问题,您需要从官方的ROS存储库下载ROS消息的源-不在安装中的common_msgs,并将其加载到工作区文件夹中的rosserial软件包文件夹中,然后编译ROS:$ catkin_make install
评论!将草图加载到Arduino IDE时,可能会发生“致命错误:字符串:此类文件或目录编译未终止”错误。这意味着我们在ros_lib中具有ROS消息类型,但是还必须将它们编译为Arduino的相应类型。您需要这样编译它们:$ cd <sketchbook>/libraries
$ rm -rf ros_lib
$ rosrun rosserial_python make_libraries.py .
现在,您可以像在普通计算机上一样在Raspberry Pi上使用rosserial_arduino:创建节点,订阅主题,发布主题等。您可以将RPi Board摄像机连接到Raspberry Pi 并使用cv_bridge ROS软件包(用于与OpenCV交互的ROS接口,可以在此处找到说明)来执行计算机视觉任务。顺便说一下,我的机器人已经全副武装:

结论
希望本文对您在Raspberry Pi上开始使用ROS有所帮助,并且您对将Raspberry Pi与Arduino或其他此类微控制器结合使用有自己的见解。祝您在实验和项目中一切顺利,并希望很快在接下来的文章中分享我的新想法!PS:V. Petin在书中摘录了一些说明,“电子。Raspberry Pi微型计算机。实用指南。”