說一下我的理解。
根據 Robotics:Modelling, Planning and Control 書中的分類,機器人編程分為四個級別:任務級,動作級,初始級,伺服級。下面舉例簡單說明一下。
目前的工業機器人控制器編程主要是基於「MOVE」指令,主要的指令有三個:MoveL(直線運動),MoveC(圓弧運動),MoveJ(關節運動)。在編程的時候,需要先有目標點的位置,然後運用這些MOVE指令將點連線起來,實作期望的運動軌跡規劃動作,完成相應任務。
比如,現在的任務是使機械臂拿起位於A點的瓶子,然後放到B點。那麽首先需要知道A、B兩個點的位置,然後A、B點之間一個中間點C的位置。機械臂末端先從當前位置O運動到A點,拿起瓶子,然後經過中間點C移動到B,放下瓶子,最後返回初始點O,那麽程式可能如下:
MoveJ A; //關節運動到A點;
Pick up bottle;
MoveC C,B; //從A點經中間點C圓弧運動到B;
Drop bottle;
MoveJ O; //返回初始點O;
這段程式碼,便是「動作級」的指令 。程式碼詳細規定了在完成「拿起位於A點的瓶子,然後放到B點」這個任務中,機械臂末端需要走的軌跡是什麽。在真實的編程中,還需要給定每一段軌跡的速度、轉彎區等參數。
控制系統得到了這段「動作級」指令之後,便開始「初始級」的規劃。 具體來說就是插值計算出直線、圓弧軌跡上的點,根據機械臂的動力學模型(如果有的話)對運動軌跡進行速度、加速度的規劃和限制等等,最後產生能夠輸入伺服系統的資訊(一般來說是每個時間周期各個關節電機的目標角度或目標力矩)。
最後就是「伺服級」的控制 。伺服系統得到了先前步驟計算得到的結果,伺服驅動各個關節的電機運動。
實作上述流程對編程人員來說還是很辛苦的。首先,要想知道A、B點準確的位置,需要去示教,即便是使用離線的仿真平台,也存在著和實際情況有偏差、需要標定的問題;其次,如果機械臂當前位置和A點中間有障礙,或A、B點中間有障礙,那麽上述程式碼恐怕就不夠了,編程人員需要示教更多的點避開那些障礙,程式碼和軌跡都會變得更復雜,可能變成如下模樣:
MoveL A0;
MoveL A1;
……
MoveL A; //經過若幹中間點到達A點
Pick up bottle;
MoveL B0;
MoveL B1;
……
MoveL B; //經過若幹中間點到達B點
Drop bottle;
MoveL O0;
MoveL O1;
……
MoveL O; //經過若幹中間點返回O點
更極端的情況下,如果A、B的位置都在變化、甚至障礙的位置也在變化,那麽用這種預先寫好程式碼的方式控制就無能為力了。
現在,為了解決上述問題,假如能為機械臂配備上視覺系統,以及其他感知環境的傳感器,那麽,機器人控制系統能即時的得到環境的資訊了,也就是A、B點、瓶子、障礙物的資訊。有了這些資訊,先進的規劃演算法能夠智能規劃出機器人到達目標點、並且避開沿途障礙物的軌跡,並且在整個過程中都能對突發的情況作出反應並處理。
當上述功能實作了,也就能做「任務級」的編程了,很可能就是一行程式碼:
Put bottle on B;
這行程式碼輸入以後,控制系統能自動即時的辨識瓶子、B點,並自主規劃任務中間的路徑等工作,完成動作級及以下的環節。
是不是很amazing!
目前這方面工作比較靠前的是mujin,
Robot Intelligence for Industrial Automation
仿真環境是 OpenRave 。
------------------------------------------------------------------
@馮jungle
以下例子是我個人理解,如有不對的地方請各位大神指教
假設一個場景:有一個周末,你爸在沙發上看電視,你媽在打掃衛生,你在臥室玩電腦。這時,你爸突然叫你:「給我倒一杯水來。」
這便是給你下達了一個「任務級」的指令。
接到這個非常抽象的任務指令之後,你的大腦智能的將這條指令分解規劃成以下動作:從當前所在的臥室走到飲水機處——拿起飲水機旁的杯子——接水——從飲水機處走到你爸坐的沙發邊——將水杯遞給你爸——返回臥室。
這個過程,就是將抽象的任務級指令分解為動作級指令。然後你就控制身體開始行動,這個部份就是初始級和伺服級的工作了。
所以你說的沒錯,「task則是由skill按照序列組合的一個skill集合」,動作級指令的序列合起來構成了需要完成的任務。
但是,事情沒那麽簡單。要完成這個任務,你至少要做到如下幾點:
1、 知道飲水機在哪兒;
2、 知道杯子就在飲水機旁邊,否則需要重新規劃路徑;
3、 知道你爸在哪兒;
4、 知道你家的整體布局;
5、 行動過程中能即時看到真實環境,因為你媽在打掃衛生的時候很可能移動了家裏桌椅板凳的位置,而且她會一直在你的行動路徑上穿梭。
先來看前四條。因為你的大腦是個智能系統,能自行辨識和處理這些資訊;但如果不行,你對這些資訊一無所知,也沒有智能系統,那就需要「人工示教」了:
首先,你爸要告訴你水機的位置、告訴你杯子就在水機旁邊以及他的沙發的位置,這就是示教工作;然後,由於你無法處理抽象的任務級指令,你爸只能下達詳細的動作級指令:「從臥室出門右轉走十步到飲水機處拿旁邊的杯子接水然後左轉走十步走到沙發這裏把水杯給我再按照原路回你的臥室。」
這個情況太極端了,一般人不會弱到這個程度(但目前的工業機器人就是弱到這個程度)。一個可能的情況是你爸媽搬了新家以後你是第一次回去,所以只是對具體物品的位置不熟悉,那麽當你接收了你爸的「任務級」指令以後,他只需要向你「示教」前三條資訊,那麽你自己就可以完成之後的工作了。
可見,你的智能等級越高,需要人工示教的東西就越少,按人的等級來說基本是不需要什麽示教的。但是,一個能執行「任務級」指令的系統可能也需要示教,只不過這個示教工作可能被之後系統智能的提升取代掉。
至於離線和線上編程,就和這個例子中的第五條有關了。如果你是透過「離線編程」,並且在「離線狀態」下執行這個任務級指令,就相當於先蒙上你的眼睛,然後給你下達了接水任務,這時其實你是知道該怎麽做的(已離線規劃好),但是你不知道你走的過程中會不會碰上被你媽暫時改變了位置的桌椅板凳、甚至直接和你媽撞上,因為你無法獲取環境資訊,只能靠你腦子中之前儲存的「離線資訊」工作,這就有可能出問題。但是,如果你媽沒在打掃衛生,真實環境和之前是一樣的,那麽你即便是處於蒙上眼睛的「離線狀態」,也能完成任務。
而如果你是在「線上狀態」下執行指令,就和一個正常人一樣了,你既可以執行「任務級」指令,也可以執行「動作級」指令,重要的是你能即時感知執行過程中環境的資訊並做出相應的反應。
因此,一個能執行任務級指令的系統可以是離線編程、離線執行的系統;只不過一個優秀的、真正智能的任務級系統,也需要是一個感知環境並做出反應的即時系統。