一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

ROS探索總結(jié)(四十四)~(五十四)(轉(zhuǎn))

 jisuancosimo 2018-08-30

近幾年,機器人和人工智能繁榮發(fā)展,曾經(jīng)運行在實驗室的機器人已經(jīng)逐漸走入千家萬戶的生活。作為機器人開發(fā)利器的ROS也得到了非常廣泛的應用,成為機器人領域的普遍標準。

ROS原本針對科研領域的PR2機器人開發(fā),這種大繁榮的景象遠遠超過ROS的最初目標,也使得ROS的缺陷在廣泛應用的同時暴露無遺:

1. 缺乏構(gòu)建多機器人系統(tǒng)的標準方法;
2. 在Windows、MacOS、RTOS等系統(tǒng)上無法應用或者功能有限;
3. 缺少實時性方面的設計;
4. 需要良好的網(wǎng)絡環(huán)境保證數(shù)據(jù)的完整性,而且網(wǎng)絡沒有數(shù)據(jù)加密、安全防護等功能;
5. ROS 1的穩(wěn)定性欠佳,研究開發(fā)與上市產(chǎn)品之間的過渡艱難;

正是由于ROS1存在種種問題,才促使ROS2.0的出現(xiàn)。ROS2.0雖然從根本上解決了ROS1.0的許多問題,但是卻無法短時間替代ROS1.0在龐大生態(tài)系統(tǒng)中的關鍵位置,只能借助越來越多的關鍵開發(fā)者逐漸推進。所以從目前ROS2.0的情況來看,近幾年ROS1.0的應用還會是主流。

 

ROS1.0能否產(chǎn)品化?

 

那么目前的ROS1.0到底能不能在機器人的產(chǎn)品化過程中應用?如果可以,又該如何應用于機器人產(chǎn)品的開發(fā)?

筆者不才,使用ROS進行了兩年的機器人產(chǎn)品開發(fā),過程當中也總結(jié)了一些經(jīng)驗,就簡單談一談對于這個問題的看法。

在談ROS的產(chǎn)品化前,我們需要明確一個問題,ROS到底是什么,可以參考我之前的文章:

"Powering the world’s robots" 的ROS是什么??

 

Image

ROS的核心雖然是通信機制,但是如今的ROS已經(jīng)遠遠超過通信機制的范疇??傮w來講,ROS包含四個部分:通信機制、開發(fā)工具、應用功能、生態(tài)系統(tǒng)。

所以在說ROS產(chǎn)品化的時候,我們需要針對這四個方面進行討論。由于內(nèi)容較多,這個主題會分為幾篇文章分別討論。

首先來看第一個部分:

 

通信機制

 

點對點的分布式通信機制是ROS的核心,使用了基于TCP/IP的通信方式,實現(xiàn)模塊間點對點的松耦合連接,可以執(zhí)行若干種類型的通信,包括基于話題(Topic)的異步數(shù)據(jù)流通信,基于服務(Service)的同步數(shù)據(jù)流通信,還有參數(shù)服務器上的數(shù)據(jù)存儲等。

 

Image

但是這種通信機制的實時性和穩(wěn)定性不好,而且強依賴于中心節(jié)點ROS Master。比如我們在機器人產(chǎn)品開發(fā)的過程中,就遇到無數(shù)類似下邊的問題:

1. 在進行壓力測試時,系統(tǒng)連續(xù)運行一周時間,運行到第四天時(時間不確定),ROS Master莫名宕機,整個系統(tǒng)不再受控,某個節(jié)點突然失效也是時有發(fā)生的。。。
2. 系統(tǒng)存在大量話題和數(shù)據(jù)時,本地傳輸?shù)臄?shù)據(jù)延時大而不確定,遠程傳輸?shù)臄?shù)據(jù)更是經(jīng)常受到帶寬和處理性能的影響。。。
3. 在系統(tǒng)中頻繁創(chuàng)建話題時(比如連續(xù)創(chuàng)建幾百個話題),某些話題的數(shù)據(jù)莫名就消失了。。。
4. 通信的實時性較差,沒辦法實現(xiàn)毫秒級的機器人控制。。。
5. 通信數(shù)據(jù)是開放式的,沒有加密,只要在網(wǎng)絡中的節(jié)點都可以輕松獲取。。。
6. 核心機制的性能沒有優(yōu)化,運行在配置較低的ARM上會占用過多資源。。。

這樣看來,好像ROS的核心部分在機器人產(chǎn)品中完全沒有可用性呀!如何去突破這個瓶頸呢?先來看看部分開發(fā)者的改良方法。

首先聊聊百度。

 

自從百度All in人工智能之后,無人駕駛汽車平臺Apollo就被推上了風口浪尖,甚至還登上了2018春晚的舞臺。在這個吸睛無數(shù)的Apollo平臺背后,就隱藏著ROS的身影。

Image

Apollo平臺基于ROS開發(fā),但是對通信機制部分進行了眾多改變,有興趣的小伙伴可以看Apollo改良之后的ROS:

https://github.com/ApolloAuto/apollo-platform

或者參考這篇解讀:

干貨曝光(二)|資深架構(gòu)師首次解密Apollo ROS有何不同!?

總結(jié)而言,百度對ROS的優(yōu)化有以下三點:(咋看上去,這些優(yōu)化有點像ROS 2.0干的那些事兒)

 

2

1. 去中心話,也就是干掉ROS Master,這部分使用了DDS技術;

DDS雖然提供的也是發(fā)布/訂閱模型的通信機制,但商用版本可以達到軍工標準,國際上有幾家大公司也在推進DDS在ROS 2.0中的應用。

 

1

2. 使用共享內(nèi)存的方法,優(yōu)化大數(shù)據(jù)傳輸?shù)钠款i;

共享內(nèi)存也是ROS2.0中時間敏感型數(shù)據(jù)通信的方法,吞吐量和傳輸速度肯定可以得到很大程度的優(yōu)化,同時占用的CPU資源也比較少。

 

3

3. 使用Protobuf優(yōu)化數(shù)據(jù)格式的兼容性。

Protobuf是google開源的一種結(jié)構(gòu)化數(shù)據(jù)存儲格式,百度拿它取代了ROS中的Message,可以向后兼容數(shù)據(jù)協(xié)議的擴展。

無人駕駛汽車的穩(wěn)定性是一個性命攸關的問題,百度敢對ROS進行大刀闊斧的優(yōu)化,也正說明了ROS的行業(yè)認可度和強大生命力。

再來聊聊研究者對ROS中Master宕機、安全性和實時性問題的解決方案。

Image

在ROScon2017上,來自USA Northeastern University的研究者介紹了一個名為“DMCTP”的包,當ROS Master崩潰時,DMCTP會緩存所有狀態(tài)和數(shù)據(jù),并且重啟Master完成系統(tǒng)恢復。

 

Image

同在ROScon2017上,另一群研究者提出了“SROS”的概念,也就是為ROS附加一系列安全增強策略:安全傳輸層、訪問控制層、進程配置層等。

 

Image

在ROScon2016上,針對實時性問題,還有研究者為ROS增加了實時性擴展,稱為——RTROS。

對這幾個研究感興趣的小伙伴可以直接看ROScon歷屆的分享視頻和ppt資料:

https://roscon./

1

基于ROS的機器人產(chǎn)品有不少已經(jīng)投入使用,除上邊提到的百度無人駕駛汽車,還有另外一個開源無人駕駛汽車平臺Autoware、NASA部署在國際空間站的Robonaut 2機器人等,目前很多大公司的開源部門也在推進ROS的產(chǎn)品化應用。

綜觀這些機器人產(chǎn)品和平臺,都可以說是基于ROS開發(fā)的,但是在ROS通信機制部分,也都進行大量的優(yōu)化和改良。

這種做法對于創(chuàng)業(yè)型的公司來講,如果不是以ROS的改良作為產(chǎn)品的話,往往都不愿意去干這件事情,費時費力。那么對于小公司來講,如果不想去動ROS的核心通信部分,應該怎么做呢?

這就要說回筆者在創(chuàng)業(yè)過程中的實踐了。大概有兩種方法:

 

第一種:自己不愿意做,就用別人做好的唄;

ROS是一個龐大的開源社區(qū),上邊提到的那些ROS優(yōu)化,基本上都可以在社區(qū)中找到開源實現(xiàn),或是找其他公司做好的成熟產(chǎn)品,站在別人的肩膀上繼續(xù)前進。

但是這樣也有問題,一方面,別人實現(xiàn)的功能不一定完全符合自己的需求,另外一方面,這些實現(xiàn)的相關文檔不多,有問題還得從源碼上解決。

那就請使用第二種方法!

 

第二種:自己不愿意做,也不想基于其他平臺做,那就別強求了。

這就是筆者創(chuàng)業(yè)公司采用的策略——放棄ROS的核心通信機制部分。這句話說來容易,做起來難!畢竟機器人系統(tǒng)還是需要通信功能的,于是我們重新設計了一個。。。


(四十五)—— ROS產(chǎn)品化探索之開發(fā)工具篇

上篇講到,在通信機制部分,我們完全舍棄了ROS基于話題和服務的通信機制,自己又實現(xiàn)了一套通信系統(tǒng),具體的實現(xiàn)主要基于Linux系統(tǒng)的各種通信方式,此處暫且不表,這篇我們來看下ROS另外一個重要部分——開發(fā)工具,如何在機器人產(chǎn)品化過程中應用。

ROS相關的開發(fā)工具有很多,大致可以分為以下幾種類型:

1.ROS原生工具,比如rviz、qt工具箱、命令行工具等;

2.編譯和測試工具,基于已有工具進一步的包裝;

3.第三方工具,基于成熟工具,使用一些插件或接口和ROS系統(tǒng)兼容。

就這三種類型的工具,我們來具體分析。

 

一、ROS原生工具

