Jetbot小车系列文章学习


jetbot的开发网站
不同开发商提供的版本和硬件不同,官方镜像下载后会出现i2c总线错误的现象,无法开机。使用商家提供的镜像进行开发,一般是将原有的官方代码进行了某些移植和修改。可以查看jetbot的代码,上层代码一般可以通用的执行。

一.Jetbot系统介绍

具有“避障”、“循路”与“遇障停止”,可以通过一个单独的CSI相机(而不是传统的距离传感器)来实现上述的功能。
特点:
Jetbot 用 Jetson Nano(含 2GB)将计算与控制集于一身,传统小车大部分是将这两部分交由两个处理设备来独立负责,主要是因为那些计算设备的性能,不足以顺畅地同时执行计算与控制两个工作,但这样的方式会增加软件上的复杂度,也会影响系统的运行稳定性。

  • 能执行绝大部分 DeepLearning 框架
    *简洁的调用方法和多种神经网络。
  • TensorRT Inference Engine
    *模型加速
  • 计算机视觉(CV)库与 Camera Subsystem
    *常见的视觉支持

配件和树莓派的针脚兼容。

jetbot的组成元件

1. 计算与控制设备:
 这是 Jetbot 系统的核心,用 NVIDIA Jetson Nano 或 2GB 版本来担任,二者的机构尺寸与接口位置几乎一致,因此配套的装置是完全通用的。
 Jetson Nano(含2GB)透过一组与树梅派兼容的 40 针扩展引脚,与电子控制设备进行互动,包括传送指令与接收信息,因此 Jetson Nano(含2GB)也同时肩负着控制的功能,这样能非常有效地降低设备之间的交互复杂度。
2.信息接收设备:
  一个 CSI 摄像头,完全模拟人类“视觉感知”的理解方法,用最先进的深度学习“图像分类”技术来识别前方的图像,因此不需要其他声纳、红外线、激光雷达之类的空间距离传感设备
3. 网络连线设备:
 我在此处使用了外接网卡,占用了一个USB,此外还可以安装内置网卡,加天线。
4.显示设备:PiOLED
 一个小显示屏来提供一些简单的信息,特别是这个设备目前的 IP 地址,以及 CPU、内存使用率等简单信息。

5.电机控制设备
PCA9685 + TB6612 二合一控制版:前者负责接收来自 Jetson Nano 的 I2C 信号,后者则根据信号去提供电机所需要的电源。
电机驱动的部分:包括两个 TT 电机与两个配套的外轮,前者接受 TB6612 供应的电流进行不同方向与速度的旋转,带动后者与地面摩擦执行 Jetbot 的行进。
6. 电源供应设备:
由于 Jetbot 所使用的电器设备全部都是 5V 电压,使用市面上标准的充电宝就可以,不过受到车座所留给放置电源的空间限制,对于充电宝的宽带与高度是有要求的,并且需要两个以上的供电口。
7. 车座机构件:
这个在 Jetbot 小车官网上有提供开源的 3D 打印文件,读者可以下载后自行打印,或者在淘宝上这方面的服务供应商去打印也可以。

一些开源项目

  1. 基本运动:从 web 浏览器对 JetBot 进行编程,执行基本的电机控制;
  2. 对象跟踪:使用预训练的对象检测模型,对人、杯子或狗等 80 类物件执行跟踪功能;
  3. 避免碰撞:这是 Jetbot 的经典范例,使用深度学习的“图像分类”功能所实现的功能,主要分为两部分,全部透过一个 CSI 摄像头来进行:
    (1) 透过 CSI 摄像头收集“障碍(block)”与“无障碍(free)”而分类图形,在 Jetson Nano(含2GB)进行模型训练,
    (2) 将训练好的模型用在 Jetbot 上,对 CSI 摄像头实时读入的图像桢上进行推理识别,进而实行“避免碰撞”的功能。
  4. 交通锥循路:这是 Jetson 社区里的开源项目,基于“避免碰撞”实验的扩展,将收集的数据分为“先前”、“向左”、“向右”、“障碍”四分类,执行与“避免碰撞”相同逻辑与步骤,进行数据集收集、模型训练与推理运作。
  5. 道路跟踪:这是使用线性回归(linear regression)的方式来实现“循路”的功能,前提是道路上必须有分割线,才能使用这种方式实现循路的功能,过程中可以使用到游戏摇杆的协助,来收集数据集进行训练。
  6. 避障与循路的结合:这也是基于 Jetson 社区的开源项目,将第 3 个“避免碰撞”与第 5 个“道路跟踪”实验相结合,是个实用性非常高的实验。

二.软件环境的安装

