第6章 树莓派与脉冲宽度调制(PWM)

   上一章我們介紹瞭如何用樹莓派點亮和熄滅一個LED,但如何控制LED燈的亮度呢?脈衝寬度調製(Pulse Width Modulation, PWM)能很好的解決這個問題。脈衝寬度調製是一種簡單、高效、應用廣泛的控制方式,還可以用於控制直流電機的轉速、舵機的轉角角度等,本章將介紹樹莓派與脈衝寬度調製(PWM)的相關知識,主要內容如下。

  • 脈衝寬度調製(PWM)的基本概念和基本原理。
  • 樹莓派RPi.GPIO庫產生和控制PWM的方法。
  • 在樹莓派上使用LED演示和驗證使用PWM。

6.1 脈衝寬度調製(PWM)

   脈衝寬度調製(PWM)是一種高效的數字電壓控制技術,它利用微處理器的數字輸出來對模擬電路進行控制,通過控制固定電壓的直流電源開關頻率,改變負載兩端的電壓,進而達到控制要求的一種電壓調整方法。爲更好的理解和使用PWM,我們首先需要了解以下兩個概念。

  • 頻率,以Hz爲單位,一個脈衝信號時間週期的倒數。如果PWM的輸出頻率比較低,例如只有5Hz,那麼在控制一個LED時候,LED就會一閃一閃的,較高的頻率可以讓運行更爲平滑,但PWM的輸出頻率並不能無限的高,而且在高頻情況下,測定的PWM頻率會與作爲樹莓派參數提供的頻率略有出入。因此,在使用PWM時,應該選擇一個合適的頻率,對於控制一個LED亮度來說,一般100Hz就足夠了。
  • 佔空比,就是輸出的PWM脈衝信號中,高電平保持的時間與該PWM的時鐘週期的時間之比。如圖6.1所示,假設PWM脈衝的頻率爲1000Hz,那麼它的時鐘週期T就是1ms(即1000us),如果高電平持續時間t1爲200us,低電平的時間t2爲800us,那麼佔空比就是200:1000(即1:5)。

   從應用的角度,我們可以簡單的將PWM理解爲通過改變脈衝信號的頻率和高電平的持續時間(或佔空比)來實現電壓控控制的一種方法。圖6.2顯示了三個由GPIO輸出的PWM信號(電壓爲3.3V),第一個信號是一個佔空比爲20%的PWM輸出,即在信號週期中,20%的時間爲高電平(邏輯1),其餘80%的時間爲低電平(邏輯0),對應的電壓爲滿幅值的20%(0.66V)。第二、三個信號分別是佔空比爲50%和80%的PWM輸出,對應的電壓分別爲1.65V和2.64V。

6.2 樹莓派操控PWM

   在樹莓派上,可以通過對GPIO的編程來實現PWM,RPi.GPIO庫就提供了一個PWM功能,以下是使用RPi.GPIO庫的PWM功能的方法。

  • 創建一個PWM實例
pwm = GPIO.PWM(channel, frequency)  

channel:指定要輸出PWM信號的GPIO引腳;
frequency:指定PWM信號的初始頻率,單位爲Hz,其值應大於0.0。

  • 啓用PWM
pwm.start(dc)  

dc:指定PWM信號的初始佔空比,取值範圍爲0.0 ≤ dc ≤ 100.0。

  • 更改PWM頻率
pwm.ChangeFrequency(freq)  

freq:指定PWM的新頻率,單位爲Hz,其值應大於0.0。

  • 更改PWM佔空比
pwm.ChangeDutyCycle(dc)  

dc:指定PWM的新佔空比,取值範圍爲0.0 ≤ dc ≤ 100.0。

  • 停止PWM
pwm.stop()  

6.3 PWM驗證實驗

   接下來,我們將用一個具體的例子來演示樹莓派是如何使用PWM的。在這個實驗裏,您將可以手動改變LED的亮度,一方面我們將儘可能用上RPi.GPIO庫中PWM的相關函數,讓您更好了解這些函數的使用,另一方面讓您更爲直觀的理解PWM的基本原理。

6.3.1 實驗電路

   本實驗的電路及所用到的材料與第五章“點亮LED燈”實驗完全一樣,我們不需要做任何變動。

6.3.2 程序思路

   與第五章“點亮LED燈”實驗相比,本實驗最大的不同在於程序代碼,以下是本實驗的基本思路。

BEGIN  
    引入GPIO庫  
    將GPIO19設置爲輸出模式  
    
    創建PWM對象,並指定初始頻率  
    啓動PWM,並指定初始佔空比  

    等待輸入新PWM頻率  
    將PWM的頻率修改爲新頻率  
    
    DO FOREVER  
        等待輸入新LED亮度(PWM佔空比)  
        改變LED亮度(PWM佔空比)  
    ENDO  
    停止PWM  
    清理釋放GPIO資源  
END  

6.3.2 程序代碼

   按照第4章介紹的方法新建一個項目,然後按照第五章的方法輸入運行以下代碼,程序的詳細說明見註釋。

import RPi.GPIO as GPIO                 # 引入GPIO模塊

if __name__ == '__main__':
    LedPin = 19
    freq = 100                          # 存放PWM頻率變量,這裏初始值爲100,可以根據實際需要修改
    dc = 0                              # 存放PWM佔空比變量,這裏初始值爲0,可以根據實際需要修改

    GPIO.setmode(GPIO.BCM)              # 使用BCM編號方式
    GPIO.setup(LedPin, GPIO.OUT)        # 將GPIO19設置爲輸出模式

    pwm = GPIO.PWM(LedPin, freq)        # 創建PWM對象,並指定初始頻率
    pwm.start(dc)                       # 啓動PWM,並指定初始佔空比

    try:
        freq = int(input("Please input the frequency of PWM(1-2000Hz): "))  # 等待輸入新PWM頻率
        pwm.ChangeFrequency(freq)       # 改變PWM頻率
        while True:
            dc = int(input("Please input the duty cycle(0-100): "))         # 等待輸入新PWM佔空比
            pwm.ChangeDutyCycle(dc)     # 改變PWM佔空比
    finally:
        pwm.stop()                      # 停止PWM
        GPIO.cleanup()                  # 清理釋放GPIO資源,將GPIO復位

   程序運行後,首先會要求您輸入PWM頻率(建議輸入的值在1到2000之間),然後您可以通過不斷的輸入新的PWM佔空比來改變LED的狀態。例如,當您輸入的PWM頻率爲100時,然後分別輸入10、30、50、80、100的PWM佔空比,您將看到LED會一次比一次亮;當您輸入的PWM頻率爲5時,LED會不斷的閃爍,輸入不同的佔空比只會改變LED點亮的時間長度,而亮度基本不變,當佔空比爲100時,LED長亮。

6.4 本章小結

   本章首先介紹了脈衝寬度調製(PWM)的基本概念和基本原理,其次介紹樹莓派產生和控制PWM的方法,最後通過一個PWM實驗演示如何使用樹莓派操作PWM,以更爲直觀的方式體驗PWM。

第5章 用树莓派点亮LED灯

   用树莓派点亮一个LED灯是非常简单的事情,但却非常重要,是利用GPIO控制外部硬件设备的基础,机器人的大部分功能都可以通过操纵GPIO来实现的。换句话说,能控制一个LED灯,就能让机器人动起来。本章将的主要内容如下。

  • 搭建一个树莓派多功能实验平台的材料及其功能用途。
  • 树莓派的GPIO引脚功能和基本用法。
  • 点亮一个LED灯的电路、程序设计思路和代码。

5.1 搭建实验平台

   为便于后续的实验,我们首先需要搭建一个多功能实验平台(见图5.1,含本章所需材料),各部件的功能用途如下。

图 5.1 多功能实验平台

  • 1:树莓派3B+型主板(含电源)
       一块树莓派3B+型主板(含电源),该主板应配备有一张已经安装好Raspbian系统的MicroSD卡。
  • 2:面包板
       实验过程中,面包板非常适用于电子电路的组装和调试,各种电子元器件可以根据需要随意插入或拔出,而无需焊接,节省了电路的组装时间,而且元件可以重复使用。
  • 3:T型GPIO扩展版
       GPIO扩展版上标有GPIO引脚的功能,与面包板配合使用非常便于对GPIO进行外接。
  • 4:40P排线
       用于连接树莓派与T型GPIO扩展版,长度适中即可。
  • 5:实验平台底座
       使用一块亚克力板作为实验平台的底座,用于固定树莓派主板和面包板,以便于实验操作,同时对树莓派主板形成一定的保护。
  • 6:万用表
       在进行GPIO硬件控制调试的时候,如果实验结果不是事先所预计的,那么我们可以使用万用表对电路进行简单的测试,排查问题。
  • 7:LED灯
       发光二极管LED是一种廉价和高效的光源,常在电路及仪器中作为指示灯,或者组成文字或数字显示。LED灯非常便于显示GPIO引脚的输出状态,在开发树莓派外部硬件控制程序时,可以先使用LED灯确定GPIO引脚输出正确后再连接要控制的硬件,避免由于GPIO输出错误而导致外部硬件损坏。本章我们需要用到到一个红色的LED灯,需要注意的是LED较长的引脚为正极,较短的引脚为负极。
  • 8:电阻
       实验过程中,请根据实际选择必要的电阻,本章需要用到一个470Ω或1kΩ的电阻。
  • 9:杜邦线
       用于连接各电子元件,无需焊接,本章仅需要用到两根公对公的杜邦线。为便于识别,建议遵循有关规范,连接电源(GPIO引脚)的线采用红色线连接,接地端使用黑色线连接。

5.2 GPIO引脚

   前面我们讲过,树莓派与普通计算机最大的区别就在于它拥有若干个可编程的GPIO,可以用来控制外部设备、从外部设备获取信息或是和硬件进行数据交互等,因此了解各个GPIO引脚的功能和使用方法是非常重要的。树莓派GPIO接口已发布了3个版本,原始的两个版本仅有26个引脚,“+”型树莓派版本有40个引脚,本章及后续章节我们将主要介绍“+”型树莓派版本的GPIO。
   树莓派GPIO接口有BOARD、BCM和wiringPi三种编号方式,三种编码方式的对应关系如表5.1所示。

表 5.1 树莓派40Pin引脚对照表

  • BOARD
       BOARD编号方式是树莓派主板上P1接头上的的引脚号,从左到右,从上到下进行编号,左边为奇数,右边为偶数,支持BOARD编号方式的库主要有RPi.GPIO、WiringPi-Go。
  • BCM
       BCM编号侧重于CPU寄存器,是根据Broadcom SOC的GPIO寄存器编号的,支持的库比较多,用的也比较多,是后续章节主要使用的编号方式。为便于使用BCM编号方式,建议采用类似“T型GPIO扩展版”或“GPIO参考卡片”等配件,让引脚功能一目了然。
  • wiringPi
       wiringPi编号侧重于实现逻辑,GPIO端口从0开始编号,WiringPi库是支持wiringPi编号方式的最主要GPIO库。

   B+型树莓派主板的40个引脚提供了17个GPIO专用接口,1个UART总线接口、1个SPI总线接口、1个I2C总线接口、2个5V电源接口、2个3.3V电源接口、8个地接口,使用的时候一定先要清楚选择了那套编号方式,相应的库是否支持。

