最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

針對ros機(jī)器人開發(fā)同學(xué)的docker入門教程

2023-08-15 23:50 作者:不姓崔的依拓答辯  | 我要投稿

前言

????????眾所周知,魚香ros的一鍵安裝腳本中,有 docker+ros 的選項(xiàng),雖然你大家都會(huì)配環(huán)境了,但對于很多調(diào)ros的同學(xué),docker是一個(gè)很陌生的東西。事實(shí)上,docker是一個(gè)能大大簡化配環(huán)境過程的革命性工具,本文針對學(xué)習(xí)機(jī)器人開發(fā)的同學(xué)的需求,對docker的基本概念和用法做簡要介紹,并解決通過魚香ros創(chuàng)建的docker+ros無法讀取串口設(shè)備與無法進(jìn)行局域網(wǎng)通信的問題。

????????基于本文的講解視頻如下,結(jié)合視頻學(xué)習(xí)效果更佳!

【TODO:錄好視頻之后放上視頻地址】


調(diào)ros的人雖然沒必要精通docker,但對docker需要有一些最基本的理解,我總結(jié)如下:

  1. 基本概念:docker是虛擬機(jī)的青春版,運(yùn)行起來的青春版虛擬機(jī)稱為容器(container,注意容器這個(gè)詞,這個(gè)詞會(huì)在本文頻繁出現(xiàn)),因?yàn)槠洳惶摂M硬件,只虛擬linux內(nèi)核和文件系統(tǒng),所以性能遠(yuǎn)高于虛擬機(jī)。

  2. 創(chuàng)建容器:docker run是把一個(gè)別人提供的鏡像運(yùn)行成一個(gè)容器(這個(gè)過程相當(dāng)于類的實(shí)例化,其中鏡像相當(dāng)于類,容器相當(dāng)于對象)。如果想讓容器有特殊的功能(包括掛載設(shè)備,同步文件夾下的文件)都需要在docker run的時(shí)候配置相應(yīng)的參數(shù),一經(jīng)配置,無法更改

  3. 文件系統(tǒng):docker容器內(nèi)的文件系統(tǒng)與宿主機(jī)的文件系統(tǒng)“一般”是毫無關(guān)系的。至于為什么fishros創(chuàng)建的ros容器能訪問物理機(jī)的主目錄,因?yàn)?/span>docker有 volumn 機(jī)制,可完成宿主機(jī)與容器之間文件的實(shí)時(shí)同步,這個(gè) volumn 就需要在docker run 的時(shí)候進(jìn)行配置。

  4. 軟件應(yīng)用:docker容器內(nèi)安裝的應(yīng)用也和宿主機(jī)互不影響,無論是通過源碼編譯安裝還是apt二進(jìn)制安裝的應(yīng)用都需要從頭安裝。

  5. 掛載USB設(shè)備:ubuntu的 /dev文件夾存放了所有的設(shè)備,只有在 docker run的時(shí)候?yàn)槿萜鲯燧d設(shè)備,才能在容器中訪問到這些設(shè)備。

  6. fishros相關(guān):fishros安裝的docker能通過容器名運(yùn)行容器,是對docker命令的又一次封裝。

注:本文將針對上述結(jié)論進(jìn)行詳細(xì)講解~

1.前提

????????給非root的用戶uart權(quán)限,否則之后的運(yùn)行都報(bào)錯(cuò)

2.docker指令解說

????????使用docker run 指令可以創(chuàng)建容器。

????????docker run是把一個(gè)鏡像創(chuàng)建成一個(gè)容器(這個(gè)過程相當(dāng)于類的實(shí)例化,其中鏡像相當(dāng)于類,容器相當(dāng)于對象)。這里的鏡像一般是別人提供好的,如ros官方的docker鏡像,也可以自己制作。特殊的功能(包括掛載設(shè)備,同步目錄)都需要在docker run的時(shí)候添加相應(yīng)的參數(shù)。

????????每個(gè)容器只能被實(shí)例化一次,如果再次運(yùn)行docker run,會(huì)創(chuàng)建一個(gè)新的容器,與之前創(chuàng)建的容器獨(dú)立存在,互不影響。實(shí)例化后,則可通過docker exec 進(jìn)入容器。

????????一個(gè)最平平無奇的創(chuàng)建容器的指令需要包括容器名與鏡像名,如下:

