找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 7631|回复: 6

陀螺仪编程,求各位高手指点

[复制链接]
发表于 2014-4-7 13:59:50 | 显示全部楼层 |阅读模式
          在机器人上安装陀螺仪,当机器人在行进过程中摔倒时,陀螺仪检测到机器人摔倒,可以向周围发出求助信号。
     初次接触陀螺仪,阅读说明书知道是在检测角速度的,要对其进行积分才能得到角度,但是具体要怎么在NXT软件上编程,求各位高手指点。谢谢!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2014-4-7 15:11:43 | 显示全部楼层
你问的是一个数学问题:

速度 X 时间 = 位移,当速度为角速度时,位移即为角度!  例:

一个以地理座标中X轴为轴心的运动,向左运动了1S,我们把时间1S人为分成1000等分(即1KHZ),那么运行1S以后,物体最终的角度(参照地理座标X)就是:(w0*0.001+w1*0.001+w3*0.001......w1000*0.001)
其中W0,1,2.....是陀螺在每个千分之一秒时的即时角速度!

所以,陀螺仪出角度,即积分得到角度的方法就有了!

为什么陀螺仪出角度时,如果不进行零飘纠正和必要的滤波,角度会越来越不准呢,其实也可以从上面的原理中看出来:
1,如果每秒1000次积分,陀螺仪出来的原始角速度就是有固定误差的,那么1000次乘法的累加以后的结果误差会有多大!
2,因为是积分算法,而我们又不可能将积分时间划得很细很细,所以我们采含集到的1000个即时角速度,并不能代表这个陀螺1S运动过程中运动曲线,有可能采集时滤掉了最高点和最低点,有可能采集到的偏于上差或者下差,这些因素肯定影响积分结果(精度)。从积分的角度上讲,理论将时间片再划细,精度就会更高.......


如果你仅仅是判断机器人摔倒与否,只要用加速度传感器就行了!


如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2014-4-7 16:24:05 | 显示全部楼层
本帖最后由 米苏 于 2014-4-7 20:21 编辑

谢谢您非常详细的解答,陀螺仪的角速度有分X Y Z三个方向吗? 请教一下要怎么编程呢?
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2014-4-7 16:43:18 | 显示全部楼层
blackblue 发表于 2014-4-7 15:11
你问的是一个数学问题:

速度 X 时间 = 位移,当速度为角速度时,位移即为角度!  例:

乐高的加速度传感器没用过,请问是属于角加速度还是线加速度?
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-4-8 09:03:06 | 显示全部楼层
其实HT的网站上全有的:
1,获取零飘:
// GetGyroOffset
//
// This function returns a suitable initial gyro offset.  It takes
// 100 gyro samples over a time of 1/2 second and averages them to
// get the offset.  It also check the max and min during that time
// and if the difference is larger than one it rejects the data and
// gets another set of samples.
#define OFFSET_SAMPLES 100

void GetGyroOffset()
{
  float gSum;
  int  i, gMin, gMax, g;

  ClearScreen();
  TextOut(0, LCD_LINE1, "HiTechnic-HTWayC");

  TextOut(0, LCD_LINE4, "Lay robot down");
  TextOut(0, LCD_LINE5, "flat to get gyro");
  TextOut(0, LCD_LINE6, "offset.");
  
  // Ensure that the motor controller is active since this affects
  // the gyro values.
  Off(MOTORS);
  
  do {
    gSum = 0.0;
    gMin = 1000;
    gMax = -1000;
    for (i=0; i<OFFSET_SAMPLES; i++) {
      g = SensorHTGyro(GYRO);

      if (g > gMax)
        gMax = g;
      if (g < gMin)
        gMin = g;

      gSum += g;
      Wait(5);
    }
  } while ((gMax - gMin) > 1);   // Reject and sample again if range too large

  //Average the sum of the samples.
  gOffset = gSum / OFFSET_SAMPLES + 1.0;
  
  // Even with motor controller active, the initial offset appears to
  // be off from the actual needed offset to keep robot from wondering.
  // This +1 helps keep robot from wondering when it first starts to
  // balance.
}


2,陀螺积分出角度:

// GetGyroData(float &gyroSpeed, float &gyroAngle)
//
// Get the data from the gyro.
// Fills the pass by reference gyroSpeed and gyroAngle based on
// updated information from the Gyro Sensor
//
// Maintains an automatically adjusted gyro offset as well as
// the integrated gyro angle.
inline void GetGyroData(float &gyroSpeed, float &gyroAngle)
{
  float gyroRaw;

  gyroRaw = SensorHTGyro(GYRO);
  gOffset = EMAOFFSET * gyroRaw + (1-EMAOFFSET) * gOffset;
  gyroSpeed = gyroRaw - gOffset;

  gAngleGlobal += gyroSpeed*tInterval;
  gyroAngle = gAngleGlobal;
}

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-4-10 10:14:03 | 显示全部楼层
牛啊,惭愧大学数学没学好。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-4-10 10:20:22 | 显示全部楼层
牛啊,惭愧大学数学没学好。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

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

本版积分规则

手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-11-23 17:32 , Processed in 0.093045 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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