分享

JetRacer (Jetson构建的AI赛车)+安装源码分析

 云深无际 2021-11-03

没图说p,看图

https://github.com/NVIDIA-AI-IOT/jetracer#setup

独立自主的AI赛车

RC车模

专业的RC车模

  1. 单击 Jupyter 实验室中打开终端File -> New -> Terminal

  2. 在终端中,键入以下命令以列出可用的 WiFi 网络,并查找网络的 。ssid_name

    sudo nmcli device wifi list
  3. 连接到选定的 WiFi 网络

    它应该在同一网络上, 您将从网络编程

    sudo nmcli device wifi connect <ssid_name> password <password>
  4. 记下以下命令返回的 WiFi 接口的 WiFi IP 地址 ()。我们称之为inetwlan0jetson_ip_address

    ifconfig

以上内容是打开nano连接WiFi。在浏览器内连接

其实我的方案比这个好,直接就是用串口连接看IP,然后SSH连接

http://<jetson_ip_address>:8888

用这个IP来连接小车,就可以打开电脑编程了


接下来的内容是,下载安装好几个要运行的库~

cd $HOMEgit clone https://github.com/NVIDIA-AI-IOT/jetcamcd jetcamsudo python3 setup.py install
cd $HOMEgit clone https://github.com/NVIDIA-AI-IOT/torch2trtcd torch2trtsudo python3 setup.py install
cd $HOMEgit clone https://github.com/NVIDIA-AI-IOT/jetracercd jetracersudo python3 setup.py install

因为执行的脚本都差不多,我给你讲一下是什么意思。先把目录转移到家目录,然后clone对应的库。接着转移到下载的库内,执行python的安装脚本

sudo nvpmodel -m1

接着把Nano的功率锁定在5W的水平上面,毕竟是个充电宝驱动东西,活力全开受不了~

这个就是我们的安装文件

install_requires=[ 'marshmallow>=3.0.0b11']

在这个setup文件安装对应的库的时候,可以这样写对应的依赖

ind_package()命令是用来查找依赖包的,理想情况下,一句find_package()把一整个依赖包的头文件包含路径、库路径、库名字、版本号等情况都获取到,后续只管用就好了。我没有见过这个包,查找了一下~

https://www.cnpython.com/pypi/adafruit-circuitpython-servokit

是个伺服电机的库

这样的,所有的轮子都是用PWM控制的

可以级联控制板

你看一次可以控制多少舵机,(其实就是有多少路PWM)

http://www.elecfans.com/d/1123469.html

在pi中的连接,在nano里面也是这个连接法

init是必须写的文件

Traitlets是什么

Traitlets 允许Python自定义类拥有类型检查动态计算默认值Change回调这三种特性。1

如何使用Traitlets

只需要继承HasTraits即可让自定义的类获得这一系列特性。

看见了一个修饰符,查查看

在源码中是用到这里的

我查了一下这个单词的意思

在学术里面找到了这个意思

那我们可以找到,这个类里面是控制车的运动情况的

一个是油门,一个就是这个steering(就好像舵机一样),这两个量可以控制小车的前进状态

def _clip_steering(self, proposal): if proposal['value'] > 1.0: return 1.0 elif proposal['value'] < -1.0: return -1.0 else: return proposal['value']

在值大于1的时候返回1,小于-1就是返回-1

在1-(-1)之间就返回自己的值,也就是说,对输出的量进行了规约

在另一个文件,我们先看到导入的文件。一个是规约文件,一个是静态库,一个是伺服电机的控制库

首先是对要控制的赛车的一些参数的标定

我们可以这样想,对于一个车想转弯的时候,前面的导向轮是要转动一些角度。一个多少度,二是转弯的这个过程有多块(就是是不是蹭的一下就角度有了,此时对应的是急转弯,这个值就是增益系数),所以这个值就是给了转向。

steering_gain = traitlets.Float(default_value=-0.65) # 转向增益 steering_offset = traitlets.Float(default_value=0) # 转向偏移 steering_channel = traitlets.Integer(default_value=0) # 转向通道 throttle_gain = traitlets.Float(default_value=0.8) # 油门增益 throttle_channel = traitlets.Integer(default_value=1) # 油门通道

此时的值可以分为两组

这段代码是对类的初始化,首先是继承。其次是读取伺服电机的地址

def __init__(self, *args, **kwargs): super(NvidiaRacecar, self).__init__(*args, **kwargs) self.kit = ServoKit(channels=16, address=self.i2c_address) # 连续伺服 self.steering_motor = self.kit.continuous_servo[self.steering_channel] # 油门马达 self.throttle_motor = self.kit.continuous_servo[self.throttle_channel]

以及油门和转向的伺服电机通道设置

下面的代码要用到这个修饰符

@traitlets.observe('steering') def _on_steering(self, change): self.steering_motor.throttle = change['new'] * \ self.steering_gain + self.steering_offset #转向马达 = 一个输入的值X转向增益+转向偏移
@traitlets.observe('throttle') def _on_throttle(self, change): self.throttle_motor.throttle = change['new'] * self.throttle_gain # 油门马达 = 一个输入的新值X油门增益

from jetracer.nvidia_racecar import NvidiaRacecar

car = NvidiaRacecar()

一开的代码一定是创建一个类,名字叫car~

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多