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

<think>好的,我现在需要帮助用户了解和使用JetBot库。首先,用户提到了安装教程、使用文档和示例代码,所以我需要围绕这三个方面来组织回答。 用户的问题是关于JetBot库的,我需要先确认JetBot是什么。根据引用[1]和[2],JetBot是一个与机器人项目相关的Python库,可能涉及TensorRT和PyTorch,用于控制JetBot小车。安装方面,用户可能需要使用pip或者从源码安装。文档方面,可能需要查看官方GitHub仓库或相关文档站点。示例代码可能包括控制小车运动、使用传感器等。 接下来,我需要检查系统级指令,确保回答符合要求。比如,行内数学表达式用$...$,独立公式用$$...$$,不过这个问题可能涉及较少的数学内容,但如果有的话要注意格式。同时要使用中文,生成相关问题,并在引用处添加标识。 用户提供的引用中有两处,引用[1]提到JetBot小车使用说明,软件包是包含模块的文件夹。引用[2]提到torch2trt的支持层,主要集中在JetBot常用层。因此,在回答安装和使用时,需要提到这些引用。 安装部分,可能包括安装前的依赖项,如Python版本、PyTorch、TensorRT等。用户可能需要从GitHub克隆仓库,使用pip安装。需要注意系统是否支持,比如JetBot可能适用于Jetson Nano平台,需要确认用户的环境。 使用文档方面,除了官方文档,可能还需要参考示例项目,比如在GitHub的examples目录下。示例代码可能包括基本的运动控制、避障或跟随功能,需要确保代码正确,并且符合用户的环境配置。 生成的问题需要与JetBot相关,可能涉及安装问题、硬件兼容性、API接口、扩展功能等。 需要确保回答结构清晰,分步骤说明安装、文档、示例,并引用提供的资料。同时要避免使用Markdown格式,但用户示例中使用了代码块,可能需要调整。不过用户给出的系统指令中,示例使用了代码块,所以可能需要保留,但根据用户可见层的要求,可能需要简化格式,不过原问题中的用户可见层示例使用了代码块,因此可能允许使用。 现在整理回答结构: 1. 安装教程:从GitHub克隆,使用pip安装,注意依赖项如Jetson系统、Python3.6+,PyTorch、torchvision、TensorRT等。引用[2]提到torch2trt的支持层,所以安装时可能需要安装torch2trt。 2. 使用文档:官方GitHub的README和docs目录,JetBot项目官网,引用[1]的软件包结构说明。 3. 示例代码:基础控制(电机、摄像头),避障和巡线示例,引用[1][2]的模块和层支持。 相关问题部分,需要生成与安装、使用、扩展相关的问题。 需要确保所有步骤正确,比如安装命令是否正确,是否需要sudo权限,是否需要在虚拟环境中安装等。可能还需要提醒用户注意硬件兼容性,比如必须使用Jetson Nano或其他NVIDIA设备。 最后检查是否符合系统指令,比如中文回答,引用标识,LaTeX语法正确(虽然这个问题可能涉及较少数学内容),生成相关问题等。</think>### JetBot库使用指南 JetBot是基于NVIDIA Jetson平台的智能小车项目,提供Python库用于控制硬件和实现AI功能。以下是安装教程、文档及示例代码的详细说明。 --- ### 1. 安装教程 #### 系统要求 - **硬件**: NVIDIA Jetson Nano/JetBot小车[^1] - **操作系统**: JetPack SDK 4.6+(预装Python 3.6+、PyTorch、TensorRT) #### 安装步骤 1. **克隆仓库**: ```bash git clone https://github.com/NVIDIA-AI-IOT/jetbot cd jetbot ``` 2. **安装依赖**: ```bash sudo apt-get install python3-pip pip3 install setuptools ``` 3. **安装JetBot库**: ```bash sudo python3 setup.py install ``` 4. **安装torch2trt(用于模型加速)**: ```bash git clone https://github.com/NVIDIA-AI-IOT/torch2trt cd torch2trt sudo python3 setup.py install ``` > 注:torch2trt支持常用层,但需检查其文档[^2]。 --- ### 2. 使用文档 - **官方文档**: 访问 [JetBot GitHub Wiki](https://github.com/NVIDIA-AI-IOT/jetbot/wiki),包含硬件配置、API接口及示例。 - **关键模块**: - `jetbot.robot`: 控制电机运动(如前进、转向) - `jetbot.camera`: 调用摄像头捕获图像 - `jetbot.utils`: 图像处理工具(如目标检测预处理) --- ### 3. 示例代码 #### 示例1:控制小车运动 ```python from jetbot import Robot robot = Robot() robot.forward(0.2) # 以20%速度前进 robot.left(0.1) # 左转 robot.stop() ``` #### 示例2:摄像头实时捕获 ```python from jetbot import Camera import traitlets camera = Camera.instance(width=224, height=224) image = camera.value # 获取当前帧 ``` #### 示例3:避障算法(简化版) ```python from jetbot import Robot, Camera import time robot = Robot() camera = Camera.instance() while True: obstacle_detected = some_detection_model(camera.value) # 自定义检测逻辑 if obstacle_detected: robot.left(0.2) else: robot.forward(0.3) time.sleep(0.1) ``` --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值