1. 功能说明
本文示例将实现8自由度并联腿机器狗保持姿态平衡的功能,当机器狗在一个平台上原地站立,平台发生倾斜时,机器狗能够自动调整姿态,保证背部水平。
2. 机器狗的稳定性分析
稳定性是机器狗运动中很重要的一部分,对于足式机器人的稳定性判定,研究人员提出了很多不同的方法,如ZMP(零力矩点)、FASM(力角稳定裕度)、ESM(能量稳定裕度)等。
机器狗运动时,惯性力、腿部与地面的接触力是其主要扰动来源。机器狗的着地腿会受到地面对其的支持力和摩擦力,而其它外力可等效为机器狗重心处的惯性力,受力分析如下图所示:
(F1、F2、F3是地面对机器狗的支持力;表示等效惯性力和等效重力的合力)
在四足机器人中,由于运动步态中支撑脚通常只有两条或更少,无法在地面上寻找到有效的支撑多边形,因此四足机器人只好将机器人的质心偏离初始位置的距离作为稳定性的参考量。一般来说,竖直方向的偏置距离对稳定性的影响不大。
3. 电子硬件
本实验中采用了以下硬件:
主控板 | Basra主控板(兼容Arduino Uno) |
扩展板 | Bigfish2.1扩展板 |
SH-SR舵机扩展板 | |
传感器 | 六轴陀螺仪 |
电池 | 7.4V锂电池 |
电路连接说明:
① 将8个舵机连接在SH-SR扩展板上,舵机连接顺序为:1、2、3、4、5、6、7、8;
② 将六轴陀螺仪传感器连接在Bigfish扩展板的A0端口。
4. 功能实现
上位机:Controller 1.0
下位机编程环境:Arduino 1.8.19
实现思路:当机器狗在一个平台上原地站立,平台发生倾斜时,机器狗能够自动调整姿态,保证背部水平。
4.1 调试舵机角度
对于机器狗利用Controller软件进行调试舵机角度,可参考上文 8自由度并联腿机器狗-行走
4.2 示例程序
下面提供一个8自由度并联腿机器狗保持姿态平衡的参考例程(Dog_Balance.ino),具体实验效果可参考官网演示视频。
/*------------------------------------------------------------------------------------
版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.
Distributed under MIT license.See file LICENSE for detail or copy at
https://opensource.org/licenses/MIT
by 机器谱 2023-05-18 https://www.robotway.com/
------------------------------*/
#include "leg.h"
#include "gait.h"
#include "sensor.h"
enum{DOGBALANCE=1,DOGWALK,DogObstacleAvoidanceWalk};
float Eular[3]; /* 欧拉角 */
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.begin(115200);
sensorSetup();
delay(3000);
}
void loop() {
// put your main code here, to run repeatedly:
Dog_Balance(); //狗保持平衡
}
void Dog_Balance()
{
static long t_control = millis();
float f = readFront();
float b = readBack();
readPose();
if ((millis() - t_control) > 40) {
if (f && !b) {
leg0.back();
leg1.back();
leg2.back();
leg3.back();
} else if (b && !f) {
leg0.front();
leg1.front();
leg2.front();
leg3.front();
}
if (Eular[0] > 3) {
leg0.down();
leg1.down();
leg2.up();
leg3.up();
}
if (Eular[0] < -3) {
leg0.up();
leg1.up();
leg2.down();
leg3.down();
}
if (Eular[1] < 0 && Eular[1] > -176) {
leg0.up();
leg1.down();
leg2.up();
leg3.down();
}
if (Eular[1] > 0 && Eular[1] < 176) {
leg0.down();
leg1.up();
leg2.down();
leg3.up();
}
leg0.updatePos();
leg1.updatePos();
leg2.updatePos();
leg3.updatePos();
// SerialUSB.println();
t_control = millis();
}
}
程序源代码资料内容详见 8自由度并联腿机器狗-姿态平衡