- ROS机器人编程实践
- (西班牙)伯纳多·朗奎洛·贾蓬
- 3350字
- 2025-02-20 18:09:12
1.3 深入理解机电
正如GoPiGo的官方文档(https://www.dexterindustries.com/GoPiGo/learning/technical-specifications-for-the-gopigo-raspberry-pi-robotics-kit/)所描述的,GoPiGo3机器人的规格如下:
- 工作电压(operating voltage):7~12 V。
- 外部接口(external interface):
- I2C端口(I2C port):两个Grove端口通过电平转换芯片连接到Raspberry Pi I2C总线。
- 串行端口(serial port):一个Grove端口通过电平转换芯片连接到Raspberry Pi主机的串行引脚。
- 模拟数字端口(analog digital port):两个Grove端口连接到GoPiGo3微控制器。
- 编码器(encoder):两个电磁编码器,每个旋转有6个脉冲计数(齿轮减速比为120∶1,车轮旋转一圈总共有720个脉冲)。
- 轮径(wheels diameter):66.5 mm。
- 轮距(distance between wheels):117 mm。
- 更多:关于设计信息,请访问官方GitHub库(https://github.com/DexterInd/GoPiGo3)。
这只是1.2.1节中介绍内容的概要。在本节中,我们将重点介绍连接GoPiGo3板的设备。
最有用的传感器
安装到GoPiGo3上的传感器可以实现机器人的顶级任务,那就是运动规划导航,同时保持低成本。这些传感器如下:
- 距离传感器
- 巡线跟随器
- 惯性测量单元(Inertial Measurement Unit,IMU)传感器
- 二维(2D)摄像头
在使用巡线跟随器的情况下,由于机器人将沿着地板上的标记路径(通常涂成黑色)行进,因此可以跳过运动规划部分,并且导航会更加容易。如果路径上有障碍物,则必须应用一种算法来绕过障碍物并返回路径,也就是说,将巡线跟随器传感器再次置于黑线上方。
现在,应该花些时间了解每个传感器提供的信息。在本书的后续章节中将学习导航问题以及可用于解决该问题的算法。
1. 距离传感器
简单的距离传感器使机器人能够测量其与前方物体的距离。它具备一个小型激光器,可以测量到物体的距离。传感器采用飞行时间(time of flight,tof)方法非常快速和准确地测定距离。产品页面可在https://www.dexterindustries.com/product/distance-sensor/浏览,见图1-7。

图 1-7
图片来自Dexter Industries:https://shop.dexterindustries.com/media/catalog/product/cache/4/image/1800x2400/9df78eab33525d08d6e5fb8d27136e95/d/e/dexter-industries-raspberry-pi-robot-distance-sensor-for-robots-front-of-sensor-1.jpg
可以将距离传感器连接到2个I2C端口中的任何一个。请注意,GoPiGo3软件库不会要求指定使用2个端口中的某一个,这将被自动检测到。
可以将传感器安装到伺服软件包上用于扫描约180°的广角。伺服电动机可以连接到伺服端口1或端口2。该产品页面可在https://www.dexterindustries.com/product/servo-package/浏览,见图1-8。

图 1-8
图片来自Modular Robotics:https://www.dexterindustries.com/wp-content/uploads/2019/09/GoPiGo3-Molded-Servo-Frontal-300x200.jpg
在第2章中,可以使用机器人进行特定测试以检查该单元是否正常工作。
2. 巡线跟随器
GoPiGo3的巡线跟随器由6对LED光电晶体管组成。当将传感器放在前面读取字母时,LED发射器是每对中最右边的部分。可以在图1-9中的照片中看到,这是有源传感器的图片,尽管仍然看不到LED光束。

图 1-9
为什么在图片中看不到它们?由于LED发出红外光,因此眼睛无法察觉。但是,可以通过手机摄像头将其显示出来(默认情况下,这些摄像头的光学系统不包含红外滤镜)。因此,如果之后发现巡线跟随器工作不正常,则必须检查的第一件事就是硬件。为此,只需使用智能手机所带的摄像头应用程序拍照即可。
在图1-10中,传感器视图被故意模糊了,以便可以看到光线并确认光束来自LED光电晶体管的右侧。接收部分(即光电晶体管)是用于检测是否存在来自LED发射器的反射光的组件。此组件的产品页面可在https://www.dexterindustries.com/product/line-follower-sensor/浏览,见图1-10。

图 1-10
现在,可以了解巡线跟随器传感器的工作原理:
- 如果由于光线是白色而从地板反射回来,然后光电晶体管接收反射的光束,并在传感器数据流中提供信息。
- 如果传感器在黑色表面上,则光电晶体管不会接收任何反射光,并让机器人知道。
反射使传感器电子设备反馈接近1(白色表面)的信号,而吸收则提供接近0(黑色表面)的值。但是,如果传感器远离地面或不面对地面怎么办?好吧,从传感器的角度来看,吸收等于没有反射。因此,报告的信号接近于零。此属性使GoPiGo3不仅可以沿着地面上的黑色路径行走,还可以沿着边缘行走,避免可能损坏机器人的本体的掉落。
由于有6对传感器,因此有6个信号,每个信号报告0或1。这6个数字将使我们推断出机器人在黑线上居中的程度。传感器的规格如下:
- 具有Grove连接器的I2C传感器。
- 6个模拟传感器,每个传感器的值在0~1之间,具体取决于它从地面接收的光线量,0表示黑色,1表示白色。
- 传感器的最高数据更新频率为120 Hz。
- 一个简易库(https://di-sensors.readthedocs.io/en/master/api-basic.html#easylinefollower)和驱动程序级库(https://di-sensors.readthedocs.io/en/master/api-advanced.html#linefollower)已经具备且文档齐全。简易库提供了可以完成繁重工作的方法。
图1-11是发射器-接收器的底视图。该传感器表面必须在地板上方几毫米处,以确保正确接收LED的发射。

图 1-11
图片来自Modular Robotics:https://shop.dexterindustries.com/media/catalog/product/cache/4/thumbnail/1800x2400/9df78eab33525d08d6e5fb8d27136e95/l/i/linefollower_bottom.jpg
图1-12显示了在适当位置(即在地面上方)安装在GoPiGo3上的巡线跟随器传感器。

图 1-12
图片来自Modular Robotics:http://www.dexterindustries.com/wp-content/uploads/2019/03/linefollowerinaction.jpg
有关如何组装和校准传感器的说明,查阅网址https://www.dexterindustries.com/GoPiGo/line-follower-v2-black-board-getting-started/。可以选择巡线跟随器传感器上的这2种I2C接口之一进行连接。请注意,距离传感器也将使用其中一个接口。
如果使用Raspbian,巡线跟随器也可以连接AD端口之一。对于机器人(https://www.dexterindustries.com/raspberry-pi-robot-software/)。它提供了更高级的使用,此设置的代码略有不同。
对于引入机器人的目的,我们将很容易通过传感器连接到一个I2C端口,并使用更友好的DexterOS(https://www.dexterindustries.com/dexteros/)。在第2章中,将介绍可以与机器人一起运行的特定测试以检查该单元是否正常运行。
3. IMU传感器
IMU传感器使我们能够测量机器人的方位,并获得其移动位置的估计值。Dexter Industries IMU的产品页面见https://www.dexterindustries.com/product/imu-sensor/。这个传感器的参数可以从图1-13得到。

图 1-13
图片来自Dexter Industries:https://shop.dexterindustries.com/media/catalog/product/cache/4/thumbnail/1800x2400/9df78eab33525d08d6e5fb8d27136e95/i/m/imu-sensor_mount2-800x800.jpg
在图1-14中,可以看到它已安装在GoPiGo3上。要连接到机器人,只需将其插入GoPiGo板上的AD1或AD2。

图 1-14
图片来自Dexter Industries:https://shop.dexterindustries.com/media/catalog/product/cache/4/thumbnail/1800x2400/9df78eab33525d08d6e5fb8d27136e95/i/m/imu-sensor_gpg3_3.jpg
该IMU具有九个自由度(degree of freedom,DOF),以及温度测量功能。让我们介绍一下IMU的每个传感器以及它们提供什么样的数据:
- 让我们从简单的温度开始。通过提供GoPiGo3外壳表面的多个位置的测量值,可以提供室温,并且可以与其他传感器结合使用,创建房间的温度图等。
- 加速度计是绝对传感器,因为其值始终被称为零加速度(静态对象)。X、Y和Z三个轴分别提供一个数值:
- 它对于测量机器人的倾斜度(余弦为垂直加速度除以重力值=9.81 m/s2的角度)和自由落体状态(相当于90°坡度)非常有利。垂直壁(如果物体停留在水平面中,则通过传感器连续检测重力,即-9.81 m/s2)。
- 加速度计的速度测量精度不高,因为该值不是由传感器直接提供的。我们可以通过对加速度信号随时间进行积分来获得它,积分会产生累积误差(漂移),主要来自传感器噪声(电子)和测量误差本身。这是陀螺仪在水平面提供准确速度测量的地方。
- 陀螺仪是一种差分传感器,可提供相对于任意参考的三个旋转(X、Y和Z轴)。真正提供的是旋转速度。这意味着它们对于测量旋转速度是准确的,但对于测量角位置却不好(必须随时间对速度信号进行积分,由于累积了测量误差和传感器噪声,从而产生漂移)。
六自由度IMU是结合了加速度计(三个自由度)和陀螺仪(三个自由度)的IMU:
- 加速度计可准确测量相对于垂直方向的倾斜度。它在中长时间内没有漂移,但对于短期测量而言并不准确。
- 陀螺仪可以精确地测量旋转速度,但是它们有漂移。这意味着它们不适用于中长时间测量。
通过组合来自加速度计和陀螺仪的6个值,可以获得更好的方向测量。由欧拉方式表达角度α、β、γ见图1-15。

图 1-15
图片来自https://commons.wikimedia.org/wiki/File:Euler_angles_zxz_int%2Baxes.png,许可证CC BY-SA 4.0
比欧拉角更常用的是泰特-布赖恩(Tait-Bryan)版本或导航角,倾斜-俯仰-偏航,其定义见图1-16。

图 1-16
图片来自https://es.m.wikipedia.org/wiki/Archivo:Flight_dynamics_with_text.png,许可证CC BY-SA 3.0
这些角度是通过将特殊的滤波器(称为互补滤波器,complimentary filter)应用于传感器的信号而获得的。滤波器是这样工作的:
- 对于来自加速度计的信号,它被视为低通滤波器,因为我们相信它的中长期测量值。
- 对于来自陀螺仪的信号,由于我们相信其短期测量,因此它可以充当高通滤波器。
数学上,互补滤波器表示如下:
θ =A·(θprev+θgyro)+B·θaccel
此处,A和B相加必须为1。这些常数由传感器的校准确定,典型值包括A=0.98,B=0.02。互补滤波器提供的结果与卡尔曼滤波器非常相似,后者是最佳线性(无偏)估计器(Best Linear Estimator,BLE),但计算量更大。
现在,我们有三个(绕X、Y、Z轴)的旋转量,但是它们还不是绝对角度:
- 由于有加速度计,相对于垂直方向的角度才有绝对的参考,但是对于水平面上的方向,我们却缺少这样的参考,因为陀螺仪是差分传感器。
- 磁力计在这里为我们提供了近似的地球磁场方向(三轴X、Y、Z)。
因此,通过6+3=9自由度IMU,我们具有了机器人的绝对方向,作为重力和磁场向量的参考。在第2章中,我们全面对机器人进行了特定测试,检查该单元是否正常工作。
4. Pi摄像头
Pi摄像头是具有摄像头串行接口(Camera Serial Interface,CSI)的定制2D摄像头。图1-17显示了两个物理部件,即摄像头的电子板和带状线缆:

图 1-17
图片来自https://commons.wikimedia.org/wiki/File:Raspberry_Pi_Camera_Module_v2_with_ribbon.jpg,许可证CC BY-SA 4.0
在图1-18中,我们可以看到摄像头功能区如何连接到Raspberry Pi的CSI端口:

图 1-18
图片来自https://www.flickr.com/photos/nez/9398354549/in/photostream(作者:Andrew),许可证CC BY-SA 2.0
Pi摄像头能够提供帧速率高达30帧/秒(Frames Per Second,FPS)的高清分辨率(1920×1080像素)。可以在https://picamera.readthedocs.io/en/release-1.12/fov.html.的文档中找到配置说明文档。在第2章中,我们将进行一个特定的测试,可以用机器人运行,检查本机是否工作正常。