器人開(kāi)發(fā)實(shí)戰(zhàn):從樹(shù)莓派到Python編程)
1. 開(kāi)箱即玩你的第一臺(tái)智能伙伴要是你心里頭對(duì)學(xué)習(xí)機(jī)器人編程這點(diǎn)事挺感興趣, 可是又覺(jué)得那些廠子里頭的機(jī)械手臂, 還有那套特別難搞的ROS系統(tǒng), 門(mén)檻實(shí)在是在天上飛, 太高了的話(huà), 那么這架機(jī)器人恐怕那就是專(zhuān)門(mén)為你一個(gè)人量著身體尺寸打造出來(lái)的夢(mèng)中情機(jī)。我第一次把這小家伙拿到手里的瞬間, 心里的那種感覺(jué)呀, 簡(jiǎn)直就像是手里攥著一臺(tái)不僅能在地上跑動(dòng)起來(lái), 還能和人嘰嘰喳喳聊天的、屬于樹(shù)莓派超級(jí)魔改版的機(jī)器物件。它本質(zhì)上是一個(gè)人形機(jī)器人, 這個(gè)機(jī)器人內(nèi)置了樹(shù)莓派計(jì)算核心, 出廠的時(shí)候預(yù)裝了完整的環(huán)境和一套強(qiáng)大的控制庫(kù), 這樣你就不用從零開(kāi)始去折騰硬件驅(qū)動(dòng)和系統(tǒng)配置, 把電插上就能開(kāi)始寫(xiě)代碼去控制它走路、說(shuō)話(huà)和看東西。這個(gè)東西特別地適合學(xué)生, 或者是編程愛(ài)好者, 還有教育工作者。你并不需要是電子工程專(zhuān)業(yè)的出身, 只要你懂一點(diǎn)點(diǎn)基礎(chǔ)的語(yǔ)法, 就可以讓它運(yùn)行起來(lái)。它設(shè)計(jì)的初衷在于降低機(jī)器人開(kāi)發(fā)的門(mén)檻, 從而把復(fù)雜的底層控制, 封裝成為一句一句簡(jiǎn)單的API調(diào)用形式。比如來(lái)說(shuō), 你想要讓機(jī)器人說(shuō)出你好這兩個(gè)字, 那么只需要編寫(xiě)一行代碼“(“你好”)”, 這樣就可以了, 所以說(shuō)這比你的想象中還要簡(jiǎn)單許多。我一開(kāi)始進(jìn)行玩的時(shí)候, 花費(fèi)了不足半天的時(shí)間, 就讓那個(gè)機(jī)器人順利地完成了自我介紹以及一小段簡(jiǎn)單的揮手動(dòng)作。那種滿(mǎn)滿(mǎn)的成就感是瞬間就涌上心頭的。它確實(shí)成功地把我們給從那些麻煩復(fù)雜的硬件調(diào)試任務(wù)之中徹底解放了出來(lái), 這使得我們能夠更加集中精力去專(zhuān)注地實(shí)現(xiàn)各種邏輯設(shè)計(jì)和創(chuàng)造性的想法。而這才是去學(xué)習(xí)機(jī)器人技術(shù)時(shí)那種非常正確的開(kāi)始方式與路徑。那么, 到底能用它來(lái)做什么呢? 它能發(fā)揮的作用, 完全不是一個(gè)簡(jiǎn)單的玩具所能比擬的。因?yàn)闃?shù)莓派本身具備強(qiáng)大的計(jì)算能力, 還有很多接接口可以使用, 所以我們把機(jī)身上自帶的攝像頭、麥克風(fēng)陣列、幾個(gè)舵機(jī)還有觸摸傳感器都結(jié)合起來(lái)用一用, 這樣的話(huà), 你就可以用它來(lái)實(shí)現(xiàn)讓人臉識(shí)別并且跟著移動(dòng)的追蹤功能了。你也可以用來(lái)做語(yǔ)音對(duì)話(huà)的交互功能了。你還能讓他通過(guò)顏色去識(shí)別東西然后進(jìn)行抓取。甚至在更復(fù)雜一些的時(shí)候, 你還可以讓它編排各種各樣的舞蹈動(dòng)作出來(lái)。我曾目睹部分學(xué)生將其應(yīng)用于課堂助教場(chǎng)景, 使其能夠自動(dòng)巡視教室亦有人利用它來(lái)構(gòu)建智能家居控制中樞的模擬環(huán)境, 通過(guò)語(yǔ)音指令來(lái)操控?zé)艄庖约跋嚓P(guān)電器設(shè)備。該產(chǎn)品在實(shí)際操作層面具備可觀的可玩性, 同時(shí)在教學(xué)領(lǐng)域擁有顯著的附加值, 堪稱(chēng)是一個(gè)直觀且可觸摸的、用于開(kāi)展人工智能與機(jī)器人學(xué)相關(guān)實(shí)驗(yàn)的理想平臺(tái)。2. 兩種開(kāi)發(fā)模式總有一款適合你在拿到機(jī)器人之后, 你也許會(huì)覺(jué)得非常糾結(jié), 不知道究竟應(yīng)該從哪個(gè)具體的地方開(kāi)始動(dòng)手撰寫(xiě)代碼。請(qǐng)完全不用擔(dān)心, 因?yàn)橐呀?jīng)為你準(zhǔn)備好了兩種非常主流的開(kāi)發(fā)路徑, 其中一種比較適合用來(lái)進(jìn)行快速的驗(yàn)證工作, 也適合用于交互式的學(xué)習(xí)過(guò)程, 而另一種則更側(cè)重于那些深度的開(kāi)發(fā)工作以及后續(xù)的實(shí)際項(xiàng)目部署環(huán)節(jié)。我曾經(jīng)對(duì)這兩種方式都進(jìn)行過(guò)比較深入的體驗(yàn)和使用, 接下來(lái)我就將會(huì)把它們的詳細(xì)步驟以及各自適用的場(chǎng)景逐一地進(jìn)行拆解和分析展示出來(lái)。2.1 新手福音基于 的在線編程這是官方最推薦的、也是上手最快的方式。你可以把它理解成, 機(jī)器人自己就帶了一個(gè)在線的、圖形化的代碼編輯器。你的電腦、手機(jī)或平板, 只要和機(jī)器人在同一個(gè)Wi-Fi網(wǎng)絡(luò)下, 就能通過(guò)瀏覽器訪問(wèn)這個(gè)編輯器, 直接編寫(xiě)并運(yùn)行控制機(jī)器人的代碼。我把具體的操作步驟呢, 結(jié)合我自己之前不小心掉進(jìn)坑里里面的那些經(jīng)驗(yàn)和教訓(xùn), 給你整理出來(lái)一個(gè)顯得更加穩(wěn)妥一點(diǎn)的整個(gè)流程出來(lái):首先, 你得去檢查那個(gè)機(jī)器人的電量是不是夠用的, 這個(gè)步驟千萬(wàn)不能夠落下, 只有電量充足以后, 才可以讓你的機(jī)器人進(jìn)行開(kāi)機(jī)操作。等到你看到或聽(tīng)到啟動(dòng)音效響起來(lái)了之后, 你就得拿出你自己的手機(jī)或者是筆記本電腦來(lái)。然后你去連接那個(gè)信號(hào)頻段為2.4GHz的Wi-Fi網(wǎng)絡(luò)。這里有一個(gè)非常關(guān)鍵的細(xì)節(jié)要點(diǎn)需要特別指出, 就是因?yàn)楹芏鄤偨佑|這方面的新手朋友們通常會(huì)很容易把它給忽略掉。其實(shí)關(guān)于連接方式, 這個(gè)機(jī)器人它自己本身會(huì)主動(dòng)創(chuàng)建一個(gè)熱點(diǎn)信號(hào)的, 或者你需要去直接連接到你家里面的路由器上面去的。更通用的做法是, 讓機(jī)器人和你的控制設(shè)備手機(jī)/電腦都連接到由同一個(gè)路由器發(fā)出的2.4G Wi-Fi網(wǎng)絡(luò)底下。這是后續(xù)能夠互相發(fā)現(xiàn)并且正常通信的一個(gè)基礎(chǔ)。 接下來(lái)需要獲取機(jī)器人的IP地址, 在網(wǎng)絡(luò)已經(jīng)完成連通之后, 按下安裝于機(jī)器人胸前的那個(gè)按鈕, 并且對(duì)著它清清楚楚地說(shuō)出“IP地址”這幾個(gè)字。機(jī)器人將通過(guò)語(yǔ)音播報(bào)的方式把你告訴它的當(dāng)前IP地址給報(bào)出來(lái), 例如像“192點(diǎn)168點(diǎn)1點(diǎn)105”這樣的內(nèi)容。你務(wù)必要將這個(gè)數(shù)字給深深地記在腦海中。關(guān)于訪問(wèn)實(shí)驗(yàn)室這回事, 請(qǐng)你直接打開(kāi)你所使用的電腦瀏覽器, 然后在地址欄里敲入以 http:// 為開(kāi)頭的鏈接內(nèi)容。機(jī)器人IP地址輸入8888這個(gè)端口號(hào), 打個(gè)冒, 后面再加一個(gè)冒和8888, 比如寫(xiě)成這樣的形式, :8888, 然后按下回車(chē)鍵。等你完成這一連串動(dòng)作之后, 眼前就會(huì)浮現(xiàn)出大家非常熟悉的Lab界面。這個(gè)界面其實(shí)是運(yùn)行在機(jī)器人里面的樹(shù)莓派設(shè)備上的。只要你在這個(gè)地方創(chuàng)建一個(gè)以.ipynb結(jié)尾的筆記本文件, 或者編寫(xiě)一段腳本代碼, 那么這些程序都會(huì)直接在機(jī)器人的硬件本體上邊執(zhí)行計(jì)算任務(wù)。下面是編寫(xiě)第一個(gè)程序的步驟, 你需要在Lab環(huán)境下新建一個(gè)筆記本文件。接著打開(kāi)編輯器的第一個(gè)單元格位置, 然后在里面輸入下面給出的這段代碼。import YanAPIfrom time import sleep# 初始化連接這里填寫(xiě)機(jī)器人自己的IP地址ip_addr “192.168.1.105” # 替換成你機(jī)器人播報(bào)的IPYanAPI.yan_api_init(ip_addr)# 讓機(jī)器人說(shuō)話(huà)YanAPI.start_voice_tts(“你好世界我開(kāi)始學(xué)習(xí)編程了”, False)sleep(2) # 等待播報(bào)完成# 讓機(jī)器人做一個(gè)打招呼的動(dòng)作假設(shè)動(dòng)作ID 1是揮手YanAPI.do_play_action(1)當(dāng)你點(diǎn)擊運(yùn)行單元格的時(shí)候, 如果在整個(gè)過(guò)程中沒(méi)有出現(xiàn)什么狀況, 那么程序就很有可能會(huì)先完成說(shuō)話(huà)的動(dòng)作, 然后才做出揮手的動(dòng)作。這種交互的方式是非常特別的, 它能夠讓你一邊進(jìn)行寫(xiě)作, 一邊去進(jìn)行測(cè)試操作, 并且可以立刻就看到最終的實(shí)際效果是什么樣子, 這一點(diǎn)是非常適合用來(lái)進(jìn)行學(xué)習(xí)或者調(diào)試程序的環(huán)節(jié)。你要多加小心才行, 因?yàn)橛袝r(shí)候?yàn)g覽器很有可能會(huì)給出一個(gè)提示說(shuō)那個(gè)連接是不安全的, 這個(gè)現(xiàn)象出現(xiàn)的主要原因是因?yàn)橄到y(tǒng)默認(rèn)使用的是HTTP這種方式。你遇到這種情況的時(shí)候, 直接去點(diǎn)擊“高級(jí)”這個(gè)選項(xiàng), 然后選擇繼續(xù)訪問(wèn)網(wǎng)站就行。除此之外, 你還得要確保電腦上的防火墻軟件并沒(méi)有把8888端口給攔截掉或者是阻止掉。2.2 高手之路本地IDE遠(yuǎn)程開(kāi)發(fā)與調(diào)試當(dāng)你已經(jīng)習(xí)慣了那種便利, 并且開(kāi)始著手開(kāi)發(fā)規(guī)模更龐大的復(fù)雜項(xiàng)目之際, 你很可能會(huì)感到一種不便, 覺(jué)得在網(wǎng)頁(yè)環(huán)境中直接書(shū)寫(xiě)代碼的做法不夠高效, 特別是在你迫切需要使用諸如智能代碼提示以及版本管理這些功能的時(shí)候, 而這些功能在你的本地環(huán)境中往往依賴(lài)于你所熟悉的專(zhuān)業(yè)工具軟件來(lái)進(jìn)行支撐, 在此時(shí)當(dāng)下, 那種采用本地開(kāi)發(fā)配合遠(yuǎn)程部署的第二種方案做法便會(huì)發(fā)揮其作用。這種方法的原理是先用SSH即安全外殼協(xié)議登錄到機(jī)器人里面的樹(shù)莓派系統(tǒng), 再把核心的SDK也就是模塊復(fù)制到你的本地電腦上, 這樣的話(huà), 你就能夠在本地IDE里面編寫(xiě)代碼, 從而享受到一個(gè)完整的開(kāi)發(fā)環(huán)境, 最后再把寫(xiě)好的腳本上傳給機(jī)器人去運(yùn)行, 或者直接用網(wǎng)絡(luò)API來(lái)呼叫遠(yuǎn)程執(zhí)行。我在這里一步一步地帶著你, 將這個(gè)過(guò)程完全地進(jìn)行展示。SSH登錄機(jī)器人打開(kāi)你電腦的命令行終端用CMD或Mac/Linux用。輸入命令ssh pi