其中的 -dit 是 -d -i -t 的結(jié)合,是一些命令行參數(shù),這個(gè)不用管,每次都帶上就行。

????????fishros本質(zhì)上就是根據(jù)你的選擇運(yùn)行對應(yīng)的命令行指令,fishros運(yùn)行的docker創(chuàng)建容器指令如下,我先把他copy下來供大家觀賞一下,之后將詳細(xì)解析。

相比最基礎(chǔ)的創(chuàng)建容器指令,這個(gè)指令添加了很多初始化配置信息。

????????這一長串命令涉及幾條特別重要的配置:

  • -v volumn 通道。一般而言,docker容器內(nèi)與宿主機(jī)的文件系統(tǒng)是單獨(dú)存在,互不干擾的,而使用volumn,就可以將兩者的指定文件夾內(nèi)的文件實(shí)時(shí)同步,例如-v /home/[your_username]:/home/[your_username]這一句,把主目錄直接同步到容器內(nèi)了,那么你在宿主機(jī)改完代碼就不需要再粘貼到容器內(nèi),在容器內(nèi)也不需要想著過一會(huì)就備份一份代碼了,非常方便。

  • --device 掛載設(shè)備,--device /dev/snd這一句是掛載聲卡的設(shè)備,其實(shí)ubuntu的所有外圍設(shè)備,比如攝像頭,USB設(shè)備,GPU,聲卡等都在 /dev 文件夾下,/dev下的文件夾與物理意義的外圍設(shè)備是一一對應(yīng)的關(guān)系。把宿主機(jī)相應(yīng)文件夾同步到容器內(nèi),容器就可以訪問到宿主機(jī)相應(yīng)的硬件設(shè)備了。

  • -e 設(shè)置環(huán)境變量。 -e DISPLAY=unix$DISPLAY這一句是專門和顯示相關(guān)的,指定容器內(nèi)顯示的相關(guān)端口,如果不加這一句,就只能在容器中運(yùn)行命令行程序,無法打開容器中的 gedit rviz gazebo ros小烏龜?shù)却翱谛问降膽?yīng)用程序。加這一句之后還需要每次開機(jī)在宿主機(jī)的終端里運(yùn)行一句 xhost +local: >> /dev/null 命令,來打開宿主機(jī)的相關(guān)服務(wù),才能在容器中正常使用窗口化應(yīng)用程序。

????????舉一反三,對于上述命令中的: -v /dev/dri:/dev/dri,他和 ?--device /dev/dri 是完全等價(jià)的。


3.容器掛載USB設(shè)備

????????docker容器如果想要訪問到宿主機(jī)的設(shè)備,比如插在USB接口上的串口轉(zhuǎn)TTL模塊(如CH340),需要在docker run 運(yùn)行容器的時(shí)候把CH340掛載到容器上。這個(gè)是一個(gè)巨坑,因?yàn)閒ishros給你創(chuàng)建容器的時(shí)候并沒有掛載USB設(shè)備,所以這個(gè)得你自己搗鼓。

運(yùn)行ros的ubuntu電腦通過CH340與底層STM32控制器通信

????????如第二節(jié)所述,不就是掛載設(shè)備嘛,加上一句 --device /dev/ttyUSB0 ?不就行了嗎?這么說docker run 的指令就可以寫成如下這種形式:

????????但是這種寫法不夠靈活,初學(xué)者不推薦使用。為什么呢?因?yàn)槟氵@么做需要確保你創(chuàng)建容器與進(jìn)入容器的全過程中USB口上是插有CH340的(即在/dev文件夾下能找到ttyUSB0),否則docker就會(huì)報(bào)錯(cuò)說找不到設(shè)備。

????????這種一般適合什么人用呢?產(chǎn)品級的機(jī)器人,比如稚暉君的哪吒!這種機(jī)器人一般內(nèi)部機(jī)載電腦的接線已經(jīng)完全確定,并且早就用外殼把電路部分封死到里面了,此時(shí)是可以確定機(jī)載電腦只要是開機(jī)的, ttyUSB0 就一定已經(jīng)連到機(jī)載電腦上了。那當(dāng)然這么運(yùn)行自然是沒有問題的。

稚暉君的哪吒機(jī)器人

