双足机器人重心在头部_为什么有些双足机器人能像人一样直立行走,还不容易倒?...

编者按:此前,深圳湾(微信公众号 ID:shenzhenware)报道过能直立行走的拟人步态机器人 DURUS ,至于类似的行走机器人,当然还有大家熟悉的波士顿动力 Altas。要让机器人实现直立行走,不仅要有底层可靠的硬件基础,还要有上层成熟的软件技术,而机器人行走所涉及的平衡算法是其中重要的一部分。本文主要介绍双足平衡的主流算法——基于 ZMP 的动态步行,本文作者系一名机器人专业在读研究生——龚睿。

双足机器人涉及的平衡算法比较多,例如「增量式模糊控制 PD 控制算法」,「机器学习算法」等,本文主要侧重于介绍一种应用于复杂地形(带有倾斜角度的或表面不均匀的落脚面)的平衡算法。

双足机器人的平衡控制都经历过哪些阶段?

在最开始,双足机器人使用的平衡控制策略是「静态步行」(static walking)。这种策略的特点是:机器人步行的过程中,重心(COG,Center of Gravity)的投影始终位于多边形支撑区域(support region)内,这种控制策略的好处在于:机器人可以在行走动作中停止而不摔倒,但代价是行动速度非常迟缓(每一步需要花费10 秒甚至更长,因为需要保持重心的投影始终位于支撑区域,否则将不稳定)。

· 图 1:静态步行

因为静态步行和人类的期望相差甚远,于是人类开发出来了另一种步行平衡策略——「动态步行」(dynamic walking)。在动态步行中,机器人的行动速度被提升至了每步不超过 1 秒。但其弊端也是显而易见的,机器人难以在运动的状态下立即停顿(惯性的作用),从而使得机器人在状态转换的过程中变得不稳定。

为了解决惯性带来的影响,零力矩点(ZMP,zero moment point)被引入到了这一控制策略中。在单脚支撑相中,ZMP=COG。其好处在于,当 ZMP 严格的存在于机器人的支撑区域中,机器人则绝对不会摔倒。

· 图 2:引入了 ZMP 的动态步行

双足平衡的主流——基于 ZMP 的动态步行

现在双足平衡的主流是用基于 ZMP 的动态步行。从上述的基本内容来看,双足机器人的一条腿就可以抽象成控制系统中最基本的「倒立摆」模型。

· 图 3:倒立摆模型

可以推导出机器人的一条腿的正向 ZMP 动力学公式为:

· 图 4:正向 ZMP 动力学公式,其中:Xzmp 代表正向 ZMP,Xmc 代表质量中心的前进位移,l 是倒立摆的长度,g 是重力加速度。

由于复杂地形的双足平衡无法由单一的控制器实现,所以多个控制器的切换策略被用于解决平衡问题。在这一个策略中,机器人的行走被设定为一个周期(cycle)每一个周期被分成了不同的行走阶段(stage),如下图所示:

· 图 5:双足机器人的行走周期和行走阶段

图中的 1 - 4 阶段是一个周期。而在第 2 和第 4 阶段可以发现,在这两个阶段中,机器人的 SSP 与 DSP 发生了「共存」,即同时存在状态。

在一般的双足平衡的算法中包含了三种控制策略:

A.实时平衡控制策略(real-time balance control strategy)

B.步行模式控制策略(walking pattern control strategy)

C.行动预测控制策略(predicted motion control strategy)

基于不同策略的不同目的,每一种控制策略都包含了多种在线控制器(online controller),下面将分述每一种策略的任务及使用的控制器:

A.实时平衡控制策略

控制器 1:阻尼控制器(Damping controller)。

目的:在 SSP 模式下,消除机器人上半身的振动。作用阶段:1、3 全阶段;2、4 中的 SSP 阶段。

控制器 2:ZMP 补偿器(ZMP compensator)。

目的:保持机器人骨盆关节(如图6所示)在动态运动中水平方向的平衡。作用阶段:1、3全阶段;2、4 中的 SSP 阶段。

· 图 6:机器人的骨盆(pelvis)关节示意图

控制器 3 :软着陆控制器(Soft landing controllers)。

目的:吸收机器人脚着陆时的撞击,调节机器人脚与着陆区的接触面。作用阶段:2、4 中的 DSP 阶段。

B.步行模式控制策略

控制器 1:骨盆摇摆振幅控制器(Pelvis swing amplitude controller )。

目的:补偿机器人骨盆关节侧部摇摆振幅。作用阶段:2、4 中的 DSP 阶段。

控制器 2:躯干俯仰角/侧倾角控制器(Torso pitch/roll controller ) 。

目的:补偿骨盆关节的中心位置相对于躯干的俯仰角/侧倾角摇摆。作用阶段:2、4 中的 DSP 阶段。

C.行动预测控制策略

控制器 1:过倾斜控制器(Tilt over controller )

目的:补偿机器人踝关节轨迹,以避免机器人在压延方向上的过倾斜。作用阶段:1、3 全阶段。

控制器 2:着陆位姿控制器(Landing position controller ) 。

目的:避免机器人脚着陆时造成的不稳定。作用阶段:2、4全阶段。

然而,一般的双足平衡算法无法解决地形不均匀或地形倾斜的问题,因此,在地形不均匀或地形倾斜这种复杂环境中,一些新的控制需要被引入:

A1.直立姿态控制器(Upright Pose Controller )