提示:

  • 通电后不要使用金属物体(如螺丝刀等)接触GPIO接口,或短接GPIO引脚。
  • 外接输入输出设备时,要先仔细了解设备的额定功率(含电压和电流),不要直接连接高功耗元件(如直流电机等),或输出电压超3.3V的设备。当使用低功率LED时,最好在LED的正极串联一个限流电阻。
  • GPIO工作在3.3V逻辑电平上,0V表示逻辑0,3.3V则表示逻辑1。调试GPIO程序时,可以使用万用表测试GPIO引脚电压,判断输出是否正确。
  • GPIO接口仅提供数字的输入和输出,当需要用到模拟输入时,可以使用ADC芯片或采用电阻式传感器来实现。

5.3 点亮LED灯

   在前面的章节中,我们已经介绍了大量的基础理论,接下来我们将进入实战,开始有趣的实验。本节将介绍如何使用树莓派控制一个LED灯,您将看到一个LED灯在树莓派的控制下不停的闪烁。

5.3.1 实验电路

   本实验的电路原理图如图5.2所示,一个红色发光二极管正极通过一个限流电阻串连到树莓派的GPIO19上,负极则连接到树莓派的GND上,从而形成一个完整的回路。

图 5.2 树莓派点亮LED电路图

   GPIO引脚的输出电压约为3.3V,高于LED上约1.7V的压降,如果直接串联,会有一个非常大的电流通过LED,这个电流通常大到可以损坏LED,甚至供电设备。因此,需要在LED和电源(GPIO引脚)间串联一个电阻限制电流,从而对LED和为其供电的GPIO引脚提供保护。不同厂家,不同颜色压降略有区别,我们假设所用LED的压降为1.8V,GPIO引脚的电流为3mA,限流电阻大小的计算方法如下:

R = ( 3.3V - 1.8V ) / 3mA = 500Ω  

   因此,我们选择使用一个1kΩ的电阻。该电路的最终实物连线图如图5.3所示。

图 5.3 电路实物连接图

提示:

  • 除了使用以上的方法计算限流电阻的值,您还可以访问类似实用工具大全http://tool.520101.com/网站,使用网站提供的LED限流电阻计算器进行计算。实际上,这个网站还提供了不少实用的电子电路计算工具,非常有助于我们后续章节的学习。
  • 限流电阻的阻值不应太小,也不能太大。太小,则起不到限流的作用;太大,则LED的亮度会比较暗。
  • 为保障树莓派主板和电子元件的安全,连线工作应在为断电的情况下进行,并在确定线路连接无误后再通电。

5.3.2 程序思路

   程序的基本设计思路如下:

BEGIN  
    引入GPIO库  
    引入time库  
    将GPIO19设置为输出模式  
    DO FOREVER  
        点亮LED
        等待1秒钟
        熄灭LED
        等待1秒钟
    ENDO
    清理释放GPIO资源
END

5.3.3 程序代码

   Python操作GPIO需要用到RPi.GPIO库,Raspbian系统默认未安装这个库,所以请先使用XShell远程登录树莓派运行以下命令安装RPi.GPIO库。

sudo apt install python3-rpi.gpio  

   RPi.GPIO库安装完毕后,按照第4章介绍的方法新建一个项目,然后输入以下代码并运行,运行效果如图5.4所示。程序的详细说明见注释,这里我们使用了try: Finally: 结构捕捉异常,确保当我们中断程序时(如使用Ctrl+C或者操作系统提供的方法),GPIO.cleanup()函数能被执行,以清理释放GPIO资源。在Pycharm下运行程序时,点击工具栏上的Stop按钮也可以中断程序。

import RPi.GPIO as GPIO                 # 引入GPIO模块  
import time                             # 引入time模块  

GPIO.setmode(GPIO.BCM)                  # 使用BCM编号方式  

GPIO.setup(19, GPIO.OUT)                # 将GPIO19设置为输出模式  

if __name__ == '__main__':
    try:
        while True:                     # 无限循环  
            GPIO.output(19, True)       # 将GPIO19设置为高电平,点亮LED  
            time.sleep(1)               # 等待1秒钟  
            GPIO.output(19, False)      # 将GPIO19设置为低电平,熄灭LED  
            time.sleep(1)               # 等待1秒钟  
    finally:
        GPIO.cleanup()                  # 清理释放GPIO资源,将GPIO复位  

图 5.4 实验运行效果

5.4 本章小结

   本章首先介绍搭建一个树莓派多功能实验平台所需的材料及其功能用途,然后详细介绍了树莓派GPIO引脚的三种编号方式、功能和使用注意事项,最后介绍用树莓派点亮一个LED灯的电路、程序设计思路和代码。

第4章 树莓派远程开发(Pycharm)

  开发软件一般需要一个程序运行环境和一个集成开发环境(Integrated Development Environment,IDE)。Raspbian系统默认已经提供了Python 2和Python 3的运行环境,选择一款优秀的IDE,并采用合适的开发方法将有助于提高开发效率。本章将介绍一种Windows下远程开发树莓派程序的方法,主要内容如下:

  • 介绍在本地和远程开发树莓派程序的两种思路。
  • 介绍在Windows上使用Pycharm远程开发树莓派程序的方法。

4.1 两种开发思路

  • 本地开发
       本地开发是指在树莓派上安装和使用IDE(或文本编辑器)进行程序编写、调试和运行。如果树莓派已经连接上显示器、鼠标、键盘等I/O设备,那么就可以和使用普通PC一样进行程序开发。如果没有连接显示器等I/O设备,可以使用SSH或VNC远程登录到树莓派编写程序。对于第二种方法,虽然是远程登录到树莓派,但由于开发环境和代码等都保存在树莓派上,所以我们仍然可以认为是在树莓派本地进行开发。
       本地开发的优势是简单,不需要太多的配置就可以进行程序开发。其劣势也是非常明显的,最主要的问题是树莓派本身的性能相对有限,而现代IDE对性能的要求较高,直接在树莓派上进行程序开发的用户体验不是很好。
  • 远程开发
       远程开发是指在个人计算机上编写代码,然后将代码上传到树莓派进行调试和运行,整个调试和运行的操作都是在个人计算机上完成的,基本无需在树莓派上进行操作。很明显,远程开发方式发挥了普通个人计算的优势,减轻了树莓派的负担,为我们提供了更好的开发体验。
       远程开发是我们推荐的开发方式,以下将介绍一种远程开发树莓派程序的方法。

4.2 PyCharm远程开发树莓派程序

4.2.1 PyCharm简介

   PyCharm是JetBrains开发的一款功能强大的Python IDE,提供了调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等功能。PyCharm有专业版和社区版两个版本,但只有专业版才具备远程Python解释器和调试器功能,要实现远程开发树莓派程序需使用专业版的PyCharm

4.2.2 配置远程开发环境

   步骤 1: 将树莓派接入网络(需要和个人计算机在同一个局域网),并配置好SSH,具体参考第3章

   步骤 2: 在个人计算机上安装Python3。从Python官网https://www.python.org/downloads/下载合适的Python版本并安装,我们这里安装的是Pyhton 3.7.2(64-bit),对应的安装文件为python-3.7.2-amd64.exe。运行安装程序,按图 4.1所示选择,把Python加到Windows的环境变量PATH上去。如果采用默认安装,则点击“Install Now”,如果需要自定义安装(如修改安装路径等),则点击“Customize installation”,然后一路“Next”即可。

图 4.1 安装Python

   安装完成后,在“命令提示符”输入以下命令,如果安装成功,则显示“Python 3.7.2”。

python --version  

   步骤 3: 在个人计算机上安装Pycharm。由于需要使用到Pycharm的远程Python解释器和调试器功能,因此我们需要安装专业版的Pycharm,官网下载地址:http://www.jetbrains.com/pycharm/download/。Pycharm的安装比较简单,运行安装程序后,采用默认安装一路“Next”即可,安装过程大概需要几分钟,请耐心等待。
   Pycharm专业版是收费的,安装完成后需要激活,具体的解决的办法,可以私信我,或上网查找。

   步骤 4: 运行Pycharm新建一个“Pure Python”项目,并按图4.2设置。其中,“Location”为新建项目在个人计算机上的存放位置。

图 4.2 创建项目

   步骤 5: 新建基于SSH连接的远程Python解释器。如图4.2所示,点击“…”,然后选择“SSH Inetrpreter”,并按图4.3一步一步设置。其中,“Host”为树莓派的IP地址;“UserName”为登录树莓派的用户名;“InterPreter”为树莓派上的Python解释器路径,这里使用的是Python 3的解释器,如果想使用Python 2,则把路径改为“/usr/bin/python”。由于Raspbain系统是大小写敏感的,在填写配置信息的时候应注意大小写。
   成功新建远程Python解释器后,如图4.4所示,PyCharm会向树莓派上传一些文件,一般需要几分钟的时间,请耐心等待。

图 4.3 新建基于SSH连接的远程Python解释器

图 4.4 完成远程Python解释器创建

   步骤 6: 修改项目在树莓派上的存放目录(可选)并完成项目创建。新建远程Python解释器后,PyCharm会自动设置项目在树莓派上的存放目录,但为了管理方便,建议修改一下。如图4.5所示,按照您的习惯对“Remote project location”进行修改,然后点击“Create”完成项目创建,进入PyCharm的开发界面,如图4.6所示。

图 4.5 修改项目在树莓派上的存放目录

图 4.6 项目开发界面

   步骤 7: 进一步配置项目远程Python解释器。进入“File->Settings->Project: myApp(项目名称)->Project Interpreter”,如图4.7所示,点击“Project Interpreter”选项后面的小齿轮,选择“Show All…”,进入“Project Interpreters”。

图 4.7 进入项目解析器配置管理

   如图4.8所示,找到刚刚新建的远程Python解释器配置,然后点击小铅笔图标进入“Configure Remote Python Interpreter”界面。

图 4.8 进入远程解析器配置

   按照图4.9设置SSH Credentials,“Host”、“User Name”、“Authentication type”、“Password”、“Python Interpreter path”等配置项的值与之前步骤的值一样,而“PyCharm helper path”采用默认值即可。

图 4.9 配置远程解析器

   如果设置成功,如图4.10所示,在“Project Interpter”对话框的列表中将显示出树莓派上已安装的Python包的信息,点击列表右边的眼睛图标可以进行刷新。如果在列表下面出来图4.10中的提示,则点击“Install packaging tools”安装packaging tools即可。

图 4.10 完成远程解析器配置

   步骤 8(可选): 配置文件上传机制。PyCharm能够自动的把代码文件等上传到树莓派,默认是当文件文件发生改变时自动上传。这种默认机制上传文件的次数较多,效率不高且会影响MicroSD卡的寿命,因此建议修改为保存文件后上传文件,以减少文件上传次数。如图4.11所示,在“File->Settings”中找到相应的配置项并修改。

图 4.11 配置文件上传机制

   到此为止,我们就完成了PyCharm远程Python开发环境的搭建,这样就可以在个人计算机上使用PyCharm编写代码,然后通过SSH调用树莓派上Python解释器进行调试和运行程序。

4.2.3 编写第一个程序

   步骤 1: 新建一个Python文件,输入以下代码并保存,最终结果如图4.12所示,在下方的“File Transfer”窗口中可以看到文件已经被自动的上传到树莓派。

#!/usr/bin/python3

if __name__ == '__main__':
    print("Hello, World!")

图 4.12 编写程序

   步骤 2: 运行程序。如图4.13所示,第一次运行程序可以点击绿色三角形选择“Run ‘main’”或“Debug ‘main’”,运行的结果可以在下面的“Run”窗口中看到。之后,也可以通过点击右上角工具栏按钮运行或调试程序。

图 4.13 运行程序