????????至于像咱們普普通通的學(xué)生,串口攝像頭鍵鼠顯示屏啥的都瞎幾把插,絕對不推薦這么用,有更好的選擇,還是往下看吧。。。。。。

在吃旺旺小小酥的悲催打工人

????????推薦寫法如下,-v /dev:/dev 直接把宿主機(jī)的 /dev 文件夾全部通過volumn同步到容器里,簡單粗暴,全部宿主機(jī)的device都會(huì)直接掛載到容器中。

????????此乃究極解決方案,最終命令如下:

注意這里的 --privileged 相當(dāng)于給了容器操作宿主機(jī)的管理員權(quán)限,必須加上。

????????其中,--privileged-v/dev:/dev 這兩句是精髓,關(guān)于--device的命令多余去掉即可,其他命令和fishros保持一致。

????????網(wǎng)上有的博客說這么做不安全,那都是說給互聯(lián)網(wǎng)專業(yè)的,學(xué)javaweb的人聽的,咱們學(xué)機(jī)器人的不用管。

????????另外,--net=host 這個(gè)配置先按下不表,下文再說。


4 容器內(nèi)局域網(wǎng)通信

????????眾所周知,ros可以很便捷地在局域網(wǎng)內(nèi)進(jìn)行多機(jī)通信,尤其是ros2甚至可以稱為零配置無縫銜接。那么,在docker容器內(nèi)中的ros是否還有這種優(yōu)勢呢?

事實(shí)上,通過在docker run的時(shí)候進(jìn)行配置,可以完成docker容器內(nèi)ros同樣無縫局域網(wǎng)通信。其實(shí)這也是第二個(gè)巨坑,因?yàn)閒ishros給你創(chuàng)建的容器的時(shí)候同樣沒考慮這個(gè)問題。

????????第三節(jié)有一個(gè)沒有介紹的參數(shù):--net=host 。這個(gè)參數(shù)意思就是讓容器與宿主機(jī)的網(wǎng)絡(luò)以host模式連接,host模式下,容器沒有自己獨(dú)立的網(wǎng)絡(luò)空間,而是完全依附與宿主機(jī)的網(wǎng)絡(luò)空間,所以和局域網(wǎng)下其他機(jī)器通信當(dāng)然沒有問題了。docker的host模式可以類比虛擬機(jī)的橋接模式。(如果你沒聽說過橋接模式,當(dāng)我沒說)

????????網(wǎng)上也有的博客說這么做不安全,那都是說給互聯(lián)網(wǎng)專業(yè)的,學(xué)web的人聽的,咱們學(xué)機(jī)器人的不用管。


5 更改已創(chuàng)建容器的配置的方法

????????由上述可知,docker容器只有在docker run 的時(shí)候才能決定該容器的配置,一旦創(chuàng)建好則不可更改如果你先前通過fishros建立好了docker容器,并且已經(jīng)在里面仿真開發(fā)了很長時(shí)間,現(xiàn)在遇到了實(shí)物實(shí)驗(yàn)連不上USB,或者連不上局域網(wǎng)內(nèi)別的機(jī)器的問題,應(yīng)該怎么更改之前創(chuàng)建好的容器的配置呢?

????????咱們需要:先把原來的容器打包成一個(gè)鏡像,然后再用docker run指令把剛剛打包好的鏡像運(yùn)行成一個(gè)新的容器,這樣新的容器和原來的容器是完全一樣的,差別只是你在 docker run 的時(shí)候添加上的掛載/dev設(shè)備和關(guān)于網(wǎng)絡(luò)的配置。

????????接下來,我們就實(shí)操一下。

????????docker將容器打包成鏡像的命令如下:

????????例如,咱們把名稱為noetic1的容器打包成一個(gè)叫l(wèi)tdz的鏡像,標(biāo)簽名瞎起一個(gè)就行了:

????????然后查看是否打包成功,列舉本地的所有鏡像:

????????若有你剛才打包的那個(gè),說明打包成功。

????????最后將這個(gè)鏡像運(yùn)行起來,命令與第三節(jié)的究極解決方案保持一致,并將鏡像名改成你剛才打包成的那個(gè)鏡像名:

????????最后,docker,啟動(dòng)?。?!贏!結(jié)束!


6 補(bǔ)充:fishros的奇技淫巧與容器內(nèi)使用可視化窗口應(yīng)用的細(xì)節(jié)