使用 Jetson Nano 2GB 开发套件
Jetbot 需要与很多周边设备互动,并且使用很多深度学习框架以及 Jupyter 交互界面进行操作,因此需要安装与调试的内容很多,主要包括以下部分:
在这里插入图片描述

  • 完整镜像安装Jetbot
    这是 Jetbot 一开始推出时所使用的方法,至今还继续沿用。执行步骤如下:
    (1)下载 Jetbot 镜像:
    根据所使用的机型是 Jetson Nano 或 2GB 版本,选择对应的下载路径,目前最新版本是基于 Jetpack 4.5 的基础上搭建网站打包成镜像文件提供下载.
    (2)准备一张 32GB 以上的 TF 卡,用 Etcher 将上面下载的镜像烧录进 TF 卡
    (3)将 TF 卡插入设备后开机即可使用,系统用户名、密码以及 Jupyter 界面的密码都是 “jetbot”
    在原有系统上创建:
    这里有两种方法能在您现有的 Jetapck 开发环境中安装 Jetbot 智能无人车项目,不过请确认您的 TF 卡还有足够的空间,如果将 SWAP 一起算进去,建议至少有 10GB 空间是比较保险的。

第一件事情,就是将 Github 的开源代码,复制一份到您的 Jetson Nano(含2GB)上,请执行以下指令:

git clone https://github.com/NVIDIA-AI-IOT/jetbot

1. 在系统上直接用脚本安装:
在这里插入图片描述

cd scripts
sudo  ./create-sdcard-image-from-scratch.sh
./scripts/configure_jetson.sh # 关闭图形桌面,并设定成10W运行模式
./scripts/enable_swap.sh # 添加SWAP空间

2. 使用Docker容器技术:
这是实用性最高的方式,不仅 Docker 集成技术会将 Jetbot 操作环境与实体环境进行隔离,避开软件版本冲突的风险,还能与您现有开发环境共存,进一步将 Jetson Nano 2GB 上所开发的项目有效集成,也让 TF 卡利用率能发挥到最高,是我们比较推荐的一种安装方式。

创建 Jetbot 容器的脚本在目录下的 docker 目录里,请先将工作位置移到这里:

	cd ~/jetbot/docker

这个安装过程,最好先用 USB 或网络(有线或 WIFI)与 Jetson Nano 2GB 连线,透过 SSH 远程操作会比较合适,因为过程会将 Jetson Nano(含2GB)的图形桌面关闭,并且最后需要在 PC 上用浏览器开启 Jupyter 操作界面。

Jetbot 团队提供创建 Docker 版本的脚本是基于 Jetpack 4.4 版本,如果您目前使用 Jetpack 4.5 以上版本的话,需要对 configure.sh 脚本以及下面的 Dockerfile 进行小幅度修改。下面以 Jetpack 4.5 版本为例:

elif [[ "$L4T_VERSION" == "32.5.0" ]]
then JETBOT_BASE_IMAGE=http://nvcr.io/nvidia/l4t-pytorch:r32.5.0-pth1.6-py3

source configure.sh

(2) 修改 base/Dockerfile 文件的两行设定值:

  • 将第 1 行 r32.4.3-pth1.6-py3 改成 r32.5.0-pth1.6-py3
  • 第 102 行 “RUN apt install -y python3-smbus && pip3 install pyzmq”提前到 jupyter 的安装之前,例如移到第 77 行
  • 为前一个安装行最后的 “pyzmq” 指定版本,改成 “pyzmq==22.0.0”

(3) 修改 models、display、jupyter、camera 下面的 Dockerfile:
将“base:jp44”改成“base: $JETBOT_VERSION- $"L4T_VERSION”

	./build

在 Jetson Nano 2GB 上大约需要 90 分钟
http://nvcr.io/nvidia/l4t-pytorch:r32.5.0-pth1.6-py3
从 NVIDIA 的镜像仓中下载,作为 Jetbot 镜像的基础,因为这是 Jetbot 深度学习的基础环境。

在这里插入图片描述

docker images

最后设置 Jetbot 相关环境,并重启设备:

./scripts/configure_jetson.sh # 关闭图形桌面,并设定为10W执行模式
./scripts/enable_swap.sh # 创建4GBSWAP 空间
sudo reboot

接下去就启动 Jetbot 软件,执行以下指令将启动位置设为在 $HOME/jetbot

cd ~/jetbot/docker./enable $HOME/jetbot
docker ps

三.网络的配置(跳过)

四.CSI摄像头安装与测试

可以参考CSI相机的

