

沒圖說p,看圖
https://github.com/NVIDIA-AI-IOT/jetracer#setup
獨立自主的AI賽車

RC車模

專業(yè)的RC車模
單擊 Jupyter 實驗室中打開終端File -> New -> Terminal
在終端中,鍵入以下命令以列出可用的 WiFi 網(wǎng)絡(luò),并查找網(wǎng)絡(luò)的 。ssid_name
sudo nmcli device wifi list
連接到選定的 WiFi 網(wǎng)絡(luò)
它應(yīng)該在同一網(wǎng)絡(luò)上, 您將從網(wǎng)絡(luò)編程
sudo nmcli device wifi connect <ssid_name> password <password>
記下以下命令返回的 WiFi 接口的 WiFi IP 地址 ()。我們稱之為inetwlan0jetson_ip_address
ifconfig
以上內(nèi)容是打開nano連接WiFi。在瀏覽器內(nèi)連接
其實我的方案比這個好,直接就是用串口連接看IP,然后SSH連接
http://<jetson_ip_address>:8888
用這個IP來連接小車,就可以打開電腦編程了
接下來的內(nèi)容是,下載安裝好幾個要運行的庫~
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
因為執(zhí)行的腳本都差不多,我給你講一下是什么意思。先把目錄轉(zhuǎn)移到家目錄,然后clone對應(yīng)的庫。接著轉(zhuǎn)移到下載的庫內(nèi),執(zhí)行python的安裝腳本
sudo nvpmodel -m1
接著把Nano的功率鎖定在5W的水平上面,畢竟是個充電寶驅(qū)動?xùn)|西,活力全開受不了~

這個就是我們的安裝文件
install_requires=['marshmallow>=3.0.0b11']
在這個setup文件安裝對應(yīng)的庫的時候,可以這樣寫對應(yīng)的依賴
ind_package()命令是用來查找依賴包的,理想情況下,一句find_package()把一整個依賴包的頭文件包含路徑、庫路徑、庫名字、版本號等情況都獲取到,后續(xù)只管用就好了。我沒有見過這個包,查找了一下~
https://www.cnpython.com/pypi/adafruit-circuitpython-servokit

是個伺服電機的庫

這樣的,所有的輪子都是用PWM控制的

可以級聯(lián)控制板

你看一次可以控制多少舵機,(其實就是有多少路PWM)
http://www.elecfans.com/d/1123469.html

在pi中的連接,在nano里面也是這個連接法

init是必須寫的文件

Traitlets 允許Python自定義類擁有類型檢查、動態(tài)計算默認值和Change回調(diào)這三種特性。1
只需要繼承HasTraits即可讓自定義的類獲得這一系列特性。

看見了一個修飾符,查查看

在源碼中是用到這里的

我查了一下這個單詞的意思

在學(xué)術(shù)里面找到了這個意思

那我們可以找到,這個類里面是控制車的運動情況的
一個是油門,一個就是這個steering(就好像舵機一樣),這兩個量可以控制小車的前進狀態(tài)
def _clip_steering(self, proposal):if proposal['value'] > 1.0:return 1.0elif proposal['value'] < -1.0:return -1.0else:return proposal['value']
在值大于1的時候返回1,小于-1就是返回-1
在1-(-1)之間就返回自己的值,也就是說,對輸出的量進行了規(guī)約

在另一個文件,我們先看到導(dǎo)入的文件。一個是規(guī)約文件,一個是靜態(tài)庫,一個是伺服電機的控制庫

首先是對要控制的賽車的一些參數(shù)的標定

我們可以這樣想,對于一個車想轉(zhuǎn)彎的時候,前面的導(dǎo)向輪是要轉(zhuǎn)動一些角度。一個多少度,二是轉(zhuǎn)彎的這個過程有多塊(就是是不是蹭的一下就角度有了,此時對應(yīng)的是急轉(zhuǎn)彎,這個值就是增益系數(shù)),所以這個值就是給了轉(zhuǎn)向。
steering_gain = traitlets.Float(default_value=-0.65) # 轉(zhuǎn)向增益steering_offset = traitlets.Float(default_value=0) # 轉(zhuǎn)向偏移steering_channel = traitlets.Integer(default_value=0) # 轉(zhuǎn)向通道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)# 連續(xù)伺服self.steering_motor = self.kit.continuous_servo[self.steering_channel]# 油門馬達self.throttle_motor = self.kit.continuous_servo[self.throttle_channel]
以及油門和轉(zhuǎn)向的伺服電機通道設(shè)置

下面的代碼要用到這個修飾符
@traitlets.observe('steering')def _on_steering(self, change):self.steering_motor.throttle = change['new'] * \self.steering_gain + self.steering_offset#轉(zhuǎn)向馬達 = 一個輸入的值X轉(zhuǎn)向增益+轉(zhuǎn)向偏移@traitlets.observe('throttle')def _on_throttle(self, change):self.throttle_motor.throttle = change['new'] * self.throttle_gain# 油門馬達 = 一個輸入的新值X油門增益
想
from jetracer.nvidia_racecar import NvidiaRacecarcar = NvidiaRacecar()
一開的代碼一定是創(chuàng)建一個類,名字叫car~
