机器谱

R328】4自由度并联机器狗

作者:机器谱

图文展示3264(1)

图文展示3264(1)

副标题

下蹲
行走
跳跃

1. 功能说明

       本文示例将实现R328a样机4自由度并联机器狗下蹲的功能

2. 结构说明

      本样机的并联驱动结构与 R082】4自由度并联四足 类似,两款样机可以对比来看。

      本样机腿部的结构如下图所示:驱动核心部分是两个5杆结构的组合。

下蹲

两个五杆结构图

驱动核心部分再搭配下图的四杆结构,即可构成单侧的腿。驱动核心部分再搭配下图的四杆结构,即可构成单侧的腿。

单侧腿部图

四杆结构

整机

3. 电子硬件

      在这个示例中,我们采用了以下硬件,请大家参考:

电路连接:为了便于识别控制4自由度并联机器狗,我们先规定好机器狗的前方以及舵机位置编号(如下图所示):

将舵机(A1、A2 、B1、B2)连接在Bigfish扩展板的D4、D7、D3、D8端口,如下图所示:

4. 功能实现

       上位机:Controller 1.0

       下位机编程环境:Arduino 1.8.19

       实现思路:实现4自由度并联机器狗站立、前蹲、后蹲的动作。

4.1 调试舵机角度

       利用上位机 Controller软件调整4自由度并联机器狗的舵机角度,记录下机器狗站立、前蹲、后蹲舵机的角度;然后利用Arduino IDE进行下位机编程,利用这些角度实现机器狗下蹲的功能。

       对于如何利用Controller软件进行调试机器狗的舵机角度,可参考U002】如何驱动模拟舵机-Controller 1.0b软件的使用 在本次实验中,经过调试,对于4自由度并联机器狗站立、前蹲、后蹲时的舵机角度值如下图所示:

主控板

Basra主控板(兼容Arduino Uno)

扩展板

Bigfish2.1扩展板

电池7.4V锂电池


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

  版权说明: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-26 https://www.robotway.com/

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

/*

    本例程实现机器小狗站立、前蹲和后蹲

*/


#include<Servo.h>

#define SERVO_SPEED 60      //定义舵机转动快慢的时间

#define ACTION_DELAY 0      //定义所有舵机每个状态时间间隔


Servo myServo[4];


int f = 15;                                         //定义舵机每个状态间转动的次数,以此来确定每个舵机每次转动的角度

int servo_port[4] = {3,4,7,8};                      //定义舵机引脚

int servo_num = sizeof(servo_port) / sizeof(servo_port[0]);   //定义舵机数量

float value_init[4] = {1513,1457,1074,1545};        //定义舵机初始角度


void setup() {

  Serial.begin(9600);

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

    ServoGo(i,value_init[i]);

  }

  delay(2000);

}


void loop() {

  Dog_squat();

}


void Dog_squat()

{

  servo_move(value_init[0],value_init[1],value_init[2],value_init[3]);//直立

  servo_move(1243,1703,1278,1299);//向后蹲下

  servo_move(value_init[0],value_init[1],value_init[2],value_init[3]);//直立

  servo_move(1715,1255,1052,1545);//向前蹲下

  servo_move(value_init[0],value_init[1],value_init[2],value_init[3]);//直立

}



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 servo_move(float value0, float value1, float value2, float value3) //舵机转动

{

 

  float value_arguments[] = {value0, value1, value2, value3};

  float value_delta[servo_num];

 

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

  {

    value_delta[i] = (value_arguments[i] - value_init[i]) / f;

  }

 

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

  {

    for(int k=0;k<servo_num;k++)

    {

      value_init[k] = value_delta[k] == 0 ? value_arguments[k] : value_init[k] + value_delta[k];

    }

    for(int j=0;j<servo_num;j++)

    {

      ServoGo(j,value_init[j]);

    }

    delay(SERVO_SPEED);

  }

  delay(ACTION_DELAY);

}

机器狗站立时的舵机值

机器狗前蹲时的舵机值

机器狗后蹲时的舵机值

4.2 示例程序

      下面提供一个4自由度并联机器狗下蹲的参考例程(Dog_squat.ino),实验效果可参考演示视频。

5. 扩展样机

     本样机可以做出一些扩展,如下图所示的在样机上方增加平板,此样机可用探索者零件或探索者兼容零件制作。

