树莓派机器人精要-全-
树莓派机器人精要(全)
原文:
annas-archive.org/md5/30a73e7fba49b83b396fc6488ca27a57
译者:飞龙
前言
最近有许多技术进步,真正改变了我们的生活、工作和娱乐方式。电视、电脑和手机都深刻地影响了我们的生活。每一项技术最初通常由一些早期采用者开始,他们大多是拥有大量资源、能够负担得起新技术的个人。然而,很快就出现了一股运动,旨在让这些技术变得更加平价,让更多人能够使用。
最新的技术趋势是机器人技术。机器人的数量、种类和应用正在快速增长。这些机器人的最初开发出现在大学实验室或军事研究中心。然而,就像计算机的普及一样,已经有一个不断壮大的草根运动,许多自制开发者涌现出来,致力于让机器人融入我们的日常生活。
这一运动得益于低价硬件和免费的开源软件。同时,它也得到了一个开发者社区的支持,许多人愿意帮助他人入门或克服他们曾遇到的挑战。
本书是以自制运动的精神提供的。在书中,你将找到如何将一台便宜、小巧但多功能的树莓派 B 2 计算机与低价硬件和开源软件结合,打造一个可以行走、感知障碍物,甚至能“看到”周围环境的双足机器人。
然而,要小心——这种信息可能是危险的。没多久,你可能就会创造出下一代的思考、行走、感知机器,它们将成为机器人革命的核心。
本书内容
第一章,配置和编程树莓派,从讨论如何连接电源开始,并通过设置一个完整的系统,配置好并准备好连接任何令人惊叹的设备和软件能力,来开发先进的机器人应用。
第二章,构建双足机器人,展示了如何构建双足平台的机械部分,无论是使用 3D 打印、购买,还是自己制作双足和身体。
第三章,双足机器人运动,讲述了一旦你建立好平台后,你需要编程让它行走、挥手、装死或执行任何其他有趣的动作,以便你能够协调平台的运动。
第四章,利用传感器避障,向你展示如何添加红外传感器,这样你就可以避免撞到障碍物。
第五章,双足机器人路径规划,介绍了如何规划双足机器人的运动。当你移动时,你会希望能从 A 点到 B 点。
第六章, 为双足机器人添加视觉,提供了如何连接网络摄像头、硬件和软件的详细信息,以便我们可以将其用于将视觉数据输入到我们的系统中。
第七章,远程访问您的双足机器人,介绍了如何将 Raspberry Pi 配置为无线接入点,从而使您能够远程控制您的双足机器人。
本书所需的资源
这是您所需资源的清单:
-
Raspbian
-
putty
-
Windows 版 Image Writer
-
libusb-1.0-0-dev
-
VncServer
本书的读者群体
本书适合那些有一定 Raspberry Pi 背景并希望用其进行机器人项目创建的读者。在创建一个可以走路、感知环境、规划动作、并自主执行运动和颜色跟踪的双足机器人时,我们假设您有一定的编程基础。
约定
在本书中,您会看到一些文本样式,用于区分不同类型的信息。以下是这些样式的一些示例及其含义说明。
文本中的代码词汇、数据库表名、文件夹名称、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 用户名显示如下:“但是,您确实需要找到您的卡的/dev
设备标签。”
任何命令行输入或输出均按以下方式书写:
sudo dd if=2015-01-31-raspbian.img of=/dev/sdX
新术语 和 重要词汇 用粗体显示。您在屏幕上看到的词汇,例如在菜单或对话框中,文本中会以如下方式呈现:“点击下一步按钮将带您进入下一屏。”
注意
警告或重要提示会以框的形式出现,如下所示。
小贴士
提示和技巧如下所示。
读者反馈
我们始终欢迎读者的反馈。请告诉我们您对本书的看法——您喜欢什么或不喜欢什么。读者反馈对我们非常重要,它帮助我们开发出您真正能从中受益的书籍。
若您想提供一般性反馈,只需通过电子邮件<feedback@packtpub.com>
联系我们,并在邮件主题中注明书籍名称。
如果您在某个主题领域有专业知识,并且有兴趣撰写或参与书籍创作,请查看我们的作者指南:www.packtpub.com/authors。
客户支持
现在您已经是一本 Packt 书籍的骄傲拥有者,我们提供了一些帮助您充分利用购买资源的方式。
下载本书的彩色图片
我们还为您提供了一份包含本书中使用的截图/图表的彩色图片的 PDF 文件。这些彩色图片将帮助您更好地理解输出的变化。您可以从www.packtpub.com/sites/default/files/downloads/Raspberry_Pi_Robotics_Essentials_Graphics.pdf
下载此文件。
勘误
尽管我们已尽一切努力确保内容的准确性,但错误仍然可能发生。如果您在我们的书籍中发现错误——无论是文本错误还是代码错误——我们将不胜感激您能向我们报告。这样,您不仅能帮助其他读者避免困惑,还能帮助我们改进后续版本的内容。如果您发现任何勘误,请访问www.packtpub.com/submit-errata
提交,选择您的书籍,点击勘误提交表单链接,并填写勘误详情。一旦您的勘误得到验证,我们将接受您的提交,并将其上传到我们的网站,或者添加到该书籍的勘误列表中。
要查看之前提交的勘误,请访问www.packtpub.com/books/content/support
,并在搜索框中输入书名。所需信息将显示在勘误部分。
盗版
互联网盗版问题在所有媒体中普遍存在。我们在 Packt 公司非常重视版权和许可证的保护。如果您在互联网上发现任何形式的我们作品的非法复制品,请立即提供网址或网站名称,以便我们采取措施。
如果您发现涉嫌盗版的资料,请通过<copyright@packtpub.com>
与我们联系,并提供相关链接。
我们感谢您为保护我们的作者和我们提供有价值内容的能力所作的帮助。
问题
如果您在本书的任何方面遇到问题,您可以通过<questions@packtpub.com>
与我们联系,我们将尽力解决问题。
第一章:配置和编程树莓派
机器人正逐渐渗透到我们的世界中。它们形态各异,功能各不相同。就像个人计算机的进化一样,机器人开发领域的许多进展也来自于那些利用新一代廉价硬件和免费的开源软件进行开发的爱好者和 DIY 者,他们通过这些工具制造出各种具备惊人能力的机器。在本书中,你将学习如何通过制造一个机器人——一个具备传感器和视觉能力的四足机器人——来学习机器人构建的技能。然而,这些技能也可以应用于各种行走、滚动、游泳或飞行的机器人。
本章中,你将学习:
-
如何使用 Raspbian 操作系统配置树莓派,这将成为你机器人控制中心的一部分。
-
如何设置远程开发环境,以便你可以编程控制你的机器人。
-
具备 Python 和 C 的基本编程技能,这样你就可以创建和编辑机器人所需的程序,来完成所有那些令人惊叹的任务。
配置树莓派——你机器人的大脑
你机器人中最重要的部分之一是你用来控制所有不同硬件的处理器系统。在本书中,你将学习如何使用树莓派——一个小型、廉价、易于使用的处理器系统。树莓派有几种不同的型号——最初的 A 型和 B 型,以及改进后的 A+型和 B+型。B+型是最受欢迎的型号,具有额外的输入/输出能力、四个 USB 接口、更大的内存,它将是本书中我们重点介绍的型号。
以下是设置初始树莓派开发环境所需的设备:
-
一个树莓派,B 2 型号。还有其他三种树莓派型号,分别是 B+、B 和 A。这些型号的处理能力较低,并且硬件配置也有所不同。本书将重点介绍树莓派 B 2 型,它具有最佳的处理能力和最实用的输入/输出接口。然而,本书中的许多内容也适用于树莓派 B+和 A 版本,可能需要一些额外的硬件。
-
一条用于为主板提供电力的 USB 电缆。
-
一张 microSD 卡——至少 4GB。
-
一台 microSD 卡读卡器。
-
另一台已连接到互联网的计算机。
-
一条用于连接主板的网络线——在初步配置过程中,你需要一根 LAN 电缆和有线 LAN 连接。
-
一台无线 LAN 设备。
以下是树莓派 B 2 型号主板的外观:
你还应该熟悉主板上的不同连接端口。以下是 B 2 型号的连接端口,已标注以供参考:
安装操作系统
在开始之前,你需要下载并创建一张包含 Raspbian 操作系统的 SD 卡。你将把 Raspbian——一个开源的 Debian 版本 Linux 系统——安装到你的树莓派上。
有两种方法可以将 Raspbian 安装到你的板子上。由于树莓派越来越流行,你现在可以购买一张预装了 Raspbian 的 SD 卡,或者你也可以将其下载到个人电脑上,然后安装到 SD 卡上。如果你打算下载一个发行版,你需要决定是使用 Windows 电脑来下载并创建 SD 卡,还是使用 Linux 机器。
无论你将使用哪台机器,都需要下载一个镜像。打开浏览器窗口,访问树莓派官网,www.raspberrypi.org,然后从页面顶部选择下载。这将提供多种下载选项。进入Raspbian部分,选择图片标识右侧的.zip
文件。这将下载一个包含 Raspbian 操作系统镜像的压缩文件。请记下默认的用户名和密码,稍后会用到。
如果你使用的是 Windows,你需要通过类似 7-Zip 的归档程序来解压文件。解压后,你将得到一个.img
扩展名的文件,这个文件可以被写入到你的 SD 卡中。接下来,你需要一个程序将镜像写入到卡片中。如果你打算用 Windows 机器创建 SD 卡,可以使用 Image Writer 程序。你可以在www.raspberrypi.org网站的下载部分找到该程序的链接。将 SD 卡插入 PC,运行该程序,界面应该如下所示:
选择正确的卡片和镜像,应该看起来像这样:
然后选择写入。这将需要一些时间,但完成后,从 PC 中弹出卡片。
如果你使用 Linux,你需要先解压文件,然后将其写入到卡片中。你可以通过一条命令完成所有操作。不过,你需要找到卡片的/dev
设备标签。你可以通过ls -la /dev/sd*
命令来做到这一点。如果你在插入卡片之前运行此命令,可能会看到如下内容:
插入卡片后,你可能会看到如下内容:
请注意,你的卡片是/dev/sdb
。现在,进入你下载归档镜像文件的目录,并运行以下命令:
sudo dd if=2015-01-31-raspbian.img of=/dev/sdX
2015-01-31-raspbian.img
命令将被你下载的镜像文件替代,/dev/sdX
将被你的卡片 ID 替代;在这个例子中是/dev/sdb
。
一旦你的卡片镜像创建完成,安装到 Raspberry Pi 上。你还需要将 Raspberry Pi 连接到局域网(LAN)电缆,并将 LAN 电缆插入有线局域网网络。
注意
如果你没有有线连接,可以通过直接将 Raspberry Pi 连接到显示器、键盘和鼠标来完成以下步骤。
开启设备电源。POWER LED应当亮起,设备应从卡片启动。为了配置卡片,你需要远程访问它。为此,你现在需要通过 SSH 连接到设备,SSH 是一种安全协议,允许你从另一台计算机远程控制一台计算机。
远程访问系统的挑战之一是你需要知道板卡的 IP 地址。通过使用 IP 扫描器应用程序,可以发现这一点。有几款免费的扫描器可供选择;在 Windows 上,一个可能的选择是 Advanced IP Scanner,可以从www.advanced-ip-scanner.com/
下载。以下是程序运行时的界面:
点击Scan选择器可以扫描所有连接到网络的设备。你也可以在 Linux 上执行此操作;在 Linux 中,一个 IP 扫描应用程序叫做 Nmap。要安装 Nmap,输入sudo apt-get install nmap
。要运行 Nmap,输入sudo nmap -sP 10.25.155.1/154
,扫描器将扫描从 10.25.155.1 到 10.25.155.154 的地址。
这些扫描器可以让你知道哪些地址正在使用,这样你就能找到你的 Raspberry Pi 的 IP 地址。由于你将通过 SSH 访问设备,你还需要在远程计算机上运行一个 SSH 终端程序。如果你使用的是 Microsoft Windows,可以下载这样的应用程序。一个简单易用的选择是 Putty。它是免费的,并且做得非常好,可以保存配置,这样你就不必每次都重新输入。该程序可以从www.putty.org下载。
在你的 Microsoft Windows 计算机上下载 Putty。然后运行putty.exe
。你应该会看到一个配置窗口,它看起来像下面的截图:
在Host Name字段中输入 IP 扫描器中的inet addr
,并确保选择了 SSH。你可能希望将此配置保存为“Raspberry Pi”,这样每次都可以重新加载它。
当你点击Open时,系统将尝试通过局域网连接打开 Raspberry Pi 的终端窗口。第一次这样做时,你会收到一个关于 RSA 密钥的警告,因为这两台计算机互不认识;所以 Windows 会提示你一台它不认识的计算机即将以相当亲密的方式连接。只需点击OK,你应该会看到一个带有登录提示的终端,像下面的截图一样:
现在你可以登录并向 Raspberry Pi 发送命令。如果你希望从 Linux 机器上进行操作,过程会更简单。打开一个终端窗口,并输入ssh pi@xxx.xxx.xxx.xxx –p 22
,其中xxx.xxx.xxx.xxx
是设备的inet addr
。这将带你进入 Raspberry Pi 的登录界面,应该与之前的截图类似。
登录后,你应该看到如下界面:
首先,你需要扩展文件系统以占用整个卡片空间。所以,按下Enter键,你将看到以下屏幕:
再次按Enter键,你将返回到主配置界面。现在,选择启用桌面/程序启动选项。
当你按下Enter键时,你将看到以下屏幕:
你也可以选择超频你的设备。这是一种让你从系统中获取更高性能的方式。不过,超频有可能会导致系统出现可靠性问题。
完成后,返回到主配置菜单,按Tab键直到光标定位到raspi-config
来运行配置工具。
添加远程图形用户界面
在构建机器人时,有些步骤你需要通过图形界面查看系统。你可以通过名为 vncserver 的应用程序,在你的 Raspberry Pi 上获取这个界面。你需要在 Raspberry Pi 的终端窗口中输入sudo apt-get install tightvncserver
来安装此应用程序的版本。
Tightvncserver 是一个允许你远程查看完整图形桌面的应用程序。安装完成后,你可以执行以下操作:
-
你需要通过在 Raspberry Pi 的终端窗口中输入
vncserver
来启动服务器。 -
接着,你将被要求输入密码,并确认密码,然后询问是否希望设置只读密码。记住你输入的密码,你将需要它来通过 VNC 查看器进行远程登录。
-
你需要为你的远程计算机安装 VNC 查看器应用程序;一个不错的选择是 Real VNC,可以从
www.realvnc.com/download/viewer/
下载。当你运行它时,你应该看到如下界面: -
输入 VNC 服务器地址,即你的 Raspberry Pi 的 IP 地址,然后点击连接。你会收到一个关于未加密连接的警告;选择继续,你会看到这个弹出窗口:
-
输入你在启动 vncserver 时刚刚设置的密码,接着你将看到 Raspberry Pi 的图形界面,类似以下截图:
现在,你可以访问系统的所有功能,尽管如果你进行图形密集型的数据传输时,速度可能会变慢。为了避免每次启动 Raspberry Pi 时都要输入 vncserver 命令,你可以参考www.havetheknowhow.com/Configure-the-server/Run-VNC-on-boot.html
中的说明来设置。
vncserver 也可以通过 Linux 使用。你可以使用一个名为“远程桌面查看器”的应用程序来查看远程的 Raspberry Pi Windows 系统。如果你还没有安装这个应用程序,可以根据你使用的 Linux 系统类型,使用更新的软件包来安装它。安装完软件后,请按照以下步骤操作:
-
运行该应用程序后,你应该会看到以下截图:
-
确保 vncserver 正在 Raspberry Pi 上运行;最简单的方式是通过 SSH 登录并在命令行中运行 vncserver。现在,点击连接按钮,进入远程桌面查看器。根据以下方式填写屏幕内容。在协议选择项中,选择VNC,你应该能看到以下截图:
-
接下来,输入主机 inet 地址—确保在末尾加上
:1
,然后点击连接。你需要输入你设置的 vncserver 密码,像下面的截图所示:
现在,你应该能看到 Raspberry Pi 的图形界面。你可以开始与系统进行交互了!
建立无线连接
现在你的系统已经配置好了,接下来的步骤是通过无线将你的 Raspberry Pi 连接到远程计算机。为此,你需要添加一个无线 USB 设备并进行配置。请参考elinux.org/RPi_USB_Wi-Fi_Adapters
来识别已验证与 Raspberry Pi 兼容的无线设备。以下是一款在许多在线电子商店都有销售的设备:
要连接到无线局域网,请启动系统并通过输入sudo nano /etc/network/interfaces
来编辑网络文件。然后,编辑该文件,使其如下所示:
重启你的设备,它现在应该已经连接到无线网络。
注意
如果你使用的是美国键盘,可能需要编辑键盘文件,以便有效使用 nano。为此,输入 sudo nano /etc/default/keyboard
并将 XKBLAYOUT="gb"
修改为 XKBLAYOUT="us"
。
你的系统有很多功能。尽管去玩弄系统,这将帮助你了解系统中已有的内容以及你从软件角度想要添加的内容。
树莓派上的编程
最后一点介绍,你需要一些基本的编程技能才能在项目中取得成功。本节将简要介绍在树莓派上使用 Python 和 C 进行编程。
在树莓派上创建和运行 Python 程序
你将使用 Python 出于两个原因。首先,它是一种简单的语言,直观且非常容易使用。其次,机器人领域中许多开源功能都可以使用 Python。为了运行本节中的示例,你需要安装 Python 的某个版本。幸运的是,基础的 Raspbian 系统已经安装了一个版本,因此你已经准备好开始了。
注意
如果你是编程新手,有许多不同的网站提供互动式教程。如果你想使用这些工具练习一些 Python 中的基本编程概念,可以访问 www.codeacademy.com 或 www.learnpython.org/
并试一试。
不过,为了帮助你入门,首先让我们了解如何创建和运行一个 Python 文件。事实上,Python 是一种交互式语言,你可以运行 Python 后逐个输入命令。但是,你希望使用 Python 来创建程序,因此你将编写 Python 程序,并通过在命令行中调用 Python 来运行这些程序。
通过输入 emacs example.py
打开一个示例 Python 文件。现在,将一些代码放入文件中。开始时,使用以下截图中的代码行:
注意
你的代码可能会有颜色编码。我已将颜色编码去除,以便更容易阅读。
让我们来看看代码,看看发生了什么:
-
a = input("Input value: ")
:程序的基本需求之一是获取用户输入。raw_input
部分允许我们做到这一点。数据将由用户输入并存储在a
中。提示"Input value:"
会显示给用户。 -
b = input("Input second value: ")
:这段数据同样由用户输入并存储在b
中。提示"Input second value:"
会显示给用户。 -
c = a + b
:这是一个可以使用数据进行的操作示例;在这个例子中,你可以将a
和b
相加。 -
print c
:程序的另一个基本需求是打印输出结果。print 命令会打印出c
的值。
创建完程序后,保存它(使用ctrl-x ctrl-s
)并退出 emacs(使用ctrl-x ctrl-c
)。现在,从命令行运行程序,输入python example.py
。你应该能看到类似以下截图的内容:
你还可以通过在程序中添加一行代码,从命令行直接运行程序,而无需输入python example.py
。现在,程序应该像以下截图所示:
在第一行添加#!/usr/bin/python
仅仅是为了使这个文件能够从命令行执行。保存文件并退出 emacs 后,输入chmod +x example.py
。这将更改文件的执行权限,计算机将认可并执行它。你现在应该能够直接输入./example.py
,程序应该能如截图所示运行:
请注意,如果你只是输入example.py
,系统将无法找到可执行文件。在这种情况下,文件尚未在系统中注册,因此你需要为其指定文件路径。在这种情况下,./
表示当前目录。
C/C++ 编程语言介绍
现在你已经了解了一种简单的编程语言——Python,你还需要接触一种更复杂但功能强大的语言——C。C 是 Linux 的原始语言,已经存在了几十年,但仍然被开源开发者广泛使用。它与 Python 相似,但也有所不同。由于你可能需要理解并修改 C 代码,因此你应该熟悉它,并了解它的使用方法。
和 Python 一样,你需要访问语言功能。这些功能以编译器和构建系统的形式提供,将你的文本文件转换为包含机器代码的程序,以便处理器可以实际执行。要做到这一点,输入sudo apt-get install build-essential
。这将安装将代码转换为系统可执行文件所需的程序。
工具安装完成后,让我们从一些简单的例子开始。以下是第一个 C/C++ 代码示例:
以下是对代码的解释:
-
#include <iostream>
:这是一个包含的库,用于使程序能够从键盘输入数据并将信息输出到屏幕。 -
int main()
:和 Python 一样,我们可以在文件中放置函数和类,但你总是希望从一个已知的起点开始执行;C 语言将这个起点定义为main
函数。 -
int a;
:这定义了一个名为a
的变量,类型为int
。C 是我们所说的强类型语言,这意味着我们需要声明定义变量时的类型。常见的类型有int
(整数,不带小数点);float
(带小数点的数字);char
(字符);和bool
(true
或false
值)。还要注意,C 语言中的每一行都以;
字符结尾。 -
int b;
:这定义了一个名为b
的变量,类型为int
。 -
int c;
:这定义了一个名为c
的变量,类型为int
。 -
std::cout << "Input value: ";
:这将在屏幕上显示字符串"Input value: "
。 -
std::cin >> a;
:用户输入的内容将存入变量a
。 -
std::cout << "Input second value: ";
:这将在屏幕上显示字符串"Input second value: "
。 -
std::cin >> b;
:用户输入的内容将存入变量b
。 -
c = a + b
:这个语句是将两个值相加的简单操作。 -
std::cout << c << std::endl;
:cout
命令打印出c
的值。末尾的endl
命令会打印一个换行符,使得下一个字符出现在下一行。 -
return 0;
:主函数结束并返回0
。
要运行这个程序,你需要通过编译过程将它转换为可执行程序,然后运行。为此,在创建程序后,输入g++ example2.cpp –o example2
。这将处理你的程序,将它转换为计算机可以执行的文件。可执行程序的名称将是example2
(由–o
选项后的名称指定)。
在编译完毕后,如果你在目录中运行ls
,你应该能在目录中看到example2
文件,如下图所示:
如果遇到问题,编译器会尝试帮助你找出问题。例如,如果你在int a
的表达式中忘记了int
,在尝试编译时会得到以下错误:
错误信息指示在int main()
函数中出现了问题,并告诉你变量a
没有成功声明。一旦编译好文件,要运行可执行文件,输入./example2
,你应该能够得到以下结果:
注意
如果你有兴趣学习更多关于 C 编程的内容,互联网上有很多好的教程可以帮助你,例如:www.cprogramming.com/tutorial/c-tutorial.html
和 thenewboston.org/list.php?cat=14
。
你还需要了解 C 语言的一个方面。你刚刚遇到的编译过程看起来相当直接。然而,如果你的功能分布在很多文件之间,或者需要大量的库,那么使用命令行执行编译可能会变得不太方便。
C 开发环境提供了一种自动化这个过程的方法;它被称为 make 过程。在使用这个方法时,你创建一个名为 makefile
的文本程序,定义你想要包含和编译的文件,然后,代替输入一长串命令,你只需要输入 make
,系统将根据 makefile
程序中的定义执行编译。有几个很好的教程介绍了这个系统——例如,www.cs.colby.edu/maxwell/courses/tutorials/maketutor/
或者 mrbook.org/tutorials/make/
。
现在你已经具备了编辑和创建自己编程文件的能力。接下来的章节将为你提供很多机会来练习你的技能,同时将代码行转换为炫酷的机器人功能。
摘要
恭喜你!你的 Raspberry Pi 已经安装并正常工作。这块硬件不会再被丢进垃圾箱了,现在,你准备好开始指挥你的 Raspberry Pi 做些事情了。
下一章将向你展示如何构建你的双足机器人。
第二章. 构建双足机器人
现在你已经配置好树莓派 2 Model B 并准备就绪,你需要添加一些硬件来进行控制和接口。在本章中,你将学习:
-
如何构建一个基本的 10 自由度(DOF)双足机器人
-
如何使用连接到树莓派 USB 端口的伺服电机控制器来控制伺服电机,从而使机器人运动
构建可以行走的机器人
在考虑如何创建一个移动机器人时,有几种选择。比较有趣的选择之一是能够行走的机器人。通常有三种版本:一种是具有两条腿的双足机器人,另一种是具有四条腿的双足机器人,还有一种是具有六条腿的六足机器人。虽然每种选择都提供了有趣而不同的可能性,但在本章中,你将构建一个基本的 10 自由度双足机器人。
你将为你的项目使用共计 10 个伺服电机,因为每条腿有 5 个活动点,或者说是 5 个自由度(DOF)。由于伺服电机是这个项目中最关键的组件,因此,可能有必要通过一个伺服电机的教程来学习如何控制它们。
伺服电机的工作原理
伺服电机与直流电机有些相似。然而,它们之间有一个重要的区别。直流电机通常设计为以连续的方式旋转——以给定的速度旋转 360 度——而伺服电机通常设计为移动到有限的角度范围。换句话说,在直流电机的世界中,你通常希望电机以你控制的连续旋转速度旋转。在伺服电机的世界里,你希望电机移动到你控制的特定位置。
这是通过向伺服电机的控制连接器发送脉宽调制(PWM)信号来完成的。这个脉冲的长度将控制伺服电机的角度,如下所示:
这些脉冲以 60 Hz 的重复率发送。通过设置正确的控制脉冲,你可以将伺服电机定位到任何角度。
构建双足平台
构建双足平台有几种方法。也许最简单的方法是购买一套基本的零件;这是你在本章中将看到的示例。市面上有几个套件选择,其中包括在www.robotshop.com/en/lynxmotion-biped-robot-scout-bps-ns-servos.html
上提供的套件、类似于www.ebay.com/itm/10-DOF-Biped-Robot-Mechanical-Leg-Robot-Servo-Motor-Bracket-NO-Servo-Motor-good-/131162548695?pt=LH_DefaultDomain_0&hash=item1e89e5a9d7
上提供的套件,或者www.amazon.com/gp/product/B00DR7GA4I/ref=oh_aui_detailpage_o04_s00?ie=UTF8&psc=1
上的套件。这就是我们将在本章中使用的具体套件。
最终,您的双足机器人将更像人类或霸王龙的腿部,但这将使编程更容易,且关闭时更加平稳。它也会更加稳定。
您还需要 10 个标准尺寸的舵机。可以选择多个品牌,但Hitec舵机相对便宜,您可以在大多数模型店和在线电子零售商那里购买。这个过程中的一个重要步骤是选择舵机的型号。舵机有不同的型号,主要根据它们能产生的扭矩大小。
扭矩是舵机能够施加的力量,用来移动与其连接的部件。在本案例中,您的舵机需要提起并移动与双足机器人相关的重量,因此您需要选择具有足够扭矩的舵机。不过,双足机器人对于不同的部位有不同的扭矩需求。角关节不会抬起整个腿部,因此它们可以使用扭矩较小的舵机,例如 HS-422 舵机。对于膝关节舵机,您将需要一个更强大的舵机。在这种情况下,我建议您使用 HS-645MGHB 舵机。抬起腿部的髋关节是需要最多扭矩的地方,因此您也可以使用 HS-645MG 舵机。您也可以为所有舵机都使用 HS-645MG 舵机,但它们价格较高,因此使用不同型号的舵机可以节省一些资金。
另一个需要的零件是一些金属舵机舵盘。这些舵盘是可选的,但它们会让您的双足机器人比通常附带的塑料舵盘更加牢固。以下是其中一个舵盘的图片:
以下是组装双足机器人的步骤:
-
将第一个脚踝舵机安装到脚部。为此,找到脚板,如下所示:
这是脚底部。注意这些斜角孔——您将使用斜头螺栓将舵机支架连接到脚板上,如下所示:
-
确保脚底平整。在将舵机安装到这个支架之前,您需要先使用套件中的一个轴承将一个 U 形支架连接到舵机支架上,如下所示:
-
最后,将其中一个舵机安装到支架中,并将 U 形支架连接到舵机的舵盘上,如下所示:
-
第一个舵机应该允许您的双足机器人移动脚部,使其左右倾斜。现在,安装第二个脚踝舵机到脚部。这将使您的双足机器人能够使脚踝前后倾斜。为此,将一个舵机支架连接到您刚刚创建的装配件上,然后将一个 U 形支架添加到这个装配件中,如下所示:
-
现在,添加支架到这个组件,如下所示:
-
现在,你可以将膝部舵机添加到你的双足机器人上。不过,首先你需要将上腿,最长的 U 型支架,连接到舵机支架上,如下所示:
-
现在,使用另一个轴承将这个组件连接到你已经组装好的下腿上,如下所示:
-
现在,你可以将膝部舵机安装在此位置。如果你使用的是不同的舵机,可以在膝关节处使用更强大的舵机。这里是图片:
-
最后一步是将髋部组装好。首先,你需要将转动腿部的舵机与舵机支架连接,如下图所示:
-
现在,将这个舵机支架连接到长 U 型支架,并安装能够抬起整个腿部的舵机。这是另一个位置;如果你使用的是不同的舵机,需要使用一个具有较大扭矩的舵机。整个组件应如下所示:
-
将另一条腿组装好,它将成为第一条腿的镜像。
-
现在,你需要通过首先将舵机支架连接器连接到髋部件的两个位置,将两条腿连接到髋部,如下所示:
-
最后,将腿部舵机的顶部安装到支架中,如下所示:
现在你的双足机器人已经准备好行走。既然你已经组装好了基本硬件,可以将注意力转向电子部分。
使用舵机控制器来控制舵机
要让你的双足机器人行走,首先需要将舵机控制器连接到舵机。你将在这个项目中使用的舵机控制器是一个简单的舵机控制器,利用 Pololu 的 USB 接口——Pololu 产品编号 1354,可以在 pololu.com 购买——它可以控制 18 个舵机。以下是设备的图片:
确保你订购的是已组装版本。这个硬件组件将把来自 Raspberry Pi 的 USB 命令转化为控制舵机电机的信号。Pololu 生产了多个不同版本的控制器,每个版本能够控制一定数量的舵机。在这种情况下,你可能想选择 18 舵机版本,这样你就可以用一个控制器控制所有 12 个舵机,还可以增加一个额外的舵机来控制摄像头或传感器的方向。你也可以选择 12 舵机版本。18 舵机控制器的一个优势是通过螺钉型连接器连接电源非常方便。
你需要做两个连接才能开始使用舵机控制器:第一个是连接舵机电机,第二个是连接电池。
首先,将伺服电机连接到控制器。为了保持一致性,使用以下配置将你的 12 个伺服电机连接到控制器上的 0 到 11 编号端口:
伺服连接器 | 伺服电机 |
---|---|
0 | 右脚踝进/出 |
1 | 右脚踝前/后 |
2 | 右膝 |
3 | 右臀上/下 |
4 | 右臀旋转 |
5 | 左脚踝进/出 |
6 | 左脚踝前/后 |
7 | 左膝 |
8 | 左上/下 |
9 | 左臀旋转 |
以下是控制器背面的图片,它将告诉我们在哪里连接伺服电机:
现在,你需要将伺服电机控制器连接到电池。对于这个项目,你可以使用一个 2S RC 锂电池;它将为你的伺服电机提供所需的 7.4 伏电压和电流,电流大约为 2 安培。以下是一个图片:
这块电池将配有两个连接器,一个带有较粗的线径用于正常使用,另一个较小的连接器用于连接电池充电器。你可以使用 XT60 连接器对,将一些电线焊接到电池连接器的配对端口,然后将电线的裸端插入伺服控制器。
你的系统现在已经可以正常工作。你可以将电机控制器连接到你的个人计算机,检查是否能够与其通信。为此,将一根迷你 USB 数据线连接到伺服控制器和你的个人计算机。
与伺服控制器通过 PC 进行通信
硬件连接完毕后,你可以使用 Polulu 提供的一些软件来控制伺服电机。我们可以通过个人计算机来完成此操作。首先,从 www.pololu.com/docs/0J40/3.a 下载 Polulu 软件,并按照网站上的说明进行安装。安装完成后,运行软件,你应该看到如下屏幕:
首先,你需要在“串口设置”中更改配置,选择 串口设置 标签,你应该会看到如下界面:
确保选择了“USB Chained”选项;这将允许你通过 USB 连接并控制电机控制器。现在,选择 状态 标签返回主屏幕;此时,你可以实际开启 10 个伺服电机。屏幕应当显示如下:
现在,你可以使用滑块来实际控制伺服电机。启动伺服电机 0,确保伺服电机 0 移动的是右下脚踝伺服电机。你也可以使用此功能来居中伺服电机。将伺服电机 1 设置到滑块的中间位置。然后,松开伺服电机上的伺服角直到伺服电机居中。在所有伺服电机的零位置时,你的双足机器人应该看起来是这样的:
将伺服控制器连接到树莓派
您已经检查了舵机电机控制器和舵机。现在,您可以将电机控制器连接到树莓派,并确保您可以从中控制舵机。
现在,让我们与电机控制器交流。以下是步骤:
-
将树莓派与电机控制器连接,通过将迷你 USB 连接到树莓派上的 USB 主机连接,如图所示:
-
在
www.pololu.com/docs/0J40/3.b
下载 Pololu 的 Linux 代码。可能最好的方法是登录到您的树莓派,然后输入wget http://www.pololu.com/file/download/maestro-linux-100507.tar.gz?file_id=0J315
。 -
然后,使用
mv maestro-linux-100507.tar.gz\?file_id\=0J315 maestro-linux-100507.tar.gz
移动文件。 -
输入
tar –xvf maestro_linux_011507.tar.gz
来解压文件。这将创建一个名为maestro_linux
的目录。输入cd maestro_linux
进入此目录,然后输入ls
;您应该看到类似以下的内容:
README.txt
文件将为您提供如何安装软件的明确说明。不幸的是,您无法在树莓派上运行MaestroControlCenter;它使用的 Windows 版本不支持图形界面,但您可以使用UscCmd命令行应用程序控制您的舵机。首先,输入./UscCmd --list
,您应该看到以下内容:
单元看到您的伺服控制器。如果只输入./UscCmd
,您可以看到可以发送到控制器的所有命令:
请注意,您可以向舵机发送特定的目标角度,尽管目标不在角度值内,因此很难知道您正在发送舵机的位置。连接了舵机和电池到伺服控制器后,尝试输入./UscCmd --servo 0, 10
。舵机将移动到其全角位置。输入./UscCmd – servo 0, 0
,将停止舵机尝试移动。在下一节中,您将编写一些 Python 代码,将您的角度转换为舵机控制器希望看到的命令,以将其移动到特定的角度位置。如果您在 USB 连接方面遇到问题,请参考www.linux-usb.org/FAQ.html
获取更多信息。
注意
如果没有运行 Windows 版本的 Maestro Controller 并将串行设置设置为USB Chained,则您的电机控制器可能无法响应。重新运行 MaestroController 代码,并将串行设置设置为USB Chained。
创建一个程序来控制您的双足机器人
现在你知道可以与舵机控制器通信并移动舵机了。在本节中,你将创建一个 Python 程序,让你与舵机通信,移动它们到特定的角度。你可以使用 Python,因为它非常简单且容易运行。
让我们从一个简单的程序开始,它会让你腿部移动的机器人舵机转到 90 度(这应该接近 0 到 180 度之间的中间位置)。下面是代码:
下面是代码的解释:
-
#!/usr/bin/python
:这行代码让你可以从命令行执行此 Python 文件。 -
import serial
:这一行导入了串行库。你需要这个库来通过 USB 与你的设备通信。 -
def setAngle(ser, channel, angle):
:这个函数将你设定的舵机和角度转换为舵机控制器所需的串行命令。要了解用于控制舵机的具体代码,请参考www.pololu.com/docs/0J40
。 -
ser = serial.Serial("/dev/ttyACM0", 9600)
:这行代码打开与你的舵机控制器的串行端口连接。 -
for i in range(0, 9)
:for 循环用于访问所有九个舵机。 -
setAngle(ser, i, 90)
:现在,你可以将每个舵机设置为中间(家)位置。默认情况下,每个舵机会设置为 90 度。如果你的腿部不在中间位置,你可以通过调整每个舵机的舵机轮来进行调整。
要访问串行端口,你需要确保你已经安装了 Python 串行库。如果没有,可以输入 apt-get install python-serial
来安装。安装好串行库后,你可以通过输入 python quad.py
来运行你的程序。
一旦你设置好基本的家庭位置,就可以让你的机器人做一些事情。我们从让双足机器人移动它的脚开始。下面是 Python 代码:
在这种情况下,你正在使用 setAngle
命令来设置你的舵机,操控机器人右脚踝。
总结
现在你有了一个可以移动的机器人!在下一章中,你将学习如何让你的机器人做很多神奇的事情。你将学习如何让它向前和向后走,如何让它跳舞和转弯。有了一些基本的知识,任何动作都是可能的。
第三章:双足机器人的运动
现在你的双足机器人已经启动并运行,你可以开始开发一些有趣的方式来让它移动。在这一章中,你将学习
-
如何调整伺服器的位置以达到霸王龙的姿势
-
你机器人的基本行走步态
-
你的机器人的基本转向
在开始之前,最好为你的双足机器人创建一个支架。你的机器人天生就不稳定,只有两条腿,并且在实验过程中,你可能会犯一些错误。仅凭两条腿,这些错误很可能会导致你的机器人摔倒,从而损坏机器人。
如果你有电子板台钳或“额外的手”设备,它们在这方面非常有用。下面是使用这个设备来创建支架的图片:
如果没有,你也可以使用 PVC 管或木材轻松创建这种悬挂支架。实际上,任何可以防止你在实验过程中摔倒机器人的物品都可以。
一个基本的稳定姿势
现在你的双足机器人已经完成,并且你知道如何使用 Python 来编程控制伺服器,你可以尝试一些基本的姿势。你将首先创建一个程序,允许你设置单独的伺服器,这样你就可以进行实验。以下是这个程序:
这段代码包括了来自第二章的 Python setAngle
函数,构建双足机器人。具体的内容来自于 www.pololu.com 网站,但它的功能非常简单,就是允许你将特定伺服器设置到特定的角度。
代码的下一部分将所有伺服器设置到它们的中心位置。代码的最后一部分,while 1:
代码块,简单地要求用户输入伺服器和角度,然后将命令发送到伺服器控制器。
一旦程序运行,你应该看到你的双足机器人直立。如果没有,你可能需要通过调整伺服器的角度来重新校准伺服器的位置。这是一个有用的姿势,但还有一些其他更稳定的姿势。作为一个很好的初步示例,你可以将姿势改为更像恐龙霸王龙(Tyrannosaurus Rex)的姿势,膝盖指向后方。以下是基本的伺服器位置:
伺服器 | 角度 |
---|---|
1 | 60 |
2 | 60 |
3 | 60 |
6 | 120 |
7 | 120 |
8 | 120 |
机器人姿势应该是这样的:
你可以使用这些角度来实现这个姿势。然而,这样会限制你的移动能力,因为你的伺服器将在单一方向上接近最大移动范围。由于这是你机器人起始的姿势,为了实现最大灵活性,你需要将伺服器调整到这个中心位置。为此,运行默认的 robot.py
来将双腿设置为中心位置。现在,调整伺服器角度,以便在伺服器角度为 90 度时,达到这个姿势。
它应该看起来像这样:
现在你有了一个稳定的基础,你可以开始编写简单的行走动作程序。
基本行走动作
你的机器人已经准备好行走,然而,你首先需要让一条腿离开地面。当然,这很简单;只需通过改变膝关节的角度抬起腿部,腿就能离开地面。你还可以改变前后踝关节的角度;这可以让你抬起腿时不需要抬得太高。
然而,如果仅仅调整这两个伺服器,你会遇到问题;当你抬起腿时,机器人会摔倒。这是由于一个简单的原理,叫做重心。当机器人处于静止状态时,重心是这样的:
很明显,如果你抬起一条腿,机器人会朝着被抬起的腿的方向摔倒。你需要做的是使用可以使机器人左右倾斜的踝关节伺服器,将重心转移到将留在地面的腿上,这样它最终会像这样:
然后你需要设置伺服器来抬起左腿。以下是这些伺服器设置的侧视图:
现在,是时候编写一些 Python 代码来实现这一点了。你将从 robot.py
代码开始,并在一个名为 liftLeftLeg
的函数中添加以下几行代码:
这样会让机器人倾斜到右腿上,然后抬起左腿,如下所示:
现在,向前迈步相对容易。只需将左腿的髋关节向前移动,然后将右腿的踝关节移动,以便将整个机器人向前倾斜。下面是图示和伺服器设置:
这是 Python 代码:
这是机器人的照片:
这是行走步态的第一阶段。那么,让我们详细说明你需要的所有动作,以便让机器人向前行走。以下是不同状态的侧视图:
下面是机器人在不同状态下的图片:
下面是不同状态下各个函数的 Python 代码:
你会注意到每个功能都有一些不同的伺服控制指令;这些必须按照这个顺序执行才能得到期望的结果。
下面是将两个步骤的函数按顺序排列的 Python 代码:一个是左腿,另一个是右腿:
这是一种非常简单的步态,虽然不算特别优雅。你可以看到每个状态都是由许多独立的伺服动作组成的。当然,你可以添加更多的伺服动作,使其更加平滑和精细。你具体的伺服角度设置可能会与这些不同;你需要进行一些实验来确保双足机器人的腿部定位正确。
既然你已经能让机器人行走了,接下来你还需要教它如何转弯。
机器人的基本转弯
你的机器人可以向前走,但你还希望它能够转弯。转弯的限制在于你能转动机器人髋部的角度,对于这款机器人来说,大约是 20 度。所以,要完成一个 90 度的转弯,你需要将转弯分为几个步骤。这里的一个重要区别是,当你回到站立状态时,你不想将髋部旋转伺服电机重置为 90 度。以下是转弯的图示,其中包括一些后视图:
这是一个基本转弯操作的 Python 代码:
这是将这些基本状态连接在一起,以实现转弯的 Python 代码:
现在你的机器人可以行走并转弯了!显然,通过反转每个函数中的伺服控制语句顺序,机器人还可以向后走。按照本章中概述的规划方法,你还可以编程更多类型的动作。
总结
现在,机器人可以移动了。下一步是添加一些传感器,使机器人能够避开或找到路径上的物体。
第四章:避免障碍物的传感器应用
你已经构建了双足机器人。现在,机器人可以移动了。但是如果你希望它能够感知外部世界,避免碰到物体呢?在本章中,你将学习如何添加一些传感器来帮助避免障碍物。
具体而言,你将学习:
-
如何将 Raspberry Pi 连接到红外(infrared)传感器
-
如何将 Raspberry Pi 连接到 USB 声纳传感器以检测外部世界
-
如何将 Raspberry Pi 和其 GPIO 连接到声纳传感器以检测外部世界
将 Raspberry Pi 连接到红外传感器
你的机器人现在可以移动,但你可能希望它能够感知障碍物或目标。实现这一点的方式之一是使用红外(IR)传感器。首先,需要了解红外传感器的基础知识。红外传感器包含发射器和接收器。发射器发出一束窄光束,传感器接收这束光。
传感器中的差异最终表现为一个角度测量,如下图所示:
不同的角度给出了物体距离的指示。传感器将这些角度测量转换为一个电压信号,你可以通过该信号来判断距离。不幸的是,传感器输出与距离之间的关系并不是线性的,因此你需要进行一些校准,以预测实际距离及其与传感器输出之间的关系。
注意
红外传感器非常准确,误差率较低;但是,如果环境光线过强,它们可能工作不佳。传感器的准确性还会受到被测物体反射特性的影响。在决定使用哪种传感器时,这一点也是需要考虑的因素。
在开始之前,你需要获取一个传感器。较为流行的选择是由 Sharp 提供的廉价红外传感器。它可以在许多在线电子商店购买,并且有多个型号可感应不同的距离。你将使用Sharp 2Y0A02型号,这款设备可以感知最远 150 厘米的距离。以下是该传感器的图片:
你还需要确保获取设备的连接电缆,通常设备会附带此电缆。以下是带有电缆的传感器图片:
如教程中所述,传感器输出的电压将表示距离。然而,这是一个模拟信号,而 Raspberry Pi 并没有模拟到数字的转换器,无法将该模拟电压转换为可以在程序中读取的数字。因此,你需要为项目添加一个模拟到数字转换器。
有两种选择。如果你想要一个直接插入 USB 接口的模拟到数字转换器,可以访问www.phidgets.com。这块板非常了不起;它将模拟信号转换成数字数据,并通过 USB 端口提供读取。这部分的型号是1011_0 - PhidgetInterfaceKit 2/2/2,如下所示:
不幸的是,启动并运行这个系统需要一些编程经验。另一个选择是使用一个连接到树莓派 GPIO 引脚的模拟到数字转换器。有一款名为ADC pi+的部件,来自www.abelectronics.co.uk,它可以实现这一功能。它的图片如下:
这个设备更容易编程,因此你将在这个项目中使用它。现在,来连接传感器:
-
将焊接针脚到 ADC Pi+板上,以连接到 ADC,像这样:
-
现在,将板子插入树莓派 B 2 型号。以下是组合连接的图片:
-
现在,你将把红外传感器连接到 ADC。为了连接这个模块,你需要将传感器底部的三个引脚连接起来。以下是连接清单:
ADC-DAC 板 传感器引脚 5V Vcc GND Gnd In1 Vo 不幸的是,模块上没有标签,但你需要连接的引脚如下:
最简单的连接方式是使用通常随传感器附带的三线电缆。一旦连接好引脚,你就可以通过树莓派上的 Python 程序访问传感器的数据。整个系统看起来是这样的:
现在,你已经准备好添加一些代码来读取红外传感器。你需要按照以下步骤与 ADC 进行通信:
-
启用 ADC 的第一步是启用 I2C 接口。你可以通过运行
raspi-config
并选择8 高级选项来完成这一操作,像这样: -
一旦完成,进入A7 I2C选项来启用 I2C,像这样:
完成所有选项以启用 I2C 接口并加载库,然后重启树莓派。
你还需要编辑
/etc/modules
文件,并添加以下两行:重启树莓派。你可以通过输入
sudo i2cdetect -y 1
来检查 I2C 是否已启用,你应该会看到类似这样的输出:I2C 设备,你的 ADC,位于68和69地址。
-
现在,你可以下载代码了。为此,在主目录中输入
git clone https://github.com/abelectronicsuk/ABElectronics_Python_Libraries.git
,Python 库将被安装到你的树莓派中。 -
转到
./ABElecttronics_Python_Libraries/ADCPi
目录;这里有你硬件的程序。按照README.md
文件中的说明,输入sudo apt-get update
,然后输入sudo apt-get install python-smbus
。这将安装smibus
库,这是 ADC 工作的必需库。同时,输入sudo adduser pi i2c
将pi
添加到可以访问 i2c 的组中。 -
你需要编辑家目录中的
.bashrc
文件,添加以下几行:添加此行代码将把这个库添加到路径中,以便你可以访问其功能。重启树莓派。
-
现在,你可以运行其中一个演示程序。输入
python demo-readvoltage.py
,你应该会看到类似这样的内容:这些原始读数很不错,但现在你需要编写一个程序,获取第一个 ADC 的数据并将其转换为距离。为此,你需要为你的传感器绘制一个电压与距离的图表。以下是该示例中 IR 传感器的图表:
曲线实际上分为两部分;第一部分是距离约 15 厘米以内,第二部分是从 15 厘米到 150 厘米的距离。最简单的方法是建立一个简单的数学模型,忽略小于 15 厘米的距离,只对 15 厘米以上的距离进行建模。有关如何构建这个模型的更多信息,请参考
davstott.me.uk/index.php/2013/06/02/raspberry-pi-sharp-infrared/
。以下是使用此模型的 Python 程序:唯一的新代码行是
distance = (1.0 / (adc.read_adc_voltage(1) / 13.15)) - 0.35
。它将你的电压转换为距离。现在,你可以运行程序,你将看到以厘米为单位的结果,像这样:现在,你可以使用 IR 传感器测量物体的距离了!
将树莓派连接到 USB 声纳传感器
还有另一种感应物体存在的方法:使用声纳传感器。但在将此功能添加到你的系统之前,这里有一个关于声纳传感器的小教程。这种类型的传感器使用超声波来计算与物体的距离。声波从传感器发出,如下图所示:
设备每秒发送 10 次声波。如果路径中有物体挡住这些波,波将反射物体,并返回传感器,如下图所示:
然后传感器测量任何返回。它使用发送声波和返回声波的时间差来测量与物体之间的距离。
注意
声纳传感器通常非常精确,误差率低,并且不受环境中的光照或颜色影响。
如果你想使用声纳传感器来测量距离,有几种选择。首先是使用连接到 USB 端口的声纳传感器。以下是 USB 声纳传感器的图片:
这是USB-ProxSonar-EZ传感器,可以直接从 MaxBotix 或亚马逊购买。有几种型号,每种型号具有不同的距离规格;然而,它们的工作方式都相同。
你也可以选择连接到树莓派 GPIO 的声纳传感器。以下是这种廉价声纳传感器的图片:
这种传感器价格较低且易于使用;它需要一定的处理能力来协调发送和接收信号的时间,但树莓派 B 2 具有所需的处理能力。以下是设置此声纳传感器以测量距离的步骤:
-
第一步是了解树莓派 B 2 的 GPIO 引脚。以下是引脚布局图示:
在这种情况下,你需要连接到树莓派 B2 的 5 伏连接器,即引脚 2。你还需要连接到 GND,即引脚 6。你将使用引脚 16 作为输出触发引脚,并使用引脚 18(GPIO24)作为输入引脚来计时来自声纳传感器的回波。
-
现在你知道你要连接的引脚,可以连接声纳传感器了。有一个问题,你不能直接将声纳传感器的 5 伏返回连接到树莓派 GPIO 引脚;它们需要 3.3 伏。你需要建立一个电压分压器,将 5 伏电压降低到 3.3 伏。这可以通过两个电阻器来完成,连接方式如下图所示:
如果你想了解在这种配置中电压分压器的工作原理,请参考
www.modmypi.com/blog/hc-sr04-ultrasonic-range-sensor-on-the-raspberry-pi
。这两个电阻器的组合将电压降低到所需的水平。你可能希望将所有这些放在一个小面包板上,如下所示:最后,将其连接到树莓派,如下所示:
-
现在设备已连接,你需要一些代码来读取值,确保它稳定(即测量值稳定),然后将其转换为距离。以下是这段程序的 Python 代码:
现在,你应该能够运行程序并看到像这样的结果:
现在你已经让传感器正常工作,你可以让双足机器人避开或找到物体。
概述
恭喜!现在你可以检测并避开墙壁及其他障碍物,也可以利用这些传感器来探测你可能想要找到的物体。在下一章,你将学习如何进行路径规划,将你的机器人从 A 点移动到 B 点,甚至让机器人在遇到路径上的障碍物时知道该如何应对。
第五章:路径规划与双足机器人
现在你的双足机器人已经可以移动,并能发现障碍物,你可以开始让它自动地移动了。不过,你需要让你的机器人规划它的路径,也就是说,如果它知道自己从哪里出发以及目标终点在哪,它就能从起点移动到终点。
本章内容包括:
-
如何将指南针添加到你的双足机器人上,这样你就能让它有方向感
-
学习一些基本的路径规划技术,以便你的机器人能更好地执行任务
将数字指南针连接到树莓派
对于你的机器人来说,一个重要的信息是它的行进方向,这对于它规划自己的路径至关重要。那么,让我们学习如何将数字指南针连接到树莓派。
有几种芯片提供数字指南针功能,其中最常见的是HMC5883L 三轴数字指南针芯片。该芯片被多家公司封装到模块中,几乎所有这些模块都提供类似的接口。以下是GY-271 HMC5883L 三轴指南针磁力计传感器模块的图片,该模块可以通过许多在线零售商购买:
这种类型的数字指南针利用磁传感器来探测地球的磁场。传感器的输出通过一组寄存器提供给外界,这些寄存器允许用户设置采样率、连续或单次采样等参数。x、y和z方向的输出也使用寄存器进行访问。
该芯片的连接方式非常简单,设备通过使用 I2C 总线与树莓派进行通信,I2C 总线是一种标准的串行通信总线。I2C 接口是一个同步串行接口,提供的性能比异步的 Rx/Tx 串行接口更高。SCL 数据线提供时钟信号,而数据则通过 SDA 线传输。该总线还提供寻址功能,因此可以同时将多个设备连接到主设备上。在模块的背面,连接端口已标明,如下图所示:
然后你将把设备连接到树莓派的 GPIO 引脚。以下是树莓派的引脚分布图:
将设备的 VCC 连接到树莓派的引脚 1(3.3V),将 GND 连接到引脚 9(GND)。将设备的 SCL 连接到引脚 5(GPIO 3),将 SDA 连接到引脚 3(GPIO 2)。注意,你无需连接数据准备好(DRDY)线。现在,你就可以与设备进行通信了。
通过编程访问指南针
为了访问指南针功能,你需要在树莓派上启用 I2C 库。如果你在第四章《避免使用传感器的障碍物》中使用了 IR 传感器和 ADC 附加硬件,你已经完成了这一步。如果没有,按照以下说明启用 I2C 接口:
-
运行
raspi-config
。选择配置高级设置,如下面的截图所示:在接下来的选择页面,选择启用/禁用 I2C 接口的自动加载,如下截图所示:
然后选择yes,如下面的截图所示:
你还需要编辑
/etc/modules
文件,添加以下两行i2c-bcm2708
和i2c-dev
,如下截图所示:最后一次编辑,修改
/boot/config.txt
中的最后一行,如下截图所示:现在,重新启动树莓派。
-
连接设备后,你可以查看系统是否识别到你的设备。为此,输入以下命令:
你可以看到设备的地址是1e。
-
现在,你可以与数字指南针进行通信了。为此,你需要创建一个 Python 程序。但在创建 Python 代码之前,你需要下载一个库,这将使这一切变得更加容易。首先,创建一个名为
compass
的目录并进入该目录。然后,输入git clone https://github.com/quick2wire/quick2wire-python-api.git
来下载quick2wire-python-api
库。最后,输入git clone https://bitbucket.org/thinkbowl/i2clibraries.git
来获取 i2clibraries。你还需要设置一些环境变量。通过进入你的主目录并编辑
.bashrc
文件,在文件末尾添加以下两行: -
现在,你可以创建以下的 Python 代码:
-
现在,运行代码,输入
python3 compass.py
命令,你应该会看到:现在,你可以为你的项目添加方向功能了!当你移动设备时,应该能看到方向值发生变化。
注意
这是一个基础程序;你可以在
think-bowl.com/raspberry-pi/i2c-python-library-3-axis-digital-compass-hmc5883l-with-the-raspberry-pi/
找到有关此库的更多其他功能。开发指南针代码的最后一步是将其制作成一个文件,这样函数就可以被导入到其他 Python 程序中。为此,编辑文件,使所有代码都包含在函数中,如下所示:
然后,你就可以使用 Python 的导入功能将这个功能导入到另一个 Python 文件中。
机器人动态路径规划
现在你可以看到障碍物,并且知道方向,你就可以进行动态路径规划了。动态路径规划意味着你在遇到障碍物之前,无法知道整个环境的所有障碍物。你的机器人必须在移动的过程中决定如何前进。这是一个复杂的话题,但有一些基本概念你可以开始理解并应用,当你让机器人在环境中移动时。首先,我们解决目标位置的识别问题,并需要执行一条没有障碍物的路径,然后再加入障碍物。
基本路径规划
为了讨论动态路径规划,即规划一条你不知道可能遇到哪些障碍物的路径,你需要一个框架来理解你机器人所在的位置,并确定目标的位置。一个常见的框架是x和y网格。下面是这样一个网格的示意图:
有三个关键点:
-
左下角是固定参考位置。x和y方向也是固定的,所有其他位置都将相对于这个位置和这些方向进行测量。
-
另一个重要点是机器人起始位置。机器人将通过使用其x坐标(相对于某个固定参考位置的* x方向上的位置)以及y坐标(相对于某个固定参考位置的y*方向上的位置)来跟踪其位置,直到目标。它将使用指南针来保持这些方向。
-
第三个重要点是目标的位置,也可以用相对于固定参考位置的x和y坐标表示。如果你知道机器人起始位置和起始角度,就可以规划一条最优(最短距离)路径到达目标。为此,你可以使用目标位置和机器人位置,并通过一些相对简单的数学计算来得出从机器人到目标的距离和角度。
要计算距离,使用以下公式:
使用以下公式告诉你的机器人到达目标的旅行距离。第二个公式将告诉你的机器人需要行进的角度:
以下是这两条信息的图形表示:
现在你已经有了目标角度和距离,你可以编程让你的机器人移动。为此,你需要编写一个程序来进行路径规划,并调用在 第三章,双足机器人的运动 中创建的运动函数。不过,你需要知道机器人每步行进的距离,以便你告诉机器人应该走多少步,而不是直接告诉它行进的距离单位。
你还需要能够计算机器人转向时可能覆盖的距离;然而,这个距离可能太小,几乎不重要。如果你知道了角度和距离,你就可以让机器人朝着目标前进。
以下是你将要编写的程序步骤:
-
计算你的机器人需要行进的距离,以到达目标。将这个距离转换成所需的步数。
-
计算你的机器人需要行进的角度以到达目标。你将使用指南针和机器人转向函数来实现这个角度。
-
现在,调用适当次数的步进函数,以使机器人走到正确的距离。
就是这样。现在,我们将使用一些非常简单的 Python 代码,通过使用函数来让机器人前进和转向。这样做时,创建一个名为 robotLib.py
的文件,其中包含所有执行实际伺服设置的函数,以便让双足机器人前进和转向是很有意义的。然后,你可以使用 from robotLib import *
语句导入这些函数,之后你的 Python 程序就可以调用这些函数了。这样,路径规划的 Python 程序会变得更小、更易于管理。你将对 compass
程序做同样的操作,使用 from compass import *
命令。
注意
有关如何将函数从一个 Python 文件导入到另一个文件的更多信息,请参考 www.tutorialspoint.com/python/python_modules.htm
。
以下是程序的代码列表:
在这个程序中,用户输入目标位置,然后机器人首先通过读取角度来决定到达目标角度的最短方向。为了简单起见,机器人被放置在网格中,并朝着角度 0 的方向前进。如果目标角度小于 180 度,机器人将向右转;如果大于 180 度,机器人将向左转。机器人会一直转直到目标角度和实际测得的角度相差很小。然后,机器人就会按步数前进直到到达目标。
避免障碍物
如前所述,规划没有障碍物的路径是非常简单的。然而,当你的机器人需要绕过障碍物时,就会变得有些挑战。让我们看一个实例,其中在你之前计算的路径中有一个障碍物。它可能看起来像下面这样:
你仍然可以使用相同的路径规划算法来找到起始角度;然而,现在你需要使用声呐传感器来检测障碍物。当声呐传感器检测到障碍物时,你需要停止并重新计算路径以避开障碍物,然后重新计算通向目标的理想路径。实现这一点的一种非常简单的方法是,当你的机器人感知到障碍物时,向右转 90 度,行进一段固定距离,然后重新计算最佳路径。当你转回来朝着目标移动时,如果没有检测到障碍物,你将能够沿着最佳路径继续前进。
然而,如果你的机器人再次遇到障碍物,它将重复这个过程,直到到达目标。在这种情况下,按照这些规则,机器人将沿着以下路径行驶:
在将声呐传感器的功能添加到你的机器人之前,还有一步需要完成。你需要修改声呐传感器代码,以便它可以作为库添加到 Python 代码中。以下是这段代码:
你还需要通过from compass import *
语句导入此代码。你还将使用 time 库和time.sleep
命令来在代码中的不同语句之间添加延迟。以下是代码的第一部分,利用这些内容来检测障碍物,向右转,然后是利用声呐传感器的第一部分 Python 代码:
以下是代码的最后一部分:
现在,这个算法相当简单;还有一些算法对障碍物有更复杂的响应。你还可以看到,通过在机器人两侧添加声呐传感器,机器人实际上能够感知障碍物是否已结束。你还可以提供更复杂的决策过程,来判断该如何转向以避开物体。同样,有许多不同的路径寻找算法。请参见www.academia.edu/837604/A_Simple_Local_Path_Planning_Algorithm_for_Autonomous_Mobile_Robots
以获取相关示例。这些更复杂的算法可以通过使用本章中建立的基本功能进行探索。
总结
现在,你已经为机器人添加了路径规划功能。你的机器人不仅能够从 A 点移动到 B 点,还能够避开可能存在的障碍物。在下一章,你将学习如何为你的双足机器人添加摄像头。这将为你的机器人提供一整套新的方式来感知周围的世界。
第六章:为你的双足机器人添加视觉功能
现在你的双足机器人已经可以启动并移动,能够找到障碍物,并且知道如何规划路径,你现在可以让它开始自主移动了。不过,你可能希望让你的机器人跟随某种颜色或运动。
在本章中,你将学习:
-
如何将摄像头添加到你的双足机器人
-
如何将 RaspiCam 添加到你的双足机器人
-
如何安装和使用 OpenCV,一个开源的视觉软件包
-
如何让你的双足机器人跟随运动
在你的双足机器人上安装摄像头
拥有视觉能力对于你的双足机器人来说是一个真正的优势;你将在许多不同的应用中使用这个功能。幸运的是,添加视觉硬件和软件既简单又便宜。关于视觉硬件,有两种选择。你可以向系统中添加一个 USB 摄像头,或者添加一个专为 Raspberry Pi 设计的摄像头 RaspiCam。
在 Raspberry Pi 上安装 USB 摄像头
连接 USB 摄像头非常简单。只需将其插入 USB 插槽。为了确保设备已连接,输入 lsusb
。你应该能看到如下内容:
这显示了一个 Creative 摄像头,位于总线 001 设备 004: ID 041e:4095。为了确保系统将其识别为视频设备,输入 ls /dev/v*
命令,你应该看到类似下面的内容:
/dev/video0
是摄像头设备。现在设备已经连接,让我们实际看看你是否可以捕捉图像和视频。有几种工具可以让你访问摄像头,但一个带有视频控制的简单程序叫做 luvcview。要安装这个程序,输入 sudo apt-get install luvcview
。安装完成后,你需要运行它。为此,你要么需要直接连接显示器,要么能通过远程 VNC 连接访问 Raspberry Pi,例如使用 vncserver,因为显示图像需要图形界面。
一旦以这种方式连接,打开 Raspberry Pi 上的终端窗口并运行 luvcview
。你应该看到类似以下内容:
不必担心图像质量,你将会在 OpenCV 内部捕捉和处理图像,OpenCV 是一个视觉框架。
在 Raspberry Pi 上安装 RaspiCam
另一个在 Raspberry Pi 上查看外部世界的选择是使用 RaspiCam。安装这个摄像头稍微复杂一些;你将需要将其连接到 Raspberry Pi 上的特殊接口。下面是带有特殊连接器的摄像头图片:
你也可能需要为摄像头添加保护罩;其组装方式如下图所示:
现在你已经准备好将相机连接到树莓派。相机通过将其安装到树莓派上标有“Camera”的连接器上来连接树莓派。要查看具体操作,请参见www.raspberrypi.org/help/camera-module-setup/
上的视频。
相机连接后,你需要使用raspi-config
工具启用相机。输入sudo raspi-config
,然后选择启用相机,如以下截图所示:
现在重启树莓派。如果你是从远程计算机进行开发并希望查看你的图像,你需要在计算机与树莓派之间建立一个 vncserver 连接。详情请参见第一章,配置和编程树莓派。要使用相机拍照,只需输入raspistill -o image.jpg
。这将用相机拍照,并将图像存储在image.jpg
文件中。一旦获得照片,你可以通过打开树莓派的图像查看器来查看它,方法是点击左下角的菜单图标,然后选择附件,接着选择图像查看器,如以下截图所示:
打开image.jpg文件,你应该能看到你拍摄的照片:
在你能使用树莓派相机访问 OpenCV 之前,你需要做两件事。首先,你需要添加一个 Python 库,叫做picamera
。要获取此库和所需的其他库,输入sudo apt-get install python-picamera python3-picamera python-rpi.gpio
。其次,你需要输入sudo modprobe bcm2835-v4l2
。现在,树莓派相机可以在下一节的 OpenCV 示例中使用。
下载并安装 OpenCV——一个功能齐全的视觉库
现在相机已经连接好,你可以开始使用开源社区提供的一些令人惊叹的功能。打开终端窗口并输入以下命令:
-
sudo apt-get update
:你将要下载一些新的软件包,所以最好确保所有内容都是最新的。 -
sudo apt-get install build-essential
:虽然你可能之前已经执行过此步骤,但这个库对于构建 OpenCV 是必不可少的。 -
sudo apt-get install libavformat-dev
:此库提供编码和解码音频及视频流的功能。 -
sudo apt-get install ffmpeg
:此库提供转码音频和视频流的功能。 -
sudo apt-get install libcv2.4 libcvaux2.4 libhighgui2.4
:此命令展示了基本的 OpenCV 库。注意命令中的数字。随着 OpenCV 新版本的发布,这个数字几乎肯定会发生变化。如果 2.4 版本不起作用,可以尝试 3.0 版本或在 Google 上搜索 OpenCV 的最新版本。 -
sudo apt-get install python-opencv
:这是 OpenCV 所需的 Python 开发工具包,因为你将使用 Python。 -
sudo apt-get install opencv-doc
:这个命令会展示 OpenCV 的文档,以防你需要它。 -
sudo apt-get install libcv-dev
:这个命令展示了编译 OpenCV 所需的头文件和静态库。 -
sudo apt-get install libcvaux-dev
:这个命令展示了更多用于编译 OpenCV 的开发工具。 -
sudo apt-get install libhighgui-dev
:这是另一个提供头文件和静态库以编译 OpenCV 的软件包。 -
现在输入
cp -r /usr/share/doc/opencv-doc/examples /home/pi/
。这将把所有示例复制到你的主目录。现在 OpenCV 已安装,你可以尝试其中一个示例。进入
/home/pi/examples/python
目录。如果你输入ls
,你会看到一个名为camera.py
的文件。这个文件包含了最基本的代码,用于捕捉并显示一系列图像。在运行代码之前,使用cp camera.py myCamera.py
命令复制一份文件。然后,编辑文件使其如下所示:你将添加的两行代码是带有
cv.SetCaptureProperty
的两行;它们将把图像的分辨率设置为 360 x 240。要运行这个程序,你需要连接显示器和键盘到树莓派,或者使用 vncviewer。当你运行代码时,你应该能看到显示的窗口,如下图所示:如果你使用的是 RaspiCam 但没有看到图像,你需要运行
sudo modprobe bcm2835-v4l2
命令。现在你可以看到外部世界了!你可能想调整分辨率,以找到最适合你应用的设置。更大的图像很棒——它们能让你更详细地看到世界——但也会消耗更多的处理能力。当你实际要求系统进行一些真实的图像处理时,你会更多地调整这一点。如果你打算使用 vncserver 来了解系统性能,要小心,因为这会显著减慢更新率。一个宽高是原来两倍的图像(宽度/高度)将涉及四倍的处理量。现在,你可以利用这个功能来完成一些令人印象深刻的任务。
边缘检测与 OpenCv
幸运的是,OpenCV Python 示例集中有一个名为edge.py
的程序。以下是该文件的内容(去掉了空行):
该程序使用 OpenCV 实现的 Canny 图像检测算法来查找图像中的边缘。更多关于 Canny 边缘算法的内容,请参考dasl.mem.drexel.edu/alumni/bGreen/www.pages.drexel.edu/_weg22/can_tut.html
或 opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_imgproc/py_canny/py_canny.html
。你之前已经捕获了一张图片;你可以使用这个程序查看边缘,并且还可以看到设置不同的阈值如何展示更多或更少的边缘。使用之前捕获的图像运行程序,你将看到以下内容:
你会注意到顶部有一个阈值滑块设置。如果你将这个阈值调高,它会找到更少的边缘——那些具有较大阈值的边缘。设置为 30 时的图片如下所示:
现在你可以看到这个过程如何转换为一张空白地板和障碍物的图像。以下是带有可能障碍物的图像:
你可以根据像素和相机的位置校准物体的距离。
颜色与运动检测
OpenCV 和你的网络摄像头还可以跟踪彩色物体。如果你希望你的双足机器人跟踪一个彩色物体,这将非常有用。OpenCV 通过提供一些高级库,使得这个任务变得非常简单。为了实现这一点,你需要编辑一个文件,它的内容看起来应该类似于以下屏幕截图所示:
让我们具体看一下使得能够隔离彩色球的代码:
-
hue_img = cv.CvtColor(frame, cv.CV_BGR2HSV):
这一行创建了一张新的图像,将图像按色相(颜色)、饱和度和亮度(HSV)的值存储,而不是原始图像的红色、绿色和蓝色(RGB)像素值。转换为 HSV 让我们的处理更加关注颜色,而不是照射到它上的光线量。 -
threshold_img = cv.InRangeS(hue_img, low_range, high_range
):low_range, high_range
参数决定了颜色范围。在这种情况下,它是一个橙色的球,因此你想检测橙色。关于使用色相来指定颜色的好教程,请参考www.tomjewett.com/colors/hsb.html
。此外,www.shervinemami.info/colorConversion.html
包含一个程序,你可以使用它来通过选择特定的颜色来确定你的值。运行程序。如果你看到一张单独的黑色图像,移动这个窗口,你将看到原始图像窗口被露出。现在,拿起你的目标物体(在本例中是一个橙色的乒乓球),并把它移动到画面中。你应该会看到类似于以下截图的内容:
请注意,我们在阈值图像中显示的白色像素,标示出球的位置。你可以添加更多 OpenCV 代码来显示球的实际位置。在我们原始图像中的球的位置,你实际上可以在球周围画一个矩形作为指示。编辑文件,使其如下所示:
添加的线条看起来像这样:
-
hue_image = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV):
这行代码将捕获的 RGB 图像转换为色相图像。在捕获真实世界图像时,色相处理起来更加方便;有关详细信息,请参阅www.bogotobogo.com/python/OpenCV_Python/python_opencv3_Changing_ColorSpaces_RGB_HSV_HLS.php
。 -
threshold_img = cv2.inRange(hue_image, low_range, high_range):
这会创建一张新图像,只包含那些位于low_range
和high_range
元组之间的像素。 -
contour, hierarchy = cv2.findContours(threshold_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE):
这段代码查找threshold_img
图像中的轮廓,即一组相似的像素。 -
center = contour[0]:
这识别了第一个轮廓。 -
moment = cv2.moments(center):
这段代码计算这一组像素的矩。 -
(x,y),radius = cv2.minEnclosingCircle(center):
这会给出包围这组像素的最小圆的x和y位置以及半径。 -
center = (int(x),int(y)):
找到x和y位置的中心。 -
radius = int(radius):
圆的整数半径。 -
img = cv2.circle(frame,center,radius,(0,255,0),2):
在图像上画一个圆。
现在代码已经准备好,你可以运行它。你应该会看到类似于以下截图的内容:
现在你可以跟踪你的物体了。你可以通过更改low_range
和high_range
元组来修改颜色。你还知道了物体的位置,可以利用这个位置为机器人进行路径规划。
总结
你的双足机器人可以行走,使用传感器避开障碍物,规划路径,甚至能够看到障碍物或目标。在最后一章中,你将学会如何远程连接你的双足机器人,从而控制和监视它,而无需任何电线。
第七章. 远程访问你的双足机器人
现在,双足机器人已经启动并运行,你会希望能够让它进入世界,但仍然能够远程监控和控制它。这不仅有助于你的开发,还能促进部署,开启各种新的场景和应用。
在这一章,你将学习:
-
如何将无线局域网加密狗添加到你的双足机器人并将其设置为无线接入点
-
如何使用此访问和摇杆控制你的双足机器人
-
如何使用无线局域网连接获取第一人称视频(FPV),以便你可以看到双足机器人看到的内容
添加无线加密狗并创建接入点
在第一章,配置和编程树莓派中,你学会了如何将无线加密狗添加到树莓派,并使其连接到无线网络。这是一种有用的方式来访问树莓派,但如果你想将你的机器人带到无线局域网覆盖范围之外,你需要将它设置为接入点。
执行此操作的第一步是安装无线局域网设备。一个价格便宜且易于配置的设备是 Edimax Wifi 适配器设备(产品信息可以在www.edimax.com/edimax/merchandise/merchandise_detail/data/edimax/global/wireless_adapters_n150/ew-7811un
上查看)。它可以在大多数在线电子商店找到:
安装设备并启动树莓派后,输入lsusb
命令。这应该会显示类似以下截图的信息:
Edimax 设备列在连接到 USB 端口的设备列表中。现在,执行以下步骤:
-
通过输入
sudo apt-get install hostapd
,确保已安装hostapd
。此应用程序是一个后台程序,用于控制树莓派上的无线配置。 -
不幸的是,默认版本的
hostapd
并不支持 Edimax 芯片组。因此,你需要通过输入wget http://www.daveconroy.com/wp3/wp-content/uploads/2013/07/hostapd.zip
来下载一个支持的版本。 -
现在,通过输入
unzip hostapd.zip
来解压此文件。 -
通过输入
sudo mv /usr/sbin/hostapd /usr/sbin/hostapd.bak
来备份原始的hostapd
应用程序。这样,如果以后需要恢复,你可以使用它。 -
现在,通过输入
sudo mv hostapd /usr/sbin/hostapd.edimax
将新版本的hostapd
移到正确的目录。 -
接下来的步骤,输入
sudo ln -sf /usr/sbin/hostapd.edimax /usr/sbin/hostapd
;这将创建一个指向新文件的软链接,使其作为hostapd
应用程序执行。 -
输入
sudo chown root.root /usr/sbin/hostapd
,这将把该文件的所有者和组更改为root
。 -
输入
sudo chmod 755 /usr/sbin/hostapd
使得该文件对所有者可执行。 -
现在你将配置你的无线接入点。通过输入
sudo emacs /etc/hostapd/hostapd.conf
编辑该文件,使其像以下截图一样: -
你现在需要编辑
/etc/network/interfaces
文件,如下截图所示: -
这将把接入点的地址设置为 10.10.0.1。
-
现在,输入
sudo apt-get install isc-dhcp-server
来安装dhcp
服务器,以便连接到它的设备能够获得动态地址。 -
现在,编辑
/etc/dhcp/dhcpd.conf
并添加以下几行: -
下一步是编辑
/etc/default/hostapd
文件,以便在启动时自动启动这一切,只需添加这一行: -
现在输入以下两条命令:
sudo update-rc.d hostapd enable
和sudo update-rc.d isc-dhcp-server enable
,然后重启树莓派。
现在你应该能够将你的树莓派连接为无线接入点。
添加操纵杆遥控
现在你可以从远程计算机访问树莓派,你可以像使用有线连接时一样进行 SSH 操作,发出命令,甚至使用远程计算机控制双足机器人。这为你提供了许多不同的可能性,其中之一就是通过连接到远程计算机的操纵杆来控制你的项目。
要添加游戏控制器,你需要首先找到一个能够连接到计算机的游戏控制器。如果你在主机计算机上使用的是 Microsoft Windows 操作系统,那么几乎任何可以连接到 PC 的 USB 控制器都可以使用。如果你在远程计算机上使用的是 Linux 操作系统,同样类型的控制器也适用。事实上,你可以使用另一个树莓派作为远程计算机。
由于操纵杆将连接到远程计算机,你需要运行两个程序:一个在远程计算机上,另一个在双足机器人上的树莓派上。你还需要一种通信方式。在以下示例中,你将使用无线局域网接口和客户端-服务器通信模型。你将在远程计算机上运行服务器程序,在树莓派上运行客户端程序。
注意
要了解如何在游戏应用中使用这种类型的模型,参考这个优秀的教程:www.raywenderlich.com/38732/multiplayer-game-programming-for-teens-with-python
。
第一步是将 USB 游戏控制器直接插入到远程计算机。一旦你将控制器连接到远程计算机,就需要在树莓派上创建一个 Python 程序,该程序将接收来自远程计算机客户端发送的信号,并将控制信号发送到树莓派上运行的服务器,以便将正确的信号传递给双足机器人的伺服器。
在此之前,你需要在树莓派上安装一些库,以便使其正常工作。第一个是一个叫做pygame
的库。通过输入sudo apt-get install python-pygame
来安装它。你还需要安装一组 Python 安装工具,通过输入sudo apt-get install python-setuptools
来安装。然后,你需要安装一个叫做PodSixNet
的局域网通信层库。这个库将允许远程计算机上的客户端和在树莓派上运行的服务器进行通信。要安装它,请按照mccormick.cx/projects/PodSixNet/
上的说明进行操作。现在你可以在树莓派上创建程序,控制双足机器人。程序的第一部分来自你在第三章中创建的程序,双足机器人运动。在这一部分,你将创建一个叫做QuadGame
的类。该类将接收来自连接到服务器的游戏控制器的输入,并将其转化为发送给伺服控制器的指令,从而控制你的双足机器人。
以下是这些控制的表格:
摇杆控制 | 双足机器人控制 |
---|---|
按钮 2 | 机器人原点位置 |
按钮 1 | 机器人右转 |
按钮 3 | 机器人左转 |
摇杆上 | 机器人向前行走 |
接下来是代码的初始部分,即 Python 导入语句:
以下是BoxesGame
类的代码,它将响应摇杆的操作:
这是代码中有趣的部分。该代码获取来自远程计算机的输入并将其转化为操作。第一个if
语句确定远程计算机通过连接的摇杆发送的数据类型。它可能是一个按钮按下事件,当data["type"] == 10
时,data["info"]["button"] == 2
语句则表示按钮 2被按下。在这种情况下,程序会发送指令让机器人回到原点位置。如果if data["type"] == 7:
,则表示这是一个摇杆事件,if data["info"]["value"] < - 0.9
则会判断摇杆处于上方位置,机器人应该向前移动。
以下是客户端程序中关于摇杆控制部分的最后部分,为了完整性:
这段最终的代码初始化了游戏循环,循环中接收输入、将其发送到伺服控制器,再传送到飞行控制器。
你还需要在远程计算机上运行一个服务器程序,接收来自游戏控制器的信号并将其发送到客户端。你将使用 Python 2.7 编写此代码,可以从这里安装。此外,你还需要安装pygame
库。如果你在远程计算机上使用 Linux,则输入sudo apt-get install python-pygame
。如果你在远程计算机上使用 Microsoft Windows,则按照www.pygame.org/download.shtml
上的说明进行操作。
你还需要之前描述的局域网通信层。你可以在mccormick.cx/projects/PodSixNet/
找到适用于 Microsoft Windows 或 Linux 的版本。以下是服务器代码的两部分:
第一部分创建了三个类:
-
第一个类
ClientChannel
为你的项目建立了一个通信通道。 -
第二个类
BoxServer
设置一个服务器,以便你可以将摇杆操作传送到双足机器人的 Raspberry Pi 上。 -
最后,第三个类
Game
只是初始化一个游戏,其中包含你需要的所有内容。
以下是代码的后半部分:
这部分代码初始化摇杆,以便将所有控制信号发送到双足机器人的 Raspberry Pi 上。
你需要在两台计算机上运行这些程序,并输入连接到摇杆的远程计算机的互联网地址。以下是运行该程序时的界面,在运行远程计算机上的程序之前:
以下是当在 Raspberry Pi 上运行并连接到机器人时,程序的界面:
最后,以下是当机器人的 Raspberry Pi 启动并连接时,远程计算机上程序的界面:
现在,你可以使用摇杆远程控制你的机器人!
添加远程查看功能
现在,你的双足机器人可以从远程计算机获取信息并响应摇杆按键,但你可能希望能够查看双足机器人通过其摄像头所看到的内容。这可以通过配置摄像头、vncserver,以及你在第六章中使用的能力——为双足机器人添加视觉——来轻松实现。使用这种方法,你可以轻松获取双足机器人所看到的画面,应该类似于以下内容:
现在,你既可以看到你的机器人正在前进的方向,也可以通过操纵杆来控制它。
总结
就这样,但实际上这只是开始。你的机器人已经具备了一些基本的运动和控制能力,但现在你应该也掌握了知识和技能,让你的双足机器人走得更远。你可以教它跳舞、跟随手势,几乎任何你能想象的事情。