ROS的原生工具非常豐富,可以參考wiki上的說明:

http://wiki./Tools

無論是可視化的qt工具還是命令行工具,都頻繁用于ROS開發(fā),這些工具和ROS系統(tǒng)的依賴性最強,想要實現(xiàn)產(chǎn)品化并不容易。

 

▼ rviz

首先來看最重要的一個工具——rviz。

rviz是ROS中的一個三維可視化平臺。為什么說它是ROS最重要的一個工具呢?因為rviz可以把不直觀的數(shù)據(jù)統(tǒng)統(tǒng)可視化地顯示出來,比如圖像、地圖、模型、路徑等等,這些還只是rviz官方提供的顯示插件。

1

rviz最厲害的地方是它的擴展性,可以通過插件的形式無限擴展,打造自己的人機交互界面。比如上圖是ROScon2017開場演講的Autoware項目,他們將rviz用于無人駕駛汽車的上位機平臺。

 

2

上圖是我們自己項目開發(fā)中設計的rviz插件,作為機器人控制的上位機。

rviz原生的顯示組件配合定制化開發(fā)的插件,功能強大,開發(fā)迅速,簡直不能再好用了!

OK!吹了半天rviz的強大,也得說說它的問題!

rviz最大的問題就是對ROS核心通信機制的強依賴,系統(tǒng)中必須要運行ROS Master,顯示的數(shù)據(jù)需要通過話題發(fā)布,運行不穩(wěn)定等等。。。很多時候在啟動rviz的過程中,總是伴隨著警告和錯誤,一次啟動失敗就再來一次,最多三四次還是可以啟動成功的。。。

基于上邊這些問題,rviz基本不可能直接拿來產(chǎn)品化,作為開發(fā)過程中的工具還是非常棒的。不過,rviz的架構(gòu)設計還值得參考,我曾“企圖”利用rviz的源碼重新開發(fā)一個類似的界面工具,擺脫對ROS的依賴,不過最終還是因為沒有時間而放棄了,有興趣的小伙伴可以試一下,記得告訴我結(jié)果哦!

 

▼ 命令行工具和rqt工具

3

ROS提供的命令行工具非常豐富,比如rostopic、rosservice、rosnode、rosparam等等。雖然沒有圖形化工具那么直觀,但是很多時候更加簡潔明快。

ROS還提供了一系列輕量化的可視化工具,比如:

 

4

顯示計算圖的rqt_graph

 

5

顯示數(shù)據(jù)包的rqt_bag

 

6

繪制數(shù)據(jù)曲線的rqt_plot

 

這些工具的問題和rviz類似,或者說ROS的原生工具都有這樣的問題,畢竟是“直系血親”,和ROS核心部分緊密相連,同樣繼承了ROS通信機制部分的問題。

所以,如果想在機器人產(chǎn)品中為用戶提供相關的工具,需要慎重考慮一下面向的對象,和對穩(wěn)定性的需求。

 

二、編譯和測試工具

第二個部分是ROS提供的編譯和測試工具。

▼ 編譯系統(tǒng)——catkin

7

ROS的編譯系統(tǒng)基于CMake,針對ROS本身的特點進行了包裝,可以比較方便的管理包之間的依賴關系,而且ROS功能包可以實現(xiàn)系統(tǒng)模塊化、松耦合的管理機制,編譯開發(fā)版和發(fā)布版都沒有問題。

功能包或編譯系統(tǒng)和ROS的核心通信機制沒有直接關系,所以代碼里邊沒有任何ROS相關的代碼,一樣可以使用。在機器人開發(fā)過程中,我們項目中的所有代碼都使用ROS包管理、catkin編譯。

這種方案還有一個很大的好處,就是很容易在CMakeLists中鏈接ROS的庫,比如tf庫。tf庫是坐標變換的數(shù)學處理庫,而我們常用的tf功能包是在tf庫的基礎上加入了ROS封裝,所以兩者是有區(qū)別的。借助tf庫可以幫助我們實現(xiàn)坐標變換,不需要再重復造這個輪子。

 

▼ 單元測試——gtest

8

ROS的單元測試系統(tǒng)基于谷歌的gtest,結(jié)合catkin編譯系統(tǒng),非常好用。我們項目所有的單元測試,都是通過這種方式完成,相關的語法和gtest一樣,可以參考:

http://wiki./gtest

可以說,ROS的編譯和測試工具在產(chǎn)品化開發(fā)過程中可以直接使用,而且包管理機制、單元測試方法讓整個軟件系統(tǒng)的框架清晰明了、分工明確。

 

三、第三方工具

ROS的迅速崛起,也不斷吸收更多第三方工具的加入,比如Gazebo、Matlab、Qt Creator、SolidWorks等。

9

機器人仿真是機器人開發(fā)過程中非常重要的一個環(huán)節(jié),可以針對機器人模型、應用功能、算法處理、環(huán)境狀態(tài)等方面做仿真。Gazebo是ROS中主要的仿真工具,現(xiàn)在已經(jīng)獨立維護,可以通過ROS接口接入ROS環(huán)境,所以無論我們是否使用ROS,都可以使用Gazebo,從開發(fā)到產(chǎn)品的過渡相對平滑。

 

10

Matlab是數(shù)據(jù)處理方面的強大工具,2013之后的機器人工具箱也提供了對ROS的支持,實現(xiàn)了ROS核心通信的大部分功能,可以運行ROS Master和節(jié)點,并且發(fā)布話題消息。這為ROS開發(fā)提供了一個強大的數(shù)據(jù)演算后臺,也可以利用matlab的可視化編程功能,實現(xiàn)人機界面的開發(fā)。

 

11

Qt Creator、SolidWorks等工具,都是以插件的形式提供對ROS的支持,從而實現(xiàn)與ROS相關的功能。

隨著ROS的發(fā)展,會有越來越多的第三方工具加入ROS的生態(tài)環(huán)境,這些“兵器”也必定會直接帶來生產(chǎn)效率的提高,促進機器人產(chǎn)品化的進程!

本篇針對ROS相關的部分工具進行了分析,當然還有很多工具沒有涵蓋進來。工具的根本目的是提高我們的開發(fā)效率,每一種工具都有其擅長之地,也有其不足之處,所以在我們設計、開發(fā)機器人產(chǎn)品的過程中,可以綜合考慮,發(fā)揮每一個開發(fā)工具的優(yōu)勢。


(四十六)—— ROS產(chǎn)品化探索之應用功能篇

上篇我們講到ROS中的開發(fā)工具,可以提高我們的開發(fā)效率,每一種工具都有其擅長之地,也有其不足之處,所以在設計、開發(fā)機器人產(chǎn)品的過程中,可以綜合考慮,發(fā)揮每一個開發(fā)工具的優(yōu)勢。本篇我們來分析一下ROS中豐富的應用功能。

說起ROS中的應用功能,可就非常龐雜了,涵蓋各種各樣的功能包,簡單做一個如下的分類:

1. 底層驅(qū)動

2. 上層功能

3. 控制模塊

4. 常用組件

就這幾種應用功能,我們來具體分析一下:

 

一、底層驅(qū)動

機器人開發(fā)是一個軟硬件結(jié)合的領域,常常需要涉及很多傳感器、執(zhí)行器的驅(qū)動。常用的硬件一般都可以在ROS中找到匹配的驅(qū)動功能包,例如傳感器可以參考wiki上的這個列表:

http://wiki./Sensors

針對常用的USB攝像頭,ROS中有usb_cam、uvc_camera等功能類似的驅(qū)動包,運行還算比較穩(wěn)定。我們用usb_cam驅(qū)動1080P的攝像頭做識別,有的時候連續(xù)運行好幾天都不會出問題,不過偶爾也會莫名其妙的掛掉。

1

一些伺服的驅(qū)動在ROS當中也可以找到,比如dynamixel的伺服,Kungfu Arm前端的靈巧手使用的就是dynamixel,相關的功能包是dynamixel_motor。用ROS驅(qū)動起來確實簡單易用,但是運行時間長了,還是會有問題。有一次給Kungfu Arm錄像,手就有點緊張了,手指不聽使喚,把開水灑了一桌子,驅(qū)動也沒有任何報錯信息,重啟之后再也沒有重現(xiàn)類似的現(xiàn)象。

Image

ROS支持的很多機器人(PR2、KUKA、shadow hand等)都使用到了一種實時工業(yè)以太網(wǎng)總線——EtherCAT。EtherCAT本身就有開源的協(xié)議實現(xiàn)方式,ROS將開源庫集成為功能包——ethercat_soem,可以在很多機器人的軟件源中看到。我們在項目的初期也使用過這種方式,驅(qū)動是沒有問題,但是穩(wěn)定性、實時性、功能方面,都還存在一些問題。

就個人感受而言,ROS中底層驅(qū)動相關的功能包,大部分都是對已有開源驅(qū)動的集成封裝,添加統(tǒng)一的ROS接口,所以穩(wěn)定性主要和原本的驅(qū)動相關,同時還要考慮ROS通信機制的影響。

 

二、上層功能

上層功能是ROS最為擅長的一個領域,可以提供眾多機器人的應用功能:SLAM、導航、定位、圖像處理、機械臂控制等等,這個部分詳細展開夠說三天三夜了。我就針對兩個部分談一下自己的看法。

 

1. 機器人導航

現(xiàn)在很多學?;蛘吖咀鰴C器人導航的時候,都會基于ROS開發(fā)。

Image [4]_副本

ROS的這套導航框架確實好用,很快就可以在機器人上把功能跑起來,而且基本不會涉及太多編碼,但是還沒來得及高興,問題就出現(xiàn)了:現(xiàn)實和理想還是有很大差距的,功能實現(xiàn)的效果可能遠遠達不到我們的需求,更別提產(chǎn)品化應用了。

