JP2011503679A - ロール補償を提供する方法及び装置 - Google Patents

ロール補償を提供する方法及び装置 Download PDF

Info

Publication number
JP2011503679A
JP2011503679A JP2010526879A JP2010526879A JP2011503679A JP 2011503679 A JP2011503679 A JP 2011503679A JP 2010526879 A JP2010526879 A JP 2010526879A JP 2010526879 A JP2010526879 A JP 2010526879A JP 2011503679 A JP2011503679 A JP 2011503679A
Authority
JP
Japan
Prior art keywords
data
roll
roll compensation
controller
control device
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
JP2010526879A
Other languages
English (en)
Inventor
エム.メイソン ウォルター
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 JP2011503679A publication Critical patent/JP2011503679A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR 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

Abstract

本開示の実施形態は制御装置(110)においてロール補償を提供する方法及び装置に向けられ、前記方法及び装置は前記制御装置(110)の動きを示す回転データ及び直線データを獲得し(310)、その獲得したデータにロール補償を適用し(320)、そのロール補償したデータからロール補償エラーを除去する(330)ことを含む。回転データ及び直線データを獲得するためにジャイロスコープセンサ(230,240)及び加速度計センサ(250)等の慣性センサを使用することができる。

Description

本出願は2007年9月26日に合衆国に提出された仮出願60/995382の35U.S.C.§119に基づく利益を主張する。
本発明は、一般的なハンドヘルド制御装置に関し、特にロール補償及びそれと関連した使い勝手の良さを有するハンドヘルド制御装置に関する。
この欄は、以下に説明及び/又は請求される本発明の様々な態様に関連され得る技術の様々な態様に読み手を案内するべく意図されている。この議論は、本発明の様々な態様のより良い理解を容易にするために背景情報を読み手に提供する助けとなると信じられる。よって、それらの記述は、従来技術の承認としてではなく、この観点から読まれるべきである。
従来の制御装置はテレビ受像機、コンピュータ、及び表示装置等の受信機を制御する。典型的な制御機能は受信機の電源のオン及びオフ、受信機により表示されるメニューを介した案内、並びに、受信機により表示されるグラフィカル要素の表示の制御を含む。通常、ユーザは制御装置のボタン(例えば、電源ボタン、案内ボタン、メニューボタン等)を用いてそれらの制御機能をアクセスし、或いは、制御装置は単純な動き(例えば、表面に沿った動きを検出するためのトラックボール又はLED配列を用いたマウス)を検出することができる。それらの従来の制御装置には自由空間におけるそれら自身の動きを追わないという欠点がある(すなわち、従来の制御装置は表面に沿ったそれらの動きをたどることだけができる)。
近時、最新の制御装置が紹介されている。それらの最新の装置は加速度計センサ、ジャイロスコープセンサ等の慣性センサを用いて自由空間でそれらの動きを追うことができる。しかしながら、それらの最新の制御装置にはロール補償を提供しないという欠点がある。その結果、最新の制御装置の自由空間の追跡は正確ではない。
本開示はそれらの欠点を解決することに向けられている。
本発明の開示した実施形態は制御装置においてロール補償を提供する方法及び装置に向けられ、その方法及び装置は制御装置の動きを示す回転データ及び直線データを獲得し、その獲得したデータにロール補償を適用し、ロール補償したデータからロール補償エラーを除去することを含む。加速度計センサ、ジャイロスコープセンサ等の慣性センサは回転データ及び直線データを獲得するために用いることができる。
本開示の実施形態を用いる典型的な制御システム例のブロック図である。 図1の動き検出プロセッサを更に示す図である。 本開示の典型的なロール補償処理例を示すブロック図である。
本発明の1以上の特定の実施形態は以下に説明される。それらの実施形態の簡潔な説明を提供する目的においては、実際の実施の全ての特徴が明細書に説明されるとは限らない。なお、エンジニアリングプロジェクト又は設計プロジェクトにおいてのように、実際の実施の開発では、実施毎に変わるかもしれない、システムと関連しかつビジネスと関連した制限に合わせた開発者の特定の目標に多くの実施特定決定が到達するようにされなければならない。更に、そのような開発の努力は複雑で時間消費であるが、それでも本開示の利益を有する当業者のための設計、組み立て及び製造を行うルーチンであることが理解されよう。
次は、加速度計、ジャイロスコープ等の慣性センサを有する制御装置を用いて表示装置を制御するシステムを説明する。表示装置以外の装置を制御するために用いられる他のシステムは非常に類似の構成を含むことができる。本技術分野の当業者は、本明細書に説明されたシステム及び回路の実施形態が単に1つの可能性がある実施形態であると評価するであろう。そのようなものとして、代替的実施形態においてはシステム及び回路のコンポーネントを再配置又は除外することができ、或いは、追加のコンポーネントを追加することができる。
次に図面を使用し、先ず図1を参照すると、本開示の実施形態を用いるシステム例のブロック図が示される。図1は、可能性がある応用、環境又はシステム100を示し、本開示のロール補償処理を利用することができる。システム100は、制御装置110と、受信機120とを含んでいる。制御装置110は、限定されないが、リモート制御装置、マウス、ゲームコントローラ、仮想現実コントローラ、ポインタ、モバイル装置(例えば、ラップトップコンピュータ、PDA、携帯電話機、無線電話機、モバイルTV等)、又は他のディジタルメディア入力装置であることができる。制御装置110は後述するように、移動されたとき(すなわち、X平面,Y平面又はZ平面に沿って直線的に移動されたとき、回転されたとき(例えば、ピッチ、ヨー及びロール動き)、又はそれらの組み合わせ)、検出し、その動きの検出に応答して制御装置110は制御信号を受信機120に送信する。受信機120は、限定されないが、テレビ、表示装置、セットトップボックス、ゲームコンソール、仮想現実コンソール等であることができる。更に、受信機120及び制御装置110は、プラットフォームが移動されたとき制御装置によって制御信号が発生されるように同一のプラットフォーム(例えば、ハンドヘルドゲームコンソール、PDA、携帯電話機、無線電話機、モバイルテレビTV等)に統合されても良いことが注意されるべきである。制御装置110からの制御信号の受信機120の受信に応答して、受信機120は、限定されないが、カーソル、ハイライトボックス、メニュー、ゲームキャラクタ又は対象物等のグラフィカル要素を表示装置上で移動させることができる。グラフィカル要素の移動の精度を詳細に後述されるように本開示のロール補償処理によって改善することができる。受信機は、移動可能な装置(例えば、リモート制御自動車、飛行機、ボート、電気機械装置等)に統合されて制御装置110の動きが移動可能な装置の動きとなるようにしても良いことが注意されるべきである。
制御装置110は、マイクロプロセッサ130、送信機140、ユーザインターフェース150、及び本開示のロール補償処理を利用する動き検出プロセッサ160を含んでいる。1つの実施形態においては、マイクロプロセッサはユーザインターフェース150及び動き検出プロセッサ160からの入力を受信し、その入力に基づいて送信機140に制御信号を受信機120に対して送信させる。代替的実施形態においては、例えば、受信機120及び制御装置110が同一のプラットフォームに統合されるとき、マイクロプロセッサ130が表示装置上のグラフィカル要素の動きを直接制御しても良く、又は受信機120、他の中間モジュール又は回路、或いはそれらの組み合わせを介してそのような動きを間接的に制御しても良い。ユーザインターフェース150は、限定されないが、ユーザ選択可能ボタン、スイッチ、ダイアル、スクロール又はマウスホイール、タッチ検出スクリーン等を含むことができる。ユーザインターフェース150によって制御又は初期化されるいくつかの機能例は、限定されないが、制御装置の電源をオンオフすること、表示装置上のハイライトの対象物を選択すること、動き検出プロセッサ160の動作を調整すること(例えば、制御装置110が表面にあるならば動き検出プロセッサ160を第1モードにさせ、制御装置100が表面から除去され、自由空間に移動されているならば、動き検出プロセッサ160を第2モードにさせる)、メニューを表示装置に表示させること、又はその技術分野の当業者によって知られた他の機能を含むことができる。動き検出プロセッサ160は後述するように、様々な動きセンサから動きデータ又は情報を獲得し、その動きデータを組み合わせ又は統合して制御装置110の動きを示す動き信号を生成する。その動き検出プロセッサ160は、マイクロプロセッサ130が例えば、グラフィカル対象物を表示装置上で移動させることができるように、その動き信号をマイクロプロセッサ130に供給する。
好ましい実施形態においては、制御装置110は次の特徴を含んでいる。制御装置110は5つの自由度(例えば、動きがジャイロスコープセンサ等の慣性センサによって2つの回転軸に沿って、そして加速度計センサ等の慣性センサによって3つの直線軸に沿って追跡される)を有する。制御装置110は、回転した方向がX−Y動きを生成するように360度のロール補償を有する。制御装置110は例えば、加速度計が制御装置110の動きの間にドリフト補償を促進又は許可するように、動的ドリフト補償を有する。制御装置110は小サイズ、低電力消費、速い起動時間を有している。制御装置110の動作パラメータの例は、直流2.7〜3.3ボルト(VDC)の供給電圧を有すること、マイクロプロセッサ130と動き検出プロセッサ130との間にシリアル・ペリフェラル・インターフェース(SPI:Serial Peripheral Interface)を有すること、7マイクロアンペアの検出動き電流、4.5ミリアンペアの定常電流、及び8ミリ秒の最大サンプリングレートを有することを含む。
図2を参照すると、図1の動き検出プロセッサ160がより詳細に示されている。動き検出プロセッサ160は、アナログ調整回路220及びアナログ−ディジタル変換器(ADC)210を介してジャイロスコープセンサ230及び240等の複数の慣性センサから回転又は角度動き信号を受信するコントローラ200を含んでいる。アナログ調整回路220はジャイロスコープセンサ230及び240から受信されたアナログ回転動き信号をフィルタリング処理し、それによりそのフィルタリング処理されたアナログ回転動き信号がADC210によってディジタル化されて適切な状態になる。アナログ信号を調整する様々なフィルタ及びフィルタリング技術はこの技術分野の当業者には公知であり、本開示の範囲内のことと考慮される。ADC210は回転動き信号をディジタル化し、そのディジタル化回転動き信号をコントローラ200に供給する。他のADC分解能が本開示の範囲内のことと考慮されるが、ADC210は好ましくは10ビットで2チャンネルADC分解能を有している。
また、コントローラ200は加速度計センサ250等の複数の慣性センサから直線動き信号を受信する。1つの実施形態の例においては、3つの加速度計センサ250がコントローラ200に信号を供給する。第1の加速度計センサはX軸に沿った動きを検出し、そのX軸に沿った動きを示す信号をコントローラ200に供給し、第2の加速度計センサはY軸に沿った動きを検出し、そのY軸に沿った動きを示す信号をコントローラ200に供給し、第3の加速度計センサはZ軸に沿った動きを検出し、そのZ軸に沿った動きを示す信号をコントローラ200に供給する。アナログ又はディジタル信号又はデータが加速度計センサ250によって提供されれば良く、コントローラ200によるいずれかの処理は本開示の範囲内のことと考慮されることが注意されるべきである。代替的実施形態においては、X軸,Y軸及びZ軸に沿った制御装置の直線的な動きを検出するために3軸加速度センサ等のマイクロ電気機械システム(MEMS:Micro Electro-Mechanical System)デバイスを使用することができる。
コントローラ200は好ましくは、詳細に後述するように本開示によるロール補償を提供する処理を含む例えば、ファームウエア内にソフトウエアモジュールを含んでいる。そのソフトウエアモジュールは、代替的実施形態においては、コントローラ200の内部メモリ又は外部メモリ(図示せず)に保存できることが注意されるべきである。ロール補償処理は参照のフレームを変換することなく受信した回転レートデータについて直接ロール補償を行うことを含み、更に、制御装置110の遠心加速度及び直線加速度を計算することなくロール補償の望ましくない結果を除去することを含む。
コントローラ200は、次の動作パラメータ、供給電圧範囲2.7VDC(直流電圧)〜5.5VDCで動作し、温度範囲−10℃(摂氏)〜+70℃で動作し、3.3VDC及び25℃で1.7ミリアンペアの標準的電流消費を有し、10マイクロアンペアのスリープ電流消費を有する集積回路として構成されても良い。好ましくは、コントローラ200は、限定されないが、ゲイン、閾値、及び電力状態制御等のいくつかのパラメータの動的調整を考慮に入れている。
ADC210、アナログ調整回路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のロール補償特徴を実施するソフトウエアモジュール:
***************************************************************/
外部宣言ファイルの包含(Inclusion of External Declaration Files)
***************************************************************/
#include "project_config.h"
#include <stdio.h>
#include <stdlib.h>
#include "spi.h"
//-------------------------------
// External Function Declarations
//-------------------------------
void Trap (unsigned char);
//-------------------------------
// Local Function Declarations
//-------------------------------
double Dabs(double x);
double Swine(double x);
double Root(double r);
double Get_Theta( double x, double y);
void Gyro_Off (void);
//-------------------------------
// Local Definitions
//-------------------------------
#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 is theoretical center
//#define SPAN 8
#define GUL 406 //wmm G Vector Magnitude qualifier
Upper Limit +16VG
#define GLL 342 //wmm G Vector Magnitude qualifier
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)= ~ 15 deg.
/***************************************************************
* 変数記憶(Variable Storage)
****************************************************************/
//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 Support Routines
//-------------------------------------------
//-------------------------------------------
// Gyro_lnit
//-------------------------------------------
void Gyro_lnit(void)
{
ADC12CTL1 = (AdcClkDiv << 5) | (AdcClkSel << 3) | (CONSEQ0);
ADC12MCTL0 = 0x70;// 0x7x uses AVex as the reference so we are quiter
and temp stability is increased.
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 = Oxfff - ADC12MEM0;
gyro_y = Oxfff - ADC12MEM1;
ADC12CTL0 &= ~(ENC | ADC12SC); // Set the X enable and start conversion
sequence
asm ("dint");
Read_XYZ();
asm ("eint");
}
//-------------------------------------------
// Start_ADC
//-------------------------------------------
void Start_ADC(void)
{
if (gyro_timer)
{
ADC12CTL0 |= ENC | ADC12SC; // Set the X
enable and start conversion sequence
QueDelay (Read_ADC, 1 ); // Queue task to
read the results
}
}

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; // Apply power to gyros and A/D
ADC12CTL0 = ADC12ON | (AdcRef << 6) | REFON | (SampleTime <<
8) | (AdcMulti << 7);
P6SEL |= 3; // Set the
port mode select bits
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; // Deactivate the A/D input pins
P6OUT |= 0x80; // Remove power from gyros and 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 can't find where we limit to
maxmickeys so I added...
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) /* Adjust max & min values */
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 :
// Our roll compensation dead zone.
gvisya = ((gvisya*19) + (Dabs(day)/Root(dax*dax+daz*daz)))*0.05;
CalcState++;
break;

