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

news/2025/2/4 2:25:21/

1. 功能说明

      在R035c样机上安装一个六轴陀螺仪传感器,本文示例将实现机器人身体平衡功能。当用手把机器人人形部分摆动到左侧时,人形部分会自动恢复到中间;当用手把机器人人形部分摆动到右侧时,人形部分也会自动恢复到中间。

 2. 结构说明

      R035c样机主要是由四轮四驱底盘上搭载一个人形部分机构组成的。

 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)下载到主控板: 

【详细源程序代码内容请见 人车混合机器人-身体平衡

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 2023-04-25 https://www.robotway.com/------------------------------*//*   功能:机器人身体平衡接线:陀螺仪传感器(GND、VCC、RX、TX)接在扩展板的( Gnd、Vcc(3.3v)、RX、TX);机器人身体中间部分的舵机接在扩展板的(Gnd、Vcc、D3);操作:当用手把机器人人形部分摆动到左侧,人形部分会自动恢复到中间;当用手把机器人人形部分摆动到右侧,人形部分会自动恢复到中间;注意:一定要等人形部分的舵机不转动了,再手动摆动机器人;*/#include<Servo.h>   //调用舵机库函数#include<Math.h>Servo myservo;#define myservopin 3                  //机器人身体中间部分的舵机引脚号//陀螺仪的相关参数#define Gyroscope_left_LimitAngle_X    0.50   //读取到陀螺仪 X 轴向左偏的极限数值#define Gyroscope_Right_LimitAngle_X   -0.65   //读取到陀螺仪 X 轴向右偏的极限数值#define Gyroscope_Middle_LimitAngle_X   -0.01    //读取到陀螺仪 X 轴平放时的数值//机器人人形部分姿态参数#define Servo_One_Min_Angle 66      //机器人身体中间部分的舵机左偏极限角度#define Servo_One_Max_Angle 118     //机器人身体中间部分的舵机右偏极限角度#define Servo_One_Middle_Angle 90   //机器人身体中间部分的舵机处于中间位置角度#define Servo_Speed 10              //舵机速度void setup(){Serial.begin(115200);           //打开串口,并设置波特率为115200myservo.attach(myservopin);}void loop(){Get_gyroscope_And_Control();   //根据陀螺仪传感器的数据实现姿态跟随}

判断机器人人形部分姿态的参考程序(Gyroscope_Device.ino)如下:

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 2023-04-25 https://www.robotway.com/------------------------------*/unsigned char Re_buf[11],counter=0;unsigned char sign=0;float a[3],w[3],angle[3],T;int gyroscope_middle_position_min = (Gyroscope_Middle_LimitAngle_X-0.2) * 100;int gyroscope_middle_position_max = (Gyroscope_Middle_LimitAngle_X+0.2) * 100;int gyroscope_left_position_min   =   Gyroscope_left_LimitAngle_X * 100;int gyroscope_left_position_max   =   gyroscope_middle_position_max;int gyroscope_right_position_min   =   gyroscope_middle_position_min;int gyroscope_right_position_max   =   Gyroscope_Right_LimitAngle_X * 100;unsigned long record_time = 0;int count = 0;void Get_gyroscope_And_Control(){int gyroscope_acc_data[2]={0,0};int map_data= 0;int servo_angle = 0;if(sign){sign=0;if(Re_buf[0]==0x55)      //检查帧头{  switch(Re_buf [1]){case 0x51:{record_time = millis();a[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*16;a[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*16;a[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*16;T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;map_data = a[0] * 100;//把陀螺仪的沿X轴的加速度值转为舵机的角度if(   ( millis() - record_time ) < 3000 ){count ++;//每隔1s,判断机器人人形部分的姿态;if(count >= 100)   {count = 0;//默认机器人处于平衡态(如机器人处于直立状态)if(map_data>=gyroscope_middle_position_min && map_data<=gyroscope_middle_position_max)   //i am state{ServoStop();   }//检测到机器人人形部分摆动到左侧,人形部分会自动恢复到平衡态(中间);if(map_data>gyroscope_left_position_max && map_data< gyroscope_left_position_min)   //i am left{  myservo.attach(myservopin);servo_angle = map( abs(map_data), abs(gyroscope_left_position_min), abs(gyroscope_left_position_max), Servo_One_Min_Angle, Servo_One_Middle_Angle);Servo_move(servo_angle, Servo_One_Middle_Angle);delay(300);ServoStop();}//检测到机器人人形部分摆动到右侧,人形部分会自动恢复到平衡态(中间);if(map_data>gyroscope_right_position_max && map_data< gyroscope_right_position_min)   //i am right{myservo.attach(myservopin);servo_angle = map( abs(map_data), abs(gyroscope_right_position_min), abs(gyroscope_right_position_max), Servo_One_Middle_Angle, Servo_One_Max_Angle);Servo_move(servo_angle, Servo_One_Middle_Angle);delay(300);ServoStop();}         }       }         }break;}}}  }void serialEvent() {while (Serial.available()) {   Re_buf[counter]=(unsigned char)Serial.read();if(counter==0&&Re_buf[0]!=0x55) return;      //第0号数据不是帧头             counter++;       if(counter==11)             //接收到11个数据{   counter=0;               //重新赋值,准备下一帧数据的接收sign=1;}     }}void ServoStop(){myservo.detach();digitalWrite(myservopin,LOW);}void Servo_move(int start_angle, int finish_angle){int flag = 0;if( (start_angle - finish_angle) >0 ){ flag = -1;}else { flag = 1; }for( int i=0; i< abs(start_angle - finish_angle);i++){myservo.write( start_angle + flag*i );delay(Servo_Speed);}}

 5. 扩展样机

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