然后就是調(diào)整功能節(jié)點的各種參數(shù),雖然可以有所改善,但是跟最終的應用還是會有很大差距。使用ROS快速開發(fā)后的興奮,在這個時候就被潑了一盆涼水。

ROS中的功能包一般都是一些通用的功能,不太可能完全適配我們自己的機器人,所以產(chǎn)生各種問題也是情理之中。解決的辦法就是:我們不能太依賴ROS中的資源,核心問題還是需要自己解決,或者針對自己的機器人開發(fā)相關的功能,或者優(yōu)化已有的ROS資源。

在Kungfu Arm的開發(fā)過程中,我們只用了半年時間就利用ROS把機器人功能原型搭建起來了,但是問題多多,接下來的優(yōu)化開發(fā)用了一年多的時間,現(xiàn)在還在持續(xù)的迭代。

 

2. MoveIt機械臂控制

MoveIt是ROS當中針對機械臂控制的運動規(guī)劃平臺,集成了機械臂運動規(guī)劃、避障規(guī)劃、運動學計算等功能模塊。和ROS中的導航功能差不多,用moveit搭建一個簡單的機械臂控制系統(tǒng)不難,真的要去實現(xiàn)一個產(chǎn)品化的控制系統(tǒng)就復雜了。

幻燈片9

這是我們基于ROS開發(fā)的工業(yè)機器人控制系統(tǒng),不僅把ROS核心通信機制拋離了,而且還針對moveit、ompl、fastik等功能包進行了代碼級的優(yōu)化和修改,大家可以參考專門介紹這款機器人的文章:

功夫手:一款基于ROS的工業(yè)機器人

總而言之,ROS中豐富的上層應用資源,對機器人產(chǎn)品化的實現(xiàn)還是有很大幫助的,一方面可以利用這些功能包快速完成原型開發(fā),另一方面也可以從這些源碼資源中獲得靈感。

 

三、控制模塊

豐富的上層資源最終還是要落實到機器人上,在機器人控制部分,ROS提供了一個控制框架——ros_control,同時還有很多常用的控制器——ros_controllers。

Image

ros_control是ROS為開發(fā)者提供的機器人控制中間件,包含一系列控制器接口、傳動裝置接口、硬件接口、控制器工具箱等等,可以幫助機器人應用功能包快速落地,提高開發(fā)效率。

Image [2]

針對不同類型的機器人(移動機器人、機械臂等),ros_control可以提供多種類型的控制器(controller),但是這些控制器的接口各不相同。

為了提高代碼的復用率,ros_control還提供一個硬件抽象層,負責機器人硬件資源的管理,而controller從抽象層請求資源即可,并不直接接觸硬件。

Image [3]

1. 控制器管理器(Controller Manager)

每個機器人可能有多個控制器(controller),所以這里有一個控制器管理器的概念,提供一種通用的接口來管理不同的控制器。控制器管理器的輸入就是ROS上層應用功能包的輸出。

2. 控制器(Controller)

控制器可以完成每個joint的控制,讀取硬件資源接口中的狀態(tài),再發(fā)布控制命令,并且提供PID控制器。

3. 硬件資源(Hardware Rescource)

為上下兩層提供硬件資源的接口。

4. 機器人硬件抽象(RobotHW)

機器人硬件抽象和硬件資源直接打交道,通過write和read方法完成硬件操作,這一層也包含關節(jié)約束、力矩轉(zhuǎn)換、狀態(tài)轉(zhuǎn)換等功能。

5. 真實機器人(Real Robot)

真實機器人上也需要有自己的嵌入式控制器,將接收到命令反映到執(zhí)行器上,比如接收到旋轉(zhuǎn)90度的命令后,就需要讓執(zhí)行器快速、穩(wěn)定的旋轉(zhuǎn)90度。

關于如何使用ros_control控制一款實體機器人,大家可以參考hans-robot發(fā)布的一款cute_robot:

https://github.com/hans-robot/cute_robot

應用功能中的控制模塊提供了不少控制器:位置控制器、軌跡控制器、力控制器、速度控制器等等,這些控制器的框架設計和代碼實現(xiàn),都可以用于自己的機器人開發(fā)中。

 

四、常用組件

應用功能中還有一些常用模塊,這里我把他們統(tǒng)稱為常用組件,比如TF、URDF、Message等。

Image [2]

TF是ROS中非常重要的一個部分,可以根據(jù)機器人系統(tǒng)中的坐標系創(chuàng)建一棵TF樹,然后幫助開發(fā)者完成坐標系之間的變換。在ROS系統(tǒng)中,TF是通過廣播和監(jiān)聽的方式操作的,這種方法在復雜機器人系統(tǒng)中會產(chǎn)生很多冗余信息,效率不高。

刨除上層的廣播和監(jiān)聽封裝,TF的內(nèi)核其實與ROS并沒有關系,而是一個完成坐標運算的數(shù)學庫。在我們的項目開發(fā)中,可以直接鏈接TF的底層數(shù)學庫,幫助完成需要的坐標變換,Kungfu Arm的正向運動學就使用到了TF數(shù)學庫。

Image [5]

URDF是ROS中實現(xiàn)機器人建模的重要工具,很多上層功能的算法實現(xiàn),都依賴于機器人的URDF模型,所以如果直接移植ROS中的功能包源碼,URDF模型部分還是需要維護的。

Image [6]

ROS為機器人提供了一個統(tǒng)一的平臺,很重要的一個部分就是定義了一系列標準的接口,這些接口的定義與ROS系統(tǒng)的通信機制沒有關系,完全可以在程序中調(diào)用,這樣不僅免去了重復定義的問題,還可以保持和ROS統(tǒng)一的接口。

本篇淺談了ROS應用功能在機器人產(chǎn)品化開發(fā)當中的應用,這是ROS中資源最為豐富的一個部分,不僅可以幫助我們快速搭建功能原型,驗證設計上的問題,同時還可以借助開源代碼,助力后續(xù)的功能開發(fā),絕對是機器人開發(fā)的優(yōu)質(zhì)資源。


(四十七)—— ROS產(chǎn)品化探索之生態(tài)系統(tǒng)篇

誕生于2007年的ROS,發(fā)展速度之迅猛超出了所有人的預料,已經(jīng)成為一個機器人領域的生態(tài)系統(tǒng),可以提供機器人相關的全方位技術,從硬件到軟件,從框架到功能,從驅(qū)動到應用。。。

前邊三篇已經(jīng)分別從通信機制、開發(fā)工具、應用功能這三個方面淺談了筆者對ROS產(chǎn)品化探索的一點總結(jié),本篇就來聊聊最后一個部分——從生態(tài)系統(tǒng)的角度來看,ROS可以為機器人產(chǎn)品化提供哪些思路。

什么是生態(tài)系統(tǒng)?

維基百科的解釋是:生態(tài)系統(tǒng)(Ecosystem)是指在一個特定環(huán)境內(nèi),相互作用的所有生物和此環(huán)境的統(tǒng)稱。

2

ROS提供了一個龐大的開源社區(qū),為ROS生態(tài)系統(tǒng)提供了基礎環(huán)境,眾多機器人的基礎工具和應用功能不斷融入這個系統(tǒng),并且不斷吸收第三方開源軟件的精華,同時得到全球范圍內(nèi)眾多開發(fā)者的支持,系統(tǒng)中的各部分協(xié)調(diào)統(tǒng)一、相互促進、共同成長,成為一個整體。

這個ROS生態(tài)系統(tǒng)應該是目前最大的機器人知識庫了,在機器人產(chǎn)品化開發(fā)中,也必將成為一個重要的資源池。

 

一、機器人資源

 

目前國內(nèi)外常用的機器人平臺大部分都已經(jīng)支持ROS系統(tǒng),可以在wiki上查找:

http://robots./

3

就算wiki上找不到的,基本也可以在github上找到其他開發(fā)者的分享。如果加上愛好者自己設計、實現(xiàn)的機器人,那就更加數(shù)不勝數(shù)了。

這些機器人資源對我們有什么用呢?

1. 機器人硬件設計參考

ROS中的機器人資源都是開源的,包括機器人的模型文件。如果我們需要做機器人設計,完全可以參考這些開源的機器人模型,畢竟包含了不少知名的機器人平臺。

2. 輔助機器人原型搭建

使用ROS中已有的功能包,我們可以在自己的機器人上快速搭建功能原型,驗證機器人設計中的問題。

3. 基于應用功能包的二次開發(fā)

ROS中的功能包非常豐富,一定可以找到與我們研究方向相關的應用功能,雖然不太可能直接應用在產(chǎn)品開發(fā)中,但還是可以減少類似重復造輪子的工作。

4. 算法驗證

如果我們是算法工程師,手上又沒有現(xiàn)成的機器人平臺,那么使用ROS中的機器人可以隨便挑隨便選,放在物理仿真環(huán)境中,想怎么用怎么用,還分文不要。

5. 學習機器人系統(tǒng)

無論我們是機器人方向剛?cè)腴T的初學者,還是資深工程師,都不可能掌握機器人方方面面的知識,那么借助ROS學習更多機器人相關的技能,一定可以事半功倍。

 

二、功能框架

設計一個完善的機器人系統(tǒng)并不是一件簡單的事情,借用Python的一句名言:人生苦短,我用ROS。ROS中豐富的機器人框架,一定可以給你一些設計、實現(xiàn)上的靈感:

1. 機器人通信框架

4

ROS1的通信機制部分在機器人產(chǎn)品化中存在很多問題,但并不代表這種通信框架是不可用的,如果我們設計類似的通信功能,一樣可以參考這個模型。

5

如果你不喜歡這種“中央集權(quán)”的通信模型,也可以看一下ROS2的通信模型。

這些通信模型的底層實現(xiàn)是開源透明的,真要拿來二次開發(fā)實現(xiàn)商業(yè)化,也不是沒有可能。

