jetbot的学习和开发

  • 一.Jetbot系统介绍
    • jetbot的组成元件
    • 一些开源项目
  • 二.软件环境的安装
  • 三.网络的配置(跳过)
  • 四.CSI摄像头安装与测试
  • 五.jetson的40针引脚
    • 40针引脚的SPIO与GPIO
      • SFIO
      • GPIO
      • 四种GPIO引脚调用模式
  • 六.I2C总线与PiOLED
    • I2c物理和应用的特性
    • **I2C总线的检测工具- i2c-tools**

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有规定的仪器挂载点,网址

Jetbot小车系列文章学习相关推荐

  1. 智能小车系列文章之小车简介

    智能小车系列文章之小车简介 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成 ...

  2. 数据结构学习系列文章合集

    数据结构学习系列文章目录 前言 1.稀疏数组和队列 稀疏数组和二位数组的转换 数组队列的实现 环形队列的介绍与实现 2.链表 单链表的增.删.改.查 总结 前言 学习数据结构记录,作为自己的笔记,同时 ...

  3. ASP.NET MVC 3.0学习系列文章—Model in ASP.NET MVC 3.0

    系列文章 ASP.NET MVC 3.0学习系列文章-序 ASP.NET MVC 3.0学习系列文章--Razor and ASP.NET MVC 3.0 ASP.NET MVC 3.0学习系列文章- ...

  4. ASP.NET MVC 3.0学习系列文章--Razor and ASP.NET MVC 3.0

    系列文章 ASP.NET MVC 3.0学习系列文章-序 Razor and ASP.NET MVC 3.0 ASP.NET MVC 3.0学习系列文章-Controllers in ASP.NET ...

  5. 机器学习框架ML.NET学习笔记【1】基本概念与系列文章目录

    一.序言 微软的机器学习框架于2018年5月出了0.1版本,2019年5月发布1.0版本.期间各版本之间差异(包括命名空间.方法等)还是比较大的,随着1.0版发布,应该是趋于稳定了.之前在园子里也看到 ...

  6. Coolite Toolkit学习笔记系列文章

    Coolite Toolkit 是一个支持ASP.NET AJAX的Web控件.它是基于跨浏览器的ExtJS 库开发而来的,并且简化了开发步骤,并且包含有丰富的Ajax运用,同ExtJS 一样都是开源 ...

  7. 零基础 ABAP 学习教程系列文章的目录

    零基础 ABAP 学习教程系列文章的目录 ABAP 标准培训教程 BC400 学习笔记之一:ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍 ABAP 标准培训教程 BC400 学习笔记之二 ...

  8. 【C#】设计模式的学习征途系列文章目录(2019版)

    Photo :Design Patterns 文 | Edison Zhou 2017年,我开始系统学习设计模式,参考了<大话设计模式>.<设计模式的艺术>等书籍,并通过C#语 ...

  9. .NET Core 微服务学习与实践系列文章目录索引(2019版)

    Photo :.NET Core 文 | Edison Zhou 2018年,我开始学习和实践.NET Core,并开始了微服务的学习,以及通过各种开源组件搭建服务治理技术方案,并在学习过程中总结了一 ...

最新文章

  1. extjs video
  2. python画折线图代码-Python折线图的分析过程和画图的方法
  3. iOS容易造成循环引用的三种场景,就在你我身边!
  4. Flutter Mac下环境配置
  5. 根据年份-月份,获得此月份的所有日期
  6. 264中 POC的计算方法
  7. 印花制版技术及工艺流程
  8. python实现规则引擎_python – 如何在不使用eval()或exec()的情况下创建规则引擎?...
  9. FTP 简介与 Windows 系统搭建 FTP 服务器
  10. ArcGIS_一种简单的三维城市建模方法
  11. Android 集成谷歌地图
  12. beta 值和 M 值: 衡量样本甲基化水平的金标准
  13. 开源护眼工具LightBulb2.3.3汉化说明
  14. web页面实现剪切板图片黏贴功能
  15. intel i5处理器layout及原理图参考
  16. final修饰类,修饰方法,修饰变量有什么特点?
  17. tekton pipeline资源
  18. 深入MTK平台bootloader启动之【 Pre-loader -> Lk】分析笔记
  19. 自动生成无课表(云南农业大学)
  20. Android 系统应用升级的坑

热门文章

  1. PM4PY - BPMN support
  2. 提升电脑运行速度,看这里就够了!
  3. java迭代法求圆周率用梯形_常用的圆周率计算公式
  4. JavaScript CSS jQuery 网页音乐播放器
  5. 2022年秋招 Java后端程序员如何应对面试?
  6. 如何截取音频片段并制作成手机铃声
  7. 华为海思总裁:压在保密柜里面的芯片可以拿出来了
  8. Jenkins自动构建部署项目
  9. C语言,指针变量的*p,p以及p的区别
  10. 计算机图形学(光线追踪)