4.2.4 root权限问题

   很多的树莓派Python程序(例如:GPIO、蓝牙等)需要root权限才能运行,而前面配置用于远程开发树莓派程序的用户pi是不具备root权限,远程运行程序的时候会发生错误,以下提供一种解决这个问题的方法。

   步骤 1: 新建脚本文件。在树莓派上新建一个脚本文件,命名为py_sudo.sh,文件的内容如下:

#!/bin/bash
sudo /usr/bin/python3 "$@"

提示:

  • 这里我们把脚本文件py_sudo.sh存放在“/home/pi/”目录下面。
  • 可以使用XShell登录树莓派后,运行“nano”或“vi/vim”等文本编辑器创建该脚本文件,也可以在个人计算机上创建该脚本文件后上传到树莓派上。

   其中,python3表示使用Python 3,如果想使用Python 2,修改为python即可。

   步骤 2: 让脚本文件具有可执行权限。使用XShell登录树莓派,进入脚本文件所在目录,输入以下命令:

chmod +x py_sudo.sh

   步骤 3: 修改远程Python解释器。参考4.2.2节的步骤7,进入“Configure Remote Python Interpreter”,按图4.14所示修改远程Python解释器路径。

图 4.14 修改远程解释器路径

   完成配置后就可以远程调试运行需要root权限的Python程序,而编写程序的方法不变。

4.3 本章小结

   本章首先介绍了本地开发和远程开发树莓派程序的两种思路,然后详细介绍在Windows上使用PyCharm专业版远程开发运行树莓派程序的方法。

第3章 让树莓派运行起来

   前面章节我们已经对树莓派进行了简单的介绍,使用树莓派作为机器人的控制系统是一个非常不错的选择,本章我们将进一步介绍如何安装、配置和使用树莓派,主要内容如下。

  • 所需材料,介绍运行树莓派所需的软、硬件材料及其注意事项和建议。
  • 安装操作系统,介绍一种安装树莓派官方操作系统Raspbian的方法。
  • 登录树莓派,介绍在无显示器条件下使用SSH方式远程登陆树莓派的方法和技巧,包含启用SSH、WiFi配置、XShell使用等内容。
  • 配置操作系统,介绍Raspbian系统的配置工具raspi-config,以及系统的语言和区域、默认语言环境等基本配置的配置方法。
  • 升级软件包,介绍使用Raspbian系统的软件包管理工具apt进行系统升级的相关知识和技巧。
  • 关机和重启,介绍几个关闭和重启树莓派的基本命令。

3.1 所需材料

3.1.1 硬件

  • 树莓派3B+型主板
       树莓派3B+型主板是当前的最新版本,提供了最为丰富的功能,可以很方便的作为机器人的控制系统。
  • 电源
       树莓派3B+型主板的额定电压为5V稳压直流电,额定电流为2.5A,可采用micro USB、GPIO和PoE三种方式供电,本章使用micro USB方式供电。在低负载运行的情况下,2A的电流也可以让树莓派正常运行,目前许多安卓智能手机的充电器(2A电流)都是可以使用的。当高负载运行时,我们应该使用能提供更大电流的电源,否则可能导致充电器过热甚至报废,也可能引起树莓派重启。另外,由于树莓派本身没有电源开关,为方便开关机,同时避免拔插电源线对树莓派造成损伤,建议使用带有开关的micro USB电源。
  • MicroSD卡
       树莓派使用MicroSD卡安装系统和存储数据,对性能要求较高,因此建议选择大容量(16GB以上)的高速(Class10以上)的MicroSD卡。您还可以准备多一张MicroSD卡用于安装不同的操作系统。
  • 读卡器(可选)
       如果您的计算机没有自带MicroSD卡读卡器,那么您需要准备一个,安装系统的时候需要用到。
  • 网线(可选)
       用于将树莓派接入网络,由于树莓派3B+提供了千兆的以太网口,使用千兆超6类网线可能获得更快的网速。当然了,使用百兆的超5类网线也是可以的。
  • 树莓派外壳(可选)
       树莓派本主板身是不带外壳的,主板外面裸露许多连接部件,当把接触到金属的时候非常容易发生短路,甚至造成损坏。所以,为树莓派配备一个合适的外壳进行保护是很有必要的。目前,市面上有很多类型的树莓派外壳,树莓派官方也出品有相应的外壳,您可以根据需要进行选择。

3.1.2 软件

  • Raspbian Stretch Lite
       树莓派官网提供了NOOBS和Raspbian两个官方的操作系统镜像。NOOBS的全称为New Out Of Box System(全新开箱即用系统),实际上是一个图形化的操作系统安装工具,其中NOOBS自带完整版的Raspbian,而NOOBS Lite则仅仅是NOOBS本身,您只要在NOOBS中选择想要安装的系统,它就会自动下载安装。Raspbian才是树莓派官方真正的操作系统,基于Debian系统定制,官方提供了Raspbian Stretch with desktop and recommended software、Raspbian Stretch with desktop和Raspbian Stretch Lite三个版本的镜像,“Stretch”是Debian系统的版本代号,其中“Raspbian Stretch with desktop and recommended software”带有图形界面和一些推荐的应用软件,“Raspbian Stretch with desktop”仅提供图形界面,“Raspbian Stretch Lite”则仅提供命令行界面。由于NOOBS和系统安装包会占用一定的存储空间,且安装操作系统的时候需要外接显示器,因此NOOBS并不是最好的选择。另外,按照“简单”的原则,我们选择使用最为精简的Raspbian Stretch Lite版本,使用过程中再按需手工安装相应软件。
       下载地址:https://www.raspberrypi.org/downloads/
  • Etcher
       Etcher是一款免费的U盘镜像制作工具,可以将镜像刻录到U盘,我们将用它将Raspbian系统安装到MicroSD卡上。类似的软件还有Win32 Disk Imager等,您可以根据习惯选择。
       下载地址:https://www.balena.io/etcher/
  • SDFormatter(可选)
       SDFormatter是一个简单的SD卡修复工具,也是树莓派官网推荐的SD格式化工具。在安装树莓派后,您会发现MicroSD卡的容量与实际容量不符(只剩下很少的存储空间),如果你想恢复MicroSD卡的容量,就可以使用SDFormatter进行格式化。
       下载地址:https://www.sdcard.org/downloads/formatter_4/
  • XShell
       XShell是一个强大的安全终端模拟软件,支持SSH1、SSH2、TELNET、Serial等多种协议,我们将用它远程登录树莓派。官方提供有免费版供个人和教育使用,相比专业版,免费版仅是限制最多只能打开四个标签页,但这并不影响我们的使用。与XShell类似的软件还有SecureCRT、Putty等,您可以根据习惯选择。
       下载地址:https://www.netsarang.com/en/
  • Advanced IP Scanner(可选)
       Advanced IP Scanner是一个免费的网络扫描器,可以分析LAN,我们将用它来确定树莓派的IP地址。类似的网络扫描工具有很多,您也可以选择其他类似的工具。
       下载地址:http://www.advanced-ip-scanner.com/cn/

3.1 安装操作系统

   Raspbian系统的安装步骤如下:
   步骤 1: 将MicroSD卡插入到电脑上。
   步骤 2: 运行Etcher,点击“Select image”按钮选择要安装的系统镜像,选择要安装系统的驱动器,然后点击“Flash!”按钮开始安装系统,如图 3.1所示。整个过程大约需要几分钟的时间,请耐心等待。

图 3.1 安装操作系统

提示:

  • Etcher通常能自动识别出要安装系统的驱动器,我们一般不需要进行额外设置。
  • raspbian的镜像是一个zip格式的压缩文件,文件名一般为“发布时间-raspbian-stretch-lite.zip”,例如:2018-11-13-raspbian-stretch-lite.zip,Etcher支持直接使用zip格式压缩文件进行安装,所以我们不需要把镜像文件解压出来。
  • 开始安装系统后,MicroSD卡原有的数据都会给格式化掉,因此我们应该非常谨慎。

   安装成功后,把MicroSD卡插入树莓派,同时给树莓派接上鼠标、键盘、显示器和电源,就可以和普通个人计算机一样使用。

3.2 登录树莓派(SSH方式)

   在使用树莓派时,尤其是作为机器人控制系统,很少会使用到显示器,更多是采用网络远程登录的方式。事实上,网络远程登录方式更为便捷,且几乎可以完成所有的工作。常见的远程登录树莓派的方法有SSH和VNC。其中,SSH是命令行界面的远程管理工具,也就是登录后只提供命令行界面,而VNC则是图形化的远程管理工具,提供图形化界面,前提是你的系统上安装了图形界面。以下是SSH方式登录树莓派的步骤和技巧:
   步骤 1: 开启SSH服务。将MicroSD卡插回计算机,在MicroSD卡的根目录下(也就是树莓派的/boot目录)新建一个空白的文件,并命名为ssh,注意文件名不要带有后缀。
   步骤 2: 接入网络。有线方式接入网络,仅需要用网线将树莓派和交换机(路由器)连接起来即可。若想在没有显示器的情况下通过WiFi接入网络,则可以通过在MicroSD卡的根目录下新建一个名为wpa_supplicant.conf的配置文件来实现,配置文件内容参考以下格式填写。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev  
update_config=1  
  
network={  
ssid="WiFi名称"  
psk="WiFi密码"  
key_mgmt=WPA-PSK  
priority=1  
scan_ssid=1  
}

   配置文件的前两行为固定写法,不需要改动。network字段的内容应根据WiFi的实际设置修改,配置文件中可以有多个network配置表示连接不同的WiFi。其中,ssid为WiFi名称;psk为WiFi密码;key_mgmt为WiFi加密方式;priority为WiFi连接优先级,为非负数,数字越大优先级越高;scan_ssid用于设置是否连接到隐藏ssid的WiFi,其值为1时表示连接。以下是几个常见的network配置:

  • 连接没有密码的WiFi:
network={  
ssid="WiFi名称"  
key_mgmt=NONE  
}  
  • 连接使用WEP加密的WiFi:
network={  
ssid="WiFi名称"  
key_mgmt=NONE  
wep_key0="wifi密码"  
}  
  • 连接使用WPA/WPA2加密的WiFi
network={  
ssid="WiFi名称"  
key_mgmt=WPA-PSK  
psk="wifi密码"  
}  

   完成以上步骤后,就可以将MicroSD卡插回树莓派,接上电源启动树莓派。

提示:

  • 建议尽量采用WiFi方式接入网络,这样可以减少树莓派的接线数量,增加灵活性,便于今后的使用。
  • 不要同时使用有线和WIFi方式连接网络,很可能会造成你的树莓派无法访问。

   步骤 3: 确定IP地址。在没有显示器的情况下,我们很可能不知道树莓派的IP地址,而远程登陆到树莓派首先需要知道树莓派的IP地址,以下是两个解决这个问题的技巧。

  • 网络扫描法
       如图3.2所示,运行Advanced IP Scanner设置要扫描的地址范围,软件会自动识别出您的电脑所在的网段,您也可以根据实际修改,然后点击扫描(Scan)开始扫描,根据网络的规模和速率的不同,扫描的时间也会有所不同。扫描结束后,我们从结果中要到制造商(Manufacturer)为“Raspberry Pi Foundation”就是您的树莓派的网络信息,从中可以找到树莓派的IP地址。
    图 3.2 获取树莓派网络信息
  • 路由器查询法(DHCP)
       在局域网中,IP地址一般由DHCP服务器负责管理,对于家庭或中小型企业的局域网,DHCP服务器的功能通常由路由器承担。如果您拥有路由器的管理权限,那么可以登陆路由器管理界面查找树莓派的IP地址。树莓派Raspbian系统的默认主机名是raspberrypi,您只要在路由器里面找到该主机名对应IP地址即可,不同路由器的管理界面大同小异,请根据您的路由器说明书操作。