2. 機器人導航框架

6_副本

這個框架我們在上一篇已經(jīng)說過,這里就不多說了,誰用誰知道。

3. ROS-I框架

7

工業(yè)機器人是機器人中非常重要的一個部分,在工業(yè)領域應用廣泛而且成熟。ROS迅猛發(fā)展的過程中,也不斷滲入到工業(yè)領域,從而產(chǎn)生了一個新的分支——ROS-Industrial(ROS -I)。

工業(yè)機器人的品牌眾多,接口也各不統(tǒng)一,ROS-I框架為這些機器人提供了一個統(tǒng)一的控制平臺,可以將ROS社區(qū)中的眾多資源應用到生產(chǎn)環(huán)境中,或許會成為ROS最快落地的一個領域。

4. ros_control框架

8

硬件平臺千差萬別,如何將上層應用快速適配到不同的機器人硬件平臺上,也是軟件開發(fā)工程師頭疼的一個問題,那就參考一下ros_control框架吧,仿真控制與實物控制輕松切換,類似于linux系統(tǒng)底層write、read機制一般的統(tǒng)一接口,可以幫助我們解決不少麻煩。

ROS中還有很多功能框架,都是全球范圍內(nèi)頂尖開發(fā)者的知識結(jié)晶,媽媽再也不用擔心我不會機器人設計了。

三、機器人前沿科技

機器人絕對是走在當今科技最前沿的一個領域,更新?lián)Q代也異常迅速,所以我們不僅要掌握機器人基礎理論和技術,還要時刻關心前沿動態(tài)。ROS在機器人領域的地位越來越高,也是我們窺看前沿科技的一個窗口。

1. 機器人前沿

9

比如這款“百萬級”的仿生手。

10

比如這款“不會傷人”的KUKA LWR iiwa。

11

再比如這款“機器僧人”Pepper。

2. 學術前沿

每年機器人頂級期刊和會議上的論文,很多都是基于ROS實現(xiàn)的,部分論文還會把成果和源碼在ROS社區(qū)中分享。很多大公司或大牛也經(jīng)常會把一些機器人算法在ROS社區(qū)分享。這就為我們接觸學術前沿提供了機會,也可以從中汲取不少新的靈感和知識。

12

比如2016年Google在ROS社區(qū)中開源了一種SLAM實現(xiàn)算法——cartographer,同時也分享了ICRA會議上的相關論文:

https://research.google.com/pubs/pub45466.html

13

再比如基于ROS實現(xiàn)的無人駕駛平臺:

http://www./news/2017/06/simulated-car-demo.html

14

當然,也少不了當今熱門的人工智能與ROS的結(jié)合:

http://www./machine-learning-openai-gym-ros-development-studio-2/

此外,很多基于ROS實現(xiàn)的論文都可以在這里找到:

http://wiki./Papers

ROS的生態(tài)系統(tǒng)在機器人領域保羅萬象,還有更多資源可以讓我們隨意使用,無論是提高個人技能,還是進行商業(yè)開發(fā),都可以讓我們站在巨人的肩膀上看得更遠。這也是ROS最初的設計目標:提高機器人領域的代碼復用率,促進不同組織之間各施所長、合作共贏。

 

至此,《淺談ROS的產(chǎn)品化探索》系列文章也就告一段落了,筆者使用四篇文章淺談了個人在ROS學習、應用、產(chǎn)品化開發(fā)過程中的一些感悟和總結(jié),歡迎各位批評指正。

總而言之,ROS能不能產(chǎn)品化應用,不能用一個“能”或者“不能”簡而概之,而是需要剖析開來具體分析,在應用中取其精華去其糟粕。

turtle

祝各位有一段美妙的ROS機器人開發(fā)之旅!


(四十八)——ROS機器人實例 (PR2)

PR2(Personal Robot 2,個人機器人2代)是Willow Garage公司設計的機器人平臺,其中數(shù)字2代表第二代機器人。

PR2有兩條手臂,每條手臂七個關節(jié),手臂末端是一個可以張合的夾爪;PR2依靠底部的四個輪子移動,在頭部、胸部、肘部、夾爪上分別安裝有高分辨率攝像頭、激光測距儀、慣性測量單元、觸覺傳感器等豐富的傳感設備。在PR2的底部有兩臺八核電腦作為機器人各硬件的控制和通信中樞,并且都安裝了Ubuntu和ROS系統(tǒng)。

1

PR2和ROS有千絲萬縷的關系,可以說ROS產(chǎn)生于PR2,也促成了PR2。ROS原本是Willow Garage為復雜的PR2機器人平臺設計的軟件框架,依靠強大的ROS,PR2可以獨立完成多種復雜的任務,例如PR2可以自己開門、找到插頭給自己充電、打開冰箱取出啤酒、打簡單的臺球等等。只不過PR2價格高昂,而且能力還達不到商業(yè)應用的要求,如今主要用于學術研究。

可見,PR2是ROS中元老級的機器人平臺,所有軟件代碼依托于ROS,并且全部在ROS社區(qū)中開放源代碼,為我們學習、應用ROS提供了豐富的資源。

 

一、 PR2功能包安裝

 

在ROS Kinetic中,大部分PR2功能包還無法支持,官方推薦使用ROS Indigo運行PR2。

首先使用如下命令安裝PR2機器人的相關功能包:

  1. $ sudo apt-get install ros-indigo-pr2-*

以上命令主要安裝了下表中PR2機器人相關的ROS功能包。

2

PR2機器人售價昂貴,大多數(shù)人都無法接觸到,所以這里我們使用仿真器運行PR2的相關功能。

 

二、 Gazebo中的PR2

 

使用如下命令啟動gazebo仿真環(huán)境,并使用pr2.launch將機器人加載到gazebo中:

  1. $ roslaunch gazebo_ros empty_world.launch
  2. $ roslaunchpr2_gazebo pr2.launch

也可以使用pr2_gazebo功能包中的pr2_empty_world.launch一次性啟動gazebo并加載機器人模型:

  1. $ roslaunch pr2_gazebo pr2_empty_world.launch

啟動成功后,就可以在一個空曠的gazebo仿真環(huán)境中看到PR2機器人了。

3

查看當前系統(tǒng)中的話題列表,會看到眾多話題已經(jīng)發(fā)布或者等待訂閱,這就是PR2機器人仿真器提供給用戶的接口,我們可以基于這些接口實現(xiàn)很多功能。

4

為了測試PR2的傳感器是否啟動成功,可以在仿真環(huán)境中隨機添加一些外部物體。

5

然后打開rviz,添加點云、激光、攝像頭等插件,實現(xiàn)傳感器數(shù)據(jù)的可視化顯示。

6

目前PR2機器人還處于靜止狀態(tài),可以運行鍵盤控制節(jié)點,控制PR2運動:

  1. $ roslaunch pr2_teleop teleop_keyboard.launch

啟動后根據(jù)終端中的提示,使用鍵盤控制PR2機器人在gazebo中移動,同時rviz中的PR2模型也會同步更新。

7

在控制PR2移動時,rviz中的Fixed Frame需要修改為odom_combined

 

三、 使用PR2實現(xiàn)SLAM

 

在PR2仿真環(huán)境中,我們已經(jīng)獲取到所有傳感器的數(shù)據(jù),并且可以控制PR2移動,接下來嘗試使用PR2實現(xiàn)SLAM。

第一步還是啟動PR2的gazebo仿真環(huán)境:

  1. $ roslaunchpr2_gazebo pr2_empty_world.launch

然后在空曠的gazebo仿真環(huán)境中添加一些障礙物體。

12212

這里以gmapping為例,創(chuàng)建一個啟動gmapping節(jié)點的啟動文件pr2_build_map.launch:

  1. <launch>
  2.    <node name="gmapping_node"pkg="gmapping"type="slam_gmapping" respawn="false" >
  3.        <remap to="base_scan" from="scan"/>
  4.        <paramname="odom_frame" value="odom_combined" />
  5.    </node>
  6. </launch>

然后在該文件所在的路徑下直接運行以下命令:

  1. $ roslaunch pr2_build_map.launch

如果launch文件、節(jié)點、可執(zhí)行文件等在終端的當前路徑下,運行命令時可以不加功能包名。

啟動成功后,gmapping節(jié)點就開始SLAM建圖了。啟動rviz并添加顯示插件后,可以看到如圖所示的SLAM效果。

8

啟動鍵盤控制節(jié)點,控制PR2機器人在仿真環(huán)境中圍繞障礙物體移動,就可以實現(xiàn)SLAM了。

  1. $ roslaunch pr2_teleop teleop_keyboard.launch

9

 

四、 PR2機械臂的使用

 

PR2不僅是一個移動機器人平臺,它還裝配了兩個機械手,可以實現(xiàn)很多復雜的機械臂操作。類似于鍵盤發(fā)布速度控制指令,我們也可以在終端中使用如下命令控制PR2的兩個機械臂:

  1. $ roslaunch pr2_gazebo pr2_empty_world.launch
  2. $ roslaunch pr2_teleop_general pr2_teleop_general_keyboard.launch

啟動成功后,可以在終端中看到提示信息,分別控制PR2的頭部、身體、機械臂等多個可運動部位。

10

此處選擇控制機械臂,然后會看到一系列控制命令。

111

按照命令提示點擊鍵盤按鍵,就可以控制PR2機器人的兩個手臂運動了。

11

說到機械臂運動,就不得不提到MoveIt!,PR2機器人的機械臂也可以通過MoveIt!控制。在安裝完成的PR2功能包中,已經(jīng)包含了PR2手臂的MoveIt!配置功能包,可以直接啟動demo示例:

  1. $ roslaunch pr2_moveit_config demo.launch

在啟動的rviz中會看moveit的界面,可以通過MoveIt!插件或代碼控制機械手臂運動。

22121