这种控制器可以使机器人在倾斜地形中始终保持直立姿势,从而保持整个机体的平衡。对于双足机器人而言,倾斜地形的「全局倾斜角」的测量就显得尤为重要。一般采用的测量方法是在机器人的躯体内部安装一个 2 轴的加速度计,再加上一个低通滤波器就可以构成一个倾斜计。

对于机器人的俯仰姿态控制,在规定的踝关节轨迹上,直立姿态控制器附加了含有俯仰误差的 PI 控制器:

直立姿态控制器则可由下列等式实现:

图 7 更加直观的反映出了使用控制器之前与之后的俯仰控制平衡性差异:

· 图 7

图 8 显示了使用控制器之前与之后的侧倾控制平衡性差异:

· 图 8

后记

以上介绍的是一种应用于复杂地形平衡控制算法,另外也有一些没有利用 ZMP 传感器进行平衡控制的机器人,比如,德国航空航天局下属的机器人学和机电学研究所(Institute of Robotics and Mechatronics)在 2011 年发布的一款名为「DLR」的机器人,与一般基于 ZMP 的双足机器人不同,DLR 依赖于力矩调节控制算法,这种算法可以计算上述平衡策略中所需的力和力矩,从而抵消外界扰动。

· 图 9:DLR

相信很多人对美国波士顿动力的网红机器人——Altas 的控制算法感兴趣,但鉴于 Altas 的应用涉及到军工行业,波士顿动力所公开的资料也非常少,我们也无从得知。

本文系技术分析类文章,欢迎有技术背景的读者点评和参与讨论,也欢迎非技术背景的读者围观评论和点赞。

责任编辑:林亿转载、约稿、投稿、团队报道请联系微信公众号:shenzhenware(回复关键字)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的双足机器人周期行走MATLAB程序: ```matlab % 定义机器人参数 L1 = 0.15; % 上腿长度 L2 = 0.2; % 下腿长度 w = 0.2; % 身体宽度 g = 9.81; % 重力加速度 T = 1; % 周期 % 定义步态参数 step_length = 0.2; % 步长 step_height = 0.05; % 步高 step_num = 6; % 步数 swing_time_ratio = 0.4; % 摆动相时长比例 stance_time_ratio = 1 - swing_time_ratio; % 支撑相时长比例 % 初始化状态 t = linspace(0, T, 500); theta1 = zeros(size(t)); theta2 = zeros(size(t)); x = zeros(size(t)); y = zeros(size(t)); vx = zeros(size(t)); vy = zeros(size(t)); ax = zeros(size(t)); ay = zeros(size(t)); % 计算步态轨迹 for i = 1:step_num % 计算每步的起始点和结束点 x_start = (i-1) * step_length; x_end = i * step_length; y_offset = (mod(i, 2) - 0.5) * step_height; % 计算每步的支撑相和摆动相时长 stance_time = stance_time_ratio * T / step_num; swing_time = swing_time_ratio * T / step_num; % 计算每步的支撑相轨迹 t_stance = linspace(0, stance_time, 100); x_stance = linspace(x_start, x_end, 100); y_stance = y_offset * ones(size(x_stance)); % 计算每步的摆动相轨迹 t_swing = linspace(0, swing_time, 100); x_swing = linspace(x_end, x_end + step_length, 100); y_swing = y_offset + step_height * sin(pi * t_swing / swing_time); % 合并每步的轨迹 x(i*200+1:(i+1)*200) = [x_stance, x_swing]; y(i*200+1:(i+1)*200) = [y_stance, y_swing]; end % 计算机器人状态 for i = 1:length(t) % 计算机器人位置和速度 x_robot = x(i); y_robot = y(i); vx_robot = (x(i+1) - x(i)) / (t(i+1) - t(i)); vy_robot = (y(i+1) - y(i)) / (t(i+1) - t(i)); % 计算机器人加速度 Fx = 0; Fy = -g; ax_robot = Fx; ay_robot = Fy; % 计算机器人关节角度 d = sqrt((x_robot - w/4)^2 + y_robot^2); alpha = atan2(y_robot, x_robot - w/4); beta = acos((L1^2 + L2^2 - d^2) / (2*L1*L2)); theta1(i) = alpha - beta; theta2(i) = pi - acos((d^2 + L1^2 - L2^2) / (2*d*L1)); % 记录机器人状态 vx(i) = vx_robot; vy(i) = vy_robot; ax(i) = ax_robot; ay(i) = ay_robot; end % 绘制机器人轨迹和关节角度 figure; plot(x, y); xlabel('x (m)'); ylabel('y (m)'); title('Robot Trajectory'); figure; plot(t, theta1, t, theta2); legend('theta1', 'theta2'); xlabel('Time (s)'); ylabel('Joint Angle (rad)'); title('Joint Angle vs Time'); ``` 以上程序中,我们首先定义了双足机器人的参数,包括上腿和下腿长度、身体宽度和重力加速度等。然后定义步态参数,包括步长、步高、步数和摆动相时长比例等。接着初始化状态,包括时间、关节角度、位置、速度和加速度等。然后计算步态轨迹,包括支撑相和摆动相轨迹,并将它们合并得到机器人的轨迹。最后计算机器人状态,包括位置、速度、加速度和关节角度,并将它们绘制出来。 需要注意的是,以上程序仅仅是一个简单的双足机器人周期行走模型,实际的双足机器人控制要比这复杂得多。例如,需要考虑机器人的姿态控制、摆臂控制、力控制等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值