极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2117|回复: 0

人车混合机器人实现身体平衡功能

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

1. 功能说明
       在R035c样机上安装一个 六轴陀螺仪传感器【https://www.robotway.com/h-col-137.html】 ,本文示例将实现机器人身体平衡功能。当用手把机器人人形部分摆动到左侧时,人形部分会自动恢复到中间;当用手把机器人人形部分摆动到右侧时,人形部分也会自动恢复到中间。
2. 结构说明
       R035c样机主要是由 【R022】四轮四驱底盘【https://www.robotway.com/h-col-127.html】 上搭载一个人形部分机构组成的。


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

主控板
Basra主控板(兼容Arduino Uno)
扩展板
Bigfish2.1扩展板
传感器
六轴陀螺仪
电池
7.4V锂电池

电路连接:
       ① 六轴陀螺仪传感器(GND、VCC、RX、TX)连接在Bigfish扩展板的Gnd、Vcc(3.3v)、RX、TX;
       ② 机器人身体中间部分的舵机连接在Bigfish扩展板的(Gnd、Vcc、D3)端口。


4. 功能实现
       编程环境:Arduino 1.8.19
       实现思路:实现机器人身体平衡功能。当用手把机器人人形部分摆动到左侧时,人形部分会自动恢复到中间;当用手把机器人人形部分摆动到右侧时,人形部分也会自动恢复到中间。
将参考例程(Robot_body_balance.ino)下载到主控板:
  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-25 https://www.robotway.com/

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

  7. /*   

  8.     功能:机器人身体平衡

  9.     接线:陀螺仪传感器(GND、VCC、RX、TX)接在扩展板的( Gnd、Vcc(3.3v)、RX、TX);

  10.               机器人身体中间部分的舵机接在扩展板的(Gnd、Vcc、D3);

  11.     操作:当用手把机器人人形部分摆动到左侧,人形部分会自动恢复到中间;

  12.               当用手把机器人人形部分摆动到右侧,人形部分会自动恢复到中间;

  13.     注意:一定要等人形部分的舵机不转动了,再手动摆动机器人;

  14. */

  15. #include<Servo.h>   //调用舵机库函数

  16. #include<Math.h>

  17. Servo myservo;

  18. #define myservopin 3                  //机器人身体中间部分的舵机引脚号

  19. //陀螺仪的相关参数

  20. #define Gyroscope_left_LimitAngle_X    0.50   //读取到陀螺仪 X 轴向左偏的极限数值

  21. #define Gyroscope_Right_LimitAngle_X   -0.65   //读取到陀螺仪 X 轴向右偏的极限数值

  22. #define Gyroscope_Middle_LimitAngle_X   -0.01    //读取到陀螺仪 X 轴平放时的数值

  23. //机器人人形部分姿态参数

  24. #define Servo_One_Min_Angle 66      //机器人身体中间部分的舵机左偏极限角度

  25. #define Servo_One_Max_Angle 118     //机器人身体中间部分的舵机右偏极限角度

  26. #define Servo_One_Middle_Angle 90   //机器人身体中间部分的舵机处于中间位置角度

  27. #define Servo_Speed 10              //舵机速度


  28. void setup()

  29. {

  30.    Serial.begin(115200);           //打开串口,并设置波特率为115200

  31.    myservo.attach(myservopin);

  32. }


  33. void loop()

  34. {

  35.    Get_gyroscope_And_Control();   //根据陀螺仪传感器的数据实现姿态跟随

  36. }
复制代码

