4自由度并联四足机器人行走功能的实现

1. 运动功能说明

      本文示例将实现R082样机4自由度并联四足机器人行走的功能。

2. 结构说明

      4自由度并联四足机器人结构每边2自由度,分布如下图所示,中间的2号舵机控制两条腿的前后运动;1号舵机控制前腿的抬、落,左右两边相差30°的相位。

3. 电子硬件

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

主控板

Basra主控板(兼容Arduino Uno)

扩展板

Bigfish2.1扩展板

电池7.4V锂电池

     电路连接:舵机分别连接在Bigfish扩展板的D4、D11、D3、D12接口上。 

4. 运动功能实现

编程环境:Arduino 1.8.19

将参考例程(machine_servo_dog.ino)下载到主控板,完成4自由度并联四足机器人行走的实验,实验效果可参考演示视频。

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

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

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

#include <Servo.h>


#define servo_speed 20   //servo_speed

#define servo_speed2 45

#define action_delay 350 //action_delay

Servo myServo[4];

int num = 10;

int servo_port[4]={4,11,3,12};   //servo_pin

int servo_num = sizeof(servo_port)/sizeof(servo_port[0]);   //servo_pin length

float value_init[4]={90, 90, 90, 90}; //各个舵机的初始位置  




void setup() {

  // put your setup code here, to run once:

  Serial.begin(9600);

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

  {

    ServoGo(i, value_init[i]);

  }

}


void loop() {

  // put your main code here, to run repeatedly:

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

{

  left_right_bias();

  delay(100);

  forward_back_lie_down();

  delay(100);

}

//while(1)

//{

// walk();

//}

while(1)

{

test();

}

}



void test()

{

  servo_move(90,60,90,90);

  servo_move(120,60,120,90);

  servo_move(120,60,120,120);

  servo_move(90,90,90,120);

}



void walk()

{

  servo_move(90,60,90,90);

  servo_move(110,60,114,90);

  servo_move(110,60,114,130);

  servo_move(60,90,90,130);   

}


void forward_back_lie_down()

{

  servo_move2(90, 90, 90, 90);

  servo_move2(103,29,75,165);

  servo_move2(90, 90, 90, 90);

  servo_move2(90,156,90,20);

  servo_move2(90, 90, 90, 90);  

}


void left_right_bias()

{

  servo_move2(90, 90, 90, 90);

  servo_move2(47,136,57,119);

  servo_move2(90, 90, 90, 90);

  servo_move2(116,54,147,74);

  servo_move2(90, 90, 90, 90);

}


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]) / num;

  }

 

  for(int i=0;i<num;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);

  }

}


void servo_move2(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]) / num;

  }

 

  for(int i=0;i<num;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_speed2);

  }

}

5. 资料内容

①例程源代码

②样机3D文件

资料内容详见:4自由度并联四足

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值