除此之外,我們也可以使用如下命令,通過MoveIt!控制gazebo仿真器中的PR2:

  1. $ roslaunch pr2_gazebopr2_empty_world.launch
  2. $ roslaunch pr2_moveit_config move_group.launch
  3. $ roslaunch pr2_moveit_config moveit_rviz.launch

各種控制器插件在這里都已經(jīng)配置完成,有興趣的讀者可以詳細學習PR2功能包中的源碼,這些都是我們實踐過程中重要的參考資料。

再次在rviz中控制PR2的機械手臂運動,gazebo中PR2的手臂將根據(jù)規(guī)劃的軌跡完成運動。

1111

 

(四十九)——ROS機器人實例 (TurtleBot)

上一篇介紹了ROS中的元老機器人——PR2,雖然功能強大,但價格昂貴,無法推廣。所以Willow Garage又開發(fā)了一款低成本的機器人平臺——TurtleBot。

image

TurtleBot的目的是給入門級的機器人愛好者或從事移動機器人編程開發(fā)者提供一個基礎平臺,讓他們直接使用TurtleBot自帶的軟硬件,專注于應用程序的開發(fā),避免了設計草圖、購買、加工材料、設計電路、編寫驅(qū)動、組裝等一系列工作。借助該機器人平臺,可以省掉很多前期工作,只要根據(jù)平臺的軟硬件接口,就能開發(fā)出所需的功能。

TurtleBot可以說是ROS中最為重要的機器人之一,它伴隨ROS一同成長,一直都作為ROS開發(fā)前沿的機器人,幾乎每個版本的ROS測試都會以TurtleBot為主,包括ROS2也率先在TurtleBot上進行了大量測試。

所以TurtleBot也是ROS支持度最好的機器人之一,可以在ROS社區(qū)中獲得大量關于TurtleBot的相關資源,很多功能包都能直接復用到我們自己的移動機器人平臺上,絕對是使用ROS開發(fā)移動機器人的重要資源。

TurtleBot第一代發(fā)布于2010年,兩年后發(fā)布了第二代產(chǎn)品。前兩代TurtleBot都使用iRobot的機器人作為底盤,在底盤上可以裝載激光雷達、Kinect等傳感器,使用PC搭載基于ROS的控制系統(tǒng)。

在2016年的ROSCon上,韓國機器人公司Robotis和開源機器人基金會(OSRF)發(fā)布了TurtleBot 3,徹底顛覆了原有TurtleBot的外形設計,成本進一步降低,而且模塊化更強,可以根據(jù)開發(fā)者的需求自由改裝。TurtleBot 3并不是為取代TurtleBot 2而生,而是提出了一種更加靈活的移動機器人平臺。

那么如何在ROS中使用Turtlebot呢?

首先需要安裝Turtlebot相關的所有功能包,使用如下命令安裝:

  1. $ sudo apt-get install ros-kinetic-turtlebot-*

安裝完成后的功能包中包含了所有Turtlebot真機與仿真的功能,這里還是以gazebo仿真為主進行實踐。

 

gazebo中的TurtleBot

 

第一步依然是啟動gazebo仿真環(huán)境,并且加載Turtlebot機器人:

  1. $ export TURTLEBOT_GAZEBO_WORLD_FILE="/opt/ros/kinetic/share/turtlebot_gazebo/worlds/playground.world"
  2. $ roslaunch turtlebot_gazebo turtlebot_world.launch

這里需要使用環(huán)境變量TURTLEBOT_GAZEBO_WORLD_FILE為仿真環(huán)境指定地圖,否則會顯示找不到地圖的錯誤。

啟動成功后可以看到gazebo界面,TurtleBot 2已經(jīng)成功加載到仿真環(huán)境當中。

image

查看當前系統(tǒng)中的話題列表,可以看到很多已經(jīng)發(fā)布和等待訂閱的話題。

image

打開rviz,可視化顯示需要的傳感器數(shù)據(jù),可以看到機器人攝像頭、激光雷達、點云等信息。

image

然后使用如下命令啟動鍵盤控制節(jié)點:

  1. $ roslaunch turtlebot_teleopkeyboard_teleop.launch

根據(jù)終端中的命令提示,控制TurtleBot在仿真器中移動,rviz中的機器人以及傳感器信息會同步更新。

image

TurtleBot導航仿真

 

接下來在仿真環(huán)境中使用TurtleBot實現(xiàn)導航功能。

第一步是SLAM建圖。turtlebot_gazebo功能包中已經(jīng)提供了使用gmapping實現(xiàn)SLAM建圖的啟動文件,但是文件內(nèi)部的包含路徑有一點問題,直接運行會提示錯誤。

image

使用如下命令打開gmapping_demo.launch文件,進行一點修改:

  1. $ roscd turtlebot_gazebo/launch/
  2. $ sudo gedit gmapping_demo.launch

在gmapping.launch.xml文件的路徑前加入gmapping文件夾,修改后的gmapping_demo.launch文件內(nèi)容如下:

  1. <launch>
  2.     <include file="$(find turtlebot_navigation)/launch/includes/gmapping/gmapping.launch.xml"/>
  3. </launch>

然后使用如下命令啟動仿真環(huán)境和gmapping節(jié)點:

  1. $ export TURTLEBOT_GAZEBO_WORLD_FILE="/opt/ros/kinetic/share/turtlebot_gazebo/worlds/playground.world"
  2. $ roslaunch turtlebot_gazebo turtlebot_world.launch
  3. $ roslaunch turtlebot_gazebo gmapping_demo.launch
  4. $ roslaunch turtlebot_rviz_launchers view_navigation.launch
  5. $ roslaunch turtlebot_teleop keyboard_teleop.launch

通過鍵盤控制TurtleBot在仿真環(huán)境中移動,在打開的rviz中可以看到SLAM過程。

image

SLAM結(jié)束后使用如下命令保存地圖,命名為turtlebot_test_map:

  1. $ rosrun map_servermap_saver -f turtlebot_test_map

接下來我們在建立完成的地圖上實現(xiàn)TurtleBot自主導航功能。turtlebot_gazebo功能包中同樣提供了實現(xiàn)導航功能的launch啟動文件,但是文件內(nèi)部的包含路徑也有問題,直接運行會提示錯誤。

image

使用如下命令打開amcl_demo.launch文件,進行一點修改:

  1. $ roscd turtlebot_gazebo/launch/
  2. $ sudo gedit amcl_demo.launch

在amcl.launch.xml文件的路徑前加入amcl文件夾,修改后的amcl_demo.launch文件內(nèi)容如下:

  1. <launch>
  2.    <!-- Map server -->
  3.    <arg name="map_file"default="$(envTURTLEBOT_GAZEBO_MAP_FILE)"/>
  4.    <node name="map_server" pkg="map_server"type="map_server" args="$(arg map_file)" />
  5.  
  6.    <!-- Localization -->
  7.    <arg name="initial_pose_x"default="0.0"/>
  8.    <arg name="initial_pose_y"default="0.0"/>
  9.    <arg name="initial_pose_a"default="0.0"/>
  10.    <include file="$(find turtlebot_navigation)/launch/includes/amcl/amcl.launch.xml">
  11.        <arg name="initial_pose_x"value="$(arg initial_pose_x)"/>
  12.        <arg name="initial_pose_y"value="$(arg initial_pose_y)"/>
  13.        <argname="initial_pose_a" value="$(arg initial_pose_a)"/>
  14.    </include>
  15.  
  16.    <!-- Move base -->
  17.    <include file="$(find turtlebot_navigation)/launch/includes/move_base.launch.xml"/>
  18. </launch>

現(xiàn)在關閉除仿真環(huán)境以外的其他節(jié)點和rviz,運行如下命令就可以開始導航了。

  1. $ roslaunch turtlebot_gazebo amcl_demo.launch map_file:=/home/hcx/turtlebot_test_map.yaml
  2. $ roslaunch turtlebot_rviz_launchers view_navigation.launch

在rviz中選擇導航的目標點后,gazebo中的TurtleBot開始向目標移動,rviz中可以看到傳感器信息和機器人狀態(tài)顯示。

image

TurtleBot 3

ROS Kinetic中也集成了TurtleBot 3相關功能包的二進制安裝文件,我們也來嘗嘗鮮。

使用如下命令安裝TurtleBot 3的所有相關功能包:

  1. $ sudo apt-get install ros-kinetic-turtlebot3-*

安裝完成后,使用如下命令啟動TurtleBot 3的仿真環(huán)境:

  1. $ export TURTLEBOT3_MODEL=burger
  2. $ roslaunch turtlebot3_gazebo turtlebot3_world.launch

TurtleBot 3目前有兩種模型:burger和Waffle,啟動之前必須通過環(huán)境變量的方式設置所需要的模型,這里選擇burger。

啟動成功后,可以看到gazebo仿真環(huán)境和TurtleBot 3機器人。

image

查看當前系統(tǒng)中的話題列表,因為TurtleBot 3 burger模型較為簡單,搭載的傳感器也并不多,所以這里發(fā)布和訂閱的話題也比較少。

image

基于這個仿真環(huán)境和現(xiàn)有的傳感器數(shù)據(jù),可以使用如下命令實現(xiàn)TurtleBot 3的SLAM功能:

  1. $ roslaunch turtlebot3_slam turtlebot3_slam.launch
  2. $ rosrun turtlebot3_teleop turtlebot3_teleop_key

打開rviz,并且訂閱傳感器和地圖數(shù)據(jù),通過鍵盤控制TurtleBot 3運動,就可以看到SLAM效果了。

image

類似于TurtleBot 2,我們也可以在建立的地圖上實現(xiàn)導航功能,此處不再贅述。

(五十)——ROS機器人實例 (Universal Robots)

