差分英伟达机器人_底层控制系统

该层控制系统接入了加速度、IMU等信息


文章目录

  • 差分英伟达机器人_底层控制系统
  • 前言
  • 二、机器人底盘通讯代码
    • 1.获取重力加速度、角速度原始数据
    • 2.向上位机传输底盘数据
    • 3.底盘接收上位机数据
  • 三、机器人PID控制器代码
    • 1.
  • 总结

前言

提示:这是学习 “环宇机器人-差分轮底层视频” 时记录下的随笔,方便自己回顾的同时也给大家一些参考,如果有说的不对之处,请指正修改。


二、机器人底盘通讯代码

1.获取重力加速度、角速度原始数据

  • 通过IIC读取信息
 while(1){   delay_ms(46);Huanyu_moto_Control_speed(Right_moto.Current_Speed, Right_moto.Target_Speed ,MOTO_RIGHT);Huanyu_moto_Control_speed(Left_moto.Current_Speed,  Left_moto.Target_Speed  ,MOTO_LEFT );MPU_Get_Accelerometer(&Send_Data.Sensor_Str.Link_Accelerometer); //通过IIC读取加速度信息MPU_Get_Gyroscope(&Send_Data.Sensor_Str.Link_Gyroscope);                  //通过IIC读取角速度信息Huanyu_SendTo_UbuntuPC();                                         //向树莓派透传数据Huanyu_IWDG_Feed();}
}
  • 通过MPU-6000(6050)(整合性6轴运动处理组件)得到加速度值、角速度原始数据。
//得到加速度值(原始值)
//gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
//返回值:0,成功
//    其他,错误代码
unsigned char MPU_Get_Accelerometer(Mpu6050_Str* Acce)
{u8 buf[6],res;  res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);if(res==0){Acce->X_data =((u16)buf[0]<<8)|buf[1];  Acce->Y_data =((u16)buf[2]<<8)|buf[3];  Acce->Z_data =((u16)buf[4]<<8)|buf[5];}   return res;;
}
  • IIC读取数据
//IIC连续读
//addr:器件地址
//reg:要读取的寄存器地址
//len:要读取的长度
//buf:读取到的数据存储区
//返回值:0,正常
//    其他,错误代码
unsigned char MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{ IIC_Start(); IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令   if(IIC_Wait_Ack())  //等待应答{IIC_Stop();       return 1;      }IIC_Send_Byte(reg);    //写寄存器地址IIC_Wait_Ack();     //等待应答IIC_Start();IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令    IIC_Wait_Ack();     //等待应答 while(len){if(len==1)*buf=IIC_Read_Byte(0);//读数据,发送nACK else *buf=IIC_Read_Byte(1);      //读数据,发送ACK  len--;buf++; }    IIC_Stop();    //产生一个停止条件 return 0;
}

2.向上位机传输底盘数据

  • 协议格式:0XFEFEFEFE … 0XEE (33个字节)
  • 包括以右手笛卡尔坐标系的X、Y、Z(旋转)三个方向的速度、电池电压、IMU等数据
  • 将速度、电压信号、重力加速度原始数据、陀螺仪角速度原始数据等打包发送到上位机(20HZ)。
