1. 运动功能说明

6自由度双足机器人样机是一款拥有6自由度的串联型双足,相当于人形机器人的下半身。它可以实现抬腿、迈步、蹲下和起立、行走、翻跟头等等功能。

2. 结构说明

6自由度双足机器人样机的每条腿由3个 舵机关节模组 构成。足部结构一般有两种设计方案,一种叫“狭窄足印”,比较常规,如图所示:

还有一种叫“交叉足印”,也叫“工”形脚或“工”字脚。这种设计方案可以保证机器人行走时重心始终落在支撑零件上,能够降低控制难度,如图所示:

3. 运动功能实现

本文先以交叉足印样机为例进行说明。本样机的运动功能主要是依靠舵机的摆动配合实现的,我们可以参考人体结构,把两条腿上的三个舵机按从上到下的顺序,对应理解为只能前后摆动的髋关节、膝关节、踝关节(真实的生物关节类似于球铰,更加复杂)。我们需要参考人行走时三个关节的摆动角度关系,为双足机器人确定并调出对应的一系列舵机角度。

为了比较轻松地完成前进、后退动作,需要让腿抬得高一些,以避免迈步时工形脚干涉。

3.1 电子硬件

在这个实验中,采用了以下硬件,请大家参考:

Basra主控板(兼容Arduino Uno)、Bigfish2.1扩展板、7.4V锂电池

由于舵机比较多,为了完成控制,我们需要约定一下样机的前、后方向,并对舵机进行编号:

3.2 运动控制

上位机:Controller 1.0

下位机编程环境:Arduino 1.8.19

(1)初始位置的设定:使用Controller上位机对机器人进行调试,调试目标为使机器人保持直立状态,并且保持右脚的支撑臂在前。

①将Controller下位机程序servo_bigfish.ino直接下载到主控板。这段代码供Controller上位机与主控板通信,并允许调试舵机。代码如下:

/*------------------------------------------------------------------------------------

版权说明:Copyright 2022 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 机器谱 2022-10-20 https://www.robotway.com/

------------------------------

实验功能: 6自由度双足行走

-----------------------------------------------------

实验接线(从行走时朝前的方向看):

左侧髋:D4;右侧髋:D3;

左侧膝:D7;右侧膝:D5;

左侧踝:D11;右侧踝:D6

------------------------------------------------------------------------------------*/

/*

* Bigfish扩展板舵机口; 4, 7, 11, 3, 8, 12, 14, 15, 16, 17, 18, 19

* 使用软件调节舵机时请拖拽对应序号的控制块

*/

#include <Servo.h>

#define ANGLE_VALUE_MIN 0

#define ANGLE_VALUE_MAX 180

#define PWM_VALUE_MIN 500

#define PWM_VALUE_MAX 2500

#define SERVO_NUM 12

Servo myServo[SERVO_NUM];

int data_array[2] = {0,0};   //servo_pin: data_array[0], servo_value: data_array[1];

int servo_port[SERVO_NUM] = {4, 7, 11, 3, 8, 12, 14, 15, 16, 17, 18, 19};

int servo_value[SERVO_NUM] = {};

String data = "";

boolean dataComplete = false;

void setup() {

Serial.begin(9600);

}

void loop() {

while(Serial.available())

{

int B_flag, P_flag, T_flag;

data = Serial.readStringUntil('\n');

data.trim();

for(int i=0;i<data.length();i++)

{

//Serial.println(data[i]);

switch(data[i])

{

case '#':

B_flag = i;

break;

case 'P':

{

String pin = "";

P_flag = i;

for(int i=B_flag+1;i<P_flag;i++)

{

pin+=data[i];

}

data_array[0] = pin.toInt();

}

break;

case 'T':

{

String angle = "";

T_flag = i;

for(int i=P_flag+1;i<T_flag;i++)

{

angle += data[i];

}

data_array[1] = angle.toInt();

servo_value[pin2index(data_array[0])] = data_array[1];

}

break;

default: break;

}

}

/*

Serial.println(B_flag);

Serial.println(P_flag);

Serial.println(T_flag);

for(int i=0;i<2;i++)

{

Serial.println(data_array[i]);

}

*/

dataComplete = true;

}

if(dataComplete)

{

for(int i=0;i<SERVO_NUM;i++)

{

ServoGo(i, servo_value[i]);

/*********************************串口查看输出***********************************/

//      Serial.print(servo_value[i]);

//      Serial.print(" ");

}

//    Serial.println();

/*********************************++++++++++++***********************************/

dataComplete = false;

}

}

void ServoStart(int which){

if(!myServo[which].attached() && (servo_value[which] != 0))myServo[which].attach(servo_port[which]);

else return;

pinMode(servo_port[which], OUTPUT);

}

void ServoStop(int which){

myServo[which].detach();

digitalWrite(servo_port[which],LOW);

}