6. 资料清单

序号

内容
1

【R328】-下蹲-程序源代码

2【R328】-下蹲-样机3D文件


文件下载
【整体打包】-【R328】4自由度并联机器狗-下蹲-资料附件.zip
6.23MB下载7次下载
上一页 1 下一页

行走

1. 功能说明

      本文示例将实现R328a样机4自由度并联机器狗行走的功能

2. 电子硬件

      在这个示例中,我们采用了以下硬件,请大家参考:

主控板

Basra主控板(兼容Arduino Uno)

扩展板

Bigfish2.1扩展板

电池7.4V锂电池


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

  版权说明: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-26 https://www.robotway.com/

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

/*

本例程实现机器小狗行走

调试小狗行走的注意事项:

  3、8对应着小狗左侧的上下舵机;

  4、7对应着小狗右侧的上下舵机;

  连接好舵机后,将调试好的小狗初始直立状态写入float value_init[4] =   {   };中即可;

*/



#include<Servo.h>

#define SERVO_SPEED 20                             //定义舵机转动快慢的时间

#define ACTION_DELAY 0                             //定义所有舵机每个状态时间间隔


Servo myServo[4];

int f = 15;//定义舵机每个状态间转动的次数,以此来确定每个舵机每次转动的角度

int servo_port[4] = {3,4,7,8};//定义舵机引脚

int servo_num = sizeof(servo_port) / sizeof(servo_port[0]);//定义舵机数量

float value_init[4] = {1478,1500,1545,1478};//定义舵机初始角度

int leg_range = 180;                        //小狗左右两条腿摆动的幅度

float reset_init[4]={0,0,0,0};


void setup() {

  Serial.begin(9600);

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

  ServoGo(i,value_init[i]);

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

    reset_init[i] = value_init[i];

  }

  delay(2000);

}


void loop() {

  Dog_walk();

}


void Dog_walk()

{

  servo_move(value_init[0],value_init[1],reset_init[2]+leg_range,reset_init[3]);

  servo_move(value_init[0],value_init[1],reset_init[2],reset_init[3]-leg_range);

}



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 servo_move(float value0, float value1, float value2, float value3) //舵机转动

{

 

  float value_arguments[] = {value0, value1, value2, value3};

  float value_delta[servo_num];

 

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

  {

    value_delta[i] = (value_arguments[i] - value_init[i]) / f;

  }

 

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

  {

    for(int k=0;k<servo_num;k++)

    {

      value_init[k] = value_delta[k] == 0 ? value_arguments[k] : value_init[k] + value_delta[k];

    }

    for(int j=0;j<servo_num;j++)

    {

      ServoGo(j,value_init[j]);

    }

    delay(SERVO_SPEED);

  }

  delay(ACTION_DELAY);

}

电路连接:机器狗左侧的上下舵机连接在Bigfish扩展板的D3、D8端口;机器狗右侧的上下舵机连接在Bigfish扩展板的D4、D7端口。

3. 功能实现

     上位机:Controller 1.0

     下位机编程环境:Arduino 1.8.19

     实现思路:实现狗可以灵活的自由行走

3.1 调试舵机角度

      对于如何利用Controller软件进行调试机器狗的舵机角度,可参考U002】如何驱动模拟舵机-Controller 1.0b软件的使用

      在本次实验中,经过调试,对于4自由度并联机器狗行走时的舵机角度值如下图所示:

机器狗行走时的舵机值

3.1 示例程序

       下面提供一个4自由度并联机器狗行走的参考例程(Dog_walk_finall.ino),实验效果可参考演示视频。

4. 资料清单

序号

内容
1

【R328】-行走-程序源代码


文件下载
【整体打包】-【R328】4自由度并联机器狗-行走-资料附件.zip
3.44KB下载2次下载
上一页 1 下一页

跳跃

1. 功能说明

      本文示例将实现R328a样机4自由度并联机器狗跳跃的功能

2. 电子硬件

       在这个示例中,我们采用了以下硬件,请大家参考:

主控板

Basra主控板(兼容Arduino Uno)

扩展板

Bigfish2.1扩展板

电池7.4V锂电池


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

  版权说明: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-26 https://www.robotway.com/

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

#include<Servo.h>

#define SERVO_NUMBER4

const int servo_pin[SERVO_NUMBER] = {4,7,3,8};//定义使用舵机的数组