提示:
   路由器为树莓派动态分配的地址是有租期的,租期一到,树莓派的IP地址很可能会改变,因此不便于我们以后的使用。如果路由器具备管理功能,建议在路由器上把树莓派的MAC地址和IP地址绑定在一起,确保同一台树莓派的IP地址永远不会改变(即使更换了操作系统),让我们既能享受自动分配IP地址的方便,又能保证IP地址是固定的,方便今后的各种网络连接操作。

   步骤 4: 登录树莓派。如图3.3所示,运行XShell,新建一个会话(Sessions),并按图3.4填写连接(Connection)和用户身份验证(Authentication)。其中,名称(Name)字段为会话名称,可任意填写;主机(Host)字段为树莓派的IP地址,请根据实际填写;用户名(User Name)字段为树莓派的用户名,第一次登录树莓派使用pi用户即可,今后您可以根据实际新建其它的用户登录;密码(Password)为pi用户的密码,默认为raspberry。

图 3.3 XShell 新建会话(Session)

图 3.4 SSH登录配置信息

   XShell登录树莓派后的界面如图3.5所示,这是一个典型的Linux命令行界面,我们可以在这里使用各种命令来控制树莓派。

图 3.5 XShell登录树莓派

3.3 配置操作系统

   为了更好的使用树莓派,建议在第一次登录树莓派后进行一些基本的配置。Raspbian系统自带一个叫raspi-config的系统配置工具,可以对树莓派的CPU频率、内存分配、网络、接口等众多项目进行配置。
   运行raspi-config需要root权限,可以在终端输入以下命令运行。

sudo raspi-config  

   raspi-config的界面如图3.6所示。这个界面操作比较简单,用键盘上的上、下键进行菜单项目的选择,左右键进行确定和取消等按钮的选择,回车键进入,Esc键取消返回,空格键选定选项,改完后选择Finish退出(可能会重启)。

图 3.6 raspi-config

提示:

  • 其他Linux系统一样,在Raspbian系统的命令行下仅需要输入命令、目录或文件的前几个字符,然后按Tab键就能自动补全,如有相重的,再按一下Tab键,系统会列出当前目录下所有以这几个字符开头的名字。例如:输入“raspi-”,再按Tab键,就能自动补全为“raspi-config”,而输入“raspi”,再按两下Tab键,则会列出以raspi为开头的命令。这种命令行自动补全的功能非常方便,极大的提升了输入命令的效率。
  • sudo命令表示以系统管理员身份执行指令。例如:运行raspi-config需要管理员权限,而登录树莓派的pi用户是一个普通的用户,所以我们需要输入“sudo raspi-config”。这是Linux系统下一个非常常用的方法,后继章节中我们还会不断用到。

   Raspbian系统的语言、时区等国际化选项(Internationalisation Options)的默认值均为英国,为了适应本地化的需要,我们在这里重点介绍如何使用raspi-config设置语言和时区,让树莓派更好的支持中文,其余配置将在今后使用到的时候再进行介绍。

  • 语言和区域设置
       运行raspi-config,进入Localisation Options->I1 Change Locale添加支持语言,如图3.7所示,用上下键和空格去掉“en_GB.UTF-8 UTF-8”,添加以下5项:

en_US.UTF-8 UTF-8
zh_CN GB2312
zh_CN.GB18030 GB18030
zh_CN.GBK GBK
zh_CN.UTF-8 UTF-8

图 3.7 添加支持语言

   添加完成后回车确认,在出现的菜单选择en_US.UTF-8为默认值并回车确认,如图3.8所示。

图 3.8 设置默认语言环境

   最后,退出raspi-config并运行以下命令重启系统,让设置生效。

sudo reboot  

提示:
在Raspbian系统中,并非所有的软件都能很好的支持中文,所以我们还是把系统的默认语言环境设置为en_US.UTF-8。

  • 设置时区
       Raspbian系统的默认时区为格林威治时间 (GMT),要比北京时间慢8小时。进入Localisation Options->I2 Change Timezone,选择Asia(亚洲)再选择shanghai(上海)即可更正时间问题。

3.4 升级软件包

   Raspbian系统默认安装的软件比较旧,安装完系统后,建议首先进行升级。Raspbian系统使用apt(Advanced Packaging Tool)管理软件包,可以使用apt命令升级软件,升级的速度受apt源的影响比较大,默认使用的apt源由树莓派基金会提供,服务器在国外,速度比较慢,因此建议先修改apt的配置文件,将apt源更换为国内的镜像以提高升级速度。
   Raspbian系统有两个apt源的配置文件,分别是 /etc/apt/sources.list 和 /etc/apt/sources.d/raspi.list。其中,/etc/apt/sources.list是Raspbian系统apt源的配置文件,包含了大部分的软件。/etc/apt/sources.list.d/raspi.list是树莓派基apt源的配置文件,由树莓派基金会单独提供维护,仅包含raspi-config、minecraftpi、树莓派桌面环境、内核固件驱动等少量软件,国内目前只有清华大学和中国科技大学提供有该apt源的镜像,且不是很稳定。因此,这里我们仅对/etc/apt/sources.list进行修改。
   已更换Raspbian系统apt源为例,首先使用管理员权限编辑/etc/apt/sources.list文件,参考命令行为:

sudo nano /etc/apt/sources.list  

   其次,如图3.9所示,使用#注释掉原来的内容,并更换相应的配置。

图 3.9 更换Raspbian系统apt源

   最后,使用 Ctrl+O 回车保存文件后,Ctrl+X 退出编辑器。

提示:

   修改完后,依次执行以下命令就可以完成升级,升级过程一般需要几十分钟甚至几个小时才能完成,请耐心等待。

sudo apt update # 更新apt源  
sudo apt upgrade # 更新已安装的软件包  
sudo apt dist-upgrade # 升级系统  

3.5 关机和重启

   树莓派本身没有开关机按钮,但我们不建议直接拔插电源来关机或重启,而是使用以下方法。

  • 关机可以使用以下任一条命令:
sudo shutdown -P now  
sudo halt  
sudo poweroff  
  • 重启可以使用以下任一条命令:
sudo reboot  
sudo shutdown -r now  

3.6 本章小结

   本章首先介绍了运行树莓派所需的硬件和软件,其次介绍了安装Raspbian系统的方法,然后介绍了在没有显示器的条件下采用ssh方式登录树莓派的方法和技巧,简单介绍了配置Raspbian系统的基本知识,讨论了升级Raspbian系统的方法,最后介绍了关机和重新系统的几个基本命令。

第2章 认识树莓派

   树莓派(Raspberry Pi,RasPi/RPi)是由英国的慈善组织“Raspberry Pi 基金会”开发,基于ARM的微型电脑主板,只有信用卡大小,但却具备一部个人计算机的基本功能。基金会开发树莓派的最初目的是为了提升学校计算机科学及相关学科的教学水平,培养青少年的计算机程序设计兴趣和能力,同时期望能有更多的应用被不断开发出来,并应用到更多领域。然而,树莓派自问世以来就受到众多计算机发烧友和创客的追捧,曾经一“派”难求。目前,具有树莓派生产许可的制造商主要有:

   这几家制造商都有在网上出售树莓派,不同厂家销售的树莓派仅在外观上有细微的区别,配置、性能和使用是完全一样,大家可以随便选择购买。在国内,我们可以很容易的从各大购物网站上购买到。

2.1 树莓派硬件

   图2.1 展示的是树莓派3B+型主板,树莓派3B+型是当前最新的版本,在所有已发行的版本中性能最好,功能和接口最多,但功耗也相对较大。接下来的章节中,我们将主要采用该版本的树莓派进行介绍,下面首先对树莓派的主要部件及接口的功能进行介绍:

图 2.1 树莓派3B+

   1:SOC芯片
   树莓派采用博通(Broadcom)BCM283X系列芯片作为SOC芯片,芯片上集成了CPU、GPU、DSP及SDRAM内存等,其中CPU和GPU共享内存,可以在系统中手工修改内存占比。不同版本的树莓派所采用的SOC芯片在结构和性能上存在一定的差异。
   2:以太网接口
   以太网接口让树莓派能以有线的方式接入计算机网络,这让我们能轻松的访问互联网,或远程登录到树莓派。树莓派的以太网接口是利用USB总线实现的,数据通过USB总线进行传输,大部分型号的树莓派都提供有以太网接口。
   3:USB接口
   通用串行总线(Universal Serial Bus, USB)接口是计算机上最常见的接口,您可以用它来连接键盘、鼠标、U盘、无线网卡等设备。当USB接口的数量不够用时,我们还可以通过USB集线器增加USB接口数量。
   4:HDMI接口
   高清多媒体接口(High Definition Multimedia Interface,HDMI)是一种全数字化视频和声音发送接口,用于传输未压缩的音频及视频信号。通过它连接到配备有HDMI接口的显示器(或电视机)上,就能显示树莓派的内容。HDMI接口能够同时传输视频和音频信号,因此我们使用的时候不需要在树莓派的音频接口连接扬声器,确实需要通过音频接口播放声音的,则需对操作系统的配置做相应的修改。
   5:音频及复合视频接口
   音频接口(3.5mm耳机插孔)在没有用到HDMI连接的时候,可以使用标准3.5mm耳机插孔的扬声器或耳机播放音频。同时,该接口还集成了复合视频接口,具有复合音视频输出功能,一般用于连接旧型号的电视机,当前已经很少使用。
   6:DSI显示器接口
   可以将LCD显示器连接到树莓派上,一般用于嵌入式产品开发。通常情况下,HDMI接口已经能满足需求。
   7:CSI摄像头接口
   利用CSI接口可以通过一条排线将CSI摄像头连接到树莓派上,轻松的进行视频录制和图像拍摄。与USB摄像头相比,这种摄像头模块的性能更为出色。
   8:通用输入输出接口(General Purpose Input Output,GPIO)
   通用输入输出接口(General Purpose Input Output,GPIO)在树莓派主板上被设计成具有两排引脚的插槽。GPIO可以用于连接各种外围电子设备和传感器,通过输入/输出电平信号,以控制或监控这些设备。例如,可以使用GPIO控制直流电机的转速,或是读取超声波传感器的测量距离等。GPIO的这些功能特性使得树莓派有别于普通计算机主板,因为它给予开发人员手工操作的自由。我们将在后续章节中对GPIO做进一步介绍,并大量的使用它们。
   9:SD卡插槽
   SD卡插槽位于树莓派主板背面。SD/MicroSD卡是树莓派必备的存储部件,用于安装操作系统和存储数据,SD卡的容量应在2GB以上。为了能有更好的使用体验,建议为您的树莓派配备大容量(16G以上)的高速(Class10以上)的SD卡。
   10:Micro USB供电接口
    Micro USB供电接口是树莓派主要的供电方式之一,额定电压5V,不同版本的树莓派的标准电流要求略有区别,例如:1B型只要700mA,而3B+型则需要2.5A,很多安卓(Android)手机的充电器都能为树莓派提供必要的电压和电流。树莓派的电流需求还与其连接的外部设备有关,建议在使用的时候应事先计算好,为树莓派选择合适电流(功率)的电源,当外接设备功率较大时,应该采用独立的电源为外部设备供电。
   11:WiFi及蓝牙模块
    WiFi功能让树莓派能够以无线的方式接入计算机无线网络实现互联互通,蓝牙功能则让树莓派能与具备蓝牙功能的设备(如鼠标、键盘、手柄等)进行连接使用。目前,仅3B型、3B+型和Zero W型树莓派自带WiFi和蓝牙功能(两者集成在一个芯片上),对于其他型号的树莓派,您可以通过外接USB WiFi(蓝牙)适配器实现。我们将在后续章节对WiFi和蓝牙的使用作进一步介绍。
   12:以太网供电(PoE)接口
    有源以太网(Power Over Ethernet, PoE)是指利用以太网进行电力传输的一种技术。树莓派3B+型在原有的Micro USB和GPIO供电的基础上,新增了以太网供电方式,用户可以使用网线为树莓派供电,而不需要配置额外的电源,这为某些应用场景提供了极大的便利。

    自2011年12月第一款树莓派问世以来,树莓派基金会已经发布了多个版本的树莓派主板,各版本的差异如表2.1所示。通常,功能较多、性能较高的版本,其体积和功耗也相对较大,我们应该根据实际需求选择合适的版本,而不是盲目的使用功能多、性能高的版本。根据实际需要,在后续的章节中我们将主要使用树莓派3B+型进行介绍。