Universal Robots(優(yōu)傲機器人)公司是一家引領協(xié)作機器人全新細分市場的先驅(qū)企業(yè),該公司成立于2005年,關注機器人的用戶可操作性和靈活度,總部位于丹麥的歐登塞市,主要的機器人產(chǎn)品有:UR3、UR5和UR10,分別針對不同的負載級別。

image

Universal Robots早在2009年便推出了第一款協(xié)作機器人——UR5,自重18公斤,負載高達5公斤,工作半徑85cm,不僅顛覆了人們對于傳統(tǒng)工業(yè)機器人的認識,還自此定義了“協(xié)作機器人”的真正意義。除了安全度高、無需安全圍欄等特點外,協(xié)作機器人還應該具備編程簡單和靈活度高等特點,才能實現(xiàn)真正的人機和諧共事。

2015年3月推出的UR3是現(xiàn)今市場上最靈活輕便、并且可與工人一起肩并肩工作的臺式機器人。它自重僅為11公斤,但是有效負載卻高達3公斤,所有腕關節(jié)均可360度旋轉(zhuǎn),而末端關節(jié)可作無限旋轉(zhuǎn)。UR 10的有效負載為10公斤,工作半徑130cm。三款機器人均以編程的簡易性、高度靈活性以及與人一起工作的安全可靠性而享譽業(yè)內(nèi)。

ROS中同樣集成了Universal Robots機器人的功能包,使用如下命令即可安裝,其中包含UR3、UR5、UR10三款機器人的相關功能:

  1. $ sudo apt-get install ros-kinetic-universal-robot

在使用之前,先來了解一下Universal Robots的相關功能包。

image

接下來我們以UR5為例,學習Universal Robots功能包的使用方法。

 

gazebo中的UR機器人

使用以下命令啟動UR5機器人的gazebo仿真環(huán)境:

  1. $ roslaunch ur_gazebo ur5.launch

啟動成功后可以看到仿真環(huán)境中的UR5。

image

查看當前系統(tǒng)中的話題列表。

image

follow_joint_trajectory是MoveIt!最終規(guī)劃發(fā)布的action消息,由機器人控制器端接收該消息后控制機器人完成運動。從上邊的話題列表中,可以找到follow_joint_trajectory,由仿真機器人的控制器插件訂閱。

打開啟動的ur5.launch文件,可以看到以下代碼段:

  1.    <rosparam file="$(find ur_gazebo)/controller/arm_controller_ur5.yaml" command="load"/>   
  2.    <node name="arm_controller_spawner" pkg="controller_manager" type="controller_manager" args="spawn arm_controller" respawn="false" output="screen"/>

控制器管理節(jié)點controller_manager啟動了一個arm_controller插件,該插件的配置可以查看arm_controller_ur5.yaml文件:

  1. arm_controller:
  2.  type:position_controllers/JointTrajectoryController
  3.  joints:
  4.     -shoulder_pan_joint
  5.     -shoulder_lift_joint
  6.     -elbow_joint
  7.     -wrist_1_joint
  8.     -wrist_2_joint
  9.     - wrist_3_joint
  10. constraints:
  11.     goal_time: 0.6
  12.     stopped_velocity_tolerance: 0.05
  13.     shoulder_pan_joint: {trajectory: 0.1, goal: 0.1}
  14.     shoulder_lift_joint: {trajectory: 0.1, goal: 0.1}
  15.     elbow_joint: {trajectory: 0.1, goal: 0.1}
  16.     wrist_1_joint: {trajectory: 0.1, goal: 0.1}
  17.     wrist_2_joint: {trajectory: 0.1, goal: 0.1}
  18.     wrist_3_joint: {trajectory: 0.1, goal: 0.1}
  19. stop_trajectory_duration: 0.5
  20. state_publish_rate:  25
  21. action_monitor_rate: 10

從上邊的配置信息中可以看到,arm_controller是一個JointTrajectory類型的控制器,接收follow_joint_trajectory中的軌跡信息后,完成機器人的運動控制。

 

使用MoveIt!控制UR機器

ROS中類似于UR5這樣的機械臂控制當然離不開MoveIt!,接下來我們就使用MoveIt!實現(xiàn)對gazebo中UR5的控制。

UR5的控制需要通過follow_joint_trajectory這個action接口實現(xiàn),這就需要在MoveIt!端配置一個控制器插件,實現(xiàn)該接口的功能。該插件的配置在ur5_moveit_config中已經(jīng)實現(xiàn),可以查看ur5_moveit_config功能包中的controllers.yaml文件:

  1. controller_list:
  2.  - name:""
  3.   action_ns: follow_joint_trajectory
  4.    type:FollowJointTrajectory
  5.    joints:
  6.      -shoulder_pan_joint
  7.      -shoulder_lift_joint
  8.      -elbow_joint
  9.      -wrist_1_joint
  10.      -wrist_2_joint
  11.      -wrist_3_joint

所以我們并不需要進行任何修改,使用如下命令啟動MoveIt!和rviz,啟動過程會包含所需要的控制器插件:

  1. $ roslaunch ur5_moveit_config ur5_moveit_planning_execution.launchsim:=true
  2. $ roslaunch ur5_moveit_config moveit_rviz.launch config:=true

啟動成功后可以看到如下界面。

image

目前,rviz和gazebo中的UR5應該保持同樣的姿態(tài)。在rviz中使用MoveIt!插件選擇一個運動目標姿態(tài),然后點擊“Plan”。如果可以實現(xiàn)運動規(guī)劃,就會看到如下規(guī)劃軌跡。

image

再點擊“Execute”按鈕,gazebo中的UR5會按照規(guī)劃的軌跡開始運動,rviz中的UR5模型保持同樣的運動姿態(tài),如下圖所示。

image

 

(五十一)——ROS機器人實例 (HRMRP)

HRMRP(Hybrid Real-time Mobile Robot Platform,混合實時移動機器人平臺)是筆者在2012年和實驗室的小伙伴們一起從零開始設計、開發(fā)的一款機器人平臺,其中大部分擴展電路、驅(qū)動和ROS相關的底層功能都是我們自己開發(fā)。該機器人平臺具有軟硬件可編程、靈活性強、模塊化、易擴展、實時性強等特點,機器人的整體結(jié)構(gòu)如下圖所示。

v2-5f7cb0ada206c75b8820610fc9d70e81_hd

HRMRP具備豐富的傳感器和執(zhí)行器,在該平臺的基礎上,可以現(xiàn)了機器人SLAM、自主導航、人臉識別、機械臂控制等功能。

 

總體架構(gòu)設計

HRMRP的總體架構(gòu)如下圖所示。

v2-bf4eafb5f6b25f609ec89cf4e04d56bd_hd

1. 硬件層

(1)機械平臺

HRMRP主體結(jié)構(gòu)為鋁合金材質(zhì),尺寸為316mm ×313mm ×342mm(高×寬×長),裝配兩個驅(qū)動輪與一個萬向輪。驅(qū)動輪由兩個30W的直流電機帶動,轉(zhuǎn)速可達83轉(zhuǎn)/分鐘,機器人最快速度1.5m/s。HRMRP還裝有一個六自由度機械臂,可以完成三維空間內(nèi)的夾取操作。

(2) 控制平臺

嵌入式系統(tǒng)具備小型化、低功耗、低成本、高靈活性等顯著的特點,電子技術的發(fā)展也促使可編程門陣列FPGA在嵌入式系統(tǒng)中得到了越來越廣泛的應用,很大程度上改善了嵌入式系統(tǒng)硬件的靈活度與繁瑣計算的實時化。

HRMRP的控制平臺即基于Xilinx最新一代集成FPGA與ARM的SoC——Zynq。

v2-abf41647865d70878a99c96d7f150ff5_hd

Zynq由處理系統(tǒng)(Processor System,PS)與可編程邏輯(Programmable Logic,PL)兩部分組成。其中PS基于ARM Cortex-A9雙核處理器構(gòu)建,包含常用的外設接口,例如網(wǎng)絡、USB、內(nèi)存控制器等。而PL由Xilinx的7系列FPGA構(gòu)成,支持動態(tài)重配置,可以使用Verilog語言編程。

在HRMRP中,PS通過操作系統(tǒng)控制所有功能正常有序的實現(xiàn),而PL作為協(xié)處理器,一方面可以對復雜運算做并行加速處理,另一方面可以進行I/O接口擴展,為多傳感器和執(zhí)行器設計統(tǒng)一的接口,提高系統(tǒng)硬件配置的靈活性。

(3) 傳感器系統(tǒng)

在機器人核心傳感器的選擇上,HRMRP使用了高性價比、高集成度的微軟Kinect 傳感器。除此還裝配有超聲波、加速度、里程計、陀螺儀等多種傳感器,確保機器人平臺可以采集到豐富的傳感信息。

 

2. 驅(qū)動層

驅(qū)動層的主要工作是采集或預處理硬件層的數(shù)據(jù),下發(fā)操作系統(tǒng)層的指令,為底層硬件與上層功能模塊提供相應的數(shù)據(jù)傳輸通道。由于我們采用“ARM+FPGA”異構(gòu)控制平臺,為配合硬件層功能,驅(qū)動層也分為兩部分,分別放置于硬件的PS端和PL端。

PS端主要驅(qū)動連接到ARM處理器的外設,例如通過PS中的OpenNI驅(qū)動Kinect,并且提供PL端到PS端的接口。而在PL端中,利用可編程硬件的靈活性和并行處理能力,進行I/O擴展與算法的硬件加速,如下圖所示。

v2-4d7903c3afdc0a393c6146dea3584093_hd

在I/O擴展方面,傳統(tǒng)的設計實現(xiàn)中,種類繁多的傳感器、執(zhí)行器對接口的要求各不相同,會占用大量I/O資源,增加處理器的負擔。而在HRMRP的ARM+FPGA系統(tǒng)當中,通過定義一組標準的硬件接口,連接傳感器和電機等外設,可使用編程邏輯取代繁雜的電路連接工作,滿足各種不同需求的硬件外設。

