之前的案例,可以进一步扩展:


机器人微控制器编程(CoCube)-突破边界

从AD到电压;电压和电量,什么关系:

锂电池电压和电量之间,有一定的对应关系,通过对开路电压的测量,可以大致得出电池的剩余电量。不过用电压测量电量的方式有一定的不稳定性,例如放电电流、环境温度、循环、放电平台、电极材料等,都会给最后结果的准确与否带来影响。
电压和电量的对应关系是:100%----4.20V、90%-----4.06V、80%-----3.98V、70%-----3.92V、60%-----3.87V、50%-----3.82V、40%-----3.79V、30%-----3.77V、20%-----3.74V、10%-----3.68V、5%------3.45V、0%------3.00V。锂电池能够实现用电压测量剩余电量,主要是因为这种电池有一个很独特的性质:在电池放电时,电池电压会随着电量的流失而逐渐降低,从而形成了一种正相关的关系,并且有一定的斜率。因此我们能够依据剩余电量估算出大概的电压,反之亦然。

进一步:

电量和机器人任务状态的关系:

充电:检测是否满电

工作:检测电量是否在范围内,执行任务

低电:机器人进入低功耗和准备充电模式

哪些由机器人做,哪些由服务器做?


卡尔曼滤波:

MPU6050数据进一步扩展

机器人微控制器编程(CoCube)-深度融合