表 2.1 树莓派版本对照表

2.2 树莓派软件

2.2.1 操作系统

    树莓派支持多种操作系统,主要基于Liunx和Windows,大多可以在树莓派基金会的官网(www.raspberrypi.org)找到,以下简单介绍两款具有代表性的操作系统。

  • Raspbian
        Raspbian是树莓派基金会的官方操作系统,基于Debian GNU/Linux定制,能运行在所有版本的树莓派主板上。根据使用经验,Raspbian与树莓派结合得最好,运行稳定、功能强大、使用方便,基本能满足各种应用需求,因此强烈建议将Raspbian作为树莓派的首选操作系统。在后续的章节中我们将进一步对Raspbian的使用作详细的介绍,并在上面进行各类应用开发。
  • Windows 10 IoT Core
        Windows 10 IoT Core是微软公司专门为物联网生态打造的操作系统,Windows 10 IoT Core则是Windows 10 IoT操作系统的核心版本,功能相对精简,可以在2B型以上的树莓派运行。Windows 10 IoT Core的安装和使用在此就不作详细介绍,有兴趣可访问微软公司的网站获取更多的资料。

    除以上介绍的两款操作系统,还有多款支持树莓派的操作系统,如Ubuntu MATE、OSMC、LibreELEC、PiNet、RISC OS等,至于选择那一种,则取决于您想要用树莓派做什么。如果想将树莓派作为普通的计算机使用,或用于电子项目开发的话,那么Raspbian是个非常好的选择。如果您打算将树莓派作为媒体中心使用,那么可以考虑使用OSMC或LibreELEC。

2.2.2 编程语言

    对于树莓派来说,有许多编程语言可用,事实上任何可以为ARM架构编译的语言(如C语言等)都可用于树莓派,其中最流行的语言应该算Python。事实上,树莓派名字中的Pi就是受单词Python的启发而取的。Python是一种解释型、面向对象、动态数据类型的高级程序设计语言,功能强大、兼容性好、可靠性高,Python程序易于编写和阅读。当前,Python有两个主要版本:Python 2和Python 3,两个版本一直保持有更新维护,但人们对到底该使用哪个版本至今仍存在争议,您可以访问Python的官网(www.python.org)了解更多的相关内容,今后我们将主要使用Python 3进行开发介绍。另外,由于树莓派的兼容性非常好,我们在3B+型上写的程序几乎不需要要修改就能在Zero W型上运行。

2.3 本章小结

    本章介绍了树莓派主板的主要部件和功能,并对各版本的树莓派进行了比较,同时介绍了树莓派的操作系统和编程语言,让读者对树莓派有个基本的了解,为接下来的课程打基础。

第1章 机器人

1.1 什么是机器人

   机器人(robot)一词最早出现在1920年捷克斯洛伐克作家Karel apek的科幻小说《罗萨姆万能机器人公司》中,是根据捷克语Robota(苦役、苦工)和波兰语Robotnik(工人)两个词创造出来的,即代表进行苦力劳动,完成繁重的工作。早在机器人一词出现前,人们就一直幻想和追求制造一种像人一样的机器,以替代人类完成各种工作,现今有记载的如:中国三国时期蜀国丞相诸葛亮制作的木牛流马、十八世纪法国天才技师发明制作的机器鸭。
   在过去的一百年里,现代机器人技术蓬勃发展,机器人已经被应用到我们生产、生活的多个领域中,甚至扮演着重要的角色。然而,至今还没有机器人的统一定义,要给机器人下一个合适的并为人们普遍接受的定义是困难的,以下是比较有代表性的定义。

  • 任何能够代替人类劳动的自动操控机器,虽然这种机器看上去有可能与人类并不相似,或者并不按照人类的方式来实现某些功能。(《大英百科全书》)
  • 机器人(Robot)是自动执行工作的机器装置。它既可以接受人类指挥,又可以运行预先编排的程序,也可以根据以人工智能技术制定的原则纲领行动。它的任务是协助或取代人类工作的工作,例如生产业、建筑业,或是危险的工作。(《百度百科》)
  • 机器人是真实存在于物理世界中的自主系统,能够感知周围环境,依靠自身判断采取行动并完成特定的目标。([美]Maja J.Mataric,《机器人学基础》)

   根据对现代机器人典型定义的理解,以及后继内容的需要,我们认为机器人至少应该具备以下特征:
   第一,机器人应该是真实存在于物理世界中的一个看得见、摸得着的实体。虽然有些计算机程序自称是机器人,也具备机器人的一些特征,但它不是一个看得见、摸得着的实体,所以我们不能称其为机器人,例如运行在我们电子邮件服务器上的反垃圾邮件机器人。
   第二,机器人能完成人类的一些工作,但不一定长得跟人类一样。一个长得和人类一样的机器人不一定适合或擅长去完成我们指定的工作,而且其设计制作的难度相当大。例如:您可以设计制作一个用双脚走路的机器人,但这个机器人的行动效率可能远不如用一个用轮子行动的机器人,而且设计制作一个用轮子走路的机器人远比设计制作一个用双脚走路的机器人要简单。
   第三,机器人应该具备环境感知能力。机器人是一个存在于真实世界的实体,运行在真实世界中,而真实世界的环境是复杂和未知的,机器人需要能根据不同的环境做出合适的行动,那么它必须具备感知周围环境的能力。上述各类古代的自动化机器显然不具备环境感知能力,因此不能算是一个机器人。
   第四,机器人能够依靠自身判断采取行动并完成特定的目标。在接收(感知)到周围的环境情况信号后,机器人应该能够根据这些信号做出判断并采取相应的行动以完成特定的任务。例如,扫地机器人在遇到障碍物的时候能够自行修改行进路线,避开障碍物继续完成工作。
   第五,机器人应该可以接受人类的指挥和操纵。对于一个感知能力有限、智能水平较低的机器,在行动的时候很可能出现偏差,这个时候就需要人类进行干预。而对于一个具备全面感知能力和高度智能的机器人,若脱离了人类的控制,那将是件多么恐怖的事情,科幻小说里机器人奴役人类的情节非常可能出现。因此,机器人接受人类的指挥和操纵是非常必要的。

1.2 机器人组成

   机器人一般由机械本体、控制系统、驱动系统和感知系统等四大部分组成。

  • 机械系统
       机械系统是机器人赖以完成作业任务的执行机构,可以在确定的环境中执行控制系统指定的操作,一般包括机身、臂部、手腕、末端操作器和行走机构等部分,每个部分都有若干的自由度,是一个多自由度的机械系统。
  • 控制系统
       控制系统的作用是根据机器人的的作业指令程序以及传感器反馈回来的信号控制机器人的执行机构,使其能完成规定的运动和功能。控制系统是机器人的指挥中枢,相当人类的大脑,可以由一台或多台微型计算机完成。后续的章节我们将采用一款叫树莓派(Raspberry Pi,RasPi/RPi)的微型计算机作为机器人的控制系统进行介绍。
  • 驱动系统
       驱动系统是驱使机械系统运动的机构,能够按照控制系统的指令信号,借助于动力元件使机器人进行动作。它输入的是电信号,输出的是线、角位移量。机器人驱动系统主要有液压、气动和电气三种。其中,电气驱动方式使用较为普遍,主要采用步进电机、伺服电机和直流电机等实现。
  • 感知系统
       感知系统是用于获取机器人的内部和外部环境信息,并把这些信息反馈给控制系统,由内部传感器和外部传感器组成。内部传感器用于感知机器人的内部情况,如速度、电压等信息,外部传感器则用于获取机器人所处环境信息,如声音、视觉等信息。光敏电阻、超声波传感器、雷达、摄像头等都是典型的传感器。

   机器人是一个典型的机电一体化系统,其基本工作原理如图1.1所示:控制系统发出动作指令,控制驱动系统动作,驱动系统带动机械系统运动以完成一定的作业任务。在运行过程中,感知系统不断的收集内外部环境信息并反馈给控制系统,控制系统根据这些信息进行运算后,发出下一个动作指令。人机交互界面则为人们提供了一个观察机器人运行状态和人工干预机器人运行的接口,属于控制系统的一部分。

图 1.1 机器人基本工作原理

1.3 机器人制作

   设计制作一个机器人涉及到机械、电子、计算机、仿生学等多个学科的知识,以下先简单介绍一下机器人设计和制作的一些基本知识,以便初学者更为快速的入门。

1.3.1 基本原则

  • 简单
        在设计和制作机器人的任何阶段,秉承简单明确的理念是非常睿智的。尤其是在设计制作第一个机器人的时候,我们对机器人的功能要求应尽可能简单,并采用较为简单的方式和技术去实现,不要因为过度钻研某一领域的知识而忘记你正在做一个机器人。
  • 分解
        设计制作机器人是一个复杂的工程,通过工作任务分解,可以简化我们的工作。可以把机器人分解为机械系统、控制系统、驱动系统和感知系统四个部分,然后再对各个部分设计制作工作进行必要的分解直至满足我们的需求并实现。
  • 迭代
        一次性就设计制作出一个功能完善的机器人显然是不现实的。在设计制作机器人的过程中,我们借鉴软件工程的迭代理念,首先实现最简单、最基本的功能,然后再逐步完善和优化。
  • 协作
        前面我们说过,机器人设计和制作涉及到众多学科的知识,而我们大多数人不可能熟知所有相关领域的知识,因此各种形式进行协作是必要的。在互联网高度发达的今天,利用网络社交手段向某些领域的大牛求助是个不错的选择。另外,对于组成机器人的一些基本功能模块,我们可以考虑直接从网上购买,而不是自己从头设计制作,这样可以大大的降低设计制作机器人的难度。