在硬件加速方面,一般來說PS端適合常用接口的驅(qū)動、網(wǎng)絡數(shù)據(jù)的處理等功能,而PL端適合于規(guī)律性的算法處理,在HRMRP中主要負責Kinect的數(shù)據(jù)預處理工作(這里我們將OpenNI中的部分代碼放入FPGA中進行加速)。PS與PL相互配合,提高了系統(tǒng)數(shù)據(jù)處理的實時性。

 

3. 操作系統(tǒng)層

操作系統(tǒng)層是機器人平臺的控制核心,集成了機器人的功能模塊,負責行為控制、 數(shù)據(jù)上傳、指令解析、人機交互等功能。為與ROS通信接口保持一致,使用Ubuntu作為操作系統(tǒng),運行于Zynq的PS端ARM處理器之中。

ROS為用戶的不同需求提供了大小和功能不同的多種安裝包,為了減少ARM端的執(zhí)行壓力,HRMRP編譯移植了僅包括ROS基本通信機制的核心庫。繼承了ROS的優(yōu)勢,機器人平臺具備ROS通信以及功能包運行的能力,與上層網(wǎng)絡指令無縫連接,結(jié)合開源軟件庫,極大地豐富了機器人的功能模塊與應用范圍。

HRMRP是一種較為典型的高性能、低成本機器人平臺。與現(xiàn)在研究和應用中使用較為廣泛的TurtleBot、Pioneer等機器人相比,HRMRP具有相似的結(jié)構(gòu)與尺寸,同樣可以完成多種多樣的機器人應用;但是在接口的可擴展性、傳感器的豐富度以及成本控制等方面,具備更好的綜合性能。

 

SLAM與導航

在以上架構(gòu)的基礎上實現(xiàn)每個模塊的具體功能,系統(tǒng)運行狀態(tài)下的數(shù)據(jù)流圖如下圖所示。

v2-b0c051d8818beca0dff52a9fcdd07367_hd

HRMRP在室內(nèi)環(huán)境下的SLAM建圖效果如下圖所示。

v2-39d94942f73e023487f3fe777346425d_hd

基于SLAM建立的地圖完成導航的效果如下圖所示。v2-1a6bd3b3162184890f65a1d39169e2f3_hd

 

多機器人擴展

ROS作為一個分布式框架,從微觀的角度講,分布式體現(xiàn)在節(jié)點的布局和配置上,而從宏觀的角度講,這種分布式可以體現(xiàn)在多機器人、多主機集成的系統(tǒng)當中。在HRMRP機器人的基礎上,我們試圖提出一種多機器人實現(xiàn)的框架,如下圖所示。

v2-cae881cfad42bd58fc81bc11319f9751_hd

由于機器人架構(gòu)多種多樣,處理應用的能力也各不相同,在不同場合下的需求也有差異,我們設計了服務器層來提高機器人應用的計算能力,負責調(diào)度、分配多機器人應用中的任務,同時為用戶提供友好、易用的人機交互界面。

分布的機器人節(jié)點與服務器都采用ROS框架設計,使用無線網(wǎng)絡通信,可以快速集成ROS社區(qū)中豐富的應用功能。在多機器人系統(tǒng)當中,通過機器人之間的信息共享和與任務協(xié)作,可以讓每個機器人在充分發(fā)揮自己能力的同時,獲得更多額外的應用潛力。

機器人節(jié)點是應用的執(zhí)行者與信息的采集者。在該系統(tǒng)中可以集成多種采用ROS框架的機器人,這里以HRMRP機器人平臺為例,針對多機器人的框架也進行了測試,除HRMRP機器人之外,還使用樹莓派制作了一個簡單的小型機器人。

在實驗中,HRMRP機器人在地圖上自主導航前進,服務器負責應用的處理與顯示,同時將HRMRP的位置信息轉(zhuǎn)發(fā)給樹莓派機器人;樹莓派機器人收到信息后,緊跟HRMRP,效果如下圖所示。

v2-b58ffb446759ba3a5882fdb87f8a0ba0_hd

 

(五十二)—— MoveIt!中的運動學插件

MoveIt!是ROS中一個重要的集成化開發(fā)平臺,由一系列移動操作的功能包組成,提供運動規(guī)劃、操作控制、3D感知、運動學等功能模塊,是ROS社區(qū)中使用度排名前三的功能包,目前已經(jīng)支持眾多機器人硬件平臺。

1

MoveIt!中的眾多功能都使用插件機制集成,其中有一個重要的功能模塊——運動學插件。

2

今天我們就來聊下MoveIt!中的運動學求解器。

 

一、KDL

Kinematics and Dynamics Library (KDL)是MoveIt!中的默認運動學插件,在使用MoveIt! Setup Assistant進行模型配置時,可以進行配置。

3

配置完成后,就可以運行demo.launch控制虛擬機械臂進行運動規(guī)劃了。但是KDL有自己的優(yōu)缺點:

4

比如一次逆解的求解時間:0.062192秒。。。

5

很多時候我們在做運動規(guī)劃的時候,MoveIt!經(jīng)常會提示規(guī)劃失敗、求解失敗等錯誤,很多都是因為KDL這款運動學插件導致的,那么問題就來了——能不能更換一個運動學插件?

當然可以,以下介紹兩個用的最多的運動學插件:TRAC-IK和IKFAST。

 

二、TRAC-IK

TRAC-IK和KDL類似,也是一種基于數(shù)值解的運動學插件,但是在算法層面上進行了很多改進,求解效率高了很多。比如在下邊這張圖中,左側(cè)的紅點是KDL無法求解的姿態(tài)點,但是在右側(cè)使用TRAC-IK是可以求解的。

6

那么如何將KDL更換成TRAC-IK呢,方法很簡單,ROS的軟件源中已經(jīng)集成了TRAC-IK的安裝包,可以直接使用以下命令安裝:

  1. sudo apt-get install ros-kinetic-trac-ik-kinematics-plugin

然后修改機械臂MoveIt!配置功能包下的kinematics.yaml文件就可以使用啦:

  1. arm:
  2.   kinematics_solver: trac_ik_kinematics_plugin/TRAC_IKKinematicsPlugin
  3.   kinematics_solver_attempts: 3
  4.   kinematics_solver_search_resolution: 0.005
  5.   kinematics_solver_timeout: 0.05

接下來再次運行demo.launch,默認加載的就是TRAC-IK運動學插件了,試試規(guī)劃求解的效率是不是高了很多!

但是TRAC-IK也有問題,它是一種數(shù)值算法,每次求解得到的關節(jié)位置不一定相同。

 

三、IKFAST

IKFAST是一種基于解析算法的運動學插件,可以保證每次求解的一致性。

7

相比KDL和TRAC-IK,IKFAST的安裝過程就比較復雜了,不過就筆者的使用經(jīng)驗來講,IKFAST的效果還是很推薦的,所以不妨一試,以下就是IKFAST的安裝配置過程。

  • 安裝程序:

  1. sudo apt-get install cmake g++ git ipython minizip python-dev python-h5py python-numpy python-scipy qt4-dev-tools
  • 安裝依賴庫:

  1. sudo apt-get install libassimp-dev libavcodec-dev libavformat-dev libavformat-dev libboost-all-dev libboost-date-time-dev libbullet-dev libfaac-dev libglew-dev libgsm1-dev liblapack-dev liblog4cxx-dev libmpfr-dev libode-dev libogg-dev libpcrecpp0v5 libpcre3-dev libqhull-dev libqt4-dev libsoqt-dev-common libsoqt4-dev libswscale-dev libswscale-dev libvorbis-dev libx264-dev libxml2-dev libxvidcore-dev
  • 安裝OpenSceneGraph-3.4:

  1. sudo apt-get install libcairo2-dev libjasper-dev libpoppler-glib-dev libsdl2-dev libtiff5-dev libxrandr-dev
  2. git clone https://github.com/openscenegraph/OpenSceneGraph.git --branch OpenSceneGraph-3.4
  3. cd OpenSceneGraph
  4. mkdir build; cd build
  5. cmake .. -DDESIRED_QT_VERSION=4
  6. make -j$(nproc)
  7. sudo make install
  • 安裝sympy

  1. pip install --upgrade --user sympy==0.7.1
  • 刪除mpmath

  1. sudo apt remove python-mpmath
  • 安裝IKFast功能包

  1. sudo apt-get install ros-kinetic-moveit-kinematics
  • 安裝OpenRave

  1. sudo apt-get install ros-kinetic-openrave
  • 創(chuàng)建collada文件

  1. export MYROBOT_NAME="marm"
  2. rosrun xacro xacro --inorder -o "$MYROBOT_NAME".urdf "$MYROBOT_NAME".xacro    
  3. rosrun collada_urdf urdf_to_collada "$MYROBOT_NAME".urdf "$MYROBOT_NAME".dae<br></font>

  • 創(chuàng)建dae文件

  1. export IKFAST_PRECISION="5"
  2. cp "$MYROBOT_NAME".dae "$MYROBOT_NAME".backup.dae # create a backup of your full precision dae.
  3. rosrun moveit_kinematics round_collada_numbers.py "$MYROBOT_NAME".dae "$MYROBOT_NAME".dae "$IKFAST_PRECISION"
  • 查看生成的模型

  1. openrave-robot.py "$MYROBOT_NAME".dae --info links

8

  1. openrave "$MYROBOT_NAME".dae

