ROS机器人编程实践
上QQ阅读APP看书,第一时间看更新

1.2 熟悉嵌入式硬件

还记得哪种硬件适用于哪种场景吗?GoPiGo3板用于连接传感器和执行器,而Raspberry Pi用于计算任务。在这里详细介绍这些内容。

1.2.1 GoPiGo3开发板

这种定制板(https://www.dexterindustries.com/GoPiGo/learning/hardware-port-description/)满足控制器所预期的一般需求:

  • 与传感器和执行器的实时通信。
  • 通过串行外围设备接口(Serial Peripheral Interface,SPI)进行输入/输出(Input/Output,I/O)通信,该接口将数据从传感器反馈到Raspberry Pi,并且在其CPU中运行逻辑后还可以接收执行器的命令(也包括来自Raspberry Pi控制闭环的每一步的命令)。
  • 板载的一个程序称为固件。由于此软件的目标是在计算机实现逻辑功能时提供通信协议,因此无须更改它,除非决定在有新版本可用时进行升级。

简要解释一下前面的要点列表中提到的输入/输出接口协议。SPI是一种总线,用于在微控制器和外部设备(此时为传感器)之间发送数据。它使用独立的时钟和数据线,以及一条选择线来选择要与之通信的设备。产生时钟的连接端称为主机,在本例中为Raspberry Pi,另一端称为从机,即GoPiGo3板。这样,两块板是同步的,因此通信形式比异步串行要快,而异步串行是异步电路板(如Arduino)中的典型通信协议。

可以在网址https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi找到更多关于SPI协议的简易教程。GoPiGo3在SPI上与Raspberry Pi的通信是通过接口进行的,可以在图1-4的GoPiGo3板的顶部看到。这种接口只需要40个GPIO引脚中的5个即可。

008-01

图 1-4

图片来自Dexter Industries:https://32414320wji53mwwch1u68ce-wpengine.netdna-ssl.com/wp-content/uploads/2014/07/GoPiGo3-Bottom_annotated-600x441.jpg

为了与设备连接,GoPiGo3板提供了以下功能(图1-5是该板的俯视图):

008-02

图 1-5

图片来自Dexter Industries:https://32414320wji53mwwch1u68ce-wpengine.netdna-ssl.com/wp-content/uploads/2014/07/GoPiGo3-Top-768x565.jpg

  • 2个I2C端口——2个Grove端口通过电平转换芯片连接到Raspberry Pi I2C总线。
  • 1个串行端口——1个Grove端口通过电平转换芯片连接到Raspberry Pi上的串行引脚。
  • 2个模拟数字端口——2个端口连接到GoPiGo3微控制器。
  • 2个伺服端口——用于PWM类型伺服电动机。

让我们解释一下这些新概念:

  • 串行端口(serial port):这是介绍SPI时提到的互补通信协议。最后一个是同步的(需要五个接口引脚),而串行端口是异步的。也就是说,没有时钟信号可跟随,只需要两个引脚:用于数据传输的Tx和用于数据接收的Rx。在GoPiGo3中,此端口通过电平转换芯片直接连接Raspberry Pi串行引脚。
  • I2C端口(I2C port):顾名思义,它使用I2C通信协议。与SPI一样,它是一个同步协议,比异步串行要快。I2C使用两条线,SDA用于数据传输,SCL用于时钟信号。第三和第四条线用于电源:VIN为5 V,GND接地——0V参考。SDA是双向的,因此任何连接的设备都可以发送或接收数据。这两个端口分别连接距离传感器和巡线跟随器传感器。
  • 模拟数字(analog-digital):这些端口可以连接到模拟、数字或I2C Grove设备。我们将其连接到IMU传感器的模拟数字端口之一。稍后我们将详细讨论。
  • 连接PWM伺服电动机的伺服端口:与配备编码器的电动机相比,它们更便宜且更易于控制,同时提供足够的精度以控制它们支撑的支架方向。在GoPiGo3中,可以将距离传感器或Pi摄像头连接到伺服电动机。脉宽调制技术(Pulse Width Modulation,PWM)是指通过更改电源电压的占空比在连续范围内进行控制,从而实现在整个周期中等效输出范围为0~5 V:0 V为0%占空比,而100%对应于施加的5 V。通过在低于100%的一段时间内施加5 V电压,可连续控制从0°到180°旋转的电动机轴的位置。有关这部分内容的解释和一些有用的图表,参考网址https://www.jameco.com/jameco/workshop/howitworks/how-servo-motors-work.html。

1.2.2 Raspberry Pi 3B+

对教育和工业界而言,Raspberry Pi拥有最大的社区,使其成为开发用于机器人或物联网(Internet of Things,IoT)设备嵌入式软件的最好单板计算机。图1-6显示了Raspberry Pi 3B+,它是为GoPiGo3供电的最常见型号。

009-01

图 1-6

图片来自https://en.wikipedia.org/wiki/File:Raspberry_Pi_3_B%2B_(39906369025).png,许可证CC BY-SA 2.0

Raspberry Pi 3B+的主要特征如下:

  • 中央处理单元(Central Processing Unit,CPU)由4个1.4 GHz的Cortex-A53组成。
  • 图形处理单元(Graphics Processing Unit,GPU)是博通的VideoCore IV,工作频率为250 MHz。
  • 同步动态随机存取存储器(Synchronous Dynamic Random-Access Memory,SDRAM)为1 GB,与GPU共享。
  • 板载存储通过MicroSDHC插槽提供。可以选择符合需求的任何微型SD卡。尽管如此,通常的建议是使用16 GB容量的10级微型SD——10表示能够以10 Mb/s的速度写入。

看一下每个组件的功能:

  • CPU提供了运行各种算法的运算能力。这就是此款机器人的智能所在。
  • GPU的任务是负责计算机图形处理和图像处理。在本案例中,它将主要用于处理Pi摄像头的图像并提供计算机视觉功能。
  • SDRAM具有与GPU共享的1 GB易失性存储,因此这是分配给GPU的内存量的平衡(默认情况下,它最多占用64 Mb)。RAM是程序加载的地方,以便可以执行。
  • 板载microSD卡是永久存储,其中包含操作系统以及所有已安装的软件。

Raspberry Pi运行操作系统,通常是基于Linux的发行版,例如Debian或Ubuntu。

虽然Raspbian——基于Debian的发行版是Raspberry Pi基金会的官方发布版,但我们将使用Ubuntu(由Canonical支持),因为它是开放式机器人(https://www.openrobotics.org)使用的平台,用来每年发布ROS版本,并与Ubuntu的年度版本同步。

1.2.3 为什么机器人需要CPU

除了本书的目的是让你实践一些与ROS相关的经验(对于这点而言,需要在Linux操作系统上安装软件)之外,如果你真的想创建一个智能机器人,则需要能够运行计算密集型算法的处理能力,这就是Raspberry Pi等CPU提供的功能。

为什么需要这种计算?因为智能机器人必须将来自环境的信息与当前任务的逻辑进行集成,才能成功完成任务。以一个对象从其当前位置行驶到目标位置为例。为了完成此任务,如激光测距传感器、3D摄像头或GPS之类的设备向机器人提供了来自环境的信息。这些数据源必须组合在一起,以便机器人能够在环境中定位自己。通过提供目标位置,它还必须计算出本体的最佳路径,这称为路径规划。在执行这样的路径规划时,它必须检测可能出现在路径上的障碍,并在不失去重点目标的情况下避障。因此,任务的每个步骤都涉及在机器人的CPU中执行算法。

下面将学习使用ROS,作为解决此问题的诸多实际方案之一,ROS是目前开发机器人应用程序的实际行业标准。