1.3.2 制作步骤

    设计制作一个机器人大致可以分为以下五个步骤:

  • 确定需求
        制作机器人的第一步应该是明确你要做一个什么样的机器人,具备什么功能。按照“简单”的原则,我们不应该一开始就对机器人有太多甚至过份的功能需求,明智的做法是从简单的功能需求出发,把需求一一列出来,并做分类整理,可以考虑把复杂的功能需求归到一类,以便后续迭代实现。
  • 系统设计
        需求确定后,我们应按照“分解”原则,分别对机器人的机械系统、控制系统、驱动系统、感知系统等四大组成部分进行逐步细化设计,确定诸如移动方式、控制方式、、感知形式、动力源等,把机器人的雏形规划出来。这里同样建议采取由简到难,迭代实现的方式进行设计。
  • 材料选择
        完成系统设计后,接下来就是根据设计挑选所需的材料,例如:驱动器、动力源、控制板、感知器等。选择材料的时候建议:①按照前面所述的机器人四大组成部分分别挑选材料,有利于理清思路;②挑选市面上普及和通用的零件,能更容易找到相关的技术文档;③注意电子电气元件的技术参数,如电压、电流、功率等,确保和设计相匹配,避免元件损坏。
  • 程序编写
        为了让机器人动起来,我们还需编写相应的控制程序并上传(烧入)到控制部件。编写程序的时候,建议:①尽可能选择简单易学的编程语言,例如后续章节所使用Python;②根据“协作”的原则,借助各类通用的开发框架和程序库进行开发;③先分别对各部件进行编程,调试通过后再进行联调,通过不断的迭代完成开发。
  • 组装运行
        最后,我们需要将各个部件组装起来,使其成为一个真正的机器人。在这个过程中,我们同样应该遵循“分解”和“迭代”的原则,逐步进行组装和调试,而不是整体组装完成再调试。同时,我们应该尤为注意电子电气元件的连线,避免由于短路而造成元器件损坏。

1.4 本章小结

    在这一章中,我们介绍了机器人的概念,以及我们对这个概念的理解,让您了解什么是机器人。其次,介绍机器人的基本组成,即机械系统、控制系统、驱动系统、感知系统四大部分。最后,我们讲述了设计制作机器人的四个原则和五个步骤,让您对机器人设计制作有个基本的了解。

Donkeycar教程

摘要:本教程是基于Donkeycar的智能小车教程。DonkeyCar小车是基于树莓派和Python,利用Keras深度学习框架实现的自动驾驶小车。

一、简介

本教程是基于Donkeycar的智能小车教程。DonkeyCar小车是基于树莓派和Python,利用Keras深度学习框架实现的自动驾驶小车。
本文档参考和整合Donkeycar文档创客智造的中英文教程,以及安装可能碰到的问题,以“HSP无限94186 ——1比16有刷无控车型”为模型作详细演示,从硬件,软件,系统整合,模型修改等方面介绍Donkeycar智能小车的实现。
整体框架:

1) Vehicle – a container class to hold and manage all aspects of the vehicle.
2) Parts – modular components of the vehicle that read/write to the memory. This includes sensors, actuators, remote controlers and a datastore.
3) Memory – holds the state of the vehicle and is used to pass variables between parts.
4) Drive loop – a function of the vehicle that runs ensures each part interacts with the memory.

二、硬件

硬件清单

配件明细

模型要求:

我们需要选择:
①独立ESC(电子调速器)和接收机的RC小车
②选择三线连接器,三线舵机
③选择速度更慢的有刷小车模型更容易实现。

推荐配置参考:

1:16模型配置

1:10模型配置

参数解释:
motor是电机的参数,2040就是表示定子外径是20mm,定子高度是40mm,定子的外径和高度越多,定子的铁芯越大,线圈绕的匝数也越多,表现出来就是电机的功率越大。
无刷电机KV值定义为转速/V,意思为输入电压增加1伏特(V),无刷电机空转转速(转/分钟)增加的转速值。
ESC的25A是指持续电流25A,这个峰值电流是85A,BEC输出5V,1A。
Tcaction:四驱,双差速器。
Groung Clearance:小车底部离地面的距离。

购买配置清单(价格仅供参考,更新于2018-7-3)
名称淘宝地址价格(税点费+邮费)/元备注
小车主体https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-10687857697.2.14566a1aBpsYGj&id=524795742343329.8(+20)无限94182——1比16有刷无控车架(有刷不要遥控)电调(已包含)舵机(已包含)
USB电池https://detail.tmall.com/item.htm?spm=a230r.1.14.9.2c9e646ctC49zM&id=564303977283&cm_id=140105335569ed55e27b&abbucket=13&skuId=356336270079149(0.2)2A 5V输出,小米充电宝
树莓派3B+https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-14802299686.14.485c40da2EhCk5&id=527630316715354(21.64)3B E14中国版 套餐16G,包括SD卡及配件
广角摄像头https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-14802299686.26.54ba6ae1HJKd7d&id=537191521576100(6.72)树莓派摄像头5MP
树莓派杜邦线https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-14802299686.23.2fd00909E38MRt&id=181897932692树莓派连接线
电机驱动芯片 PCA 9685https://detail.tmall.com/item.htm?spm=a230r.1.14.1.3bc5178b59bMmJ&id=538283746663&cm_id=140105335569ed55e27b&abbucket=115(+5.4)资料下载https://pan.baidu.com/s/1miRuKti
3D打印架CAD Files: a360.co/2pf3Dam STL Files: thingiverse.com/thing:2260575x需要3D打印机

配件介绍

HSP无限94182

模型参数:

模型结构:

电调(Electronic Speed Control,ESC)

电子调速器,主要有两个作用,一是将电池降压,适合接收机和其他舵机的工作电压;二是从接收机获得油门信号,控制马达的转速,从而改变飞机的速度。
❤连接方式为:
1、电调的输入线与电池连接;
2、电调的输出线(有刷两根、无刷三根)与电机连接;(在我们用到的有刷模型中,是红色和黑色的两根比较粗的线)
3、电调的信号线(三根红色,白色和黑色的较细的线)与接收机(PCA驱动芯片)连接。

舵机

舵机的工作原理:舵机常用的控制信号是一个周期为20毫秒左右,宽度为1毫秒到2毫秒的脉冲信号。当舵机收到该信号后,会马上激发出一个与之相同的,宽度为1.5毫秒的负向标准的中位脉冲。之后二个脉冲在一个加法器中进行相加得到了所谓的差值脉冲。输入信号脉冲如果宽于负向的标准脉冲,得到的就是正的差值脉冲。如果输入脉冲比标准脉冲窄,相加后得到的肯定是负的脉冲。此差值脉冲放大后就是驱动舵机正反转动的动力信号。舵机电机的转动,通过齿轮组减速后,同时驱动转盘和标准脉冲宽度调节电位器转动。直到标准脉冲与输入脉冲宽度完全相同时,差值脉冲消失时才会停止转动。
❤连接方式:将输出的三线与对应的PCA驱动板引脚连接。电调和舵机都是标准3线母插头连接只要按照对应的引脚插入驱动板就可以了。(地线一般为黑色或棕色、信号线一般为黄色或白色)。

树莓派+miscro SD存储卡:

Raspberry Pi(中文名为“树莓派”,简写为RPi,(或者RasPi / RPI) 1 是为学习计算机编程教育而设计,只有信用卡大小的微型电脑,其系统基于Linux。
关于树莓派的详细教程参考7
Raspberry Pi 3B+主板图解:

树莓派主板图解

树莓派引脚GPIO定义
❤连接方式:
1、USB电源接口接入充电宝电源
2、摄像头接口连接摄像头
3、树莓派和PCA9685连接:只连四根线,3.3v,两根 I2C 引脚 (SDA 和 SCL),地线 ground。

PCA电机驱动芯片9685(舵机驱动板)

资料下载:https://pan.baidu.com/s/1miRuKti
详细教程参考9

PCA9685是一款基于IIC总线通信的12位精度16通道PWM波输出的芯片, 可用于控制舵机、led、电机等设备,i2c通信,节省主机资源。
❤连接和使用方式:
1、 连接树莓派:
GND -> RPi GND(9脚)
SCL -> RPi SCL1(5脚)
SDA -> RPi SDA1(3脚)
VCC -> RPi 3.3V (1脚)
V+ -> RPi 5V(本实验中PCA上的V+接口不需要接入电源)

树莓派和PCA9685连接图

2、 连接舵机和电调:电调和舵机都是标准3线母插头连接只要按照对应的引脚插入驱动板就可以了。(地线一般为黑色或棕色、信号线一般为黄色或白色,所以对应黑色的线要插在GND对应的针头)。

PCA9685连接图
在上图中,两股标准3线母插头分别连接舵机与电调。

广角摄像头

WARNING:不要在树莓派开机时插拔摄像头!
摄像头需要满足的参数:

购买的Camera 5MP广角摄像头参数:

充电宝

提供5v2A的usb输出和12V输出,主要给树莓派供电
❤连接方式:将充电宝的输出microusb输出连接到树莓派的电源输入端。

3D打印架

❤用螺丝和销钉固定在小车车架上。

杜邦线

杜邦线可用于实验板的引脚扩展,增加实验项目等。可以非常牢靠地和插针连接,无需焊接,可以快速进行电路试验。
本实验中,用来连接树莓派与PCA驱动芯片的对应引脚。

硬件组装

组装流程

1),2)两步为3D打印步骤,如果不适用3D打印,可以用纸板和小刀手工完成顶部结构。
1) 打印部件(3D打印)
用黑色PLA打印零件,层高2毫米,没有支撑。顶部翻转杆设计成倒置打印。
用黑色PLA打印零件,0.3mm层高,一个0.5mm喷嘴,没有支撑。顶部翻转杆设计成倒置打印。
打印的结构图:

2) 清理零件(手工修正)
几乎所有3D打印部件都需要清理。重新钻孔,并清理多余的塑料。

3) 组装顶板结构,树莓派电源充电宝
顶部结构手工完成后的图片:

4) 将PCA驱动板连接到树莓派
利用杜邦线连接,对应的针脚如下:
GND -> RPi GND(9脚)
SCL -> RPi SCL1(5脚)
SDA -> RPi SDA1(3脚)
VCC -> RPi 3.3V (1脚)
V+ -> RPi 5V(本实验中PCA上的V+接口不需要接入电源)
本实验只需要连接四个针脚即可。

5) 将树莓派和PCA驱动板附加到3D打印的底板上。

6) 安装摄像头
使用摄像头前,取下相机镜头上的塑料薄膜。
安装方式:将树莓派上摄像头插销扒开,插入相机电缆,注意触点的位置,随后按入插销即可。

7) 硬件整合
舵机与电调已经在小车上固定好,所以接下来只需用三线母插头把PCA驱动板连接舵机与电调。因为电调和舵机都是标准3线母插头连接只要按照对应的引脚插入驱动板就好。(地线一般为黑色或棕色、信号线一般为黄色或白色,所以对应黑色的线要插在GND对应的针头)。

组装完成

几种不同形态智能小车的完成体:

三、软件

软件清单

❤系统:
树莓派系统
Ubuntu系统
❤在linux下安装donkeycar
安装依赖:virtualenv build-essential python3-dev gfortran libhdf5-dev
https://github.com/wroscoe/donkey
❤在Windows下安装donkeycar
https://conda.io/miniconda.html
https://git-scm.com/download/win
git库https://github.com/wroscoe/donkey
❤在MAC下安装donkeycar
https://conda.io/miniconda.html
https://www.atlassian.com/git/tutorials/install-git
xcode-select —install
pip install https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.3.0-py3-none-any.whl
开源机器学习框架:
❤pip install keras==2.0.6
❤pip install tensorflow==1.3.0

软件安装

安装树莓派系统

将SD卡用读卡器连接到本地PC。
首先为树莓派安装固件,下载地址:
https://www.dropbox.com/s/wiudnm2dcsvoquu/donkey_v22.img.zip?dl=0
安装步骤:
方法1:使用6中的推荐步骤

方法2:利用安装软件Etcher。
安装方法参考教程(For ubuntu),(For windows)

设置wifi连接

