[go: up one dir, main page]

CN101809528A - 用于提供滚动补偿的方法和装置 - Google Patents

用于提供滚动补偿的方法和装置 Download PDF

Info

Publication number
CN101809528A
CN101809528A CN200880109176A CN200880109176A CN101809528A CN 101809528 A CN101809528 A CN 101809528A CN 200880109176 A CN200880109176 A CN 200880109176A CN 200880109176 A CN200880109176 A CN 200880109176A CN 101809528 A CN101809528 A CN 101809528A
Authority
CN
China
Prior art keywords
data
roll
control device
roll compensation
compensation
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN200880109176A
Other languages
English (en)
Inventor
沃尔特·M·梅森
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Thomson Licensing SAS
Original Assignee
Thomson Licensing SAS
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Thomson Licensing SAS filed Critical Thomson Licensing SAS
Publication of CN101809528A publication Critical patent/CN101809528A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/01Input arrangements or combined input and output arrangements for interaction between user and computer
    • G06F3/03Arrangements for converting the position or the displacement of a member into a coded form
    • G06F3/033Pointing devices displaced or positioned by the user, e.g. mice, trackballs, pens or joysticks; Accessories therefor
    • G06F3/0346Pointing devices displaced or positioned by the user, e.g. mice, trackballs, pens or joysticks; Accessories therefor with detection of the device orientation or free movement in a 3D space, e.g. 3D mice, 6-DOF [six degrees of freedom] pointers using gyroscopes, accelerometers or tilt-sensors
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04MTELEPHONIC COMMUNICATION
    • H04M1/00Substation equipment, e.g. for use by subscribers
    • H04M1/72Mobile telephones; Cordless telephones, i.e. devices for establishing wireless links to base stations without route selection
    • H04M1/724User interfaces specially adapted for cordless or mobile telephones
    • H04M1/72403User interfaces specially adapted for cordless or mobile telephones with means for local support of applications that increase the functionality
    • H04M1/72409User interfaces specially adapted for cordless or mobile telephones with means for local support of applications that increase the functionality by interfacing with external accessories
    • H04M1/72415User interfaces specially adapted for cordless or mobile telephones with means for local support of applications that increase the functionality by interfacing with external accessories for remote control of appliances
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04MTELEPHONIC COMMUNICATION
    • H04M2250/00Details of telephonic subscriber devices
    • H04M2250/12Details of telephonic subscriber devices including a sensor for measuring a physical value, e.g. temperature or motion

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Human Computer Interaction (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Position Input By Displaying (AREA)
  • Gyroscopes (AREA)
  • Control Of Position, Course, Altitude, Or Attitude Of Moving Bodies (AREA)
  • User Interface Of Digital Computer (AREA)
  • Navigation (AREA)

Abstract

本公开的实施例涉及用于在控制设备(110)中提供滚动补偿的方法和装置,该方法和装置包括:获取(310)指示出所述控制设备(110)的运动的旋转数据和线性数据;向所获取的数据应用(320)滚动补偿;以及从经滚动补偿的数据中去除(330)滚动补偿误差。诸如陀螺仪传感器(230、240)和(一个或多个)加速计传感器(250)之类的惯性传感器可用于获取旋转和线性数据。

Description

用于提供滚动补偿的方法和装置
本申请根据35U.S.C.§119要求2007年9月26日在美国提交的临时申请60/995382的权益。
技术领域
本发明总地涉及手持式控制设备,更具体而言涉及具有滚动补偿和与之相关联的改进的易用性的手持式控制设备。
背景技术
本部分旨在向读者介绍与以下描述和/或要求保护的本发明的各种方面可能有关的现有技术的各种方面。相信这里的论述有助于向读者提供背景信息,以促进对本发明的各种方面的更好的理解。从而,应当明白,这些陈述应当据此来加以理解,而不应当被理解为承认是现有技术。
传统的控制设备控制诸如电视、计算机和显示器之类的接收机。典型的控制功能包括使接收机加电和断电,在接收机所显示的菜单间穿行、以及控制接收机所显示的图形元素的显示。通常,用户利用控制设备上的按钮(例如,电源按钮、导航按钮、菜单按钮等等)来访问这些控制功能,或者控制设备可检测简单的运动(例如,利用跟踪球或LED布置来检测沿某一表面的运动的鼠标)。这些传统的控制设备有这样的缺陷,即不跟踪其自己在自由空间中的运动(即,传统的控制设备只能跟踪其沿着某一表面的运动)。
近来,已经引入了更新的控制设备。这些更新的设备可以利用诸如加速计传感器或陀螺仪传感器之类的惯性传感器来跟踪其在自由空间中的运动。然而,这些更新的控制设备具有不提供滚动补偿的缺陷。结果,这些更新的控制设备的自由空间跟踪是不精确的。
本公开致力于解决这些缺陷。
发明内容
所公开的本发明的实施例涉及一种用于在控制设备中提供滚动补偿的方法和装置,该方法和装置包括获取指示控制设备的运动的旋转数据和线性数据,向所获取的数据应用滚动补偿,并且从经滚动补偿的数据中去除滚动补偿误差。诸如陀螺仪传感器和(一个或多个)加速计传感器之类的惯性传感器可用于获取旋转和线性数据。
附图说明
在附图中:
图1是使用本公开的实施例的示例性控制系统的框图。
图2是进一步示出图1的运动感测处理器的示图。
图3是示出本公开的示例性滚动补偿过程的框图。
从以下以示例方式给出的描述中,本发明的特性和优点可变得更清楚。
具体实施方式
下面将描述本发明的一个或多个特定实施例。为了提供对这些实施例的简洁描述,说明书中没有描述实际实现的所有特征。应当明了,当在任何工程或设计项目中开发任何这种实际实现时,必须做出许多依实现而定的决定,以实现开发者的具体目标,例如服从与系统有关和与业务有关的约束,这些约束在不同实现之间可能是不同的。另外,应当明了,这种开发工作可能是复杂且耗时的,但对于受益于本公开的普通技术人员来说也只不过是设计、制作和制造的例行工作。
以下描述了用于利用具有诸如加速计或陀螺仪之类的惯性传感器的控制设备来控制显示器的系统。用于控制除显示器以外的设备的其他系统可包括很类似的结构。本领域的普通技术人员将会明了,这里描述的系统和电路的实施例只是一种可能的实施例。因此,在替换实施例中,可以重新布置或省略系统和电路的组件,或者可添加另外的组件。
现在转到附图,并首先参考图1,其中示出了利用本公开的一个实施例的示例性系统的框图。图1示出了可利用本公开的滚动补偿过程的可能的应用、环境或系统100。系统100包括控制设备110和接收机120。控制设备110例如可以是(但不限于)遥控器、鼠标、游戏控制器、虚拟现实控制器、指示器、移动设备(例如,膝上型计算机、PDA、蜂窝电话、无线电话、移动TV等等)或者其他数字媒体输入设备。控制设备110如下所述检测其何时运动了(即,其何时被以线性方式沿着x、y或z平面移动,其何时被旋转(例如,俯仰、摇摆和滚动运动),或者上述的任何组合),并且响应于对运动的检测,控制设备110向接收机120发送控制信号。接收机120例如是(但不限于)TV、显示器、机顶盒、游戏控制台、虚拟现实控制台等等。另外,应当注意,接收机120和控制设备110可被集成到同一平台上(例如,手持式游戏控制台、PDA、蜂窝电话、无线电话、移动TV等等),使得当该平台运动时,控制设备生成控制信号。响应于接收机120接收到来自控制设备110的控制信号,接收机120可以使得诸如(但不限于)光标、突出显示框、菜单、游戏人物或对象之类的图形元素在显示器上运动。图形元素的运动的精确性可以通过如下文中更详细描述的本公开的滚动补偿过程得以提高。还应当注意,接收机可以被集成到可动设备中(例如,遥控车辆、飞机、船支、机电设备等等),使得控制设备110的运动导致该可动设备的运动。
控制设备110包括微处理器130、发送机140、用户接口150以及利用本公开的滚动补偿过程的运动传感处理器160。在一个实施例中,微处理器接收来自用户接口150和运动感测处理器160的输入,并且基于这些输入来使得发送机140发送控制信号到接收机120。在另一实施例中,例如,当接收机120和控制设备110被集成到同一平台上时,微处理器130可以直接控制显示器上图形元素的运动,或者可以经由接收机120、其他中间模块或电路或者上述的任何组合来间接控制这种运动。用户接口150可以包括(但不限于)用户可选择按钮、开关、拨盘、滚动或鼠标滚轮、触摸敏感屏等等。用户接口150所控制或发起的一些示例性功能可包括(但不限于)使控制设备加电和断电、选择显示器上被突出显示的对象调整运动感测处理器160的行为(如果控制设备110在一表面上,则使运动感测处理器160进入第一模式,而如果系统100从该表面移开并且在自由空间中运动,则使运动感测处理器160进入第二模式)、使菜单被显示在显示器上、或者本领域的技术人员已知的其他功能。运动传感处理器160如下所述从各种运动传感器获取运动数据或信息,并且组合或集成运动数据以生成表示控制设备110的运动的运动信号。运动传感处理器160将运动信号传递到微处理器130,从而使得微处理器130能够例如使得图形对象在显示器上运动。
在优选实施例中,控制设备110包括以下特征。控制设备110具有五个自由度(例如,利用诸如陀螺仪传感器之类的惯性传感器沿着两个旋转轴跟踪运动,并且利用诸如加速计之类的惯性传感器沿着三个线性轴跟踪运动)。控制设备110具有360度的滚动补偿,使得任何被滚动的朝向都产生真实的X-Y运动。控制设备110具有动态漂移补偿,使得例如(一个或多个)加速计在控制设备110的运动期间促进或允许漂移补偿。控制设备110具有较小的大小、较低的功耗以及较快的启动时间。控制设备110的一些示例性操作参数包括具有从2.7至3.3伏特DC(VDC)的电源电压、具有在微处理器130和运动感测处理器160之间的串行外围接口(SPI)、具有7微安的检测运动电流、4.5毫安的稳态电流以及8毫秒的最大采样率。
现在参考图2,图1的运动感测处理器160被更详细示出。运动传感处理器160包括控制器200,该控制器200经由模拟调节电路220和模数转换器(ADC)210接收来自诸如陀螺仪传感器230和240之类的惯性传感器的旋转或角运动信号。模拟调节电路220对从陀螺仪传感器230和240接收的模拟旋转运动信号进行滤波,使得经滤波的模拟旋转运动信号处于要被ADC 210数字化的适当状况中。用于调节模拟信号的多种滤波器和滤波技术是本领域的技术人员已知的并且被认为在本公开的范围内。ADC 210对旋转运动信号进行数字化,并把数字旋转运动信号提供给控制器200。ADC 210优选地具有10位2通道ADC分辨率,但其他ADC分辨率也被认为在本公开的范围内。
控制器200还接收来自诸如加速计传感器250之类的惯性传感器的线性运动信号。在一个示例性实施例中,三个加速计250向控制器200提供信号。第一加速计用于检测沿X轴的运动并向控制器200提供指示出沿X轴的运动的信号,第二加速计用于检测沿Y轴的运动并向控制器200提供指示出沿Y轴的运动的信号,并且第三加速计用于检测沿Z轴的运动并向控制器200提供指示出沿Z轴的运动的信号。应当注意,加速计传感器250可提供模拟或数字信号或数据,而控制器200对其中任一种的处理都被认为在本公开的范围内。在另一实施例中,诸如三轴加速传感器之类的微机电系统(MEMS)设备可用于检测控制设备沿着X、Y和Z轴的线性运动。
控制器200优选地包含使用例如固件的软件模块,其中包括用于提供如下文中更详细论述的根据本公开的滚动补偿的过程。应当注意,在其他实施例中软件模块可被存储在控制器200的内部存储器或者存储在外部存储器(未示出)中。滚动补偿过程包括直接对接收到的旋转速率数据执行滚动补偿,而不转化参照系(frame of reference),并且还包括去除滚动补偿的不良影响,而不计算控制设备110的离心和线性加速度。
控制器200可被制作为具有以下操作参数的集成电路:在从2.7至5.5VDC的供应电压范围内操作,在从-10摄氏度到+70摄氏度的温度范围内操作,在3.3VDC和25摄氏度下具有1.7毫安的典型电流消耗,并且具有10微安的休眠电流消耗。优选地,控制器200允许对诸如(但不限于)增益、阈值和功率状态控制之类的一些参数的动态调整。
应当注意,虽然ADC 210、模拟调节电路220、陀螺仪传感器230和240以及加速计传感器250被示为与控制器200分离,但是这些元件中的任何一个或全部都可以是控制器200的一个组成部分。对这种集成控制器的创建或制作是本领域的技术人员已知的,并且被认为在本公开的范围内。
控制器200接收由陀螺仪传感器230和240以及加速计传感器250生成的线性和旋转运动信号,处理这些运动信号以提供根据本公开的滚动补偿等等,并且把经处理的运动信号传递给控制设备110的微处理器130。应当注意,取决于例如控制设备在何种操作模式下操作,控制器200可以把经处理的旋转运动信号和线性运动信号中的每一个分开传递给微处理器130,可以把表示经处理的旋转运动信号和线性运动信号的集成信号传递给微处理器130,或者可以选择性地把经处理的旋转运动信号和线性运动信号中的一些传递给微处理器130。例如,如果控制设备110作为桌上型鼠标操作,则控制器200可以只传递指示出控制设备在X和Y方向上的线性运动的信号。或者,如果控制设备110在自由空间中操作,则控制器可以传递指示出控制设备的所有线性和旋转运动的分开的信号或集成的信号。
现在参考图3,其中示出了用于提供根据本公开的滚动补偿的方法或过程300。最初,在步骤310,控制器200接收或获取来自陀螺仪传感器230和240的旋转运动数据或信号以及来自加速计250的线性运动数据或信号,如上所述。接下来,在步骤320,控制器200在不转化参照系的情况下对运动数据提供或应用滚动补偿。滚动补偿步骤320在下面提供的软件模块描述中进一步论述。然后,在步骤330,控制器200在不计算控制设备110的离心和线性加速度的情况下,从运动数据中去除滚动补偿的应用的不良影响或者说滚动补偿误差,这在下面提供的软件模块描述中进一步论述。
在下面提供的软件模块中论述用于提供根据本公开的滚动补偿的方法。该软件模块是控制器200所利用的固件的一部分。
在控制器200中实现滚动补偿特征的软件模块:
***************************************************************************/
                              包括外部声明文件
**************************************************************************/
#include″project_config.h″
#include<stdio.h>
#include<stdlib.h>
#include″spi.h″
//--------------------------------------
//外部函数声明
//--------------------------------------
void Trap(unsigned char);
//--------------------------------------
//本地函数声明
//--------------------------------------
double Dabs(double x);
double Swine(double x);
double Root(double r);
double Get_Theta(double x,double y);
void Gyro_Off(void);
//--------------------------------------
//本地定义
//--------------------------------------
#define PI 3.141592654
#define PIBY2 1.5707963
#define COEFF_1 0.7854
#define COEFF_2 2.3562
#define COEFF_3 1.27323954474
#define COEFF_4 -0.4052847346
#define COEFF_5 0.225
#define READ_X      0x93
#define READ_Y 0xB3
#define ACTIVATE_ INTERVAL    5
#define DESK_SENSE_INTERVAL 100
#define DESK_SENSE_PULSE  500
#define ADC_INTERVAL         6
#define GYRO_TIMER_INTERVAL 100
#define GYRO_SCALE_FACTOR 50
#define STEADY_THRESHOLD 20
#define MOTION_NOISE    0//wmm 10>0 for testing
#define STEADY_SAMPLES  10
//#define CT                    374//wmm 374是理论中心
//#define SPAN          8
#define GUL                     406//wmm G向量幅值限定句
Upper Limit+16VG
#define GLL                     342//wmm G向量幅值限定句
Lower Limit+16VG
//CT=374.374+/-64=438,310
//CT=374.374+/-32=406,342 proto values
//CT=374.374+/-16=390,358
//CT=374.374+/-8=382,366=RC too small
#define GVECTOR_ZERO     3.0//wmm 10*sqrt(Gain_AX)=~15deg.
/*************************************************************************
*      变量存储
**************************************************************************/
//extern unsigned char self_steady_done_flag;
unsigned int rest_count_x,rest_count_y;
extern unsigned char Buf[];
signed int gyro_x,gyro_y;
signed int x_min,y_min,x_max,y_max;
signed int ax_min,ay_min,az_min,ax_max,ay_max,az_max;
signed long x_steady,y_steady;
unsigned char num_steady_samples;
signed int x_mickeys,y_mickeys;
unsigned long gyro_timer;
unsigned char turned_on;
signed int      accel_x,accel_y,accel_z,gain_sum,sign;
signed int      x_sum,y_sum,z_sum;
double                dax,day,daz;
double      theta2,theta3,theta4;
double          rrx,rry,rr_mag,gvisya;
double          grv_axyz_mag;
double          extra_yaw,extra_pitch;
extern unsigned char gyro_state;
//--------------------------------------------------------------------------
//陀螺仪支持例程
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
//Gyro_Init
//--------------------------------------------------------------------------
void Gyro_Init(void)
{
   ADC12CTL1=(AdcClkDiv<<5)|(AdcClkSel<<3)|(CONSEQ0);
   ADC12MCTL0=0x70;//0x7x使用AVex作为参照,以便更完全,
并且改善了temp稳定性
   ADC12MCTL1=0x71|EOS;
   theta3=0;//wmm
//grv_axyz_mag_ref=68;
}
//--------------------------------------------------------------------------
//Read_XYZ
//--------------------------------------------------------------------------
void Read_XYZ(void)
{
   accel_x=spi_xyz_get(OUT_X_L);
   accel_x|=(spi_xyz_get(OUT_X_H))<<8;
   accel_y=spi_xyz_get(OUT_Y_L);
   accel_y|=(spi_xyz_get(OUT_Y_H))<<8;
   accel_z=spi_xyz_get(OUT_Z_L);
   accel_z|=(spi_xyz_get(OUT_Z_H))<<8;
   P2OUT^=1;
}
//--------------------------------------------------------------------------
//Read_ADC
//--------------------------------------------------------------------------
void Read_ADC(void)
{
   gyro_x=0xfff-ADC12MEM0;
   gyro_y=0xfff-ADC12MEM1;
   ADC12CTL0&=-(ENC|ADC12SC);//设置X使能和开始转换
序列
   asm(″dint″);
   Read_XYZ();
   asm(″eint″);
}
//--------------------------------------------------------------------------
//Start_ADC
//--------------------------------------------------------------------------
void Start_ADC(void)
{
   if(gyro_timer)
   {
          ADC12CTL0|=ENC|ADC12SC;              //设置X
使能和开始转换序列
          QueDelay(Read_ADC,1);               //使任务排队
以读取结果
   }
}
void ClearWarmup(void)
{
   if(STEADY_FLAG_TRUE)
   {
         SelfSteadyCounter--;
         if(!SelfSteadyCounter)
         {
                  CLR_STEADY_FLAG;
                  if(ProgramMode)
                        lcd_print(LEFT,6,1,″Self Steady failed″,0,0);
                  Gyro_Off();
         }
   }
   CLR_WARMUP_FLAG;
}
//--------------------------------------------------------------------------
//Gyro_On
//--------------------------------------------------------------------------
void Gyro_On(void)
{
   if(!gyro_timer)
   {
        P6DIR &=~3;
        P6OUT &=~0x80;   //向陀螺仪和A/D施加电力
        ADC12CTL0=ADC12ON|(AdcRef<<6)|REFON|(SampleTime<<
8)|(AdcMulti<<7);
        P6SEL|=3;                                  //设置
端口模式选择比特
        spi_xyz_put(CTRL1,POWUP|DEC0|XENA|YENA|ZENA);
        spi_xyz_put(CTRL2,MAX6G|BDU);
        SampleDivider=17;
        SET_WARMUP_FLAG;
        SET_SAMPLE_FLAG;
        QueDelay(ClearWarmup,250);
        gyro_timer=GYRO_RUN_TIME;
  }
}
//--------------------------------------------------------------------------
//Gyro_Off
//--------------------------------------------------------------------------
void Gyro_Off(void)
{
   CLR_SAMPLE_FLAG;
   spi_xyz_put(CTRL1,0);
   ADC12CTL0=0;
   P6SEL &=-3;                //使A/D输入管脚无效
   P6OUT|=0x80;         //使陀螺仪和A/D断电
   gyro_timer=0;
}
//--------------------------------------------------------------------------
//Calc_Mickeys
//--------------------------------------------------------------------------
void Calc_Mickeys(void)
{
   x_mickeys=((gyro_x-x_offset));
   y_mickeys=((gyro_y-y_offset));
   if((x_mickeys<G_MotionNoise)&&(x_mickeys>-G_MotionNoise)&&\
      (y_mickeys<G_MotionNoise)&&(y_mickeys>-G_MotionNoise))
         x_mickeys=y_mickeys=0;
  if(x_mickeys>(MaxMickeys*Gain_X))//wmm无法找到我们限制到
maxmickeys之处,所以我添加了...
    x_mickeys=MaxMickeys*Gain_X;
  if(x_mickeys<(-MaxMickeys*Gain_X))
    x_mickeys=-MaxMickeys*Gain_X;
  if(y_mickeys>(MaxMickeys*Gain_Y))
    y_mickeys=MaxMickeys*Gain_Y;
  if(y_mickeys<(-MaxMickeys*Gain_Y))
    y_mickeys=-MaxMickeys*Gain_Y;
}
//--------------------------------------------------------------------------
//Reset_Self_Steady
//--------------------------------------------------------------------------
void Reset_Self_Steady(void)
{
   x_min=gyro_x;
   y_min=gyro_y;
   x_max=gyro_x;
   y_max=gyro_y;
   ax_min=accel_x;
   ax_max=accel_x;
   ay_min=accel_y;
   ay_max=accel_y;
   az_min=accel_z;
   az_max=accel_z;
   x_sum=accel_x;
   y_sum=accel_y;
   z_sum=accel_z;
   x_steady=gyro_x;
   y_steady=gyro_y;
   num_steady_samples=STEADY_SAMPLES-1;
}
//--------------------------------------------------------------------------
//Self_Steady
//--------------------------------------------------------------------------
void Self_Steady(void)
{
   x_steady+=gyro_x;
   y_steady+=gyro_y;
   x_sum+=accel_x;
   y_sum+=accel_y;
   z_sum+=accel_z;
   if(gyro_x>x_max)      /*调整max和min值*/
          x_max=gyro_x;
   if(gyro_x<x_min)
          x_min=gyro_x;
   if(gyro_y>y_max)
          y_max=gyro_y;
   if(gyro_y<y_min)
          y_min=gyro_y;
   if(((ax_max-ax_min)>A_SteadyThreshold)||
               ((ay_max-ay_min)>A_SteadyThreshold)||
               ((az_max-az_min)>A_SteadyThreshold))
   {
          SET_WARMUP_FLAG;
          QueDelay(ClearWarmup,1000);
          sprintf(Buf,″Noise Z%c″,0x1c);
          if(ProgramMode)
                lcd_print(LEFT,5,1,Buf,0,0);
   }
   else
   if((x_max-x_min)>X_SteadyThreshold)
   {
          SET_WARMUP_FLAG;
          QueDelay(ClearWarmup,1000);
          sprintf(Buf,″Noise X max:%x min:%x″,x_max,x_min);
          if(ProgramMode)
                lcd_print(LEFT,5,1,Buf,0,0);
   }
   else
   if((y_max-y_min)>X_SteadyThreshold)
   {
      SET_WARMUP_FLAG;
      QueDelay(ClearWarmup,1000);
      sprintf(Buf,″Noise Y max:%x min:%x″,y_max,y_min);
      if(ProgramMode)
            lcd_print(LEFT,5,1,Buf,0,0);
}
else
{
      num_steady_samples--;
      if(num_steady_samples==0)
      {
            if(x_steady<0)
                   x_steady-=STEADY_SAMPLES/2;
            else
                   x_steady+=STEADY_SAMPLES/2;
            if(y_steady<0)
                   y_steady-=STEADY_SAMPLES/2;
            else
                   y_steady+=STEADY_SAMPLES/2;
            x_offset=x_steady/STEADY_SAMPLES;
            y_offset=y_steady/STEADY_SAMPLES;
            x_sum+=STEADY_SAMPLES/2;
            y_sum+=STEADY_SAMPLES/2;
            z_sum+=STEADY_SAMPLES/2;
            x_sum/=STEADY_SAMPLES;
            y_sum/=STEADY_SAMPLES;
            z_sum/=STEADY_SAMPLES;
            dax=x_sum/Gain_AX;
            day=y_sum/Gain_AX;
            daz=z_sum/Gain_AX;
            grv_axyz_mag_ref=Root((dax*dax)+(day*day)+(daz*daz));
            sign=(int)(grv_axyz_mag_ref*10);
            sprintf(Buf,″X=%x Y=%x GV=%d″,x_offset,y_offset,sign);
            if(ProgramMode)
                  lcd_print(LEFT,6,1,Buf,0,0);
            LED_PORT &=-GRN_LED;
            Write_NVRAM();
            LED_PORT|=GRN_LED;
             CLR_STEADY_FLAG;
             Gyro_Off();
        }
   }
}
//--------------------------------------------------------------------------
//gyro_get_report
//--------------------------------------------------------------------------
unsigned char gyro_get_report(GYRO_REPORT*report)
{
   if(WARMUP_FLAG_TRUE)
   {
         CLR_DATA_FLAG;
         return(0);
   }
   if(DATA_FLAG_TRUE)
   {
         report->x=Xdata;
         report->y=Ydata;
         if(Xdata||Ydata)
               return(1);
         return(0);
   }
   return(2);
}
void DoCalcs(void)
{
   if(STEADY_FLAG_TRUE)
   {
         CLR_RAW_FLAG;
         if(WARMUP_FLAG_TRUE)
              Reset_Self_Steady();
         else
              Self_Steady();
         return;
   }
    P3OUT|=0x20;
    switch(CalcState)
    {
         case 0:
         CLR_RAW_FLAG;
         SET_CALC_FLAG;
         dax=-accel_x/Gain_AX;
         day=-accel_y/Gain_AX;
         daz=accel_z/Gain_AX;
         CalcState++;
         break;
         case 1:
         //我们的滚动补偿死区。
         gvisya=((gvisya*19)+(Dabs(day)/Root(dax*dax+daz*daz)))*0.05;
         CalcState++;
         break;
         case 2:
         if(gvisya<=GVECTOR_ZERO)
         //V^2幅值截止。GUL利用mag(AX,AY,AZ)
         //相对于G向量的一个方向上的加性速度
         //限制滚动补偿,而GLL利用总加速计幅
         //值的减性速度限制滚动补偿。
               grv_axyz_mag=Root((dax*dax)+(day*day)+(daz*daz));
         CalcState++;
         break;
         case 3:
         //theta1=((Dabs(theta1*1)+Dabs(theta3))/2);////////////////////////
         //if(theta3<0)///////////////////
         //theta1=-Dabs(theta3);////////////////////////
         if((grv_axyz_mag<=(grv_axyz_mag_ref)+0.75)&&(grv_axyz_mag>=
(grv_axyz_mag_ref-0.75)))
              theta2=Get_Theta(dax,daz);//
         CalcState++;
         break;
        case 4:
        //非线性Delta抽选:Uber Good
        /*
        if((theta1-theta2)>=0)
                theta2=((Root(Dabs(theta1-theta2))+(theta2)));
        else
                theta2=((theta2)-(Root(Dabs(theta1-theta2))));
        */
        //theta2=theta1;//////////////////// no non linear filter
        //添加简单的反向加权平均:好了,终于完成了。
        theta3=((Dabs(theta3*9)+Dabs(theta2))*0.1);
        if(theta2<0)
          theta3=-Dabs(theta2);
        /////////////theta3=-PI/2;////////////用于调试Epsons。
        //theta3=theta2;/////////用于调试theta 2,3滤波器
        CalcState++;
        break;
        case 5:
        //将摇摆和俯仰改成幅值和角度。
        Calc_Mickeys();
        rrx=x_mickeys;
        rry=y_mickeys;
        rr_mag=Root(rrx*rrx+rry*rry);
        CalcState++;
        break;
        case 6:
        theta4=Get_Theta(x_mickeys,y_mickeys);
        CalcState++;
        //if((rr_mag)>(double)(Gain_X))/////////////////////////从theta1滤波器
截止中恢复theta3
        //{
          //theta3=theta1;////////////////////////////////////////
        //}
      break;
      case 7:
      //滚动补偿摇摆和俯仰计算。
      rrx=rr_mag*Swine(theta4+PI-theta3);
      CalcState++;
      break;
      case 8:
      rry=rr_mag*Swine(theta4+PIBY2-theta3);
      x_mickeys=(signed int)(rrx+extra_yaw);
      y_mickeys=(signed int)(rry+extra_pitch);
      CalcState++;
      break;
      case 9:
      //增益除法的余数。
      extra_yaw=((x_mickeys)%Gain_X);
      extra_pitch=((y_mickeys)%Gain_Y);
      //停止积累余数偏移。
//    extra_yaw=(double)((int)(extra_yaw*0.1)*10);
//    extra_pitch=(double)((int)(extra_pitch*0.1)*10);
      if(SENT_FLAG_TRUE||WARMUP_FLAG_TRUE)
      {
            CLR_SENT_FLAG;
            CLR_UPDATE_FLAG;
            Xdata=0;
            Ydata=0;
      }
      else
            SET_UPDATE_FLAG;
      if(jerk_timer)
      {
            Xdata=0;
            Ydata=0;
      }
      else
        {
             Xdata+=(signed char)(x_mickeys/Gain_X);
        Ydata+=(signed char)(-y_mickeys/Gain_Y);
        }
        CalcState=0;
        CLR_CALC_FLAG;
        SET_DATA_FLAG;
        break;
        default:
        Trap(2):
   }
   P3OUT &=-0x20;
}
//--------------------------------------------------------------------------
//Dabs
//--------------------------------------------------------------------------
double Dabs(double x)
{
   if(x<0)
     x=-x;
   return x;
}
//--------------------------------------------------------------------------
//Swine
//--------------------------------------------------------------------------
double Swine(double x)
{
   double even,y;
   even=(int)(x/(PI));
   x=x-(PI*even);
   if((int)(even/2)!=(even/2))
   {
     x=-x;
   }
  y=COEFF_3*x+COEFF_4*x*Dabs(x);
  //y=COEFF_5*(y*Dabs(y)-y)+y;
   return y;
}
//--------------------------------------------------------------------------
//Get_Theta
//--------------------------------------------------------------------------
double Get_Theta(double x,double y)
{
  double abs_y,r,angle;
   abs_y=Dabs(y)+0.0000000001F;     //防止/0情况
  if(x>=0)
  {
    r=(x-abs_y)/(x+abs_y);
    angle=COEFF_1-COEFF_1*r;
  }
  else
  {
    r=(x+abs_y)/(abs_y-x);
    angle=COEFF_2-COEFF_1*r;
  }
  if(y<0)
  return(-angle);//如果在象限III或IV中则求反
  else
  return(angle);
}
//--------------------------------------------------------------------------
//Root
//--------------------------------------------------------------------------
double Root(double number)
{
  long i;
  float x,y,z;
  const float f=1.5F;
   z=(float)number;
  x=z*0.5F;
  y=z;
  i=*(long*)&y;
  i=0x5f3759df-(i>>1);
  y=*(float*)&i;
  //y=y*(f-(x*y*y));
  //y=y*(f-(x*y*y));
  return(double)(z*y);
}
虽然本发明可以有各种修改和替换形式,但这里已经详细描述了在附图中以示例方式示出的具体实施例。然而,应当明白,本发明并不想要限于所公开的特定形式。更确切地说,本发明要覆盖落在由所附权利要求限定的本发明的精神和范围内的所有修改、等同和替换。

Claims (21)

1.一种用于在控制设备(110)中提供滚动补偿的方法,该方法包括以下步骤:
获取(310)指示出所述控制设备(110)的运动的旋转数据和线性数据;
向所获取的数据应用(320)滚动补偿;以及
从经滚动补偿的数据中去除(330)滚动补偿误差。
2.如权利要求1所述的方法,其中,获取(310)旋转数据的步骤包括从陀螺仪传感器接收旋转数据的步骤。
3.如权利要求1所述的方法,其中,获取(310)线性数据的步骤包括从加速计接收线性数据的步骤。
4.如权利要求1所述的方法,其中,向所获取的数据应用(320)滚动补偿的步骤包括向所获取的旋转数据应用滚动补偿。
5.如权利要求5所述的方法,其中,去除(330)滚动补偿误差的步骤包括处理所获取的线性数据,以从经滚动补偿的旋转数据中去除滚动补偿误差。
6.如权利要求1所述的方法,其中,应用(320)滚动补偿的步骤包括在不转化参考系的情况下对所获取的数据应用滚动补偿。
7.如权利要求1所述的方法,其中,去除(330)滚动补偿误差的步骤包括在不计算所述控制设备(11)的离心和线性加速度的情况下从经滚动补偿的数据中去除滚动补偿误差。
8.如权利要求1所述的方法,还包括以下步骤:
在从经滚动补偿的数据中去除滚动补偿误差后,利用经滚动补偿的数据来控制图形元素的运动。
9.如权利要求8所述的方法,其中,所述图形元素是光标、突出显示框、菜单、游戏人物和游戏对象中的一种。
10.如权利要求1所述的方法,还包括以下步骤:
在从经滚动补偿的数据中去除滚动补偿误差后,利用经滚动补偿的数据来控制可动设备的运动。
11.如权利要求10所述的方法,其中,所述可动设备是遥控车辆、遥控飞机、遥控船支和遥控机电设备中的一种。
12.如权利要求1所述的方法,其中,所述控制设备(110)是遥控器、鼠标、游戏控制器、虚拟现实控制器、指示器、移动设备和数字媒体输入设备中的一种。
13.如权利要求1所述的方法,其中,所述控制设备(110)被集成到手持式平台中。
14.如权利要求13所述的方法,其中,所述手持式平台是游戏控制台、个人数字助理、蜂窝电话、无线电话和移动电视中的一种。
15.一种控制设备(110),包括:
用于获取指示出所述控制设备(110)的运动的旋转数据和线性数据的装置(230、240、250);
向所获取的数据应用滚动补偿的装置(200);以及
从经滚动补偿的数据中去除滚动补偿误差的装置(200)。
16.如权利要求15所述的控制设备(110),其中,用于获取旋转数据的装置是陀螺仪传感器(230、240)。
17.如权利要求15所述的控制设备(110),其中,用于获取线性数据的装置(250)包括加速计。
18.如权利要求15所述的控制设备(110),其中,用于向所获取的数据应用滚动补偿的装置(200)包括用于向所获取的旋转数据应用滚动补偿的装置。
19.如权利要求18所述的控制设备(110),其中,用于去除滚动补偿误差的装置(200)包括用于处理所获取的线性数据以从经滚动补偿的旋转数据中去除滚动补偿误差的装置。
20.如权利要求15所述的控制设备(110),其中,用于应用滚动补偿的装置(200)包括用于在不转化参考系的情况下对所获取的数据应用滚动补偿的装置。
21.如权利要求15所述的控制设备(110),其中,用于去除滚动补偿误差的装置(200)包括用于在不计算所述控制设备(110)的离心和线性加速度的情况下从经滚动补偿的数据中去除滚动补偿误差的装置。
CN200880109176A 2007-09-26 2008-06-26 用于提供滚动补偿的方法和装置 Pending CN101809528A (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US99538207P 2007-09-26 2007-09-26
US60/995,382 2007-09-26
PCT/US2008/008026 WO2009042002A1 (en) 2007-09-26 2008-06-26 Method and apparatus for providing roll compensation

Publications (1)

Publication Number Publication Date
CN101809528A true CN101809528A (zh) 2010-08-18

Family

ID=39739359

Family Applications (1)

Application Number Title Priority Date Filing Date
CN200880109176A Pending CN101809528A (zh) 2007-09-26 2008-06-26 用于提供滚动补偿的方法和装置

Country Status (7)

Country Link
US (1) US9052752B2 (zh)
EP (1) EP2193426A1 (zh)
JP (1) JP2011503679A (zh)
KR (1) KR101546845B1 (zh)
CN (1) CN101809528A (zh)
BR (1) BRPI0817191B1 (zh)
WO (1) WO2009042002A1 (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2013029303A1 (zh) * 2011-08-30 2013-03-07 江苏惠通集团有限责任公司 姿态感知设备及其定位、鼠标指针的控制方法和装置

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101807126A (zh) * 2010-04-06 2010-08-18 华为终端有限公司 触摸笔及实现触摸功能的方法
CN101893898A (zh) * 2010-07-15 2010-11-24 江苏科技大学 智能小车的重力感应控制装置
ITTO20111144A1 (it) * 2011-12-13 2013-06-14 St Microelectronics Srl Sistema e metodo di compensazione dell'orientamento di un dispositivo portatile
CN103902038A (zh) * 2012-12-28 2014-07-02 联想(北京)有限公司 一种控制方法及装置、电子设备
US10405440B2 (en) 2017-04-10 2019-09-03 Romello Burdoucci System and method for interactive protection of a mobile electronic device

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5574479A (en) 1994-01-07 1996-11-12 Selectech, Ltd. Optical system for determining the roll orientation of a remote unit relative to a base unit
JP3161283B2 (ja) * 1995-06-15 2001-04-25 トヨタ自動車株式会社 車両の横加速度検出装置
JP2004150900A (ja) * 2002-10-29 2004-05-27 Japan Aviation Electronics Industry Ltd 姿勢角検出装置および取付け角度補正量取得方法
US7106189B2 (en) * 2004-04-29 2006-09-12 Tracetech Incorporated Tracking system and methods thereof
EP1759529A4 (en) 2004-04-30 2009-11-11 Hillcrest Lab Inc SPACE SHOW AND METHOD
US20060164393A1 (en) * 2005-01-24 2006-07-27 Chic Technology Corp. Highly sensitive inertial mouse
JP2009530699A (ja) * 2006-03-15 2009-08-27 コーニンクレッカ フィリップス エレクトロニクス エヌ ヴィ ロール検出を備えたリモートコントロール型ポインティング技術

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2013029303A1 (zh) * 2011-08-30 2013-03-07 江苏惠通集团有限责任公司 姿态感知设备及其定位、鼠标指针的控制方法和装置

Also Published As

Publication number Publication date
JP2011503679A (ja) 2011-01-27
BRPI0817191B1 (pt) 2022-04-19
KR20100063065A (ko) 2010-06-10
BRPI0817191A2 (pt) 2015-03-17
EP2193426A1 (en) 2010-06-09
WO2009042002A1 (en) 2009-04-02
US9052752B2 (en) 2015-06-09
KR101546845B1 (ko) 2015-08-24
US20100328212A1 (en) 2010-12-30

Similar Documents

Publication Publication Date Title
JP5201146B2 (ja) 入力装置、制御装置、制御システム、制御方法及びハンドヘルド装置
CN101911048B (zh) 装置的运动传感器和接口应用程序
US8957909B2 (en) System and method for compensating for drift in a display of a user interface state
USRE47070E1 (en) Input apparatus, control apparatus, control system, and control method
KR101073062B1 (ko) 움직임 감지를 통한 힘 강도 및 회전 강도를 입력하는 방법 및 디바이스
US20110307213A1 (en) System and method of sensing attitude and angular rate using a magnetic field sensor and accelerometer for portable electronic devices
US20080042973A1 (en) System for sensing yaw rate using a magnetic field sensor and portable electronic devices using the same
EP2184581A1 (en) Input device, controller, control system, control method, and hand-held device
JPWO2009072583A1 (ja) 入力装置、制御装置、制御システム、制御方法及びハンドヘルド装置
CN101809528A (zh) 用于提供滚动补偿的方法和装置
CN101840277B (zh) 输入装置、控制装置、控制系统和控制方法
US11249562B2 (en) Pointing electronic device with fast start-up recovery and corresponding method
CA2769085C (en) Portable electronic device adapted to compensate for gyroscope bias
CN101782813B (zh) 输入装置和方法
JPH10232739A (ja) ペン型入力装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C12 Rejection of a patent application after its publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20100818