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

2.2 Python和JupyterLab入门

JupyterLab是Python社区中非常广泛的工具,因为它可以让你编写程序,就好像在上课时正在解决数学问题一样。也就是说,先写标题,然后写问题说明和初始数据。声明之后,写要执行的操作的一段解释,然后在代码单元中编写执行该操作的Python代码。对于每个操作,重复相同的步骤:

1)人类可读的段落解释下一个操作,格式为大家都知道的markdown语法(https://commonmark.org/help/)。

2)一个代码单元,其中包含执行操作的Python代码行。

3)对执行单个操作的每个代码段重复步骤1和2。最后将提供解决问题的方法。

这是一个读取GoPiGo3距离传感器的通俗易懂的示例,见图2-1。

026-01

图 2-1

接下来,解释如何为GoPiGo3启动JupyterLab。

2.2.1 为GoPiGo3启动JupyterLab

在DexterOS中,有两小节说明了Jupyter笔记本和使用Python控制机器人的方法:

1)可以通过导航到网址http://mygopigo.com或http://10.10.10.10访问它们,然后单击LEARN,然后单击Lessons in Python,见图2-2。

027-01

图 2-2

然后启动JupyterLab环境,在窗口的左侧,将看到两个文件:

  • 1_Moving_Around.ipynb是Jupyter笔记本,逐步介绍了如何向前移动机器人并旋转机器人。请按照笔记本中给出的说明执行命令。
  • 2_The_Environment.ipynb是另一个示例,说明了如何处理JupyterLab:运行单元、停止执行等。如果卡在上一个笔记本中,请遵循此笔记本,然后再返回前一个。

2)现在,尝试1_Moving_Around.ipynb。如下命令使机器人前进10 cm:

027-02

3)如果以in(1 in=0.0254 m)为单位,请使用以下命令:

027-03

4)如果在同一个代码单元中执行这两个命令,则在执行第二个命令之前,会注意到一个小的间隙:

027-04

现在,用机器人进行物理测试:

1)在起点处的地板上标记一个标志,向前行驶10 cm,向后行驶10 cm,并找出运动的精度:

027-05

应该发现它完全返回到起点。用千分尺测量的误差(三次)为+1.29 mm、-0.76 mm和+2.16 mm。正值意味着它在驶回时经过起点,而负值意味着它没有到达起点。

2)如果将一个距离(10 cm+10 in=35.4 cm)添加到一个向前命令中,然后再执行另一个命令以向后移动相同的距离,则我们测得的误差为(再次做了三次)-0.01 mm、-1.40 mm和-0.72 mm:

028-01

可以看到由两个命令间隙引起的暂停会引入大约1 mm的误差。仅将一个命令用于向前,将一个命令用于向后,可大大减少误差。

3)可以对车体转向执行类似的测试:

028-02

4)其他有用的命令如下:

028-03

5)要停止机器人,使用以下命令:

028-04

6)请务必注意,软件流程可能与机器人物理不兼容。

尝试以下顺序,观察GoPiGo3的运动效果:

028-05

似乎只执行了最后一行,即my_gopigo.left()。实际上发生的是,命令执行得如此之快(每个命令几毫秒),以至于机器人的惯性没有足够的时间让GoPiGo向前、向后或向右移动。删除最后一行再次进行检查:现在看到的唯一实际执行的命令是my_gopigo.right()

009-04 对机器人进行编程时,最具挑战性的问题之一就是了解其动态性能,因为看似软件错误的某件事可能是机器人物理行为的意外响应所导致的。因此,在开发软件之前,必须确保了解问题的物理原理,包括其质量(惯性)、摩擦力、电动机的最大负载、电源限制和电池电量。来自物理世界的变量列表可能是无穷无尽的,应该运用自己的机械和电气知识尽可能使功能软件开发成功。

这种简单问题最可能的解决方案是按顺序指定要移动的距离或角度:

029-03

将工作保存在DexterOS中,必须在~/.lessons_python文件夹中进行。这是pi:users拥有权限的,而DexterOS的用户是jupyter(在终端中输入$ whoami命令,或仅在提示符下看到它)。转到文件树的上一层,并在其中创建一个想要的文件夹名称。然后使用File | Save Notebook As....将更改保存在该位置。

2.2.2 硬件测试

访问这些在LEARN环境以外的DexterOS中的笔记本,导航到http://mygopigo.com或http://10.10.10.10,并点击Code on Python按钮。JupyterLab启动如图2-3所示。

029-01

图 2-3

在屏幕左侧的文件管理器视图中,将找到以下两个笔记本:

  • 其中一个是First Ride Around.ipynb,它提供了一个小部件来通过可视面板驱动机器人,见图2-4。
029-02

图 2-4

  • 另一个是Hardware Testing.ipynb,它对电池、LED和编码器运行特定的测试。在以下小节中我们将介绍GoPiGo3期望的行为。
测试电池、LED和电动机/编码器

打开笔记本,浏览每个单元大致了解其功能。

(1)电池电量

以下命令读取并显示当前电池电压。GoPiGo3的电压应大于9 V。当电池充电不足时,将失去与机器人的Wi-Fi连接,必须为电池充电或更换新电池:

030-01

接下来,看一下硬件信息和电压水平。

(2)硬件信息和当前电压水平

下一个命令模块将显示制造商、硬件和固件版本以及电池电量的信息。以下与输出有关:

  • 电池电压与以前相同。测量得出的值略有不同,为9.294 V,这没问题。
  • 5 V电压是通过Raspberry Pi的GPIO向其供电的电压。GoPiGo红板具有一个电源调节器,可将9 V原始输入转换为稳定的5 V。如果电池已正确充电,则该值应非常接近5 V,如下所示:
030-02

接下来,我们将检查LED和指示灯。

(3)LED和闪烁

板子顶部有两个LED,它们可以仿真GoPiGo3的眼睛。通过运行以下代码,更改其颜色:

030-03

信号灯是前面红色板下方的两个红色小LED。以下代码使它们闪烁5次:

031-01

目测检查即可,并注意控制台中有没有消息提示。

(4)电动机和编码器测试

以下单元模块将运行约5秒钟,并将报告编码器读数:

031-02

结果如下所示:

031-03

最后将看到一条消息,它告诉我们测试是否通过。此刻,不必担心数字的含义:它是一种内部测试,GoPiGo3进行自我检查并报告其通过还是未通过。

如果成功,则可以进行以下测试。GoPiGo3将向前行驶10 cm,最后的输出值应约为10。如果此测试失败,则可以通过单击顶部的红色Stop按钮来停止机器人:

032-01

如果一切顺利,将获得以下消息:

032-02

同样,如果测试失败,则可以通过按下顶部的红色Stop按钮停止机器人。在完成这些基本测试之后,我们对GoPiGo3的硬件和软件有了足够的了解,可以执行组件测试,这是本章的主要目标。