我们需要让树莓派连接wifi热点,从而可以无线操控小车。方法有两种:
方法1:SD卡插入树莓派,显示屏,键盘和鼠标连入树莓派,开机后通过界面链接wifi。
方法2:(没有显示屏和键鼠条件下)
首先,新建一个无线热点。可以使用本地PC新建wifi热点。记录ssid和password。
接下来修改树莓派的系统文件:
在boot部分的根目录下,新建文件名为wpa_supplicant.conf的文件,文件内容为

1
2
3
4
5
6
7
country=US
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid=”<your network name>”
psk=”<your password>”
}

分别在ssidpsk设置自己的WiFi用户名和密码,注意不能有<>

设置主机名

如果网络中有多个树莓派,还需要修改本树莓派的用户名,以下命令需要将sd卡挂载到Linux上运行,由于创建本文档时只有一个树莓派,所以并没有修改用户名,本文档的所有用户名均为pi,若读者对树莓派的用户名有修改,登录时需要改成自己的用户名和密码。

1
2
sudo vi /media/userID/UUID/etc/hostname
sudo vi /media/userID/UUID/etc/hosts

注意用户名只能是小写。
然后把SD卡插进树莓派里,给树莓派上电。

设置SSH远程登录

首先查看网络环境,树莓派连接的网络是本地连接13创建的共享热点:

用抓包工具或者nmap扫描工具查找树莓派的ip地址:

或者可以用cmd自带的ARP命令查看相应地址的ARP缓存也可以找到小车地址,arp -a
从上图可以找到树莓派的ip地址是192.168.155.2,接着通过ssh登录树莓派,用户名pi,密码asdfasdf ,登录进去之后界面如图所示:

另外,可以通过win10自带的移动热点看到连接设备的IP地址:

推荐使用的ssh客户端登录软件比如Xshell。

在树莓派镜像安装,升级donkeycar

存储卡图像上的donkeycar Python代码可能比Github repo上的要早,所以一旦你运行了Pi,需要更新,在ssh客户端连接树莓派后,键入命令如下:

1
2
3
cd ~/donkeycar
git pull
pip install -e .

在本地PC安装donkeycar并创建本地工作目录

接下来是在本地笔记本电脑或服务器上设置相同的代码库,以便测试和训练智能小车。安装因平台而异。有如下三种方法,仅给出了windows上的安装结果。

Windows系统

❤安装miniconda Python 3.6 64 bit. https://conda.io/miniconda.html
❤确保选中该框以允许它修改您的系统路径变量以添加conda。
❤安装git 64 bit,https://git-scm.com/download/win
❤从开始菜单启动Anaconda
❤更改为您希望用作项目主管的目录

1
2
mkdir projects
cd projects

❤安装donkeycar

1
2
git clone https://github.com/wroscoe/donkey
cd donkey

❤创建Python Anaconda环境

1
2
conda env create -n donkeycar -f install\envs\windows.yml
activate donkey

❤安装代码源并创建您的本地工作目录:

1
2
pip install -e .
donkey createcar –path ~/d2 #本地工作目录名称设置为d2,可以自己定义

安装结果:

注意:在关闭Anaconda提示符后,当再次打开它时,您需要键入activate donkey以重新启用映射到特定于donkey的Python库。(关于anaconda的使用,可以参考10
项目主管目录示例:

创建的本地工作目录示例:

Linux系统

❤安装依赖和python环境

1
2
3
4
5
sudo apt-get install virtualenv build-essential python3-dev gfortran libhdf5-dev
virtualenv env -p python3
source env/bin/activate
pip install keras==2.0.6
pip install tensorflow==1.3.0

❤安装donkeycar

1
2
git clone https://github.com/wroscoe/donkey donkeycar
pip install -e donkeycar
Mac系统

❤安装miniconda Python 3.6 64 bit. https://conda.io/miniconda.html
❤安装git 64 bit,https://git-scm.com/download/win
❤启动终端
❤如果Xcode or gcc 没安装

1
xcode-select –install

❤创建项目根目录

1
2
mkdir projects
cd projects

❤下载donkeycar

1
2
git clone https://github.com/wroscoe/donkey
cd donkey

❤创建Python Anaconda环境

1
2
conda env create -f envs/mac.yml
source activate donkey

❤安装Tensorflow

1
pip install https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.3.0-py3-none-any.whl

❤安装donkey

1
2
pip install -e .
donkey createcar –path ~/d2

注意:关闭终端后,当您再次打开终端时,您需要键入

1
source activate donkey

来重新启用映射到特定于donkey的Python库。

四、运行智能小车

WARNING:先放置到安全地方并让轮子离地!

Windows系统

-打开Anaconda
-激活映射到donkey的Python设置:donkey

1
2
3
“`
-进入管理donkey的本地目录:
“`cd ~/d2

远程登录树莓派

-用Xshell登录,详细见3.2.4节。

启动和控制小车

-在Xshell连接成功后,打开你小车目录,并开启小车

1
2
cd ~/d2
python manage.py drive

-这个脚本将启动你的小车,其中包括一个作为Web服务器的部件,以便控制你的小车。
-现在可以通过以下网址从网络浏览器控制您的汽车:

1
<your car’s IP’s address>:8887

接下来在本地PC通过浏览器(推荐Chrome浏览器)登录上述网址,在web端控制智能小车:

校准小车

小车的配置信息是存在config.py脚本中的,这个脚本会在运行

1
donkey createcar –path ~/d2

这个命令之后出现在”./d2”这个目录下,如下所示:

其内容是各个部件的参数配置:

校准小车的目的就是将上述参数调整到合适的值,这样才能顺利的驾驶小车,以及共享同款小车的校准数据。

舵机校准(转向校准)

要填的数据有:

注意,此时应让小车离开地面,避免乱跑
1、打开小车,找到舵机伺服电缆插到了PCA的那个通道上了,应该是1或者0.
2、运行命令

1
donkey calibrate –channel <your_steering_channel>

3、输入 360’会看到小车的轮子轻微转动,如果没有的话就输入400或者300
4、左右调整 +/- 10,一直到轮子完全转向左边或者右边,记录此时的值,并填入config.py

马力校准(电机控制)

需要校准的参数:

1、找到ESC的电缆,看看它插到PCA的哪个位置,这就是马力通道。
2、运行命令

1
donkey calibrate –channel <your_throttle_channel>

当提示输入PWM值的时候输入370,此时应该能听到ESC发出哔哔声,表示已经经过校准。
3、输入400,这时小车应该就能往前走了,如果不能往前,则有可能是反向的,此时应该输入330
4、多尝试几次,直到找到你认为比较合适的最大速度,记下此时的PWM值。

校准微调

现在小车已经校准过了,可以开动小车查看是否按照预期运行:
1、运行

1
python manage.py drive

命令启动小车
2、在浏览器中访问

1
<your_cars_ip_address>:8887

3、按j,一直到小车的方向完全转向右边
4、按i,一直到小车的方向完全朝向前方
5、测量转弯直径,并将它记录在表格中
6、在不同的转向值下重复同样的测量
7、绘制表格看看小车在各个方向的转向是否相同(角度相同时)
如果你的转向在80%PWM和100%PWM相同时,将PWM值变为80%PWM,
如果你的车往一边偏,改变另一边的PWM值
经过微调之后你的表格大概会是这个样子

五、训练智能小车

赛道设置

可以用带颜色的胶带、丝带或者绳子,赛道最好宽4英尺,并且有2英寸的白色边框和黄色虚线中线。

数据收集

① 先不记录数据,在跑道上跑几圈,当熟练跑道之后(10圈以上不出错)点击按钮Start Recording

② 如果出错或者有意外发生时马上点击Stop Car停止记录
③ 至少收集10-20圈好的数据之后即可以停止收集,Ctrl-c即可,收集的数据在data文件夹里

需要注意的细节:

1.清除d2/data目录下的之前的数据
2.回到d2目录下python namage.py drive启动小车
3.到浏览器中model选择user,然后用电脑控制小车在场景下跑几圈
4.等到操作小车在场景下基本不出错之后点击start recording开始记录数据
5.记录大约半个小时的数据就可以了
注意在记录数据的过程中,可能会出现小车没电的情况,解决的办法就是,刚开始在config.py文件中把THROTTLE_FORWARD_PWM设置的小一点,本车是335或者330,过一会感觉小车跑的变慢了,停止记录,停下小车,关闭程序。调整THROTTLE_FORWARD_PWM变大一点到440,重启程序,记得保持小车的运行速度以及Throttle差不多一致。同理慢慢可以变为445和450
6.记录完数据,筛选数据。手动删除数据中撞墙等不好的数据
7.将数据考到电脑上装的donkey的d2/data目录下(小文件太多,速度会特别慢)
8.进入d2目录,运行命令 python manage.py train --model ~/d2/models/mypilot
9.等待训练结束,到到d2/models下将mypilot文件发送到小车的对应目录下
10.用命令python manage.py drive --model ~/d2/models/mypilot启动小车,然后到浏览器中选择local pilot模式启动自动驾驶

拷贝数据至本地PC

由于树莓派计算能力有限,需要将数据迁移到电脑上进行模型的训练,有两种方法:

方法1:新开一个SSH窗口用rsync命令从树莓派复制数据。命令如下:

1
rsync -r pi@<your_pi_ip_address>:~/d2/data/ ~/d2/data/

方法2:利用Xshell里面的新建文件传输直接复制粘贴。

利用keras训练模型

复制好数据之后就可以运行训练脚本:

1
python ~/d2/manage.py train –tub <tub folder names comma separated> –model ./models/mypilot

或者:

1
python ~/d2/manage.py train –model ~/d2/models/mypilot

拷贝模型至树莓派

训练好之后再讲pilot迁移回树莓派:

1
rsync -r ~/d2/models/ pi@<your_ip_address>:~/d2/models/

用自动驾驶模型启动小车

重新启动小车,将训练好的模型穿进去:

1
python manage.py drive –model ~/d2/models/mypilot

用模拟器训练小车*

用于生成训练用的图片,测试自动驾驶仪等。当然你也可以不用这种方法,根据网页【http://docs.donkeycar.com/guide/build_hardware/】的描述,你也可以先用手机控制小车在赛道上开10-20次来收集训练数据。
下载之后直接双击EXE文件运行,你可以在input里面看到控制按钮信息。

模拟器中共有三个场景,但是网站【http://docs.donkeycar.com/guide/simulator/】中只给了前两种的描述,第三种是sparkfun AVC机器人大赛的场景:
Generated Road Scene:通用场景
The purpose of this is to create a randomly generated road so that you can have miles of curves on different road surfaces. You can train on one road and test on something similar, or a totally different surface.
Warehouse Scene:专用场景
The purpose of this is to create a specific track that is somewhat similar to an actual course in use as the primary track for the Oakland DIYRobocars Meetup.

进入模拟器,右上角可以选择操作选项,根据网站【http://docs.donkeycar.com/guide/simulator/】的介绍,Joystick/Keyboard No Rec的意思就是摇杆或者键盘控制,但是数据不记录,其他选项意思类推。Next Track:在生成的道路场景中,这将改变路面和轨道宽度。Regen Track:使用当前的表面类型,但生成一个新的随机路径和路径。
下图为我用键盘控制时的截图,在网站【http://docs.donkeycar.com/guide/simulator/】的介绍中,有一个注意事项是这样描述的:Note: Keyboard data produces steering information that is stepped (ie. -1, 0, +1) and may be difficult to train with. See below for joystick setup.大意是说由于键盘控制并不像摇杆可以产生连续的转向信息,而只能是间断的,所以并不适合用来训练。

键盘控制页面
下图为自动驾驶页面,可以看到左下角一共有四个参数,目前并没有搞得很清楚这四个参数的具体含义,暂且先贴出网页【http://docs.donkeycar.com/guide/simulator/】上的解释:
Max Speed:这个应该就是决定了自动驾驶的最大速度
This setting determines the target speed during the PID auto drive. It will also affect the speed when driving by keyboard controls (not recommended).
Prop:转向角度
This is short for proportional. This is the P part of PID that attempts to adjust steering back to the path in proportion to the deviation.
Diff:为了防止角度调整过大
This is the D part of PID that attempts to limit steering back to the path as derivative to the trend of deviation, designed to limit overshoot.
Max Steering
Max steering can only be adjusted when using Auto Drive No Rec. It will also affect joystick and keyboard steering range, and should be saved and reloaded for you.
另外关于这个参数,原文中有一个注意事项: Max Steering is an important adjustment. This affects categorical training quite strongly. As the steering data is normalized when written, and multiplies after coming from Python, this angle should remain constant over training and simulation. Take care when changing this value. And separate data and models by max steering setting.

自动驾驶时的截图
训练结束后,在log目录中会有训练的图片,图片大小为160*120像素

贴一个网页【http://docs.donkeycar.com/guide/simulator/】上给出的典型用法,方便以后使用。

六、更新DonkeycarV2.5教程

  1. 用Etcher给SD卡写入树莓派系统镜像文件名为:donkey_2.5.0_pi3.img,新建并编辑boot目录下的wpa_supplicant.conf文件。
  2. SSH连接树莓派并登陆。1
    2
    用户名:pi
    密码:raspberry
  3. 在树莓派上安装Donkeycar V2.5.1环境1
    2
    pip install donkeycar[pi]
    donkey createcar ~/
  4. 在windows上安装DonkeycarV2.5.1
    (注意区分本地工作目录与本地代码目录)
    a)新建一个本地代码目录,存放代码库:1
    2
    mkdir projects
    cd projects