http://www.ppmy.cn/news/73796.html

相关文章

陈丹琦团队最新力作:上下文学习在上下文“学到”了什么?

深度学习自然语言处理 原创作者 | 鸽鸽 这段时间in-context learning真的很火&#xff0c;陈丹琦组最新的两篇文章都是ICL相关&#xff0c;今天我们拜读其中一篇&#xff1a;丹琦的硕士生、纽约大学准博士生Jane Pan的ACL小短文。 大佬的学生会做出怎样的科研示范呢&#xff1f…

常用在线工具,非常实用,快收藏起来!

作者丨黑蛋 今天给大家介绍一些常用到的在线工具&#xff0c;能方便我们的日常学习&#xff1a; 编码工具&#xff1a; AES加密解密&#xff1a;http://www.jsons.cn/aesencrypt/ DNA编码解码&#xff1a;https://web.expasy.org/translate/ 双16进制编码解码&#xff1a;ht…

java 版本企业电子招投标采购系统源码之登录页面

​ 信息数智化招采系统 服务框架&#xff1a;Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构&#xff1a;VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术&#xff1a;Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、…

子网监控工具

现代 IT 基础架构不再局限于单个物理位置。如今&#xff0c;网络分布在多个地理位置、远程站点和数据中心。它们庞大的 IP 地址空间也作为多个 IP 组分布在这些位置&#xff0c;包括 IPv4 子网和 IPv6 站点。传统的 IP地址管理 &#xff08;IPAM&#xff09;选项使得全面了解这…

ZeroMQ:不一样的套接字。

ZMQ连接和传统的TCP连接是有区别的&#xff0c;主要有&#xff1a; ● 使用多种协议&#xff0c;inproc&#xff08;进程内&#xff09;、ipc&#xff08;进程间&#xff09;、tcp、pgm&#xff08;广播&#xff09;、epgm1&#xff1b;● 当客户端使用zmq_connect()时连接就已…

linux异步通知实验

一、异步通知简介 中断是处理器提供的一种异步机制&#xff0c;配置好中断后就可以让处理器去处理其他的事情&#xff0c;当中断发生以后会执行中断服务函数&#xff0c;在中断服务函数中做具体的处理。 Linux 应用程序可以通过阻塞或者非阻塞两种方式来访问驱动设备&#xff0…

【实施】畅捷通T+软件生产成本结转的理解

【项目场景】 在公司涉及到有生产的业务过程中&#xff0c; 针对生产升本结转的各项环节与理解。 【实施讲解】 在整个生产过程中&#xff0c;针对生产成本结转主要分为三个步骤&#xff1b; 步骤一&#xff1a; 日常发生的所有制造费用&#xff0c;借制造费用&#xff0c;比…

内存基础知识

概述 内存可存放数据。程序执行前需要先将外存中的数据放到内存中才能被CPU处理&#xff0c;因为CPU处理速度过快&#xff0c;而从硬盘读取数据较慢&#xff0c;所以内存是为了缓和CPU和硬盘之间的读取速度矛盾 在多道程序环境下&#xff0c;系统中会有多个程序并发执行&…