最近论文间隙,带着师弟们写了个业余的项目。最初的想法是为了避免我们在做 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,并提出宝贵意见!