极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2409|回复: 0

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

[复制链接]
发表于 2023-4-24 09:55:48 | 显示全部楼层 |阅读模式
本帖最后由 机器谱 于 2023-4-24 09:55 编辑

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自由度并联四足机器人行走的实验,实验效果可参考演示视频。
  1. /*------------------------------------------------------------------------------------

  2.   版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

  3.            Distributed under MIT license.See file LICENSE for detail or copy at

  4.            https://opensource.org/licenses/MIT

  5.            by 机器谱 2023-04-14 https://www.robotway.com/

  6.   ------------------------------*/

  7. #include <Servo.h>


  8. #define servo_speed 20   //servo_speed

  9. #define servo_speed2 45

  10. #define action_delay 350 //action_delay

  11. Servo myServo[4];

  12. int num = 10;

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

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

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




  16. void setup() {

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

  18.   Serial.begin(9600);

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

  20.   {

  21.     ServoGo(i, value_init[i]);

  22.   }

  23. }


  24. void loop() {

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

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

  27. {

  28.   left_right_bias();

  29.   delay(100);

  30.   forward_back_lie_down();

  31.   delay(100);

  32. }

  33. //while(1)

  34. //{

  35. // walk();

  36. //}

  37. while(1)

  38. {

  39. test();

  40. }

  41. }



  42. void test()

  43. {

  44.   servo_move(90,60,90,90);

  45.   servo_move(120,60,120,90);

  46.   servo_move(120,60,120,120);

  47.   servo_move(90,90,90,120);

  48. }



  49. void walk()

  50. {

  51.   servo_move(90,60,90,90);

  52.   servo_move(110,60,114,90);

  53.   servo_move(110,60,114,130);

  54.   servo_move(60,90,90,130);   

  55. }


  56. void forward_back_lie_down()

  57. {

  58.   servo_move2(90, 90, 90, 90);

  59.   servo_move2(103,29,75,165);

  60.   servo_move2(90, 90, 90, 90);

  61.   servo_move2(90,156,90,20);

  62.   servo_move2(90, 90, 90, 90);  

  63. }


  64. void left_right_bias()

  65. {

  66.   servo_move2(90, 90, 90, 90);

  67.   servo_move2(47,136,57,119);

  68.   servo_move2(90, 90, 90, 90);

  69.   servo_move2(116,54,147,74);

  70.   servo_move2(90, 90, 90, 90);

  71. }


  72. void ServoStart(int which)

  73. {

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

  75.   pinMode(servo_port[which], OUTPUT);

  76. }



  77. void ServoStop(int which)

  78. {

  79.   myServo[which].detach();

  80.   digitalWrite(servo_port[which],LOW);

  81. }


  82. void ServoGo(int which , int where)

  83. {

  84.   if(where!=200)

  85.   {

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

  87.     else

  88.     {

  89.       ServoStart(which);

  90.       myServo[which].write(where);

  91.     }

  92.   }

  93. }


  94. void servo_move(float value0, float value1, float value2, float value3)

  95. {



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

  97.   float value_delta[servo_num];



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

  99.   {

  100.     value_delta[i] = (value_arguments[i] - value_init[i]) / num;

  101.   }



  102.   for(int i=0;i<num;i++)

  103.   {

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

  105.     {

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

  107.     }

  108.    

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

  110.     {

  111.       ServoGo(j,value_init[j]);

  112.     }

  113.     delay(servo_speed);

  114.   }

  115. }


  116. void servo_move2(float value0, float value1, float value2, float value3)

  117. {



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

  119.   float value_delta[servo_num];



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

  121.   {

  122.     value_delta[i] = (value_arguments[i] - value_init[i]) / num;

  123.   }



  124.   for(int i=0;i<num;i++)

  125.   {

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

  127.     {

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

  129.     }

  130.    

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

  132.     {

  133.       ServoGo(j,value_init[j]);

  134.     }

  135.     delay(servo_speed2);

  136.   }

  137. }
复制代码

5. 资料下载
资料内容:

​①例程源代码
​②样机3D文件
资料下载地址:https://www.robotway.com/h-col-209.html

想了解更多机器人开源项目资料请关注 机器谱网站 https://www.robotway.com

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-28 05:27 , Processed in 0.039675 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表