void ServoGo(int which , int where){

ServoStart(which);

if(where >= ANGLE_VALUE_MIN && where <= ANGLE_VALUE_MAX)

{

myServo[which].write(where);

}

else if(where >= PWM_VALUE_MIN && where <= PWM_VALUE_MAX)

{

myServo[which].writeMicroseconds(where);

}

}

int pin2index(int _pin){

int index;

switch(_pin)

{

case 4: index = 0; break;

case 7: index = 1; break;

case 11: index = 2; break;

case 3: index = 3; break;

case 8: index = 4; break;

case 12: index = 5; break;

case 14: index = 6; break;

case 15: index = 7; break;

case 16: index = 8; break;

case 17: index = 9; break;

case 18: index = 10; break;

case 19: index = 11; break;

}

return index;

}

下载完成后,保持主控板和电脑的USB连接,以便利用上位机进行调试。

②双击打开Controller 1.0b.exe:

③界面左上角选择:设置-面板设置,弹出需要显示的调试块,可通过勾选隐藏不需要调试的舵机块:联机-选择主控板对应端口号以及波特率。

④拖动进度条,可以观察相应的舵机角度转动,直到样机姿态达到我们的预想目标。然后勾选左下角添加-转化,获得舵机调试的数组:

⑤该数组可直接复制到后面的行走程序中“各个舵机的初始位置”部分进行使用。

(2)编写并下载行走程序的代码(Biped_Robot.ino)到主控板:

/*------------------------------------------------------------------------------------

版权说明:Copyright 2022 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 机器谱 2022-10-20 https://www.robotway.com/

------------------------------

实验功能: 6自由度双足行走

-----------------------------------------------------

实验接线(从行走时朝前的方向看):

左侧髋:D4;右侧髋:D3;

左侧膝:D7;右侧膝:D5;

左侧踝:D11;右侧踝:D6

------------------------------------------------------------------------------------*/

#include <Servo.h>

Servo myServo[6];

int servo_port[6]={4,7,11,3,8,12};

float servo_value[6] = {65, 60, 105, 60, 100, 80};//各个舵机的初始位置

void setup()

{

for(int i=0; i<5; i++){

ServoGo(i, (int)servo_value[i]);

}

delay(2000);

}

void loop()

{

left_go();

right_go();

}

void left_go()

{

for(int i=0; i<10; i++){

servo_value[4] -= 10;

servo_value[5] -= 6;

for(int j=0; j<6; j++){

ServoGo(j, (int)servo_value[j]);

}

delay(25);

}

for(int i=0; i<10; i++){

servo_value[0] += 2.5;

servo_value[2] -= 1;

servo_value[3] += 2.5;

servo_value[4] += 10;

servo_value[5] += 4.5;

for(int j=0; j<6; j++){

ServoGo(j, (int)servo_value[j]);

}

delay(25);

}

}

void right_go()

{

for(int i=0; i<10; i++){

servo_value[1] += 10;

servo_value[2] += 7.5;

servo_value[5] += 0.5;

for(int j=0; j<6; j++){

ServoGo(j, (int)servo_value[j]);

}

delay(25);

}

for(int i=0; i<10; i++){

servo_value[0] -= 2.5;

servo_value[1] -= 10;

servo_value[2] -= 6.5;

servo_value[3] -= 2.5;

servo_value[5] += 1;

for(int j=0; j<6; j++){

ServoGo(j, (int)servo_value[j]);

}

delay(25);

}

}

void ServoStart(int which)

{

if(!myServo[which].attached())myServo[which].attach(servo_port[which]);

pinMode(servo_port[which], OUTPUT);

}

void ServoStop(int which)

{

myServo[which].detach();

digitalWrite(servo_port[which],LOW);

}

void ServoGo(int which , int where)

{

if(where!=200)

{

if(where==201) ServoStop(which);

else

{

ServoStart(which);

myServo[which].write(where);

}

}

}

void ServoMove(int which, int start, int finish, int t)

{

int a;

if((start-finish)>0) a=-1;

else a=1;

for(int i=0;i<abs(start-finish);i++)

{ServoGo(which,start+i*a);delay(t/(abs(start-finish)));}

}

将上个步骤记录的角度数据依次填入相应舵机的初始值,比如:float servo_value[6] = {90, 44, 46, 82, 115, 100}; //各个舵机的初始位置。为了减少重力的干扰,一般先把机器人调整成直立状态采值。采值后,需要注意的是舵机0、3的初始值应在上个步骤结果值基础上减去10,使其进入行走姿态。修改完成后便可以直接将程序下载到主控板,然后将主控板、电池安装到机器人最上面的平台(应以重心较低为标准),然后连接好舵机线,顺利的话现在机器人应该就可以正常行走了。但是由于舵机的内部结构问题,相应的角度输出可能会存在误差,这样的表现便是机器人的支撑臂会出现“打架”现象,这个问题的解决方法是修改程序中对应的参数调节系数,例如:servo_value[4] -= 11;

