上一篇文章介紹了用web界面來(lái)控制小車(chē)移動(dòng)增炭,這篇文章介紹用藍(lán)牙游戲手柄來(lái)控制小車(chē)的移動(dòng)忍燥。物理手柄的控制會(huì)更加得心應(yīng)手,不會(huì)受網(wǎng)絡(luò)延遲的影響隙姿。
1. 藍(lán)牙游戲手柄
筆者使用的一款價(jià)格約100元的小雞藍(lán)牙手柄梅垄,理論上所有帶藍(lán)牙功能的手柄都支持,如PS3, Xbox One等等孟辑。
1.2 手柄配置
不管什么型號(hào)的手柄哎甲,一般都有相似的功能按鈕蔫敲,分為以下兩類(lèi):軸和按鈕。
軸(axis):
能輸出連續(xù)變化的值炭玫,如:
- L2, R2是根據(jù)按壓的力度輸出從0~32767的值奈嘿;
- 左右搖桿(left_stick, right_stick)是輸出兩個(gè)方向從-32767~32767的值:up_down、left_right吞加,搖桿不動(dòng)(居中)的值是0裙犹。
按鈕(button):
只有0或1的值,按下去為1衔憨。如D Pad的上下左右4個(gè)按鈕叶圃,L1, R1;L2和R2也能同時(shí)輸出是否被按下践图。
從手柄設(shè)備的設(shè)備文件(如/dev/input/js0
)可以讀出手柄的控制信號(hào)掺冠,信號(hào)包含操作的按鈕/軸和它的值。按鈕/軸由一個(gè)16進(jìn)制的數(shù)字來(lái)標(biāo)識(shí)码党。不同廠(chǎng)商/型號(hào)的手柄的數(shù)字標(biāo)識(shí)是不一樣的德崭,需要在配置文件指定。如config/joystick_drive.yml
里的配置就是我的小雞手柄G3的映射值揖盘。
Joystick
類(lèi)定義了通用的按鈕名眉厨,你只需要配置不同按鈕的標(biāo)識(shí)就可以了。
joystick:
axis_keys:
'left_stick_horz': 0x00 # 左搖桿的水平方向
'left_stick_vert': 0x01 # 左搖桿的垂直方向
'right_stick_horz': 0x02
'right_stick_vert': 0x05
'dpad_leftright': 0x10 # 方向按鍵的左右方向
'dpad_up_down': 0x11 # 方向按鍵的上下方向
'L2_pressure': 0x0a # L2的按壓壓力
'R2_pressure': 0x09 # R2的按壓壓力
button_keys:
'select': 0x13a # 選擇鍵
'start': 0x13b # 開(kāi)始鍵
'L1': 0x136
'R1': 0x137
'L2': 0x138
'R2': 0x139
'left_stick_press': 0x13d # 左搖桿被按下
'right_stick_press': 0x13e # 右搖桿被按下
'A': 0x130
'B': 0x131
'X': 0x133
'Y': 0x134
自己的手柄連上電腦后兽狭,可以到https://html5gamepad.com/這個(gè)網(wǎng)站檢測(cè)自己的手柄的按鍵憾股。然后寫(xiě)到配置文件就可以了。
1.3 按鍵功能
我們控制小車(chē)不需要用完上面的全部按鍵箕慧。源碼中的Joystick
類(lèi)給不同的按鈕/軸綁定了對(duì)小車(chē)做不同的操作服球。具體有:
- 左搖桿水平方向(
left_stick_horz
):控制小車(chē)的左右轉(zhuǎn)向(steering
)。 - 右搖桿的豎直方向(
right_stick_vert
):控制小車(chē)的前進(jìn)和后退(throttle
)销钝。 - Y: 切換自動(dòng)駕駛/手動(dòng)駕駛模式
- B: 切換錄像開(kāi)/關(guān)
- L1: 降低最高速度
- R1: 提高最高速度
其他按鍵暫時(shí)沒(méi)有用到有咨,可以留作以后擴(kuò)展更多功能。你也可以修改配置文件來(lái)綁定不同的按鍵蒸健。
1.4 代碼實(shí)現(xiàn)
jetson nano連上藍(lán)牙手柄會(huì)產(chǎn)生一個(gè)設(shè)備文件,如/dev/input/js0
婉商,我們不斷讀取該文件似忧,解析讀到的指就可以了。部分代碼參考了donkeycar的controller文件丈秩。
控制信號(hào)會(huì)發(fā)送到CAN
盯捌,actuator
和其他訂閱者就能作出反應(yīng)了。本次完整的配置文件如下(config/joystick_drive.yml
):
2. 錄制視頻
本次文章篇幅不長(zhǎng)蘑秽,我們順便實(shí)現(xiàn)錄制視頻的功能饺著,同樣比較簡(jiǎn)單箫攀,只需要使用cv2.VideoWriter
類(lèi)把攝像頭的圖像逐幀寫(xiě)入文件就可以了。
writer = cv2.VideoWriter(file_name,
cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'),
frame_rate,
(width, height))
writer.write(frame)
默認(rèn)VideoRecorder
類(lèi)會(huì)保存一個(gè)capture.avi
文件到當(dāng)前目錄幼衰。也可通過(guò)配置文件指定路徑和文件名靴跛,還有分辨率、幀率渡嚣。見(jiàn)上一章節(jié)的video_recorder
配置梢睛。
3. 運(yùn)行
文章的代碼已經(jīng)開(kāi)源到github mycar項(xiàng)目。
3.1 clone代碼
git clone https://github.com/evan-wu/mycar
git checkout -b blog-4
3.2 連接藍(lán)牙手柄
把手柄打開(kāi)识椰,進(jìn)入藍(lán)牙配對(duì)模式绝葡,然后在jetson nano的藍(lán)牙設(shè)置點(diǎn)+號(hào)找到手柄,連接上就可以了腹鹉。以下是我的藍(lán)牙手柄:
連接上以后可以查看一下對(duì)應(yīng)的設(shè)備文件:
$ file /dev/input/js0
/dev/input/js0: character special (13/0)
3.3 啟動(dòng)
cd mycar
bin/run.sh config/joystick_drive.yml 120
可以使用手柄來(lái)控制小車(chē)移動(dòng)了藏畅,按B
可以開(kāi)始錄像!
后續(xù)預(yù)告:視覺(jué)PID循線(xiàn)算法功咒。敬請(qǐng)期待愉阎!
歡迎blog/github點(diǎn)贊,評(píng)論航瞭,討論诫硕!