幻宇_差分英伟达机器人_底层控制
差分英伟达机器人_底层控制系统
该层控制系统接入了加速度、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提供了大量能使我们快速便捷地处理数据的函数和方法。
幻宇_差分英伟达机器人_底层控制相关推荐
- GTC之英伟达破局之举:机器人新战场和生态这步棋
这一次,英伟达沉稳多了. 在去年年末的NVIDIA CTC China上,黄仁勋可谓是格外亢奋,不仅模仿迈克尔杰克逊大跳了一段"AI太空舞步",还和李小龙一起玩了一下双节棍. 这一 ...
- GTC之英伟达破局之举:机器人新战场和生态这步棋...
这一次,英伟达沉稳多了. 在去年年末的NVIDIA CTC China上,黄仁勋可谓是格外亢奋,不仅模仿迈克尔杰克逊大跳了一段"AI太空舞步",还和李小龙一起玩了一下双节棍. 这一 ...
- 不再靠你买显卡充值信仰,英伟达已经变了
千亿规模的服务器芯片市场,是英伟达的第二增长曲线. 「皮衣教主」黄仁勋可能睡觉都能笑醒.就在新冠疫情给电子消费.零售.制造等行业带来「深度衰退」时,以数据中心为代表的云计算行业却迎来逆势增长.近日,D ...
- 软硬件解耦太难!英伟达竟“越来越像Mobileye”
尽管Mobileye已经愿意推行"软硬件解耦",但由于车企自己目前还没有能力搞定算法,Mobileye便"不得不"又回到软硬一体化的老路上. 随着软件能力越来越 ...
- 英伟达斥巨资“聘礼”收购ARM,半导体行业将变天?
9月13日,一条关于芯片收购的消息在全球芯片行业引发巨震. 据路透社消息,英伟达即将斥资400亿美元(折合人民币超过2700亿元)的价格从软银手中买下英国芯片设计公司ARM.如该笔收购成功,这将是半导 ...
- 网络架构采用 bs/cs 混搭模式_深扒英伟达安培新架构,五大技术新招刀刀见血...
芯东西(ID:aichip001)文 | 心缘 芯东西5月28日报道,两周前,英伟达(NVIDIA)厨房里的发布会吸引了全球AI领域的目光.联合创始人兼CEO黄仁勋对着一张砧板,密集释放一系列硬核新品 ...
- 要让机器人切土豆丝,英伟达首先给土豆建了个模
鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 你知道,切开一颗土豆的过程中,刀是如何受力的.土豆又会发生怎样的形变吗? 这可不是什么没用的知识+1,至少对于机器人来说,弄清楚其中的规律, ...
- asic面试题目 英伟达_免笔试!不限量!全球可编程图形处理技术领袖英伟达2021校园招聘火热进行中!...
关注并标星大同学吧 每周1次,打卡阅读 快速获取行业最新资讯 秋意浓,渐微凉 校招逐渐收尾 不少同学陆陆续续开始签约 还在观望决意不定的同学 英伟达还没结束! 筹谋已久的英伟达2021校园招聘 终于来 ...
- 英伟达_如何超越英伟达?
从AI热潮中率先获益的英伟达,其GPU参数和性能频繁出现在不少AI芯片发布会的对比图中.这是在缺乏AI芯片衡量的标准时,新的AI芯片证明自己实力的不错方式.不过,声称性能超越英伟达GPU的创新AI芯片 ...
最新文章
- Winio驱动在64位windows下无法使用的解决方法
- DBScript:轻量级ORM
- Visual studio 快捷键大全
- 对象池commons-pool
- 华为鲲鹏弹性云服务器KM1_#化鲲为鹏,我有话说# 鲲鹏弹性云服务器配置 Tomcat...
- element UI 单选框设置默认选中值
- [php]php设计模式 Facade(外观模式)
- C语言CURL实现HTTP POST、GET、PUT
- Vue学习笔记之02-Mustache语法以及一些指令
- ASP.NET Web程序设计 第一章 ASP.NET Web应用程序基础笔记
- Android Excel 解析 xls 和 xlsx,方法也可以很简单
- 强化学习 Q学习原理及例子(离散)附matlab程序
- C - Alphabetic Removals
- 9个GVP国产Java开源项目!是真滴哇塞
- 预装Win8系统的电脑安装Win7的方法(EFI安装Win7)
- python学得好、进监狱进的快_最经典的100部美剧,看到第一名瞬间服气!
- 【教程】安装torch_sparse、torch_cluster、torch_scatter、torch_spline
- 《代码大全》读书笔记(转载)
- RPL基础知识点与组网过程
- win8.1电脑显示器亮度按钮无法使用
热门文章
- java web程序设计 郭克华 pdf_Java Web程序设计郭克华
- 【乔布斯】如果没有这种固执的话,他还会是如此伟大的一个产品家和CEO吗?
- #IB TWS编程手记——01.TWS建立基础连接
- 火狐中国版历史版本pc_为什么选择Firefox,以及如何在PC上获取它?
- TCPMP超级播放器Windows CE5.0(ARMV4)编译方法
- 日期计数器—C++实现
- 珞珈一号数据预处理完整流程及一些总结
- js调用windows.Print打印去掉页眉页脚
- 电商商城小程序开发|电商商城小程序怎么玩?
- 3D建模师为什么变得这么吃香?火出圈的原因太现实了!