前言
??你好,我是辰chen,本文旨在準(zhǔn)備考研復(fù)試或就業(yè)
??本文內(nèi)容是我為復(fù)試準(zhǔn)備的第二個(gè)項(xiàng)目
??歡迎大家的關(guān)注,我的博客主要關(guān)注于考研408以及AIoT的內(nèi)容
?? 預(yù)置知識(shí):基本Python語法,基本linux命令行使用
以下的幾個(gè)專欄是本人比較滿意的專欄(大部分專欄仍在持續(xù)更新),歡迎大家的關(guān)注:
??ACM-ICPC算法匯總【基礎(chǔ)篇】
??ACM-ICPC算法匯總【提高篇】
??AIoT(人工智能+物聯(lián)網(wǎng))
??考研
??CSP認(rèn)證考試歷年題解
機(jī)器人簡(jiǎn)介
機(jī)器人應(yīng)用與前景
生活中的應(yīng)用:
工業(yè)應(yīng)用:
ROS元老機(jī)器人 – PR2:
NASA 將機(jī)器人部署到空間站:
智駕成為汽車核心賣點(diǎn)之一:
機(jī)器人形態(tài)
輪式機(jī)器人:
腿式機(jī)器人:
輪腿機(jī)器人:
無人機(jī):
機(jī)械臂:
機(jī)器人的構(gòu)成
? 傳感器:機(jī)器人的感官,決定了能獲取到哪些外部信息。類比人的視覺、觸覺、聽覺等。
? 算法和邏輯:內(nèi)部的數(shù)據(jù)處理。比如用深度學(xué)習(xí)算法識(shí)別物體、傳感器融合定位、業(yè)務(wù)邏輯等。
? 執(zhí)行器:機(jī)器人向外的輸出,決定了能完成哪些任務(wù)。類比人的手、腳、語言、動(dòng)作等。
? 機(jī)器人是復(fù)雜系統(tǒng),包含一系列協(xié)同工作的軟件硬件。各個(gè)傳感器、算法、業(yè)務(wù)邏輯、執(zhí)行器之間,有復(fù)雜的依賴關(guān)系。
ROS基礎(chǔ)
ROS的作用和特點(diǎn)
機(jī)器人開發(fā)的難題
- 組件眾多,依賴關(guān)系復(fù)雜。如何兼顧靈活性、魯棒性和性能?
- 組件可能由不同語言編寫,如何協(xié)同運(yùn)行?
- 某些功能(如建圖、導(dǎo)航等)很多機(jī)器人都需要有,如何方便的復(fù)用?
- 如何調(diào)試、記錄機(jī)器人運(yùn)行時(shí)的大量數(shù)據(jù)?
ROS的作用-提高軟件復(fù)用
- 點(diǎn)對(duì)點(diǎn)的設(shè)計(jì)
- 多語言支持
- 豐富的工具包
點(diǎn)對(duì)點(diǎn)的設(shè)計(jì):
? 分布式的節(jié)點(diǎn)單元
? RPC + TCP/UDP 通信系統(tǒng)
? 支持多機(jī)器協(xié)同(分布式系統(tǒng))
? 各個(gè)節(jié)點(diǎn)獨(dú)立編譯、啟動(dòng)
遠(yuǎn)程過程調(diào)用(英語:Remote Procedure Call,RPC)是一個(gè)計(jì)算機(jī)通信協(xié)議。該協(xié)議允許運(yùn)行于一臺(tái)計(jì)算機(jī)的程序調(diào)用另一個(gè)地址空間(通常為一個(gè)開放網(wǎng)絡(luò)的一臺(tái)計(jì)算機(jī))的子程序,而程序員就像調(diào)用本地程序一樣,無需額外地為這個(gè)交互作用編程(無需關(guān)注細(xì)節(jié))。
點(diǎn)對(duì)點(diǎn)的設(shè)計(jì)是ROS中最重要的一個(gè)概念,其中關(guān)鍵在于節(jié)點(diǎn)。一個(gè)系統(tǒng)可能由多個(gè)節(jié)點(diǎn)構(gòu)成,我們可以理解成每一個(gè)程序都是一個(gè)節(jié)點(diǎn),或者說每一個(gè)主函數(shù)都是一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)之間是相互獨(dú)立的,節(jié)點(diǎn)和節(jié)點(diǎn)之間,不一定運(yùn)行在同一個(gè)物理機(jī)器上,它可以是一個(gè)分布式的系統(tǒng),對(duì)于分布式系統(tǒng)而言,通信就是重中之重。如上圖所示,有三大塊,代表著不同的設(shè)備:用戶電腦,服務(wù)器,機(jī)器人;其中每一個(gè)橢圓都代表著一個(gè)節(jié)點(diǎn),他們是可以跑在不同的電腦上的。
比如我給出一個(gè)導(dǎo)航任務(wù),簡(jiǎn)單說明其部分運(yùn)作流程:在我們的用戶電腦上運(yùn)行一個(gè)節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)用來獲取用戶的輸入,比如輸入一個(gè)坐標(biāo),這就是這個(gè)節(jié)點(diǎn)的作用,當(dāng)我們獲得了這個(gè)輸入之后,我們可以把該坐標(biāo)傳遞給下一個(gè)節(jié)點(diǎn),也就是進(jìn)行節(jié)點(diǎn)間的通信,如上圖所示,下一個(gè)節(jié)點(diǎn)為路徑規(guī)劃算法,它拿到了坐標(biāo)之后還不夠,還需要地圖,地圖服務(wù)器也就另一個(gè)節(jié)點(diǎn),這兩個(gè)節(jié)點(diǎn)就不是運(yùn)行在用戶電腦上了,而是運(yùn)行在服務(wù)器上,它們之間就是網(wǎng)絡(luò)通信,所以即便不在一個(gè)機(jī)器上,我們也可以通過網(wǎng)絡(luò)來進(jìn)行協(xié)同的工作,也就是運(yùn)行在一個(gè)分布式系統(tǒng)中。
簡(jiǎn)而言之,可以理解成為各自都有一個(gè)主函數(shù),各自是獨(dú)立運(yùn)行的,它們都會(huì)去遵循同一個(gè)通訊協(xié)議,所以說它們之間能夠傳遞信息。這就是ROS的點(diǎn)對(duì)點(diǎn)設(shè)計(jì)。
多語言支持:
? 支持 Python,C++,Java等語言
? 提供語言無關(guān)的數(shù)據(jù)接口定義
所謂語言無關(guān),如上圖所示,它是一個(gè)Image(圖像)的數(shù)據(jù)格式,我們知道,在cpp中,如果要存儲(chǔ)一個(gè)圖像,可以用數(shù)組或者vector來存,但這些東西在Python中是沒有的,所謂語言無關(guān)的數(shù)據(jù)定義接口,就是更為抽象的一層,就是用它來標(biāo)識(shí)我這個(gè)圖像里面有何種信息。
比如上圖中有圖像的高度、圖像的寬度…并且也說明了信息是哪種數(shù)據(jù)類型,如 uint32, string, uint8...
,但這些數(shù)據(jù)類型并不是具體的某一種語言里面的數(shù)據(jù)類型,而是ROS提供的一種語言無關(guān)的數(shù)據(jù)類型,在之后編譯中會(huì)根據(jù)不同的語言轉(zhuǎn)換成為對(duì)應(yīng)語言的相應(yīng)數(shù)據(jù)類型,ROS幫我們實(shí)現(xiàn)了其中的數(shù)據(jù)轉(zhuǎn)換
豐富的工具包:
? 3D數(shù)據(jù)可視化:Rviz
? 物理環(huán)境仿真:Gazebo
? Qt可視化工具箱:rqt_*
以上工具包我們很快就會(huì)用到,先簡(jiǎn)單略過
ROS的運(yùn)行機(jī)制
ROS機(jī)制-計(jì)算圖
? 節(jié)點(diǎn):軟件模塊,可以訂閱/發(fā)布 Topic,調(diào)用/創(chuàng)建 Service
? ROS Master:控制中心,整個(gè)系統(tǒng)有且只有一個(gè)。負(fù)責(zé)鏈接各個(gè)節(jié)點(diǎn)、管理參數(shù)等
? Topic:異步通信,傳輸消息
? Service:同步通信,類似函數(shù)調(diào)用
我們說過,最重要的就是點(diǎn)對(duì)點(diǎn)通信,這是如何實(shí)現(xiàn)的呢?下作介紹:
先來補(bǔ)充一個(gè)概念:計(jì)算圖,上面提到的圖:
也可以看做成一個(gè)計(jì)算圖。
下面我們拿下圖舉例:
該圖中的每一個(gè)橢圓都是ROS rqt_*的工具箱自動(dòng)生成的,一些節(jié)點(diǎn)之間的通信關(guān)系可以自動(dòng)的生成這樣的圖來給我們查看,每個(gè)橢圓都是一個(gè)節(jié)點(diǎn),一個(gè)箭頭就代表著他們之間有一個(gè)消息的通信。
已經(jīng)講過,每一個(gè)橢圓都代表著一個(gè)節(jié)點(diǎn),每一個(gè)節(jié)點(diǎn)都可以訂閱或者發(fā)布一個(gè) Topic,也可以調(diào)用或者創(chuàng)建一個(gè) Service,下面分別介紹 Topic 與 Service:
Topic 和 Service 都是節(jié)點(diǎn)之間的通訊方式
? Topic:
是一種傳輸信息的異步通信
Publisher就是Topic的發(fā)布者,如上圖所示,Topic的名字(example),它會(huì)有一個(gè)數(shù)據(jù)類型(String),這里就是語言無關(guān)的數(shù)據(jù)類型,它會(huì)有一些 Subscriber 也就是接收者(可以有多個(gè)接收者),這些接收者只需要訂閱了名字為 example 的這個(gè) Topic,它就與 Publisher 建立連接了,此后 Publisher 每次發(fā)送消息,Subscriber 都會(huì)收到,即其實(shí)是一個(gè)單向的連接,該連接是異步的,也就是 Publisher 發(fā)出去就發(fā)出去了,至于 Subscriber 收到與否,處理速度的快慢,有沒有及時(shí)收到,都不會(huì)給 Publisher 進(jìn)行反饋,類似一種廣播。
? Service:
類似函數(shù)調(diào)用,是一種同步通信
和我們請(qǐng)求服務(wù)器一樣,它有一個(gè) Service Server,有一個(gè) Service Client,Client 發(fā)送請(qǐng)求,然后 Server 再返回請(qǐng)求,是一個(gè)同步的通信模式。
ROS機(jī)制-Topic
? 指定名稱和數(shù)據(jù)類型
? 創(chuàng)建流程
- Talker、Listener 向 Master 注冊(cè)(發(fā)布/訂閱哪個(gè)Topic)
- Master 向 Listener 發(fā)送 Talker 信息
- Listener 向 Talker 建立網(wǎng)絡(luò)連接
- Talker 向 Listener 發(fā)布數(shù)據(jù)
? 一個(gè) Topic 可以有多個(gè)發(fā)布者,也可以有多個(gè)訂閱者。如多個(gè)節(jié)點(diǎn)都可以向“警告” Topic 發(fā)布信息;定位節(jié)點(diǎn)和路徑規(guī)劃節(jié)點(diǎn)同時(shí)訂閱“地圖”Topic
? 同一個(gè) Topic 的所有發(fā)布和訂閱,都要用同一種數(shù)據(jù)類型
繼續(xù)介紹一下建立一次 Topic 的通信流程:
首先,我們要指定這個(gè) Topic 的名稱和數(shù)據(jù)類型,這兩個(gè)是必須要定義的,假設(shè)有一個(gè) Talker 一個(gè) Listener,其實(shí)就是上述中的 Publisher 和 Subscriber,它們會(huì)向 ROS Master 進(jìn)行注冊(cè),也就是上述的全局唯一的控制節(jié)點(diǎn),Talker 會(huì)告訴 Master,現(xiàn)在想要接收一個(gè) Topic 并且告訴這個(gè) Topic 叫什么以及數(shù)據(jù)類型是什么,Master 會(huì)記住這些信息,當(dāng)它收到 Listener 向它發(fā)布的請(qǐng)求,即想要獲得哪個(gè) Topic 的時(shí)候,如果 Topic 已經(jīng)存在,如已有一各 Talker 發(fā)布了,Master 會(huì)把 Talker 的信息發(fā)送給 Listener,此時(shí) Listener 就知道了 Talker 的信息,如知道了 Talker 的 IP 地址,端口號(hào)是什么,Listener 就可以主動(dòng)地去聯(lián)系 Talker,告訴我要訂閱你發(fā)布的 Topic,同時(shí) Talker 也會(huì)記下來 Listener,這樣下一次 Talker 發(fā)布數(shù)據(jù)的時(shí)候就會(huì)直接把數(shù)據(jù)傳遞給 Listener。對(duì)于同一個(gè) Topic,所有的發(fā)布和訂閱都必須用同一種數(shù)據(jù)類型,不然的話就會(huì)報(bào)錯(cuò):Master 會(huì)告訴你,這個(gè) Topic 不是這個(gè)類型的,并拒絕你的請(qǐng)求。
每個(gè) Topic 可以有多個(gè)發(fā)布者 Talker(Publisher),也可以有多個(gè)訂閱者 Listener(Subscriber),多個(gè)訂閱者是比較常見的,舉一個(gè)多個(gè)發(fā)布者的例子:系統(tǒng)中可能有一個(gè) Topic 叫警告,觸發(fā)警告可能有多種:溫度過高,速度過快…,有的節(jié)點(diǎn)是用來測(cè)量溫度的,有的節(jié)點(diǎn)是用來測(cè)量速度的,那么這些節(jié)點(diǎn)都可以向警告這個(gè) Topic 發(fā)布信息。
多個(gè)訂閱者的例子:比如 地圖Topic,它可以同時(shí)被定位和路徑規(guī)劃的節(jié)點(diǎn)所訂閱。
ROS機(jī)制-Service
? 指定名稱和 Service 類型,Service 類型中指定了調(diào)用數(shù)據(jù)類型和返回?cái)?shù)據(jù)類型
? 調(diào)用流程
- Talker 向 Master 注冊(cè) Service
- Listener 向 Master 請(qǐng)求 Service
- Master 向 Listener 發(fā)送 Talker 信息
- Listener 向 Talker 請(qǐng)求 Service,傳遞調(diào)用參數(shù)
- Talker 返回?cái)?shù)據(jù)
首先也是要指定,指定名稱和 Service 類型,注意 Service 類型,因?yàn)樗怯衼碛谢氐模淮握{(diào)用就是一個(gè)過程,不像 Topic,只要建立了連接,每一次talker有新的數(shù)據(jù),都會(huì)發(fā)送給 Listener(Topic :假如 talker 是一個(gè)攝像頭,幀率是三十幀每秒,那么一旦有了一個(gè) Listener,就會(huì)以每秒 30次的速率向 Listener 發(fā)送信息;Service :只是一次調(diào)用過程)
一個(gè)調(diào)用的數(shù)據(jù)類型就類似于函數(shù)的一個(gè)參數(shù),與此還會(huì)有一個(gè)返回?cái)?shù)據(jù)類型即返回值,這兩個(gè)一起組成了一個(gè) Service 類型
調(diào)用流程與 Topic 類似,首先是注冊(cè),Talker 也就是 Service Server,Listener 也就是 Service Client,它們?cè)趧?chuàng)建的時(shí)候都需要向 Master 注冊(cè),Master 就會(huì)記住,誰定義了哪個(gè) Service,誰要請(qǐng)求哪個(gè) Service,當(dāng)有請(qǐng)求的時(shí)候,Master 會(huì)向 Listener 發(fā)送 Talker 的信息,Listener 就知道了 Talker 的信息,就可以直接和 Talker 建立通信,來完成一次請(qǐng)求。
可以把 Service 類比為函數(shù)調(diào)用,一次調(diào)用就是傳入一次參數(shù),返回一次數(shù)據(jù)。Service 主要作用并不是傳遞數(shù)據(jù),而是觸發(fā)/調(diào)用某些邏輯之類的作用
話題 Topic | 服務(wù) Service | |
---|---|---|
同步性 | 異步 | 同步 |
通信模型 | 發(fā)布/訂閱 | 服務(wù)器/客戶端 |
底層協(xié)議 | ROSTCP/ROSUDP | ROSTCP/ROSUDP |
反饋機(jī)制 | 無 | 有 |
緩沖區(qū) | 有 | 無 |
實(shí)時(shí)性 | 弱 | 強(qiáng) |
節(jié)點(diǎn)關(guān)系 | 多對(duì)多 | 一對(duì)多(一個(gè) Service Server) |
適用場(chǎng)景 | 數(shù)據(jù)傳輸 | 邏輯處理 |
ROS機(jī)制-參數(shù)
- Talker 向 Master 設(shè)置參數(shù)
- Master 存儲(chǔ)參數(shù)
- Listener 向 Master 查詢參數(shù)
- Master 返回參數(shù)
ROS機(jī)制-文件系統(tǒng)
?xxx_ws:工作空間根目錄,項(xiàng)目的基本單位
?xxx_ws/src:各種代碼存放位置,我們只需要修改src中的文件
? xxx_ws/build 和 xxx_ws/devel:編譯生成的文件夾,存放目標(biāo)文件、依賴項(xiàng)等,開發(fā)時(shí)一般不用管
? src中每個(gè)功能包:
- package.xml:功能包的元數(shù)據(jù)(名稱、版本、作者、依賴項(xiàng)等)
- CMakeLists.txt:編譯配置文件
- 其他可選文件夾(src, msg, srv, launch等)
ROS常用命令
命令 | 作用 |
---|---|
catkin_create_pkg | 創(chuàng)建功能包 |
rospack | 獲取功能包的信息 |
catkin_make | 編譯工作空間的功能包 |
rosdep | 自動(dòng)安裝功能包依賴的其他包 |
roscd | 功能包目錄跳轉(zhuǎn) |
roscp | 拷貝功能包中的文件 |
rosed | 編譯功能包中的文件 |
rosrun | 運(yùn)行功能包中的可執(zhí)行文件 |
roslaunch | 運(yùn)行啟動(dòng)文件 |
加 -h 參數(shù)查看幫助,如 rosrun -h
文章來源:http://www.zghlxwxcb.cn/news/detail-805329.html
上述所有內(nèi)容出處如下,博主在此基礎(chǔ)上僅為添加個(gè)人理解:
本項(xiàng)目為北大團(tuán)隊(duì)出品【項(xiàng)目三:深度學(xué)習(xí)&仿真機(jī)器人 - 丘丘老師】原創(chuàng)(部分代碼為開源代碼)。課程團(tuán)隊(duì):B站ID【M學(xué)長的考研top幫】UID【3546580235848566】復(fù)試項(xiàng)目班QQ大群:885884619,負(fù)責(zé)人QQ:674799975文章來源地址http://www.zghlxwxcb.cn/news/detail-805329.html
到了這里,關(guān)于仿真機(jī)器人-深度學(xué)習(xí)CV和激光雷達(dá)感知(項(xiàng)目2)day03【機(jī)器人簡(jiǎn)介與ROS基礎(chǔ)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!