from jetbot import Camera, bgr8_to_jpeg
import ipywidgets.widgets as widgets
from IPython.display import display
import traitlets
camera = Camera.instance(width=1640, height=1232)
image = widgets.Image(format='jpeg', width=1640, height=1232)
camera_link = traitlets.dlink((camera, 'value'), (image, 'value'), transform=bgr8_to_jpeg)
display(image)

五.jetson的40针引脚

启用使用到的外设权限:
使用以下命令获取对GPIO的使用权限

sudo usermod -a -G gpio username

使用以下命令获得对I2c的使用权限。

sudo usermod -a -G i2c username

配置和使用jetson-io时可能会出现两个问题。
sudo /opt/nvidia/jetson-io/jetson-io.py
如果该命令不起作用
一个是dtb文件找不到,还有/boot挂载的磁盘的标签要修改为APP。
dtb文件是设备树的一种描述,解决方法如下:
cd /boot&cp .dtb /dtb
第二种是报错无法识别标签为APP
通过gparted来修改
在这里插入图片描述

blkid /dev/mmcblk0p1 通过命令来查看分区的属性。
可以使用系统的引脚配置工具sudo /opt/nvidia/jetson-io/config-by-pin.py查询当前的引脚的功能。
在这里插入图片描述
自动控制整体方案。早期的自动控制是机电控制。
jetson可以做到,智能加控制
扩充引脚的方式控制与机电控制设备对接。
在这里插入图片描述

将控制赋予机器学习的智能。
关于Jetson40针引脚的介绍的分类:

  1. 40 根引脚的 SPIO 与 GPIO
  2. Jetson-IO工具与 Jetson.GPIO 开发库
  3. 四种 GPIO 引脚调用模式:BOARD、BCM、CVM、TEGRA_SOC

40针引脚的SPIO与GPIO

在这里插入图片描述
GPIO(General Purpose I/O)通用功能

SFIO(Special Function I/O)特定功能

SFIO

有 18 根与开发套件底板电子电力直连的脚位,这是不能重新定义的固定功能


1. 供电相关:这个部分需要非常细心处理,如果错用可能会造成 Jetson 设备损坏。这里也进一步分成三种功能:

  • 5V 直流电输入/输出:脚位[2, 4],在标识上唯一使用“红色”的地方,可以对 Jetson 开发套件作为“供电”用途,有些 Jetbot 第三方套件就是用这种方式对 Nano(含2GB)进行供电,不过这些都是专业厂商自行设计的电路,如果不太熟悉供电原理的读者,请勿随意尝试以避免对设备造成破坏。
    两个接脚也能对 5.0V 规格的周边设备进行供电,但是非常不推荐这样使用,因为 Jetson 本身的电力已经处于吃紧状态,如果再对其他设备提供 5V 输出,很可能影响整体稳定性。
  • 3.3V 直流电输出:脚位[1, 17],可以为一些低电设备进行供电。例如在 Jetbot 项目中使用的 PiOLED 与 PCA9685,就是由 Nano(含2GB)的 3.3V 供电口对这两个元件进行供电。
  • GND 接地点:脚位[6, 9, 14, 20, 25, 30, 34, 39]共 8 个。

2. 二组 I2C:I2C1_SDA/SCL=>脚位[27, 28];I2C2_SDA/SCL => 脚位[3, 5]
两组
SDA和SCL的说明
串行数据线SDA——负责在设备间传输串行数据 
串行时钟线SCL——负责产生同步时钟脉冲
SCL\SDA是I2C总线的信号线。


  1. 一组 UART:UART2_TX/RX=>脚位[8, 10]

 UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。
UART


撇开电源相关的 12 根脚位之外,真正需要了解的,就是两组 I2C 与一组 UART 共 6 个脚位,这 18 根脚位的定义与树莓派是完全一致的。在 Jetbot 项目中也就使用 1 组 3.3V/GND 电源与 1 组 I2C 的 SDA/SCL 而已,总共 4 根引脚就能完成智能车的任务。

GPIO

至于另外 22 根“可重新定义”脚位,才是很多网上所探索的“GPIO” 内容,其实正确的说法应该是“Jetson 的 22 根 GPIO 引脚使用”才对,不过这里就不去纠正这些小问题,重点在于让大家更清楚剩下这 22 根引脚的用法。

两种处理方式:

  1. 透过Jetson-IO 工具将特定引脚设置成为 SFIO 用途,然后配合特定的开发库;
  2. 作为 GPIO 用途,透过Jetson.GPIO 或其他开发库直接调用
  • Jetson-IO引脚配置工具

    Jetpack 自带的底层系统引脚配置工具

  • Jetson.GPIO 库
    针对 GPIO 引脚的应用层开发库
    针对“未被 Jetson-IO 设置为 SPIO”的 GPIO 引脚进行配置与运作的应用库。