可以修改参数“11”的大小,需要注意的是程序的整个循环特定的位置对应特定的值,因此在修改的时候程序后面相应舵机的输出系数也需要相应的改变,由此达到一个完满的循环。

资料内容:6自由度双足-行走-例程源代码、6自由度双足-样机3D文件、Controller1.0b资料包【资料下载详见 6自由度双足-行走】

6自由度双足机器人行走功能的实现相关推荐

  1. 如何让6自由度双足机器人实现翻跟头的动作?

    1. 功能描述 控制6自由度双足机器人样机腿部舵机协调运动,使样机做出翻跟头的动作. 2. 电子硬件 在这个示例中,采用了以下硬件,请大家参考: Basra主控板(兼容Arduino Uno).Big ...

  2. 双足机器人的稳定性判据_双足机器人行走稳定性探究.pdf

    双足机器人行走稳定性探究 第30卷第ll期 哈尔滨工程大学 学报 V01.30№.1l ofHarbin Unlversltv Nov.2009 2009年11月 Joumal Engineering ...

  3. matlab强化学习算例理/菜鸟理解1——双足机器人行走算例

    目录 matlab双足机器人强化学习算例介绍 强化学习的一些基础理解 菜鸟对一些名词的理解 matlab强化学习库介绍 双足机器人算例逻辑盘点 如何改写算例做自己的强化学习. %写在前面: 本人大四狗 ...

  4. matlab 棍,双足机器人行走棍图怎么用MATLAB画出来

    匿名用户 1级 2016-05-25 回答 The following is a function I wrote to generate a stick diagram of robot motio ...

  5. 12自由度六足机器人实现步态规划功能

    1. 运动功能描述 R111样机是一款拥有12个自由度的串联仿生六足机器人.本文示例实现12自由度六足机器人的行走功能,包括前进.后退.左转.右转. 2. 结构说明 R111样机由六个2自由度串联结构 ...

  6. 第一篇----行走控制的研究现状:双足机器人四足机器人

    最近打算入门双足机器人.四足机器人,通过在网上搜索,整理一份比较全面的介绍目前发展状况的资料. 需要关注的几个学术大牛人物 Marc Raibert 网站为:MIT Leg Laboratory, 网 ...

  7. 装上螺旋桨,加州理工让只能行走的双足机器人「上了天」,还玩起了障碍滑板、走绳索...

    视学算法报道 编辑:杜伟.陈萍 能走能飞,这才是最酷的双足机器人吧?! 有的机器人可以行走,有的可以飞行.你见过既能行走又能飞行的双足机器人吗? 加州理工学院的研究人员就打造了这样一台机器人 LEON ...

  8. 人工机器:机器人模块化和双足机器人被动行走

    对于机器人,作为服务人或者家庭成员,是否能走进千家万户,还要看机器人的双足是否能够实现. 服务机器人构件: 1.双足机器人的两条腿; 2.被动行走和能源问题; 3.机器组件的模块化; 4.情感作用以及 ...

  9. 12自由度六足机器人实现原地舞蹈功能

    1. 功能描述 R111样机是一款拥有12个自由度的串联仿生六足机器人.本文示例所实现的功能为:R111样机12自由度六足机器人原地舞蹈. 2. 结构说明 R111样机(R111b)由6个2自由度连杆 ...

最新文章

  1. JQuery实现倒计划按钮
  2. Java-Redis 热部署问题
  3. 简单工厂模式+工厂方法模式
  4. android分享文件分享结果_干货分享丨DM删除归档日志文件的多种方法
  5. python增加工作日列_将工作日添加到日期字段
  6. 误区30日谈21-24
  7. python -屏保
  8. 合并出错:svn Working copy and merge source not ready for reintegration
  9. dlna android电视,DLNA推送安卓手机投屏电视
  10. 微信小程序view居中问题
  11. 采用sFlow工具实现流量监控--实验
  12. Python第一课:print()函数、变量与赋值
  13. PHP串行化与JSON
  14. saladict提示Invalid value for bounds bounds must be at least 50% within visible screen
  15. 做好黑客入侵防护,你需要了解这些入侵工具
  16. [极客大挑战 2020]Roamphp 1、2、4
  17. 给定一个接口,测试人员应该如何测试?
  18. BO 4.3支持微软的Azure Synapse Analytics 吗?
  19. Unity实战之见缝插针
  20. 你根本不会用搜索引擎

热门文章

  1. osg glsl添加半透明
  2. 博毅 创为 Cocos Creator 全栈架构师 进阶与 创业班
  3. PTA 哈利·波特的考试 (25分)
  4. matlab lzc,人脸分割 matlab程序
  5. WordPress虚拟资源商城主题日主题RiPro6.7 开源版 星空资源网首发
  6. msys2 安装 mingw64
  7. PCM音频数据、DSD音频数据,spdif,以及DOP格式说明
  8. 做饼状图时,显示百分比的解决方案
  9. 简历模板(建议收藏)
  10. Pregel:一个大规模图计算系统