JetRacer (Jetson构建的AI赛车)+安装源码分析
没图说p,看图
https://github.com/NVIDIA-AI-IOT/jetracer#setup
独立自主的AI赛车
RC车模
专业的RC车模
单击 Jupyter 实验室中打开终端
File
->New
->Terminal
在终端中,键入以下命令以列出可用的 WiFi 网络,并查找网络的 。
ssid_name
sudo nmcli device wifi list
连接到选定的 WiFi 网络
它应该在同一网络上, 您将从网络编程
sudo nmcli device wifi connect <ssid_name> password <password>
记下以下命令返回的 WiFi 接口的 WiFi IP 地址 ()。我们称之为
inet
wlan0
jetson_ip_address
ifconfig
以上内容是打开nano连接WiFi。在浏览器内连接
其实我的方案比这个好,直接就是用串口连接看IP,然后SSH连接
http://<jetson_ip_address>:8888
用这个IP来连接小车,就可以打开电脑编程了
接下来的内容是,下载安装好几个要运行的库~
cd $HOME
git clone https://github.com/NVIDIA-AI-IOT/jetcam
cd jetcam
sudo python3 setup.py install
cd $HOME
git clone https://github.com/NVIDIA-AI-IOT/torch2trt
cd torch2trt
sudo python3 setup.py install
cd $HOME
git clone https://github.com/NVIDIA-AI-IOT/jetracer
cd jetracer
sudo 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~