当前位置: 华文问答 > 数码

机械臂是怎么保证速度平滑且位置精确的?

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,并提出宝贵意见!