#include <MPU6050_tockn.h>
#include <Wire.h>
#include <Kalman.h> // Source: https://github.com/TKJElectronics/KalmanFilter#define RESTRICT_PITCH // Comment out to restrict roll to ±90deg instead - please read: http://www.freescale.com/files/sensors/doc/app_note/AN3461.pdfMPU6050 mpu6050(Wire);Kalman kalmanX; // Create the Kalman instances
Kalman kalmanY;uint32_t timer;/* IMU Data */
double accX, accY, accZ;
double gyroX, gyroY, gyroZ;
int16_t tempRaw;double gyroXangle, gyroYangle; // Angle calculate using the gyro only
double compAngleX, compAngleY; // Calculated angle using a complementary filter
double kalAngleX, kalAngleY; // Calculated angle using a Kalman filter// TODO: Make calibration routinevoid setup() {Serial.begin(115200);Wire.begin();mpu6050.begin();mpu6050.calcGyroOffsets(true);delay(1000); // Wait for sensor to stabilize/* Set kalman and gyro starting angle */mpu6050.update();accX = mpu6050.getAccX();accY = mpu6050.getAccY();accZ = mpu6050.getAccZ();// Source: http://www.freescale.com/files/sensors/doc/app_note/AN3461.pdf eq. 25 and eq. 26// atan2 outputs the value of -π to π (radians) - see http://en.wikipedia.org/wiki/Atan2// It is then converted from radians to degrees
#ifdef RESTRICT_PITCH // Eq. 25 and 26double roll  = atan2(accY, accZ) * RAD_TO_DEG;double pitch = atan(-accX / sqrt(accY * accY + accZ * accZ)) * RAD_TO_DEG;
#else // Eq. 28 and 29double roll  = atan(accY / sqrt(accX * accX + accZ * accZ)) * RAD_TO_DEG;double pitch = atan2(-accX, accZ) * RAD_TO_DEG;
#endifkalmanX.setAngle(roll); // Set starting anglekalmanY.setAngle(pitch);gyroXangle = roll;gyroYangle = pitch;compAngleX = roll;compAngleY = pitch;timer = micros();
}void loop() {/* Update all the values */mpu6050.update();accX = mpu6050.getAccX();accY = mpu6050.getAccY();accZ = mpu6050.getAccZ();tempRaw = mpu6050.getTemp();gyroX = mpu6050.getGyroX();gyroY = mpu6050.getGyroY();gyroZ = mpu6050.getGyroZ();double dt = (double)(micros() - timer) / 1000000; // Calculate delta timetimer = micros();// Source: http://www.freescale.com/files/sensors/doc/app_note/AN3461.pdf eq. 25 and eq. 26// atan2 outputs the value of -π to π (radians) - see http://en.wikipedia.org/wiki/Atan2// It is then converted from radians to degrees
#ifdef RESTRICT_PITCH // Eq. 25 and 26double roll  = atan2(accY, accZ) * RAD_TO_DEG;double pitch = atan(-accX / sqrt(accY * accY + accZ * accZ)) * RAD_TO_DEG;
#else // Eq. 28 and 29double roll  = atan(accY / sqrt(accX * accX + accZ * accZ)) * RAD_TO_DEG;double pitch = atan2(-accX, accZ) * RAD_TO_DEG;
#endifdouble gyroXrate = gyroX / 131.0; // Convert to deg/sdouble gyroYrate = gyroY / 131.0; // Convert to deg/s#ifdef RESTRICT_PITCH// This fixes the transition problem when the accelerometer angle jumps between -180 and 180 degreesif ((roll < -90 && kalAngleX > 90) || (roll > 90 && kalAngleX < -90)) {kalmanX.setAngle(roll);compAngleX = roll;kalAngleX = roll;gyroXangle = roll;} elsekalAngleX = kalmanX.getAngle(roll, gyroXrate, dt); // Calculate the angle using a Kalman filterif (abs(kalAngleX) > 90)gyroYrate = -gyroYrate; // Invert rate, so it fits the restriced accelerometer readingkalAngleY = kalmanY.getAngle(pitch, gyroYrate, dt);
#else// This fixes the transition problem when the accelerometer angle jumps between -180 and 180 degreesif ((pitch < -90 && kalAngleY > 90) || (pitch > 90 && kalAngleY < -90)) {kalmanY.setAngle(pitch);compAngleY = pitch;kalAngleY = pitch;gyroYangle = pitch;} elsekalAngleY = kalmanY.getAngle(pitch, gyroYrate, dt); // Calculate the angle using a Kalman filterif (abs(kalAngleY) > 90)gyroXrate = -gyroXrate; // Invert rate, so it fits the restriced accelerometer readingkalAngleX = kalmanX.getAngle(roll, gyroXrate, dt); // Calculate the angle using a Kalman filter
#endifgyroXangle += gyroXrate * dt; // Calculate gyro angle without any filtergyroYangle += gyroYrate * dt;//gyroXangle += kalmanX.getRate() * dt; // Calculate gyro angle using the unbiased rate//gyroYangle += kalmanY.getRate() * dt;compAngleX = 0.93 * (compAngleX + gyroXrate * dt) + 0.07 * roll; // Calculate the angle using a Complimentary filtercompAngleY = 0.93 * (compAngleY + gyroYrate * dt) + 0.07 * pitch;// Reset the gyro angle when it has drifted too muchif (gyroXangle < -180 || gyroXangle > 180)gyroXangle = kalAngleX;if (gyroYangle < -180 || gyroYangle > 180)gyroYangle = kalAngleY;/* Print Data */
#if 0 // Set to 1 to activateSerial.print(accX); Serial.print("\t");Serial.print(accY); Serial.print("\t");Serial.print(accZ); Serial.print("\t");Serial.print(gyroX); Serial.print("\t");Serial.print(gyroY); Serial.print("\t");Serial.print(gyroZ); Serial.print("\t");Serial.print("\t");
#endifSerial.print(roll); Serial.print("\t");Serial.print(gyroXangle); Serial.print("\t");Serial.print(compAngleX); Serial.print("\t");Serial.print(kalAngleX); Serial.print("\t");Serial.print("\t");Serial.print(pitch); Serial.print("\t");Serial.print(gyroYangle); Serial.print("\t");Serial.print(compAngleY); Serial.print("\t");Serial.print(kalAngleY); Serial.print("\t");#if 0 // Set to 1 to print the temperatureSerial.print("\t");double temperature = (double)tempRaw / 340.0 + 36.53;Serial.print(temperature); Serial.print("\t");
#endifSerial.print("\r\n");
}