b)从github上clone最新的donkeycar代码库

1
2
git clone https://github.com/wroscoe/donkey
cd donkey

c)安装donkeycar资源环境,新建本地工作目录(mycar)

1
2
pip install -e .
donkey createcar C:\Users\WuFan\new_mycar(自己修改)
  1. 会遇到的问题:
    a)ModuleNotFoundError: No module named 'controller'
    解决办法:
    将文件
    (可直接复制粘贴word中的这个文件)
    拷贝至\donkey\donkeycar\parts对应的本地代码目录下。
    修改本地工作目录中文件manage.py中第24行,修改为:1
    from donkeycar.parts.controller import LocalWebController, JoystickController

b)训练后的数据存放在树莓派tub文件夹下,而不是data
训练的时候,把tub文件夹下所有数据复制到本地工作目录下的data文件夹下。再开始训练。
c)用训练的模型驾驶的时候,切换到local pilot时,可能会遇到类似摄像头框消失,树莓派报错的情况。
这是因为树莓派上有的python文件版本和本地电脑从github上面clone的文件不一致。如果有报这种错误,可以把本地代码库上面的对应文件覆盖到树莓派上解决。

七、参考创新方向

无人驾驶车障碍竞速

无人取件车/送餐车/领路车

无人捡球车


参考文献

————-本文结束感谢阅读————-

基于 ROS 的 Donkey Car 远程控制

引言

这次我们要实现的功能是用 g29 方向盘远程控制 Donkey Car 小车运动。

整个系统包括小车平台和 PC 端两部分:

  • 小车平台上的设置
    1. 安装 raspbian 操作系统
    2. 安装 ROS
    3. 安装 Donkey Car 相关的 ROS package
  • PC 端的设置
    1. 安装 ROS
    2. 编写程序提取 g29 方向盘控制命令并发布到 ROS topic 上

基于以上两个平台,设置它们之间的 ROS 通讯,就可以实现远程控制。

下边是具体操作步骤。

小车平台上的安装

虽然可以 ssh 到小车上进行远程设置,但是还是强烈推荐连接上显示器、鼠标、键盘,将 raspberry pi 板子当作一个普通的电脑主机使用,操作起来要方便很多。

以下的安装步骤都是假设已经给 raspberry pi 外接了显示器、鼠标和键盘。我们用的是 raspberry pi 3B+ 。

安装 raspbian 操作系统

第一步是将 sd 卡创建成一个系统启动盘。步骤如下:

  • 下载 raspbian 操作系统镜像
    目前 raspberry pi 官网提供了最新的 raspbian 版本 buster 。但是出于兼容性方面的考虑,我们选择用不那么新的 stretch 版本。
    下载地址 http://downloads.raspberrypi.org/raspbian_full/images/raspbian_full-2019-04-09/
    只需要下载那个 1.9 G 的压缩文件即可。
  • 创建启动盘
    官网提供了非常详细的安装说明。也可以参考这里,通过命令行的形式烧录和备份镜像文件。如果不习惯用命令行方式,推荐用 Etcher 。
  • 最后的安装
    有了 sd 卡启动盘,插到 raspberry pi 板子上。通电启动就会进入系统安装界面,跟普通的 ubuntu 系统安装流程类似,不再赘述。

从 sd 卡启动是树莓派的标配,不过也可以从 USB 盘启动。基本方法也是通过 Etcher 将系统镜像文件写入 USB 盘。具体操作可以参考这里。对于最新版的树莓派 3B+,启动的时候只需要 USB 盘,对于旧版的树莓派,还需要 sd 卡做一下引导。
用 USB 做系统盘的好处是存储容量可能比 sd 卡大一些,缺点是暴露在外边,不小心碰到了就可能直接关机了。

安装 ROS

在 raspbian 上安装 ROS 跟 ubuntu 有点区别。raspbian 系统中没有现成的已编译好的 ROS debian package,所以不能简单地用 apt install ros-kinetic-desktop-full 之类的命令安装。我们有两个选择:

  • 从源码编译
  • 直接用别人分享的 raspbian + ROS 镜像文件

这里我用了源码编译的方式。具体流程如官网所示. 这里不再赘述。

在安装过程中有几个问题需要注意

  1. 注意 raspbian 的版本,不同的版本安装命令有些区别。我们用的是 stretch 版本。
  2. 在最后进行如下编译时sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic 默认编译参数是 -j4 。我们在编译时系统完全卡死。尽管 raspberry pi 板子是 quad-core 的,但整体计算能力还是比较低。为了避免编译死机,可以添加参数 -j2,如果还死机,用 -j1,最终的编译命令为sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic -j2 # 或 -j1
  3. 设置完这一步就可以结束了echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc 后边的步骤不需要。

根据我们的经验,整个源码安装过程至少 3 个小时 (用了参数 -j1)。

安装 Donkey Car 相关的 ROS package

本项目用到的 package 都在这里。实际上我们只需要其中两个 package: donkey_car 和 ros-i2cpwmboard

只要前一步的 ROS 编译过程没有问题,后边在使用 ROS 时跟普通 ubuntu 上是完全一样的。
基本步骤是创建一个 workspace,把上述两个 package 放进去, catkin_make 编译一下,就可以了。

在编译 ros-i2cpwmboard 时如果出现如下错误

‘i2c_smbus_write_byte_data’ was not declared in this scop

则需要额外安装一个 i2c 工具包

sudo apt-get install libi2c-dev

以上所有流程结束之后可以测试一下:

roslaunch donkey_car keyboard_demo.launch

通过 rqt_graph 可以看到一个 topic /cmd_vel ,此时只要向该 topic 发送控制命令,就可以驱动小车移动了。可以在命令行用rostopic pub 命令向 /cmd_vel 发送数据测试一下。

这里可能有个问题,运行上述 roslaunch 命令之后,在没有任何 topic 信息输入的情况下,车轮的角度可能会偏向一边,而不是朝向正前方。这是因为 donkey_car/src/low_level_control.py 这个文件中设置的参数跟实际小车不太匹配。这个文件中默认 center_value 的 pwm 值为 333,我们的小车设置为 300 时车轮才会朝前。具体搜索 pwm 值的过程可以参考这里

下一步我们就在 PC 端将 g29 方向盘的操作发布到该 topic 上。

PC 端安装

安装 ROS

PC 端的 ROS 安装比较中规中矩,按照官网步骤安装即可。对于我们这个项目,安装 desktop 就足够了,不需要 desktop-full。当然,安装 desktop-full 肯定也是没有问题的。

转换 g29 操作指令到 ros topic

我们这里用 Node.js 与 g29 通讯,Node.js 既可以提取 g29 的操作输入 (方向盘转角、踏板),也可以反向控制 g29 方向盘。关于反向控制的部分,可以参考我们之前的文章

下面我们要基于 Node.js 编写 ROS node 文件 g29_pub.js,实现 g29 控制命令的提取:

#!/usr/bin/env node

'use strict';

const rosnodejs = require('rosnodejs');
const g = require('logitech-g29');

const Twist = rosnodejs.require('geometry_msgs').msg.Twist;

const options = {
  autocenter: true, 
  debug: false,
  range: 900
}

const wheel = {
  currentPos: 0, 
  moveToPos: 0,  
  moved: true
}

var connected = false;
// once g29 is connected, run this function
    g.connect(options, function() {
    connected = true;
    g.forceFriction(0.4);
})

function g29_pub_node() {
    rosnodejs.initNode('/g29_pub')
    .then((rosNode) => {
        if (!connected)
        return; 
        var pub = rosNode.advertise('/cmd_vel', Twist);
        const msg = new Twist();
        g.on('wheel-turn', function(val){
            msg.angular.z = -(val-50.0)/50.0;    # 可以按照实际需要,将 g29 转角转换成小车的转角
            pub.publish(msg);
        })
        g.on('pedals-gas', function(val){
            msg.linear.x = val * 5;  # 可根据需要修改
            pub.publish(msg);
        })
        g.on('pedals-brake', function(val){
            msg.linear.x = val * - 5;   # 可根据需要修改
            pub.publish(msg);
        })
    })
}


if (require.main === module) {
    // Invoke Main Function
    g29_pub_node();
}

上述命令创建了名了 g29_pub_node 的 ROS node,可以将 g29 的操作转化成 /cmd_vel上的命令。

Donkey Car 与 PC 的连接

有了以上两个平台,现在需要配置 ROS 环境,实现两个平台之间的通讯。假设现在两个平台连接到同一局域网里,互相能 ping 通。

我们选择在 PC 端运行 ROS master, 小车远程连到 PC。

  • PC 平台:
    在 ~/.bashrc 文件末尾添加如下变量定义:export ROS_IP=<PC IP addrss> 然后重开 terminal ,启动 ROS,运行刚才编写的 g29_pub.js 文件。这样就设置好了 g29 方向盘到 /cmd_vel 这一部分的连接。可以通过 rostopic echo /cmd_vel 查看一下方向盘转动时是否有数据输出。
  • 小车平台
    类似地,要在 ~/.bashrc 文件末尾添加如下变量定义:export ROS_IP=<donkey car IP addrss> export ROS_MASTER_URI=http://<PC IP address>:11311 这里不仅要设置本地 IP,还要设置要远程连接的 ROS master 的 IP。设置好以上内容之后,运行如下命令: roslaunch donkey_car keyboard_demo.launch 这就设置好了从 /cmv_vel 到小车这一部分的连接。

如果一切顺利,应该可以通过 g29 方向盘远程控制 Donkey Car 运行了。