????????你也許比較納悶,docker進(jìn)入容器的命令不是?docker exec 嗎,為什么使用fishros創(chuàng)建的docker容器,直接輸入容器名,就可以進(jìn)去呢?

fishros安裝的docker+ros進(jìn)入容器的方式

????????這就屬于fishros的奇技淫巧了,如果你之前使用fishros創(chuàng)建了一個(gè)容器,你可以打開宿主機(jī)下的~/.bashrc文件,看看有沒有這么一句話:

然后你跟隨這個(gè)路徑前往宿主機(jī)的~/.fishros/bin/ 文件夾,看看有沒有一個(gè)和你容器名一模一樣的文件:

如果有,你用記事本打開他看看他長啥樣,是不是挺熟悉的?聰明的你是不是不需要再解釋了?

????????這里面的第一句話 xhost +local: >> /del/null,需要引起格外的關(guān)注。還記得上文說的嗎,這句話是打開宿主機(jī)的顯示服務(wù),讓容器內(nèi)的窗口化應(yīng)用程序能顯示出來的。這其實(shí)是第三個(gè)巨坑,但是這是唯一一個(gè)fishros已經(jīng)幫你解決的坑。如果咱們自己創(chuàng)建了一個(gè)容器,就需要每次開機(jī)手動(dòng)輸一遍這句話。當(dāng)然,直接把這句話寫到.bashrc里是一個(gè)不錯(cuò)的選擇,每次啟動(dòng)終端他都會(huì)自動(dòng)運(yùn)行一遍,就完美解決了。


結(jié)語

????????也許折騰這么一大堆你會(huì)感覺docker非常繁瑣,但不知道你有沒有注意到,使用docker安裝ros根本沒有敲一連串的繁瑣的命令,你做的只是把別人提供給你的鏡像下載下來,并docker run 成了自己的容器而已。這就是docker最大的優(yōu)勢,docker將配環(huán)境變成了一個(gè)共享式的工作

????????fishros官方給你提供了一個(gè)安裝好ros的鏡像,你下載下來直接docker run,就不需要在這個(gè)容器中安裝ros了。那么有沒有一種可能,你在這個(gè)鏡像的基礎(chǔ)上安裝一些別的東西,比如gedit mysql python pytorch tensorflow tensorrt java cmake gcc gdb opencv,然后再打包成自己的鏡像發(fā)布出去,別人拿到你的鏡像之后直接docker run,你已經(jīng)安裝好的那一堆東西,別人也再也不需要管了。這種體驗(yàn)是奇妙的,對于量產(chǎn)化的配環(huán)境工作是革命的(尤其對于互聯(lián)網(wǎng)行業(yè))。希望大家都能掌握這個(gè)革命性的工具。


參考文獻(xiàn)

docker容器打包成鏡像: https://blog.csdn.net/qq_14945437/article/details/106135369

深入了解docker推薦尚硅谷的教程:?尚硅谷在B站的docker教程

題外話

????????2023年8月17號(hào)之前 epic可以免費(fèi)領(lǐng)取 歐陸風(fēng)云4?。?!這是個(gè)和鋼鐵雄心4一模一樣的P社游戲,只不過時(shí)間放在了1400奧斯曼崛起~1800法國大革命期間。親愛的寶哥老早就推薦我玩玩這個(gè)游戲,還好沒買,不然血虧。對近代世界歷史感興趣的同學(xué)趕緊抓緊時(shí)間白嫖吧!

歐陸風(fēng)云4 EPIC免費(fèi)送!?。?/figcaption>


針對ros機(jī)器人開發(fā)同學(xué)的docker入門教程的評論 (共 條)

分享到微博請遵守國家法律
菏泽市| 贡觉县| 邛崃市| 寻乌县| 浦城县| 乐陵市| 登封市| 郯城县| 房产| 兴文县| 海南省| 红安县| 成都市| 昔阳县| 高碑店市| 方城县| 安阳市| 溧水县| 巍山| 石首市| 柳河县| 蓝田县| 固始县| 连云港市| 平罗县| 茶陵县| 东乌珠穆沁旗| 东源县| 介休市| 连江县| 阿拉尔市| 宁津县| 商水县| 平原县| 西华县| 谷城县| 布尔津县| 澄迈县| 铜鼓县| 武城县| 奉新县|