當前位置: 華文問答 > 數位

機械臂是怎麽保證速度平滑且位置精確的?

2016-12-16數位

最近論文間隙,帶著師弟們寫了個業余的計畫。最初的想法是為了避免我們在做 robot learning from demonstration 的過程中重復造輪子,寫著寫著變成了 做大做強,再創輝煌, 所以就有了把示教學習從頭實作到尾的沖動。也就是從多模態數據采集開始、到示教數據的表征學習、再到機器人的軌跡生成和控制,最後再來一個仿真器輕松驗證軌跡就完美了。

Rofunc Package

先上repo的連結

軌跡規劃

至於題主所問的 機械臂是怎麽保證速度平滑且位置精確的 ,答案就在上圖的藍色部份。我們使用的是我們的合作夥伴 Sylvain Calinon 老師的 LQT (Linear Quadratic Tracking ) iLQR (iterative Linear Quadratic Regulator) 系列。Calinon 老師是一個硬核的大佬,最近搞了個repo專門針對機器人的軌跡規劃與最佳化控制問題,不過可惜的是只給出了2D example,適合教學使用。

而我們的rofunc呢,則是摸著Calinon老師過河,旨在開發簡單易用、且能夠直接用在真實機器人上的API。那麽對於 機械臂是怎麽保證速度平滑且位置精確的 ,我們的解決方案真是簡潔又美觀

import rofunc as rf via_points = ... u_hat , x_hat , mu , idx_slices = rf . lqt . uni ( via_points ) rf . lqt . plot_3d_uni ( x_hat , mu , idx_slices , ori = False , save = False )

我還貼心地在package中打包了 test data,例如

import rofunc as rf import numpy as np from importlib_resources import files via_points = np.load(files('rofunc.data.LQT_LQR').joinpath('rolling_pin_1.npy')) filter_indices = [0, 1, 5, 10, 22, 36] via_points = via_points[filter_indices]u_hat, x_hat, mu, idx_slices = rf.lqt.uni(via_points) rf.lqt.plot_3d_uni(x_hat, mu, idx_slices, ori=False, save=False, for_test=True)

簡單來講,LQT根據幾個via-point poses,可以生成指定時間間隔、指定長度、且可指定狀態變量維度(x or [x, dx] or [x, dx, ddx])的軌跡,滿足實際機器人的平滑軌跡需求,而不至於如題主所說需要在每兩個via-points之間來一回加速減速。這是透過設計一個兼顧跟蹤損失和控制損失的cost function來實作的,所以就會呈現出平滑且精確追蹤指定路徑點的效果。至於其具體原理已經被我結合程式碼放在了package的documentation裏,這裏就不贅述了。

我們還提供了仿真環境以驗證軌跡

相關程式碼見

Rofunc裏還有很多LQT,iLQR的變種,感興趣的小夥伴可以自行探索。目前Rofunc還處於v0.0.0.9的初級版本,還有很長的路要走,同時我也有很多關於機器人的有趣的知識需要學習,所以歡迎各位在github上多多提issue( 當然也要多多star哦 ),助力我們共同進步。

10.28 更新

Rofunc 文件上新了!

我們在 Quick start 中以一個簡單卻有趣的小例子( 從人類示教中學習太極雲手 ),展示了 Rofunc package 的全流程示教學習 pipeline,並將其部署在我們 lab 自主設計搭建的雙臂類人機器人 CURI 上。

從人類示教中學習太極雲手 https://www.zhihu.com/video/1569302987662635008

太極雲手 task 相關的 paper 已經在投 T-Mech,相關的真機實驗視訊會在中稿之後放出(期待能中)。當然這篇論文肯定不止 LfD 這麽簡單,主要是關於 whole-body adaptive impedance controller,不過這就超出本文範疇了。

2023.05.16更新

上面的常式已經被全面更新了,還增加了很多其他的examples,歡迎大家參考 example gallery 使用rofunc,並提出寶貴意見!