#define PROTOCOL_HEADER      0XFEFEFEFE              // 协议头
#define PROTOCOL_END        0XEE                    // 协议尾#define PROTOCL_DATA_SIZE 33                      // 每帧数据长度#pragma pack(1)typedef struct __Mpu6050_Str_                       //原始数据为XYZ方向的(重力加速度、角速度)数据
{short X_data;short Y_data;short Z_data;
}Mpu6050_Str;typedef union _Upload_Data_
{unsigned char buffer[PROTOCL_DATA_SIZE];struct _Sensor_Str_{unsigned int Header;float X_speed;         // 差分轮运动学正解得到XYZ方向的线性速度float Y_speed;float Z_speed;float Source_Voltage;                // 电压信号Mpu6050_Str Link_Accelerometer;      //重力加速度原始数据Mpu6050_Str Link_Gyroscope;          //陀螺仪角速度原始数据unsigned char End_flag;}Sensor_Str;
}Upload_Data;

3.底盘接收上位机数据

  • 接收上位机的控制指令,控制电机运动(运动学逆解)
  • 通过串口1(USART1)进行数据接收校验
/*@ describetion: USART1 interrupt process function@ param: void@ return: none@ author: Xuewei Zhou@ date : 2019-4-17@ note: @ function: void USART1_IRQHandler(void)
*/
unsigned char Rcount = 0;
void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  {Recive_Data.buffer[Rcount] = USART_ReceiveData(USART1);(Recive_Data.buffer[0] == 0xFe)?(Rcount++):(Rcount = 0);if (Rcount == PROTOCL_DATA_SIZE)   //验证数据包的长度{if(Recive_Data.Sensor_Str.Header == PROTOCOL_HEADER)   //验证数据包的头部校验信息{if(Recive_Data.Sensor_Str.End_flag == PROTOCOL_END)    //验证数据包的尾部校验信息{//接收上位机控制命令,使机器人产生相应的运动Kinematics_Positive(Recive_Data.Sensor_Str.X_speed, Recive_Data.Sensor_Str.Z_speed);}}Rcount = 0;}}
}
  • 对接收到的指令进行运动学解析
    正解:通过差分轮的速度求出空间当中的XYZ的速度。(用于向ubantu提交里程计数据)
    逆解:将空间中的XYZ三个方向的速度转化到轮子运动上
/*@ describetion: Chassis kinematics Positive solution function@ param: float vx,float vz@ return: none@ author: Xuewei Zhou@ date : 2019-4-17@ note: @ function: void Kinematics_Positive(float vx,float vz)
*/
void Kinematics_Positive(float vx,float vz)
{if(vx == 0.0f){          //原地旋转或静止Right_moto.Target_Speed = vz * Base_Width / 2.0f;Left_moto.Target_Speed  = (-1) * Right_moto.Target_Speed;}else if(vz == 0.0f){    //静止或者前后运动Right_moto.Target_Speed = Left_moto.Target_Speed = vx;} else{                   //在前进或者后退过程中转弯Left_moto.Target_Speed  = vx - vz * Base_Width / 2.0f;Right_moto.Target_Speed = vx + vz * Base_Width / 2.0f;}
}

三、机器人PID控制器代码

1.


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

幻宇_差分英伟达机器人_底层控制相关推荐

  1. GTC之英伟达破局之举:机器人新战场和生态这步棋

    这一次,英伟达沉稳多了. 在去年年末的NVIDIA CTC China上,黄仁勋可谓是格外亢奋,不仅模仿迈克尔杰克逊大跳了一段"AI太空舞步",还和李小龙一起玩了一下双节棍. 这一 ...

  2. GTC之英伟达破局之举:机器人新战场和生态这步棋...

    这一次,英伟达沉稳多了. 在去年年末的NVIDIA CTC China上,黄仁勋可谓是格外亢奋,不仅模仿迈克尔杰克逊大跳了一段"AI太空舞步",还和李小龙一起玩了一下双节棍. 这一 ...

  3. 不再靠你买显卡充值信仰,英伟达已经变了

    千亿规模的服务器芯片市场,是英伟达的第二增长曲线. 「皮衣教主」黄仁勋可能睡觉都能笑醒.就在新冠疫情给电子消费.零售.制造等行业带来「深度衰退」时,以数据中心为代表的云计算行业却迎来逆势增长.近日,D ...

  4. 软硬件解耦太难!英伟达竟“越来越像Mobileye”

    尽管Mobileye已经愿意推行"软硬件解耦",但由于车企自己目前还没有能力搞定算法,Mobileye便"不得不"又回到软硬一体化的老路上. 随着软件能力越来越 ...

  5. 英伟达斥巨资“聘礼”收购ARM,半导体行业将变天?

    9月13日,一条关于芯片收购的消息在全球芯片行业引发巨震. 据路透社消息,英伟达即将斥资400亿美元(折合人民币超过2700亿元)的价格从软银手中买下英国芯片设计公司ARM.如该笔收购成功,这将是半导 ...

  6. 网络架构采用 bs/cs 混搭模式_深扒英伟达安培新架构,五大技术新招刀刀见血...

    芯东西(ID:aichip001)文 | 心缘 芯东西5月28日报道,两周前,英伟达(NVIDIA)厨房里的发布会吸引了全球AI领域的目光.联合创始人兼CEO黄仁勋对着一张砧板,密集释放一系列硬核新品 ...

  7. 要让机器人切土豆丝,英伟达首先给土豆建了个模

    鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 你知道,切开一颗土豆的过程中,刀是如何受力的.土豆又会发生怎样的形变吗? 这可不是什么没用的知识+1,至少对于机器人来说,弄清楚其中的规律, ...

  8. asic面试题目 英伟达_免笔试!不限量!全球可编程图形处理技术领袖英伟达2021校园招聘火热进行中!...

    关注并标星大同学吧 每周1次,打卡阅读 快速获取行业最新资讯 秋意浓,渐微凉 校招逐渐收尾 不少同学陆陆续续开始签约 还在观望决意不定的同学 英伟达还没结束! 筹谋已久的英伟达2021校园招聘 终于来 ...

  9. 英伟达_如何超越英伟达?

    从AI热潮中率先获益的英伟达,其GPU参数和性能频繁出现在不少AI芯片发布会的对比图中.这是在缺乏AI芯片衡量的标准时,新的AI芯片证明自己实力的不错方式.不过,声称性能超越英伟达GPU的创新AI芯片 ...

最新文章

  1. Winio驱动在64位windows下无法使用的解决方法
  2. DBScript:轻量级ORM
  3. Visual studio 快捷键大全
  4. 对象池commons-pool
  5. 华为鲲鹏弹性云服务器KM1_#化鲲为鹏,我有话说# 鲲鹏弹性云服务器配置 Tomcat...
  6. element UI 单选框设置默认选中值
  7. [php]php设计模式 Facade(外观模式)
  8. C语言CURL实现HTTP POST、GET、PUT
  9. Vue学习笔记之02-Mustache语法以及一些指令
  10. ASP.NET Web程序设计 第一章 ASP.NET Web应用程序基础笔记
  11. Android Excel 解析 xls 和 xlsx,方法也可以很简单
  12. 强化学习 Q学习原理及例子(离散)附matlab程序
  13. C - Alphabetic Removals
  14. 9个GVP国产Java开源项目!是真滴哇塞
  15. 预装Win8系统的电脑安装Win7的方法(EFI安装Win7)
  16. python学得好、进监狱进的快_最经典的100部美剧,看到第一名瞬间服气!
  17. 【教程】安装torch_sparse、torch_cluster、torch_scatter、torch_spline
  18. 《代码大全》读书笔记(转载)
  19. RPL基础知识点与组网过程
  20. win8.1电脑显示器亮度按钮无法使用

热门文章

  1. java web程序设计 郭克华 pdf_Java Web程序设计郭克华
  2. 【乔布斯】如果没有这种固执的话,他还会是如此伟大的一个产品家和CEO吗?
  3. #IB TWS编程手记——01.TWS建立基础连接
  4. 火狐中国版历史版本pc_为什么选择Firefox,以及如何在PC上获取它?
  5. TCPMP超级播放器Windows CE5.0(ARMV4)编译方法
  6. 日期计数器—C++实现
  7. 珞珈一号数据预处理完整流程及一些总结
  8. js调用windows.Print打印去掉页眉页脚
  9. 电商商城小程序开发|电商商城小程序怎么玩?
  10. 3D建模师为什么变得这么吃香?火出圈的原因太现实了!