机器人微控制器编程(CoCube)-强化实践相关推荐

  1. 机器人微控制器编程(CoCube)-破除定势

    从课程到生活: 从书本到理想: 从程序到生态: 从个体到集群: 从特殊到一般: 从传统到现代: 从技术到科学: 从理论到工程: 从基础到高阶. -- 课程归根结底,是为学生服务的,学生得到提升的课程, ...

  2. PacketTracer模拟器物联网教程2—MCU微控制器编程

    PacketTracer模拟器物联网教程2-MCU微控制器编程 注:新版内容已更新,如有需要请点击跳转 注:新版内容已更新,如有需要请点击跳转 一.目的 使用MCU微控制器实现对物联网设备的控制(使用 ...

  3. python微控制器编程从零开始-Python微控制器编程从零开始 使用MicroPython

    目 录 第1章 概述 1 1.1 MicroPython简介 1 1.2 设计思想 2 1.3 MicroPython探究 2 1.4 面向对象编程和一些Python基础 4 1.4.1 面向对象的概 ...

  4. python微控制器编程从零开始下载_Python微控制器编程从零开始(使用MicroPython)...

    目 录 第1章 概述 1 1.1 MicroPython简介 1 1.2 设计思想 2 1.3 MicroPython探究 2 1.4 面向对象编程和一些Python基础 4 1.4.1 面向对象的概 ...

  5. python微控制器编程从零开始 开发板_Python微控制器编程从零开始 使用MicroPython 文轩网正版图书...

    章概述1 1.1MicroPython简介1 1.2设计思想2 1.3MicroPython探究2 1.4面向对象编程和一些Python基础4 1.4.1面向对象的概念4 1.4.2建模一个机器人7 ...

  6. python微控制器编程从零开始下载_Python微控制器编程从零开始 使用MicroPython

    目 录 第1章 概述 1 1.1 MicroPython简介 1 1.2 设计思想 2 1.3 MicroPython探究 2 1.4 面向对象编程和一些Python基础 4 1.4.1 面向对象的概 ...

  7. 微控制器编程技术c语言,8位单片机C语言编程:基于PIC16(用c语言对pic16微控制器进行编程的实用指导)...

    第1章 PIC微控制器系统1 1.1 PIC 16 微控制器1 1.1.1 MCU特性2 1.1.2 程序执行3 1.1.3 RAM文件寄存器4 1.1.4 其他PIC芯片5 1.2 PIC MCU配 ...

  8. 超图解python物联网实作入门_完美图解物联网IoT实操:ESP8266 Arduino,Cordova物联网移动App,JavaScript微控制器编程...

    本书探讨的核心主题是串联.汇流整合.互联网从最初的人际沟通桥梁,拓展成机器之间协同合作的交流管道. 本书强调的是串联网络软件和微电脑控制板,以JavaScript 为主线,开发网络应用程序.手机App ...

  9. python微控制器编程从零开始 豆瓣_从零开始(什么是编程)认识python

    1.什么是语言? 语言是一个事物与另一个事物交流的介质 python是人与计算机交流的介质 能够被计算机所识别的表达方式即是编程语言 2.什么是编程? 编程就是程序员将想让计算机做的事情用编程语言表达 ...

最新文章

  1. 在AWS Lambda上运行脚本语言:PHP、Ruby和Go(外文翻译)
  2. Vue中使用form表单提交刷新问题
  3. ceo for one month final around
  4. ffmpeg源码实现抽取音频并保存 --C++实现
  5. python io包_关于python中的IO流
  6. 第 36 章 RRDTool
  7. Spring框架----基于子类的动态代理
  8. 我的IT之路2011(二)
  9. .Net File类的操作
  10. Oracle 列转行函数 Listagg()
  11. open cv+C++错误及经验总结(三)
  12. ubuntu nginx配置虚拟主机,目录
  13. Python常用的字符串操作
  14. 修改 Windows Host 文件工具
  15. Oracle 官宣:腾讯 JDK 18 国内第一!
  16. WCF DataService调试时的一些问题
  17. Android中获取IMEI码及其它相关信息的源码
  18. 刷题记录 CF每日一题打卡 2020.6月7-6月13
  19. python语言程序设计实践教程答案上海交通大学_计算机二级教程 Python语言程序设计 第5章基本数据类型...
  20. CSS世界Bug般的存在——字母x与“居中”

热门文章

  1. 阿里OceanBase破茧成蝶 跃升DB界宠儿
  2. kafka生产报错couldn‘t resolve server 9092 from bootstrap.servers as DNS
  3. [power bi]calculate
  4. 挽救损坏的 Word 文档
  5. php的ci框架前后台分离,基于CodeIgniter框架的前后端完全分离开发
  6. 计算机毕业设计SpringBoot美容院后台管理系统[包运行成功]
  7. 漫步微积分九——乘法和除法法则
  8. 创新工场CTO王咏刚:人类最后一个独立写作的纪元
  9. 通过FEDOT将AutoML用于时间序列数据
  10. 【人机交互与普适计算】 2019年-中国计算机学会推荐国际学术会议和期刊目录(九)