引脚 19 在前面 Jetson-IO 配置为 spi1 功能之前,就是作为 GPIO 功能,可以用 Jetson.GPIO 库去指派与调用;但是经过 spi1 配置并重启之后,引脚 19 已经属于 SFIO 而非 GPIO,这时候如果用 Jetson.GPIO 库去指定这个引脚,就不会产生作用。

从某种角度来说 Jetson.GPIO 与 Jetson-IO 是互斥的”,道理就在这个地方,一旦被 Jetson-IO 配置并启动的脚位,就不再属于 GPIO 的功能了。

下载这个库

 sudo pip3 install Jetson.GPIO

下载这个开发库的范例:

cd ~ && git clone https://github.com/NVIDIA/jetson-gpio
cd jetson-gpio/samples

面包板、LED 灯、杜邦线、小电阻、小电容

四种GPIO引脚调用模式

作为 GPIO 用途的脚位有四种调用的模式
设置模式:
GPIO.setmode(GPIO_MODE)

  1. GPIO.BOARD
  2. GPIO.BCM

  1. GPIO.CVM
  2. GPIO.TEGRA_SOC

GPIO.BOARD:这种模式的引脚是根据“1~40”的物理编号进行指定,是最简单易懂的方式,不过必须注意得避开已经设置为 SFIO 的引脚。例如:

1.GPIO.setmode(GPIO.BOARD)
2.GPIO.setup(12, GPIO.IN)                      # 设置12号引脚为输入
3.GPIO.setup(13, GPIO.OUT, initial=GPIO.HIGH) # 设置13号引脚为输出

GPIO.BCM:这种编号是因为控制芯片主要来自于博通(Broadcom)公司,而他们自定义了一组 BCM 编码方式,在 Jetson Nano(含2GB)开发套件的针脚位背面所印刷的“Dxx”编号(如下图),就是 BCM 的编码。

除了电源和接地线,其他具有功能的都有编号。

从0开始编码的,并且不像BOARD编码方式那样有序,他是根据功能进行编码的。
在这里插入图片描述

1.GPIO.setmode(GPIO.BCM)
2.GPIO.setup(12, GPIO.IN)    # 设置D12(BOARD的32)脚位为输入
3.GPIO.setup(13, GPIO.OUT)  # 设置D13(BOARD的33)脚位为输出

GPIO.CVM与GPIO.TEGRA_SOC:这两种模式使用各 GPIO 管脚命名的字符串,作为设置引脚的参数,其中 CVM 是根据 CVM/CVB 连接器信号名称命名,TEGRA_SOC 是根据 Tegra SoC 中信号名称来命名的。例如:

1.GPIO.setmode(GPIO.TEGRA_SOC)
2.GPIO.setup('SPI1_SCK', GPIO.IN)      # 设置BOARD的23脚位为输出
3.GPIO.setup('SPI1_MISO', GPIO.OUT)  # 设置BOARD的21脚位为输出

六.I2C总线与PiOLED

I2C 的[3, 5]与[27,28]

集成电路总线(Inter-Integrated Circuit)
多主从(master/slave)架构的串行通信总线由于结构设计得非常简单并且有很大的弹性空间,使得这个总线的普及度相当高,广泛用于微控制器与传感器阵列,显示器,IoT 设备,EEPROM 等之间的通信。

I2c物理和应用的特性

在这里插入图片描述

I2C总线的检测工具- i2c-tools

I2C 的归类是 SFIO 而不是 GPIO 类型
I2C 有自己专属的 i2c-tools 检测工具,可以用指令检测设备上 I2C 的状态,并使用 SMBUS 总线开发库来进行开发,Jetbot 系统的机电操控指令也是基于这个库进行高阶封装的。

安装 i2c-tools 与 smbus

sudo apt update && sudo apt install -y i2c-tools

不过这些牵涉到底层的调用,因此需要配置使用的权限,如下步骤:

sudo usermod -aG i2c $USER

检查看看设备里有几个 i2c 总线

i2cdetect -l

在这里插入图片描述
3:5是I2C-2
27:28是I2C-1
通过命令查看 对i2cdetect的参数进行分析。
-y :关闭交互模式
-a :强制扫描非常规地址(不推荐)
-q :使用 SMBus 的 “quick write” 命令进行探测(不推荐)
-r :使用 SMBus 的 “receive byte” 命令进行探测(不推荐)
-F :显示适配器实现的功能列表并退出
-V :显示版本信息并退出
-l :输出已安装 I2C 总线的列表
I2C有规定的仪器挂载点,网址

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值