case 2:
if(gvisya <= GVECTOR_ZERO)
//V^2 magnitude cutoff. GUL limits roll compensation by additive
velocity in one
//direction of mag(AX,AY,AZ) relitive to G-vector, while GLL limits roll
//compensation by subtractive velocity of the total accelermeter
magnitude.
grv_axyz_mag = Root((dax*dax) + (day*day) + (daz*daz));
CalcState++;
break;

case 3:
//thetal = ((Dabs(theta1 * 1 ) + Dabs(theta3))/ 2);//////////////////
//if (theta3 < 0)///////////////
// thetal = -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:
//Non-Linear Delta Decimation: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
//Add Simple Backward Weighted Averaging: OK, Done at last.

theta3 = ((Dabs(theta3 * 9) + Dabs(theta2))*0.1);
if(theta2 < 0)
theta3 = -Dabs(theta2);


/////////////theta3 = -PI/2;//////////// for debuging Epsons.
//theta3 = theta2;///////// for debuging theta 2,3 Filters
CalcState++;
break;

case 5:
// Change Yaw and Pitch into magnitude and angle.
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))/////////////// theta3 restore from
thetal filter cutoff
//{
//theta3 = thetal;//////////////////
//}
break;

case 7:
//Roll compensate Yaw and Pitch calculations.
rrx = rr_mag * Swine(theta4 + Pl - 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:
// Residual from gain division.
extra_yaw = ((x_mickeys) % Gain_X);
extra_pitch = ((y mickeys) % Gain_Y);
// Stop accumulating residual offset.
// 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/(Pl));
x = x - (Pl*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; // Prevent /0 condition

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)
retum(-angle); // negate if in quad III or IV
else
retum(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 = Ox5f3759df - ( 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)においてロール補償を提供する方法であって、
    前記制御装置(110)の動きを示す回転データ及び直線データを獲得するステップ(310)と、
    獲得したデータにロール補償を適用するステップ(320)と、
    ロール補償したデータからロール補償エラーを除去するステップ(330)と
    を備えることを特徴とする方法。
  2. 前記回転データを獲得するステップ(310)は、ジャイロスコープセンサから回転データを受信するステップを含むことを特徴とする請求項1記載の方法。
  3. 前記直線データを獲得するステップ(310)は、加速度計から直線データを受信するステップを含むことを特徴とする請求項1記載の方法。
  4. 前記獲得したデータにロール補償を適用するステップ(320)は、獲得した前記回転データにロール補償を適用することを含むことを特徴とする請求項1記載の方法。
  5. 前記ロール補償エラーを除去するステップ(330)は、前記ロール補償エラーがロール補償した前記回転データから除去されるように前記獲得した直線データを処理することを含むことを特徴とする請求項5記載の方法。
  6. 前記ロール補償を適用するステップ(320)は、参照のフレームを変換することなく前記獲得したデータについてロール補償を適用することを含むことを特徴とする請求項1記載の方法。
  7. 前記ロール補償エラーを除去するステップ(330)は、制御装置(110)の遠心加速度及び直線加速度を計算することなく前記ロール補償したデータからロール補償エラーを除去することを含むことを特徴とする請求項1記載の方法。
  8. 前記ロール補償エラーが前記ロール補償したデータから除去された後、前記ロール補償したデータを用いてグラフィカル要素の移動を制御するステップを更に備えることを特徴とする請求項1記載の方法。
  9. 前記グラフィカル要素はカーソル、ハイライトボックス、メニュー、ゲームキャラクタ及びグラフィカル対象物のうちの1つであることを特徴とする請求項8記載の方法。
  10. 前記ロール補償エラーが前記ロール補償したデータから除去された後、前記ロール補償したデータを用いて移動可能な装置の移動を制御するステップを更に備えることを特徴とする請求項1記載の方法。
  11. 前記移動可能な装置は、リモート制御される自動車、リモート制御される飛行機、リモート制御されるボート、及びリモート制御される電気機械装置のうちの1つであることを特徴とする請求項10記載の方法。
  12. 前記制御装置(110)は、リモート制御装置、マウス、ゲームコントローラ、仮想現実コントローラ、ポインタ、モバイル装置、及びディジタルメディア入力装置のうちの1つであることを特徴とする請求項1記載の方法。
  13. 前記制御装置(110)は、ハンドヘルドプラットフォームに統合されていることを特徴とする請求項1記載の方法。
  14. 前記ハンドヘルドプラットフォームは、ゲームコンソール、PDA、携帯電話機、無線電話機、及びモバイルTVのうちの1つであることを特徴とする請求項13記載の方法。
  15. 制御装置(110)の動きを示す回転データ及び直線データを獲得する手段(230,240,250)と、
    獲得したデータにロール補償を適用する手段(200)と、
    ロール補償したデータからロール補償エラーを除去する手段(200)と
    を備えることを特徴とする制御装置(110)。
  16. 前記回転データを獲得する手段は、ジャイロスコープセンサ(230,240)であることを特徴とする請求項15記載の制御装置(110)。
  17. 前記直線データを獲得する手段(250)は、加速度計を含むことを特徴とする請求項15記載の制御装置(110)。
  18. 前記獲得したデータに前記ロール補償を適用する手段(200)は、当該獲得した回転データにロール補償を適用する手段を含むことを特徴とする請求項15記載の制御装置(110)。
  19. 前記ロール補償エラーを除去する手段(200)は、前記ロール補償エラーが前記ロール補償した回転データから除去されるように、前記獲得した回転データを処理する手段を含むことを特徴とする請求項18記載の制御装置(110)。
  20. 前記ロール補償を適用する手段(2000)は、参照のフレームを変換することなく、前記獲得したデータについてロール補償を適用する手段を含むことを特徴とする請求項15記載の制御装置(110)。
  21. 前記ロール補償エラーを除去する手段(200)は、制御装置(110)の遠心加速度及び直線加速度を計算することなく、前記ロール補償したデータからロール補償エラーを除去する手段を含むことを特徴とする請求項15記載の制御装置(110)。
JP2010526879A 2007-09-26 2008-06-26 ロール補償を提供する方法及び装置 Pending JP2011503679A (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US99538207P 2007-09-26 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
JP2011503679A true JP2011503679A (ja) 2011-01-27

Family

ID=39739359

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2010526879A Pending JP2011503679A (ja) 2007-09-26 2008-06-26 ロール補償を提供する方法及び装置

Country Status (7)

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

Families Citing this family (6)

* 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 江苏科技大学 智能小车的重力感应控制装置
CN102306054B (zh) * 2011-08-30 2014-12-31 江苏惠通集团有限责任公司 姿态感知设备及其定位、鼠标指针的控制方法和装置
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

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH095352A (ja) * 1995-06-15 1997-01-10 Toyota Motor Corp 車両の横加速度検出装置
JP2004150900A (ja) * 2002-10-29 2004-05-27 Japan Aviation Electronics Industry Ltd 姿勢角検出装置および取付け角度補正量取得方法

Family Cites Families (5)

* 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
US7106189B2 (en) * 2004-04-29 2006-09-12 Tracetech Incorporated Tracking system and methods thereof
KR100937572B1 (ko) * 2004-04-30 2010-01-19 힐크레스트 래보래토리스, 인크. 3d 포인팅 장치 및 방법
US20060164393A1 (en) * 2005-01-24 2006-07-27 Chic Technology Corp. Highly sensitive inertial mouse
CN101405685A (zh) 2006-03-15 2009-04-08 皇家飞利浦电子股份有限公司 具有滚动检测的遥控指向技术

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH095352A (ja) * 1995-06-15 1997-01-10 Toyota Motor Corp 車両の横加速度検出装置
JP2004150900A (ja) * 2002-10-29 2004-05-27 Japan Aviation Electronics Industry Ltd 姿勢角検出装置および取付け角度補正量取得方法

Also Published As

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

Similar Documents

Publication Publication Date Title
US8576168B2 (en) Input apparatus, control apparatus, control system, control method, and handheld apparatus
JP5201146B2 (ja) 入力装置、制御装置、制御システム、制御方法及びハンドヘルド装置
US8957909B2 (en) System and method for compensating for drift in a display of a user interface state
JP2011503679A (ja) ロール補償を提供する方法及び装置
US8994658B2 (en) Input apparatus, control apparatus, control method, and handheld apparatus
US7489299B2 (en) User interface devices and methods employing accelerometers
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
KR20100054701A (ko) 움직임 감지를 통한 힘 강도 및 회전 강도를 입력하는 방법 및 디바이스
US8896301B2 (en) Portable electronic device adapted to compensate for gyroscope bias
JP2007535774A5 (ja)
US8614671B2 (en) Input apparatus, control apparatus, control system, and control method
EP2520903B1 (en) Portable electronic device adapted to compensate for gyroscope bias
US20100259475A1 (en) Angle sensor-based pointer and a cursor control system with the same
US8411030B2 (en) Pointing and control device and method for a computer system
JPH10232739A (ja) ペン型入力装置
Nasiri et al. Selection and integration of MEMS-based motion processing in consumer apps
CN112748259B (zh) 物理量传感器、电子设备和移动体
CN108375862A (zh) 光学图像稳定器和操作该光学图像稳定器的方法
EP3859498B1 (en) Pointing electronic device with fast start-up recovery and corresponding method
JP2010157157A (ja) 入力装置、制御装置、ハンドヘルド装置、制御システム及び制御方法

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20110525

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120803

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20121105

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130301

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20130603

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20130610

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20130902

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20131217