1. 序論
~phoneなどの現代の~hardwareには、可用な数種の~motion~sensorがある。 ◎ There are a handful of different motion sensors available in modern hardware such as phones.
~motion~sensorは、 `汎用~sensor~API^cite( `Generic Sensor API^en ) `GENERIC-SENSOR$r を拡張して,[ 低levelな~sensor/融合~sensor ]の~classを公開する。 この文書は、これらの~sensorどうしの関係性を説明する。 ◎ The motion sensors extends the Generic Sensor API [GENERIC-SENSOR] to expose a class of low-level and fusion sensors. This document explains the relationship between these sensors.
低levelな~sensorには次が含まれる ⇒ `加速度計$, `~gyroscope$, `磁力計$ ◎ The low-level sensors include: • Accelerometer • Gyroscope • Magnetometer
これらの~sensorからの~dataを利用すれば,複数の新たな~sensorを異なる仕方で作成できる。 これらは,融合~sensorとして共通的に知られている。 ◎ Multiple new sensors can be created using the data from these above sensors in different ways. These are commonly known as fusion sensors.
2. ~security/~privacyの考慮点
`汎用~sensor~API^cite `GENERIC-SENSOR$r に述べられたものを超える,特有な~security/~privacyの考慮点は無い。 ◎ There are no specific security and privacy considerations beyond those described in the Generic Sensor API [GENERIC-SENSOR].
3. 低levelな~sensor
3.1. 加速度計
生の `加速度計@ ( `accelerometer^en )~sensorは、加速度における変化を 3 つの異なる方向において測定するが, `重力$にも影響される。 `Accelerometer$I ~interfaceは、 `ACCELEROMETER$r 仕様にて定義されている。 ◎ A raw accelerometer sensor measures changes in acceleration in 3 different directions, but is affected by gravity. The Accelerometer interface is defined in [ACCELEROMETER] specification.
`加速度計$~sensorは、 `慣性-~frame~sensor@ ( `inertial-frame sensor^en )である。 すなわち、~deviceが自由落下しているとき,落下-方向の加速度は 0 ~ms2になり、~deviceが~tableに平らに置かれているとき,上方への加速度は地球の`重力$ — g ≡ 9.8 ~ms2 — に等しくなることを意味する — それは、~deviceを上向きに押している~tableの力を測定しているので。 ◎ The Accelerometer sensor is an inertial-frame sensor, this means that when the device is in free fall, the acceleration is 0 m/s2 in the falling direction, and when a device is laying flat on a table, the acceleration in upwards direction will be equal to the Earth gravity, i.e. g ≡ 9.8 m/s2 as it is measuring the force of the table pushing the device upwards.
加速度計は、それ自体では さほど有用ではなく,他の融合~sensorの一部を占めることが多いが、揺れや歩数に類するものを登録する目的などはある。 ◎ Accelerometers are less useful by themselves and often take part in other fusion sensors, but they do have some purposes like registering shakes, steps and the like.
そのような利用事例では、開発者の関心は,`線形~加速度$ — `重力$補償と呼ばれる`重力$を伴わない加速度(`線形~加速度~sensor$を見よ) — にあることが多い。 あるいは、`重力$を隔離して`重力$~vectorを知ることに関心があることも多い(`重力~sensor$を見よ) — これは、磁気~compassを作成している様な何らかの種類の~sensor融合~用に有用になり得る。 ◎ Often for such use-cases the developer is interested in the linear acceleration which is the acceleration without the gravity, called gravity compensation (See Linear Acceleration Sensor); or the developer is interested in the isolated gravity, in order to know the gravity vector (see Gravity Sensor), which can be useful for some kinds of sensor fusion like creating a magnetic compass.
加速度に対しては,通例的には、大きな変化を~careして,`重力$の様な~noiseは避けることが求まれる。 それには、[ `線形~加速度$を隔離する`高域通過~filter$/ `重力$を隔離する`低域通過~filter$ ]が助けになり得る。 したがって,`低域通過~filter$は、傾きを測定するときに有用になり得る。 あいにく,どの[ `高域通過~filter$/`低域通過~filter$ ]も,受容-可能でないかもしれない遅延を導入する。 ◎ For acceleration, you usually care about the big changes and want to avoid noise, like the gravity, thus a high-pass filter can help isolate the linear acceleration and a low-pass filter can help isolate the gravity. A low-pass filter can thus be useful for measuring a tilt. Unfortunately, any high-pass filter or low-pass filter introduces a delay, which may or may not be acceptable.
加速度計は加速度 %a を報告するので、速度 %v を取得するためには,積分する必要がある ⇒ %v = ~INTG %a ~MUL ∂%t ◎ Notice, as accelerometers report acceleration, you need to integrate to get velocity: • v = ∫a×∂t
【 この文書~全体を通して、 %t は時間を表す。 】
位置 %x を取得するためには,もう一回 積分する ⇒ %x = ~INTG %v ~MUL ∂%t ◎ And again to get position: • x = ∫v×∂t
積分は~driftを作成し,二回の積分はそれを増幅する ⇒# %a = %g ~MUL sin(%θ)†, %x = %a ~MUL ( %t ~MUL %t ) ~DIV 2 ◎ An integral creates drift, and a double integral amplifies that: • a = g×sin(θ), • x = ½×at2
【† %g は重力-加速度, %θ は物体が動く方向と接地~平面が成す角度 を表すらしい。 】
なので、加速度計から得られる位置は,精確さに欠き,あまり有用ではない。 ◎ So position from an accelerometer is very imprecise and not very useful.
3.2. ~gyroscope
`~gyroscope@ ( `gyroscope^en )は、自身に相対的な`角速度$を~senseする。 したがってそれは、~Coriolis効果と呼ばれる慣性-力を利用して,自前の回転を測定する。 ~gyroscopeは、これを測定するために,比較的~高い~frequencyで~~振動( `oscillate^en )するので,最も電力を食う~motion~sensorの一つになる。 これはまた,~motorや~speakerの様な,同じ~device上の他の振動( `vibration^en )に影響され易いことを意味する。 `Gyroscope$I ~interfaceは、 `GYROSCOPE$r 仕様に定義される。 ◎ A gyroscope senses angular velocity, relative to itself, thus it measures its own rotation, using an inertial force called the Coriolis effect. Gyroscopes oscillate at relative high frequency in order to measure this and are thus one of the most power hungry motion sensors. This also means that they can easily be affected by other vibrations, like a vibration (rumble) motor or speaker on the same device. The Gyroscope interface is defined in [GYROSCOPE] specification.
`角速度$を~senseする~gyroscopeから回転(角度)を取得するためには、一回だけ積分する必要がある — %f は~frequency【 1 秒間の回転数としての角速度】を表すとするとき ⇒ ~INTG `cos^op( 2π ~MUL %f ~MUL %t ) = `sin^op( 2π ~MUL %f ~MUL %t ) ~DIV ( 2π ~MUL %f ) ◎ In order to get rotation (angle) from a gyroscope, which senses angular velocity, you need to perform a single integration. • f ≡ frequency • ∫cos(2π×ft)) = (1/(2π×f)) × sin(2π×ft)
になるが、積分法は~noise【振動などによる誤差】を~driftに転換することに自覚すること。 上に見られるように、積分法は 1 ~DIV %f を外に出す。 すなわち,~frequency( %f )が高い~noiseは積分すれば消去る【!drop by a factor of a 100?】一方で、~frequencyがごく低い~noiseは増幅され,~gyroscopeは時間~越しに~driftすることになる。 ◎ But be aware that integration turns noise into drift. As we see above, the integration gets a 1/f outside, meaning that high frequency (f) noise disappears with integration, i.e. a noise of frequency will drop by a factor of a 100, but a very low frequency will be amplified, meaning the gyroscope will drift over time.
なので、上手くやるためには間断なく行う必要があり,次に見られるように ∂%t で乗算する。 なので、報告された時間~差に誤差があれば,上の~driftの様に明白化することになる ⇒# %θ%n = %θ%n ~MINUS 1 ~PLUS %ω ~MUL ∂%t ◎ So in order to do it well you need to do it quickly and as you see below, we multiply with the ∂t, so any error in the reported time difference will manifest itself like the drift above. • θn = θn-1 + ω × ∂t
ここで、 %ω は`角速度$, %θ は結果の角度を表す。 ◎ With ω denoting the angular velocity and θ, the resulting angle.
ほとんどの~gyroscope~sensorは、[ ~deviceに同居する~hardware【の振動】により生じる,既知な低い~frequency【の~noise】 ]に対し[ 何らかの類の`~drift補償^iを~hardware内で適用する ]ことにより,`較正$を遂行する。 ◎ Most gyroscope sensors perform calibration by applying some sort of drift compensation in hardware for known low frequency caused by adjacent hardware on the device.
3.3. 磁力計
`磁力計@ ( `magnetometer^en )は、`磁場$~sensorである — すなわち、近くに強い磁気を及ぼすものが無ければ,地球の`磁場$を~senseする。 それは、およそ北~方向を指すが,真北ではない。 `Magnetometer$I ~interfaceは、 `MAGNETOMETER$r 仕様に定義される。 ◎ Magnetometers are magnetic field sensors, which means that without any strong magnetic influence close by, it will sense the Earth’s magnetic field, which more or less points in the direction of North, but not true North. The Magnetometer interface is defined in [MAGNETOMETER] specification.
前述したように,磁力計は、少し磁化された近くの物など,外から及ぶ磁力にとても敏感である。 さらには、~deviceの内側にある他のものからも影響される — これに対しては、~deviceの製造元は,いくぶん補償できるが。 実施においては、これらの~sensorは,最も共通的な利用事例には,割と~wellに働くが。 ◎ As said, magnetometers are very sensitive to outside influence, like anything on a table that has been slightly magnetized, and it is even affected by other things inside a device, though the device manufacturer can compensate for this somewhat. In practise though, these sensors work quite well for most common use-cases.
上で言及したように、磁化された何かが周囲で動回っていない限り,磁力計からの読取りは,`重力$を隔離する用途には十分に安定的である。 ◎ As long as nothing that is magnetized in the surrounding is moving around, the magnetometer readings are stable enough to be used to isolate gravity as mentioned above.
磁力計は、 3 軸からなる~sensorであり,最も強い`磁場$を指している~3D~vectorを与え、特定の~device方位を施行しなくとも働く。 ◎ Magnetometer is a 3-axis sensor, which means it gives a 3D vector pointing to the strongest magnetic field. It also means that it does not enforce a specific device orientation in order to work.
ただし,~deviceがどう保持されているか知るためには、`重力$~vectorが必要になる。 低域通過~filter法の事例では,最低でも加速度計は要することに加え、もっと精確な読取りが必要な場合は,~gyroscopeも要する。 これは `傾き補償@ ( `tilt compensation^en )と呼ばれる。 ◎ In order to tell how the device is being held, though, you need a gravity vector, which as a bare minimum requires an accelerometer in the case of low pass filtering, and additionally a gyroscope if more precise readings are needed. This is called tilt compensation.
磁力計の最も共通的な利用事例は、地球~平面に~stationaryな`方位~sensor^i, または~compassを生成するために,~sensor融合の一部を成すことである。 ~compassは、基本的に,[ 偏角による,地理所在位置に依存する補正 ]で真北を指すようにした前者である。 ◎ The most common use-case for magnetometers are as part of sensor fusion, in order to generate an Orientation Sensor which is stationary to the Earth plane, or a compass, which is basically the former with corrections to the declination depending on geolocation position, such that it points to the true North.
4. 高levelな~sensor
上で言及したように,各~sensorには,~noiseや~driftなどの自前の課題があり、異なる~sensorからの入力を利用する,何らかの種類の補償が必要になることが多い。 別の仕方で言うなら、~sensor単独では,あまり精確でなくても、複数の~sensor入力を合わせれば,ずっと安定的になり得る。 ◎ As mentioned above, each sensor has its own issues, such as noise and drift, and often need some kind of compensation using input from a different sensor. Put another way, one sensor might not be very precise on its own, but the sum of multiple sensory input can be much more stable.
あいにく,~sensorは電力を要する — [ ~sensorが増える/測定している~frequencyが高くなる ]ほど,電力~消費も増す。 ~gyroscopeは、概して他のものより電力を食うと見なされる — `角速度$を測定するためには,一定の~frequencyで振動する必要があるので。 ◎ Unfortunately, sensors require power, and the more sensors and the higher the measuring frequency, higher the power consumption. The gyroscope is typically considered more power hungry than the rest, as it needs to vibrate at a certain frequency in order to measure the angular velocity.
上の理由から、~taskを満足に解くための~sensorの集合を最小に抑えることが常に重要になる。 今日の多くの~deviceは、~hardware内である種類の~sensor融合を行い得るので、電力と処理能の観点からは,これらの利用がイミを成すことが最も多い。 ◎ For the above reasons, it is always important to consider the minimum set of sensors which solves a task satisfactory. As many devices today can do certain kinds of sensor fusion in hardware, it most often makes sense to use these from a power and performance point of view.
4.1. 共通的な融合~sensor
以下に,融合~sensorを挙げる。 それぞれには、それを成す通例的な~sensorたちも示す: ◎ Below is a list of fusion sensors and what sensors they usually are made up of:
~sensor型 | 下層の物理的~sensor | 備考 |
---|---|---|
`相対~方位~sensor$ | `加速度計$, `~gyroscope$ | `磁力計$は利用しないモノトスル |
`絶対~方位~sensor$ | `加速度計$, `磁力計$, および(在るならば) `~gyroscope$ | |
`地磁気~方位~sensor$ | `加速度計$, `磁力計$ | `~gyroscope$は利用しないモノトスル |
`重力~sensor$ | `加速度計$, `~gyroscope$ | |
`線形~加速度~sensor$ | `加速度計$, [ `~gyroscope$または`磁力計$ ] |
4.2. 低域通過/高域通過~filter
上で言及したように、[ 低域通過/高域通過 ]~filterを利用して,(~frequencyが[ 高い/低い ])~noiseを除去することはアリである — その名が表すとおり,これらの~filterは、[ 低い/高い ]~frequencyは通過させるので,求まれない~frequencyによる効果を切落したり最小限にする。 ◎ As mentioned earlier, it is possible to remove noise (high or low frequency) using low and high pass filters. As the names say, the filters let low or high frequencies pass and thus cut of, or minimize, the effect of unwanted frequencies.
4.2.1. 低域通過~filter
`低域通過~filter@ ( `low-pass filter^en )を作成する共通的な仕方では、最新な値をある割合だけ利用して,既存の値から残りをとる。 この仕方では、~filterが各~回に共通な値を覚えて,[ 各回に共通でないことが最も多い~noise ]を平滑化して外す。 この解決策は、かなりの割合で既存の値を利用するため,~eventを実際に登録する際に遅延を導入する。 ◎ A common way to create a low-pass filter is to only use a percentage of the latest value and take the rest from the existing value. In a way this means that the filter remembers common values and thus smoothens out uncommon values which most often are a result of noise. As it uses a big percentage of the existing value, this solution introduces a delay in registering the actual events.
class LowPassFilterData { constructor(%reading, %bias) { Object.assign(this, { x: %reading.x, y: %reading.y, z: %reading.z }); this.bias = %bias; } update(%reading) { this.x = this.x * this.bias + %reading.x * (1 - this.bias); this.y = this.y * this.bias + %reading.y * (1 - this.bias); this.z = this.z * this.bias + %reading.z * (1 - this.bias); } }; const %accl = new Accelerometer({ frequency: 20 }); /* 低域通過~filterで重力を隔離する ◎ Isolate gravity with low-pass filter. */ const %filter = new LowPassFilterData(%accl, 0.8); %accl.onreading = () => { %filter.update(%accl); /* 最新な値を~filterに通す ◎ Pass latest values through filter. */ console.log(``^隔離された重力 (${%filter.x}, ${%filter.y}, ${%filter.z})``^); } %accl.start();
4.2.2. 高域通過~filter
`高域通過~filter@ ( `high-pass filter^en )は、`低域通過~filter$の様に働くが,高い~frequencyのみ通過することを許容する。 ◎ High-pass filter works like a low-pass filter, but allows only high frequencies to pass through.
これは、`~gyroscope$からの読取りから時間~越しに~~累積される~driftを取り除くときに有用になり得る。 ◎ This can be useful to get rid of the drift which builds up over time with gyroscope readings.
class HighPassFilterData { constructor(%reading, %cutoffFrequency) { Object.assign(this, { x: %reading.x, y: %reading.y, z: %reading.z }); this.cutoff = %cutoffFrequency; this.timestamp = %reading.timestamp; } update(%reading) { let %dt = %reading.timestamp - this.timestamp / 1000; this.timestamp = %reading.timestamp; for (let %i of ["x", "y", "z"]) { let %alpha = this.cutoff / (this.cutoff + %dt); this[%i] = this[%i] + %alpha * (%reading[%i] - this[%i]); } } }; const %gyro = new Gyroscope({ frequency: 20 }); /* 高域通過~filterで~driftを除去する ◎ Remove drift with a high pass filter. */ const %filter = new HighPassFilterData(%gyro, 0.8); %gyro.onreading = () => { %filter.update(%gyro); /* 最新な値たちを~filterに通す ◎ Pass latest values through filter. */ console.log(``^安定な~gyroscope (${%filter.x}, ${%filter.y}, ${%filter.z})``^); } %gyro.start();
4.3. 絶対~方位~sensor
`絶対~方位~sensor@ ( `Absolute Orientation Sensor^en )は、前に言及したように`磁力計$の共通的な利用事例の一つであり,地球~平面に対し~stationaryに方位を表現している~sensorである(`磁場$~vectorと`重力$~vectorに固定的)。 `AbsoluteOrientationSensor$I ~interfaceは、 `ORIENTATION-SENSOR$r 仕様に定義される。 ◎ As mentioned before, the Absolute Orientation Sensor, is one of the common use-cases of a magnetometer, and is a sensor representing an orientation stationary (fixed to the magnetic field vector and gravity vector) to the Earth plane. The AbsoluteOrientationSensor interface is defined in [ORIENTATION-SENSOR] specification.
絶対~方位~sensorが有用になり得る例は ⇒# `ball-in-a-maze puzzle^en などの~game~control/ 全~方向を見回せることが求まれる,頭部装着~display(~HMD / `head mounted display^en ) ◎ An absolute orientation sensor can be useful for game controls such as a ball-in-a-maze puzzle, or for a head-mounted display where you want to be able to rotate the display and look in all directions.
絶対~方位~sensorは、基準~frameが~stationaryなので,例えば~phone上の運転~game用の~controllerとしては有用にならない — 少しあるいは ゆっくりでも~deviceを動かすと,運転~方向に影響するので(`相対~方位~sensor$を見よ)。 ◎ As the reference frame of an absolute orientation sensor is stationary, it is not useful as a controller for say a driving game on a phone, as it would not allow you to move around, even slightly or slowly, without affecting your driving direction. (See Relative Orientation Sensor).
`絶対~方位~sensor$の方位~vectorは、以下の仕方で計算できる: ◎ The orientation vector of the Absolute Orientation Sensor, can be calculated in the following way:
`加速度計$は,`慣性-~frame~sensor$なので、~deviceがほぼ~stationaryであるとき,`重力$~vectorは天を向かって指すことになり、~deviceが自由落下していない限り,`磁場$~vectorを接地~平面( `ground plane^en 【地球に接する平面】)上に投影する十分な~vector長さがある。 ◎ As the Accelerometer is an inertial-frame sensor, the gravity vector will point towards the sky when the device is mostly stationary, and as long as the device is not in free fall, there is enough vector length to project the magnetic field vector onto the ground plane.
注記: これは、磁極では失敗することになる — `磁場$~vectorは、ほぼ`重力$~vectorと反対~方向を指すことになり,一般に ほぼ依拠-不能になるので。 ◎ Note, this will fail at the magnetic poles as the magnetic field vector will point mostly in the opposite direction as the gravity vector and generally be very unreliable.
- 右手系~規則を利用する下で,`磁場$~vectorと`重力$~vector(`重力~sensor$を見よ)の~cross-productをとれば、接地~平面~上で東を指す~vectorを取得できる。 ◎ By taking the cross product between the the magnetic field vector and gravity vector (see Gravity Sensor), we get a vector which points East on the ground plane, using the right hand rule.
- `重力$~vectorと東を指す~vectorとの~cross-productをとれば、地球の`磁場$に向かって北方を指す~vectorが得られる。 ◎ Now if we take the cross product between the gravity vector and the newly found East vector, the resulting vector will point in the northern direction towards the Earth’s magnetic field.
下の~~図式は、この事例を表現する — ここでは ⇒# ~deviceは~~静止していて,~y軸は北を指す。 `磁力計$からの読取りは `{x: 0, y: 11, z: -16}^c を報告する。 `加速度計$からの読取りは`加速度$ `{x: 0.11, y: 0.07, z: 9.81}^c を報告する。 %uG は`重力$を表現している単位~vector。 %uB は`磁場$~vectorを表現する【図の矢印は地下を指している】。 %uE = %uB ~MUL %uG は東を指す【 ~MUL は~cross-product】。 %uN = %uG ~MUL %uE は北方を指す。 ◎ The illustration below represents the case where the device is at rest and y-axis points towards the North. The reading from the Magnetometer is {x: 0, y: 11, z: -16} and Accelerometer reports {x: 0.11, y: 0.07, z: 9.81} acceleration. The uG is a unit vector representing the gravity, uB represents magnetic field vector, uE = uB × uG and points East. The uN = uG × uE points to the northern direction.
方位~sensor融合。 ◎ OrientationSensor fusion.
すなわち,`絶対~方位~sensor$は、`磁力計$と`加速度計$が成す融合~sensorである。 加えて、`重力$をより良く隔離するために,`~gyroscope$も含められ得る(`重力~sensor$を見よ)。 ◎ That means an Absolute Orientation Sensor is a fusion sensor of the Magnetometer and the Accelerometer, and potentially the Gyroscope for better isolated gravity (see Gravity Sensor).
4.4. 地磁気~方位~sensor
`地磁気~方位~sensor@ ( `Geomagnetic Orientation Sensor^en )は、`絶対~方位~sensor$に似るが、`~gyroscope$は利用しない。 これは、利用する電力は抑えられる一方で,揺れや動きには敏感になることを意味する。 ◎ A Geomagnetic Orientation Sensor, is like a Absolute Orientation Sensor, but doesn’t use the Gyroscope which means it uses less power. This also means that it is more sensitive to shakes and movement.
`地磁気~方位~sensor$の主な利用事例は、~compassを作成したり,地図用~appの中で~compass方向を利用することである。 これらの利用事例では、人は通例的に~deviceを安定に保持するので,前述が問題になることはあまりない。 ◎ As the main use-case for a Geomagnetic Orientation Sensor is to create a compass, or use compass direction within a mapping application, this is not much of a problem since people usually hold the device steady for these use-cases.
実際の`~heading^i ( N, S, E, W ) は、~sensorから得られた回転~vectorを,現在の地理所在位置から計算される局所的な`偏角~補償^iで調整することにより見出せる。 ◎ The actual heading (N, S, E, W) can be found by adjusting the rotation vector with the local declination compensation calculated from the current geolocation position.
~sensorは,[ 歩いている様なときに,もっと安定な~headingを取得する ]ために`加速度計$を利用する。 回転~vectorは,(`加速度計$から隔離された)`重力$~vectorに垂直な平面 — これは、およその接地~平面を表現する — に投影される。 これはまた、`重力$~vectorの実際の方位に関心がある場合,代わりに`磁力計$を直に利用することを意味する。 ◎ As the sensor uses the accelerometer to get a more steady heading, like when walking, the rotation vector is projected to the plane perpendicular to the gravity vector (as isolated from the accelerometer) which more or less represents the ground plane. This also means that if you are interested in the actual orientation of the gravity vector, then use the magnetometer directly instead.
4.5. 相対~方位~sensor
ほとんどの~sensor~hubにおいては、`重力$は`~gyroscope$を利用して`加速度計$から隔離され、`線形~加速度$は,隔離した`重力$を除去することにより`加速度計$の値から隔離される。 ◎ On most sensor hubs, gravity is isolated from the accelerometer using the gyroscope, and the linear acceleration is isolated by removing the isolated gravity, from the accelerometer values.
これは[ 低域通過/高域通過 ]~filterが導入する遅延を避ける。 ◎ This avoids the delay which low and high pass filters introduce.
これには[ ~Kalman~filter/`相補~filter$ ]を利用して行う仕方があり、 `相対~方位~sensor@ ( `Relative Orientation Sensor^en )を導く。 `相補~filter$は、割と良い結果が得られ,~hardware内で実装するのも容易なので、共通的な解決策になる。 ◎ One way of doing this is using a Kalman filter or complementary filter, which leads us to the Relative Orientation Sensor. As a complementary filter yields quite good results and is easy to implement in hardware, this is a common solution.
4.5.1. 相補~filter
`相補~filter@ ( `complementary filter^en )は、`低域通過~filter$と`高域通過~filter$を併せたものと捉えられる — それは、`~gyroscope$からの値を次のように`加速度計$からの値で補なう 【 ~x, ~y, ~z 各~成分ごとに】 ⇒ %θ%n = %α ~MUL (%θ%n ~MINUS 1 ~PLUS %ω ~MUL ∂%t ) ~PLUS ( 1.0 ~MINUS %α ) ~MUL %a ◎ A complementary filter can be thought of as a low-pass filter and high-pass filter in one, complementing the gyroscope values with the accelerometer values: • θn = α × (θn-1 + ω × ∂t) + (1.0 - α) × a
ここで ⇒# %ω は `~gyroscope$からの`角速度$, %a は `加速度計$からの`加速度$, %α は重み定数, ∂%t は 各~測定~回の間隔(時間) ◎ With α being the weight constant, a the acceleration from accelerometer, ω the angular velocity from gyroscope and ∂t being the time between measurements.
%α 用の共通な値は 0.98 であり,`~gyroscope$からの測定が 98% の重みを占めることを意味する。 ◎ A common value for α is 0.98, which means that 98% of the weight lays on the gyroscope measurements.
`相補~filter$を利用して,相対~方位~Euler角度【の %alpha, %beta, %gamma 成分】(~radian)を手動で計算する例。 ◎ Manually calculate the relative orientation in Euler angles (radian) using a complementary filter.
`~gyroscope$は`角速度$を測定するので、時間~差で乗算すれば,`角度の変化^iを取得できる。 この変化は,常に現在の~device位置に相対的に計算されるので、これを接地~平面に較正するために,`重力$を含む`加速度計$を利用する必要がある。 ◎ The gyroscope measures angular velocity, so by multiplying with the time difference, we get the change of angle. This change is always calculated relative to the current device position, so we need to use the accelerometer, which includes gravity, to calibrate this to the ground plane.
`加速度計$からの値は,~heading( ~z軸~周りの回転 %alpha )についての情報は持ち込まないので、 %alpha 成分には それを含めない。 他方,`加速度計$は、`重力$に因り,~deviceが[ ~x, ~y ]軸~周り( %beta, %gamma )にどう保持されているかの情報は供する。 ◎ The values from the accelerometer bring no information about the heading (alpha, the rotation around z), so we don’t include that in our alpha component. On the other hand, the accelerometer (due to gravity) provides information on how the device is held around the x and y axis (beta and gamma).
動きがわずかしかなければ、`~gyroscope$より`加速度計$の読取りから得される~vectorの方が, ( %alpha, %beta, %gamma ) 角度に寄与することになる。 ◎ When there is no or little movement, the vector obtained from the accelerometer reading will contribute more to the (alpha, beta, gamma) angles than the gyroscope.
安定な`加速度計$からの値は、`重力$~vectorを表現し, %alpha 内に~z成分を含まない。 その結果、方位は`~gyroscope$だけに従い,安定的になるが、~headingの原点は開始-時の~device位置に依存するので、これは`~deviceに相対的な方位~sensor^iになる。 ◎ As values from a steady accelerometer represent the gravity vector, and we don’t include the z component in the alpha, the result of this is that the orientation will just follow the gyroscope and be stable. But as the origin of the heading depends on the device position at start this a device-relative orientation sensor.
const %options = { frequency: 50 }; const %accl = new Accelerometer(%options); const %gyro = new Gyroscope(%options); let %timestamp = null; let %alpha = %beta = %gamma = 0; const %bias = 0.98; %gyro.onreading = () => { let %dt = %timestamp ? (%gyro.%timestamp - %timestamp) / 1000 : 0; %timestamp = %gyro.%timestamp; /* 加速度~vectorを正規化して,方位~vectorとして扱う。 ~deviceが裏返されていたなら,~vectorは まったく別の方向を指すので、加速度計~dataからは,~deviceがどの向きへ方位しているか知るすべはないことを念頭に置くこと。 ◎ Treat the acceleration vector as an orientation vector by normalizing it. Keep in mind that the if the device is flipped, the vector will just be pointing in the other direction, so we have no way to know from the accelerometer data which way the device is oriented. */ const %norm = Math.sqrt(%accl.x ** 2 + %accl.y ** 2 + %accl.z ** 2); /* ~~全周( 2π rad )の半分(π rad )だけ受持つので、[ ~MINUS π ~DIV 2 以上, π ~DIV 2 以下 ]の範囲を受持つよう,単位~vectorの各~成分( ~MINUS 1 以上, 1 以下 )に π ~DIV 2 を乗算する。 ◎ As we only can cover half (PI rad) of the full spectrum (2*PI rad) we multiply the unit vector with values from [-1, 1] with PI/2, covering [-PI/2, PI/2]. */ const %scale = Math.PI / 2; %alpha = %alpha + %gyro.z * %dt; %beta = %bias * (%beta + %gyro.x * %dt) + (1.0 - %bias) * (%accl.x * %scale / %norm); %gamma = %bias * (%gamma + %gyro.y * %dt) + (1.0 - %bias) * (%accl.y * -%scale / %norm); /* ~Euler角度 ( %alpha, %beta, %gamma ) で何かする ◎ Do something with Euler angles (alpha, beta, gamma). */ }; %accl.start(); %gyro.start();
~device調整している相対~方位~sensor。 ◎ An device-adjusting, relative orientation sensor.
上の例では、 %alpha 【の値 0 】は初期~heading方位を表現していた。 この~headingは、`~gyroscope$に基づいていることに因り,時間~越しに~driftするかもしれない。 ◎ From the above example, we notice that the alpha represented the initial heading orientation. We also know that this heading might drift over time due to being based on the gyroscope.
一部の状況では、方位は,利用者の現在の位置へ向かって~driftすることが求まれる。 これは、仮想現実~環境の内側にある~controller用に有用になり得る — そこでは、~play中に動いたり向きを変えることもある下で,車を~controllerの~headingに追従させることが求まれる。 それは、本物の車を運転するときと似た様に働くことになる。 ◎ In some situations you might want the orientation to drift towards your current position. This can be useful for a controller inside a virtual reality environment, where you want a car to follow the heading of your controller, but you might move and turn around while playing. That would more or less work like driving a real car.
上における 1 行lを変更すれば,成遂げられる: ◎ Changing one line in the above accomplishes that.
const %zeroBias = 0.02; %alpha = (1 - %zeroBias) * (%alpha + %gyro.z * %dt);
上では、 %alpha の 2% が 値 0 になる。 したがって,~deviceがおよそ安定に保持されているとき、~headingは 0 へ向かって動くことになり【?】 — 周囲のものに則って位置されることなく — 現在の~device位置に対し調整されることを意味する。 ◎ With the above 2% of the alpha consists of the value 0. Thus, when the device is being held more or less steady, the heading will move towards 0, meaning being adjusted to your current device position and not positioned according to the surroundings.
この例は、ときには,手動による融合も有用になり得る様を示す。 ◎ This example shows how useful manual fusion can be at times.
4.6. 重力~sensorと線形~加速度~sensor
上で利用した`相補~filter$は、`重力$を隔離することについては割と良い。 したがって,ほとんどの~sensor~hubは、`~gyroscope$を利用して`加速度計$から`重力$を隔離し、隔離した`重力$を`加速度計$の値から除去すれば,`線形~加速度$が隔離される。 ◎ The complementary filter used above is quite good at isolating the gravity, and most sensor hubs thus isolate gravity from the accelerometer using the gyroscope, and the linear acceleration is isolated by removing the isolated gravity, from the accelerometer values.
これはまた、~sensor~hubにより公開される `線形~加速度~sensor@ ( `Linear Acceleration Sensor^en )と `重力~sensor@ ( `Gravity Sensor^en )は、たいていは融合~sensorであることも意味する。 ◎ This also means that the Linear Acceleration Sensor and the Gravity Sensor as exposed by most sensor hubs are most likely fusion sensors.
`重力$はまた、`磁力計$を利用して,`線形~加速度~sensor$から除去できる — `磁場$~vectorは、およそ安定的なので。 ◎ Gravity can also be removed from a linear acceleration sensor using a magnetometer, as the magnetic field vector is more or less stable.
[ `LinearAccelerationSensor$I / `GravitySensor$I ]~interfaceは、 `ACCELEROMETER$r 仕様に定義される。 ◎ The LinearAccelerationSensor interface and GravitySensor interface are defined in [ACCELEROMETER] specification.
注記: `重力$は、動きの~frequencyに伴って変化する — 例えば,自由落下していれば落下している方向へは 0 になる — ので,`線形~加速度$が精確にならなくなるのは想像に難くない。 揺れを検出しようと試行している場合、そのことを念頭に置くように。 ◎ Note, as the gravity changes with the frequency of the movements, i.e., 0 in falling direction in free fall, you can imagine that linear acceleration will be quite imprecise if you are trying to detect a shake, so keep that in mind.
4.7. 利用事例と要件
~motion~sensorの高度な利用事例には、[ 正確aな~sensor読取り/ ~hardware~sensorにおける高い標本化~rateによる演算/ 特定0の~app用に好ましい読取り送達~rate ]に関する要件が課されることもある。 ◎ Advanced motion sensor use-cases could have requirements for accurate sensor readings, high sampling rates at which hardware sensor operates, and reading delivery rate that is preferable for particular application.
~motion~sensorは、次に挙げる様々な高度な利用事例に利用され得る: ◎ Motion sensors can be used for variety of advanced use-cases, such as:
- [ 仮想現実/拡張現実 ]~HMD【頭部装着~display / `head mounted display^en 】追跡 `HMDTRACKING$r ◎ Virtual and augmented reality HMD tracking [HMDTRACKING]
- ~sensorに支援された,屋内の[ 地図用~app/~navi ] `INDOORNAV$r, `IPIN$r ◎ Sensor assisted indoor mapping and navigation [INDOORNAV], [IPIN]
- [ 写真/動画 ]撮影の安定化 `ROLLSTABILIZER$r, `VIDEOSTABILIZER$r ◎ Photo and video capture stabilization [ROLLSTABILIZER], [VIDEOSTABILIZER]
- 標本化~rate~frequencyが高い, かつ正確度も高い読取りを要する~game。 ◎ Games that require high-frequency sampling rates with high accuracy readings.
- ~3D走査 `3DSCANNING$r ◎ 3D scanning [3DSCANNING]
- 高度な~gesture認識 `MEMSGESTURES$r ◎ Advanced gesture recognition [MEMSGESTURES]
- 歩数計~その他の身体的な活動の監視 `PHYSMON$r ◎ Step counting and monitoring of other physical activities [PHYSMON]
~motion~sensorを利用する~gameや~UI~app用の汎用な要件は、描画される~frameごとに新たな~sensor読取りを得る。 この事例においては、標本化~rateが高いほど待時間は抑制され,利用者~体験を改善する。 ◎ The generic requirement for games or UI applications that use motion sensors is to have a new sensor reading per rendered frame. The higher sampling rates in this case, will reduce latency, thus improve user experience.
仮想現実~HMD追跡の事例では、[ ~sensorは,かなり高い標本化~rate(何 kHz までにも)で稼働する ]こともあり、[ ~refresh~rate 75Hz 〜 120Hz で描画される~frameごとに,最新な~sensor読取りを供する ]ことにより,~motionが光子になるまでの待時間を最小限にする。 ◎ In case of virtual reality HMD tracking, sensors might run at very high sampling rates (up to several kHz) and minimize motion-to-photon latency by providing latest sensor reading for every rendered frame at refresh rates of 75-120Hz.
屋内~naviや~realtimeでない動画(画像)安定化~appは、[ その~data処理~algoが,正確aな結果を供するに十分な標本を得る ]よう[ 高い標本化~rate( 80 〜 100 Hz )で,正確度が高い~sensor読取りを収集する ]ことで,便益を得ることもある。 ◎ Indoor navigation or non-realtime video (image) stabilization applications could benefit from collecting high accuracy sensor readings at high sampling rates (80-100Hz), so that data processing algorithms have enough samples to provide accurate results.