判断机器人人形部分姿态的参考程序(Gyroscope_Device.ino)如下:
  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-25 https://www.robotway.com/

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

  7. unsigned char Re_buf[11],counter=0;

  8. unsigned char sign=0;

  9. float a[3],w[3],angle[3],T;

  10. int gyroscope_middle_position_min = (Gyroscope_Middle_LimitAngle_X-0.2) * 100;

  11. int gyroscope_middle_position_max = (Gyroscope_Middle_LimitAngle_X+0.2) * 100;

  12. int gyroscope_left_position_min   =   Gyroscope_left_LimitAngle_X * 100;

  13. int gyroscope_left_position_max   =   gyroscope_middle_position_max;

  14. int gyroscope_right_position_min   =   gyroscope_middle_position_min;

  15. int gyroscope_right_position_max   =   Gyroscope_Right_LimitAngle_X * 100;

  16. unsigned long record_time = 0;

  17. int count = 0;


  18. void Get_gyroscope_And_Control()

  19. {

  20.    int gyroscope_acc_data[2]={0,0};

  21.    int map_data= 0;

  22.    int servo_angle = 0;

  23.    if(sign)

  24.    {

  25.      sign=0;

  26.      if(Re_buf[0]==0x55)      //检查帧头

  27.      {  

  28. switch(Re_buf [1])

  29. {

  30. case 0x51:

  31.                {

  32.                 record_time = millis();

  33. a[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*16;

  34. a[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*16;

  35. a[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*16;

  36. T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;

  37.                 map_data = a[0] * 100;

  38.                 //把陀螺仪的沿X轴的加速度值转为舵机的角度

  39.                 if(   ( millis() - record_time ) < 3000 )

  40.                 {

  41.                   count ++;

  42.                   //每隔1s,判断机器人人形部分的姿态;

  43.                   if(count >= 100)   

  44.                   {

  45.                     count = 0;

  46.                     //默认机器人处于平衡态(如机器人处于直立状态)

  47.                     if(map_data>=gyroscope_middle_position_min && map_data<=gyroscope_middle_position_max)   //i am state

  48.                     {

  49.                       ServoStop();   

  50.                     }

  51.                     //检测到机器人人形部分摆动到左侧,人形部分会自动恢复到平衡态(中间);

  52.                     if(map_data>gyroscope_left_position_max && map_data< gyroscope_left_position_min)   //i am left

  53.                     {  

  54.                       myservo.attach(myservopin);

  55.                       servo_angle = map( abs(map_data), abs(gyroscope_left_position_min), abs(gyroscope_left_position_max), Servo_One_Min_Angle, Servo_One_Middle_Angle);

  56.                       Servo_move(servo_angle, Servo_One_Middle_Angle);

  57.                       delay(300);ServoStop();

  58.                     }

  59.                     //检测到机器人人形部分摆动到右侧,人形部分会自动恢复到平衡态(中间);

  60.                     if(map_data>gyroscope_right_position_max && map_data< gyroscope_right_position_min)   //i am right

  61.                     {

  62.                       myservo.attach(myservopin);

  63.                       servo_angle = map( abs(map_data), abs(gyroscope_right_position_min), abs(gyroscope_right_position_max), Servo_One_Middle_Angle, Servo_One_Max_Angle);

  64.                       Servo_move(servo_angle, Servo_One_Middle_Angle);delay(300);

  65.                       ServoStop();

  66.                     }         

  67.                   }      

  68.                 }         

  69.                }break;

  70. }

  71.     }

  72.   }  

  73. }


  74. void serialEvent() {

  75.   while (Serial.available()) {   

  76.     Re_buf[counter]=(unsigned char)Serial.read();

  77.     if(counter==0&&Re_buf[0]!=0x55) return;      //第0号数据不是帧头            

  78.     counter++;      

  79.     if(counter==11)             //接收到11个数据

  80.     {   

  81.        counter=0;               //重新赋值,准备下一帧数据的接收

  82.        sign=1;

  83.     }     

  84.   }

  85. }


  86. void ServoStop()

  87. {

  88.   myservo.detach();

  89.   digitalWrite(myservopin,LOW);

  90. }


  91. void Servo_move(int start_angle, int finish_angle)

  92. {

  93.   int flag = 0;

  94.   if( (start_angle - finish_angle) >0 ){ flag = -1;}

  95.   else { flag = 1; }

  96.   for( int i=0; i< abs(start_angle - finish_angle);i++){

  97.     myservo.write( start_angle + flag*i );

  98.     delay(Servo_Speed);

  99.   }

  100. }
复制代码

5. 扩展样机
       本样机可以有一些扩展,如减少样机底盘上的2个直流驱动轮,或者将样机底盘上的直流驱动轮替换成舵机,如下图所示:


6. 资料下载

资料内容:

①身体平衡-程序源代码
②身体平衡-样机3D文件
资料下载地址:https://www.robotway.com/h-col-213.html

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

回复

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-24 10:30 , Processed in 0.039573 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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