const int servo_init_ang[SERVO_NUMBER] = {85,82,101,104};//定义小狗站立的初始角度

const int max_h_ang = 28;//小狗蹦跳时四肢的上下幅度

const int max_w_ang = 25;//小狗蹦跳时四肢的前后幅度

int servo_limit_ang[SERVO_NUMBER][2];

Servo myservo[SERVO_NUMBER];

int i=1;

void setup()

{

  Serial.begin(9600);

servo_limit_ang[0][0] = (servo_init_ang[0]- max_h_ang/2) * (180.0 / 270.0);//将180°舵机的算法转换成270°舵机

servo_limit_ang[0][1] = (servo_init_ang[0]+ max_h_ang/2) * (180.0 / 270.0);

servo_limit_ang[1][0] = (servo_init_ang[1]+ max_w_ang/2) * (180.0 / 270.0);

servo_limit_ang[1][1] = (servo_init_ang[1]- max_w_ang/2) * (180.0 / 270.0);

servo_limit_ang[2][0] = (servo_init_ang[2]+ max_h_ang/2) * (180.0 / 270.0);

servo_limit_ang[2][1] = (servo_init_ang[2]- max_h_ang/2) * (180.0 / 270.0);

servo_limit_ang[3][0] = (servo_init_ang[3]- max_w_ang/2) * (180.0 / 270.0);

servo_limit_ang[3][1] = (servo_init_ang[3]+ max_w_ang/2) * (180.0 / 270.0);

resetDog();

delay(2000);

}

void loop()

{

  bonceF(10000);//行走100秒

}

void resetDog()

{

  //初始化小狗

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

{

myservo[i].attach(servo_pin[i]);

myservo[i].write(servo_init_ang[i]);//小狗准备行走时的角度

               

}

}

void bonceF(int run_number)

{

float time_rate = 2.0;

delay(1000);

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

{

for(int j=1;j<=10;++j)

{

myservo[0].write(map(servo_limit_ang[0][1]-max_h_ang/10*j,0,180,0,270));

myservo[2].write(map(servo_limit_ang[2][1]+max_h_ang/10*j,0,180,0,270));

delay(max_h_ang/10*5*time_rate);

}

for(int j=1;j<=10;++j)

{

myservo[1].write(map(servo_limit_ang[1][0]-max_w_ang/10*j,0,180,0,270));

myservo[3].write(map(servo_limit_ang[3][0]+max_w_ang/10*j,0,180,0,270));

delay(max_w_ang/10*5*time_rate);

}

for(int k=1;k<=10;++k)

{

myservo[0].write(map(servo_limit_ang[0][0]+max_h_ang/10*k,0,180,0,270));

myservo[2].write(map(servo_limit_ang[2][0]-max_h_ang/10*k,0,180,0,270));

delay(max_h_ang/10*5*time_rate);

}

for(int k=1;k<=10;++k)

{

myservo[1].write(map(servo_limit_ang[1][1]+max_w_ang/10*k,0,180,0,270));

myservo[3].write(map(servo_limit_ang[3][1]-max_w_ang/10*k,0,180,0,270));

delay(max_w_ang/10*5*time_rate);

}

}

}

电路连接:机器狗左侧的上下舵机连接在Bigfish扩展板的D3、D8端口;机器狗右侧的上下舵机连接在Bigfish扩展板的D4、D7端口。

3. 功能实现

     上位机:Controller 1.0

     下位机编程环境:Arduino 1.8.19

      实现思路:实现跳跃的动作

3.1 调试舵机角度

      对于如何利用Controller软件进行调试机器狗的舵机角度,可参考U002】如何驱动模拟舵机-Controller 1.0b软件的使用

在本次实验中,经过调试,对于4自由度并联机器狗跳跃时的舵机角度值如下图所示:

机器狗跳跃时的舵机值

3.2 示例程序

      下面提供一个4自由度并联机器狗跳跃动作的参考例程(dog_bengTiao.ino),实验效果可参考演示视频。

4. 资料清单

序号

内容
1

【R328】-跳跃-程序源代码


文件下载
【整体打包】-【R328】4自由度并联机器狗-跳跃-资料附件.zip
3.17KB下载3次下载
上一页 1 下一页
© 2024 机器时代(北京)科技有限公司  版权所有
机器谱——机器人共享方案网站
学习  开发  设计  应用