9

  • 生成六軸機器人配置

  1. export PLANNING_GROUP="arm"
  2. export BASE_LINK="1"
  3. export EEF_LINK="11"
  4.  
  5. export IKFAST_OUTPUT_PATH=`pwd`/ikfast61_"$PLANNING_GROUP".cpp
  6.  
  7. python `openrave-config --python-dir`/openravepy/_openravepy_/ikfast.py --robot="$MYROBOT_NAME".dae --iktype=transform6d --baselink="$BASE_LINK" --eelink="$EEF_LINK" --savefile="$IKFAST_OUTPUT_PATH"
  • 創(chuàng)建插件

  1. export MOVEIT_IK_PLUGIN_PKG="$MYROBOT_NAME"_ikfast_"$PLANNING_GROUP"_plugin
  2. cd ~/catkin_ws/src
  3. catkin_create_pkg "$MOVEIT_IK_PLUGIN_PKG"
  4. rosrun moveit_kinematics create_ikfast_moveit_plugin.py "$MYROBOT_NAME" "$PLANNING_GROUP" "$MOVEIT_IK_PLUGIN_PKG" "$IKFAST_OUTPUT_PATH"
  • 重新編譯工作空間

  1. catkin_make
  • 修改使用的插件

  1. rosed "$MYROBOT_NAME"_moveit_config/config/kinematics.yaml
  2.  
  3. <planning_group>:
  4. kinematics_solver: <myrobot_name>_<planning_group>_kinematics/IKFastKinematicsPlugin
  5. -INSTEAD OF-
  6. kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin

注意以上步驟中的機器人名稱、運動規(guī)劃組名稱、坐標系序號等需要和自己所使用的機器人匹配,也可以參考官方教程配置:

http://docs./kinetic/api/moveit_tutorials/html/doc/ikfast/ikfast_tutorial.html

現(xiàn)在運行demo.launch文件時,使用的運動學插件就是IKFAST了,快試一試效果是不是還不錯!


(五十三)—— ROS與VREP的集成

VREP( Virtual Robot Experimentation Platform)是一款瑞士軍刀級的機器人仿真軟件,包含的功能眾多,而且使用方便,在各種系統(tǒng)下都有相應的安裝文件。

今天我們就來看看如何將ROS和vrep集成,把兩個強大的平臺結(jié)合到一起。

版本設定:Ubuntu16.04 + ROS Kinetic + vrep3.4

 

一、下載vrep

第一步當然是下載vrep軟件啦!

登錄vrep官網(wǎng):http://www./downloads.html

找到相應版本的下載地址,然后選擇Linux版本即可下載。這里選擇的是3.4版本。

image

下載完成后的vrep是一個壓縮文件,解壓該文件后,放置到home路徑下(可自定義),重命名為vrep。

ubuntu下的vrep不需要特意安裝,直接在終端下運行如下命令即可啟動:

  1. $ cd vrep
  2. $ ./vrep.sh

啟動成功的界面如下圖所示:

image

 

二、配置ROS接口

vrep提供了一個ROS接口——RosInterface,使用ROS插件搭建了一座vrep和ROS之間的橋梁,其原理如下:

image

不過該插件需要通過編譯四個功能包來生成。

創(chuàng)建一個單獨的工作空間,將 vrep/programming/ros_packages路徑下的四個功能包拷貝到工作空間下,或者使用如下命令下載這四個功能包:

  1. $ git clone https://github.com/CoppeliaRobotics/ros_bubble_rob2
  2. $ git clone https://github.com/CoppeliaRobotics/vrep_skeleton_msg_and_srv.git
  3. $ git clone https://github.com/CoppeliaRobotics/vrep_plugin_skeleton.git
  4. $ git clone --recursive https://github.com/CoppeliaRobotics/v_repExtRosInterface.git

然后在終端設置vrep的路徑,并且編譯工作空間

  1. $ export VREP_ROOT=~/path/to/v_rep/folder
  2. $ catkin build

編譯成功后,在/deve/lib/下找到以下兩個庫,拷貝到vrep根路徑下即可。

image

 

三、啟動vrep

ROS與vrep集成的配置工作已經(jīng)完成,接下來就可以啟動系統(tǒng)啦。

使用如下命令啟動ros master和vrep:

  1. $ roscore
  2. $ ./vrep.sh

在啟動vrep的終端中應該可以看到如下RosInterface加載的日志提示:

image

這個時候vrep和ROS已經(jīng)連接成功,不信可以打印當前系統(tǒng)的話題看看:

image

vrep接口相關的話題赫然在目。

 

四、集成測試

最后就進入到激動人心的測試環(huán)節(jié)了。vrep中已經(jīng)自帶了幾個測試例程。

先來加載第一個仿真場景:

image

然后在顯示區(qū)會出現(xiàn)很多五顏六色的模型,點擊工具欄中的開始按鍵,啟動仿真。vrep場景中的會仿真一個攝像頭,并且發(fā)布圖像話題,在ROS中打開rqt_image_view,訂閱圖像話題,看看是不是已經(jīng)有圖像出現(xiàn)啦!

image

這里存在一個數(shù)據(jù)流的問題,導致vrep和ROS中的圖像是相反的,可以在vrep端發(fā)布數(shù)據(jù)或者ROS端訂閱數(shù)據(jù)時,對圖像數(shù)據(jù)做一個倒置處理,即可解決問題。

從這個例程中,我們可以看到vrep中的數(shù)據(jù)可以順利通過RosInterface發(fā)送到ROS端。

接下來將ROS端的數(shù)據(jù)發(fā)送到vrep,一樣需要加載仿真場景:

image

場景中有幾個可愛的小機器人,每個機器人對應于一個數(shù)據(jù)來源。開始仿真后,其他幾個機器人就開始活躍起來,唯獨下圖中的紅色機器人紋絲不動。

image

從機器人旁邊的提示可以看到,“小紅”需要通過ROS節(jié)點來控制。這讓我們想起了ROS中的小海龜。

查看當前ROS系統(tǒng)的話題列表:

image

和小海龜訂閱的Twist消息不同,“小紅”訂閱了兩個話題,分別對應于兩個驅(qū)動電機的速度,在終端中發(fā)布如下命令,即可控制“小紅”移動,差速就要自己來控制啦。

  1. $ rostopic pub /leftMotorSpeed2084567 std_msgs/Float32 "data: 1.0"
  2. $ rostopic pub /rightMotorSpeed2084567 std_msgs/Float32 "data: 0.5"

OK!今天就測試到這里,后續(xù)我們再進一步通過ROS控制vrep中的機器人實現(xiàn)仿真。

 

注:以上內(nèi)容,也可以查看vrep自帶的幫助文檔:/vrep/helpFiles/en/rosTutorial.htm


(五十四)—— ROS機器人開發(fā)案例(附ppt)

8月1日晚,古月君在深藍學院的的公開課平臺,和大家一起聊了下ROS機器人開發(fā)的相關案例,主要結(jié)合自身機器人開發(fā)經(jīng)驗,從機器人系統(tǒng)組成、移動機器人開發(fā)案例和機械臂開發(fā)案例等三個方面,介紹了古月君是如何將ROS應用于機器人項目開發(fā)的。

 

公開課的全部內(nèi)容可以免費回看,有興趣的小伙伴可以訪問課程網(wǎng)站:

http://www./open/course/13

 

另外古月君主講的《機器人操作系統(tǒng)ROS理論與實踐》第二期課程也在火熱進行中,同樣可以在深藍學院的機器人課程中找到:

http://www./course/92

 

以下是8月1日晚公開課的ppt內(nèi)容,供各位參考。

 

幻燈片1幻燈片2幻燈片3幻燈片4幻燈片5幻燈片6幻燈片7幻燈片8幻燈片9幻燈片10幻燈片11幻燈片12幻燈片13幻燈片14幻燈片15幻燈片16幻燈片17幻燈片18幻燈片19幻燈片20幻燈片21幻燈片22幻燈片23幻燈片24幻燈片25幻燈片26幻燈片27幻燈片28幻燈片29幻燈片30幻燈片31幻燈片32幻燈片33幻燈片34幻燈片35幻燈片36幻燈片37幻燈片38幻燈片39幻燈片40幻燈片41幻燈片42幻燈片43幻燈片44幻燈片45幻燈片46幻燈片47幻燈片48幻燈片49幻燈片50幻燈片51幻燈片52幻燈片53幻燈片54幻燈片55幻燈片56幻燈片57幻燈片58幻燈片59幻燈片60幻燈片61幻燈片62幻燈片63幻燈片64幻燈片65幻燈片66幻燈片67幻燈片68幻燈片69幻燈片70幻燈片71幻燈片72

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    香蕉网尹人综合在线观看| 亚洲一区二区三区四区性色av | 亚洲综合色在线视频香蕉视频| 国产日韩欧美国产欧美日韩 | 精品午夜福利无人区乱码| 免费大片黄在线观看国语| 成人精品日韩专区在线观看| 久久大香蕉精品在线观看| 日韩黄片大全免费在线看| 人妻一区二区三区多毛女| 99久免费精品视频在线观| 亚洲国产另类久久精品| 中文字幕五月婷婷免费| 日韩在线视频精品中文字幕| 五月天丁香婷婷一区二区| 九九热精彩视频在线播放| 免费观看日韩一级黄色大片| 免费一区二区三区少妇| 婷婷一区二区三区四区| 日本和亚洲的香蕉视频| 亚洲黄香蕉视频免费看| 日韩精品综合免费视频| 亚洲人午夜精品射精日韩| 在线懂色一区二区三区精品| 精品人妻一区二区三区四区久久| 亚洲国产丝袜一区二区三区四| 视频一区二区 国产精品| 老熟妇乱视频一区二区| 少妇人妻中出中文字幕| 久热在线视频这里只有精品| 日本人妻丰满熟妇久久| 亚洲午夜福利不卡片在线| 成人免费视频免费观看| 亚洲最新一区二区三区| 日本男人女人干逼视频| 亚洲中文在线观看小视频 | 中文字幕在线区中文色| 国产欧美日韩在线一区二区| 日韩精品你懂的在线观看| 精品日韩av一区二区三区| 亚洲伊人久久精品国产|