CN101809528A - 用于提供滚动补偿的方法和装置 - Google Patents
用于提供滚动补偿的方法和装置 Download PDFInfo
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input 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/01—Input arrangements or combined input and output arrangements for interaction between user and computer
- G06F3/03—Arrangements for converting the position or the displacement of a member into a coded form
- G06F3/033—Pointing devices displaced or positioned by the user, e.g. mice, trackballs, pens or joysticks; Accessories therefor
- G06F3/0346—Pointing 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
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04M—TELEPHONIC COMMUNICATION
- H04M1/00—Substation equipment, e.g. for use by subscribers
- H04M1/72—Mobile telephones; Cordless telephones, i.e. devices for establishing wireless links to base stations without route selection
- H04M1/724—User interfaces specially adapted for cordless or mobile telephones
- H04M1/72403—User interfaces specially adapted for cordless or mobile telephones with means for local support of applications that increase the functionality
- H04M1/72409—User 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/72415—User 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
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04M—TELEPHONIC COMMUNICATION
- H04M2250/00—Details of telephonic subscriber devices
- H04M2250/12—Details 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)的离心和线性加速度的情况下从经滚动补偿的数据中去除滚动补偿误差的装置。
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)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| WO2013029303A1 (zh) * | 2011-08-30 | 2013-03-07 | 江苏惠通集团有限责任公司 | 姿态感知设备及其定位、鼠标指针的控制方法和装置 |
Families Citing this family (5)
| 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)
| 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 | コーニンクレッカ フィリップス エレクトロニクス エヌ ヴィ | ロール検出を備えたリモートコントロール型ポインティング技術 |
-
2008
- 2008-06-26 CN CN200880109176A patent/CN101809528A/zh active Pending
- 2008-06-26 EP EP08779823A patent/EP2193426A1/en not_active Withdrawn
- 2008-06-26 BR BRPI0817191-2A patent/BRPI0817191B1/pt active IP Right Grant
- 2008-06-26 WO PCT/US2008/008026 patent/WO2009042002A1/en not_active Ceased
- 2008-06-26 US US12/680,256 patent/US9052752B2/en active Active
- 2008-06-26 KR KR1020107005842A patent/KR101546845B1/ko active Active
- 2008-06-26 JP JP2010526879A patent/JP2011503679A/ja active Pending
Cited By (1)
| 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 |