サンプルデモ
参考書籍
センサ値における誤差の分類
- 偶然誤差
- 系統誤差
- 過失誤差
- 過失誤差は、実験中にデータの記録を間違えるような事象を指す
誤差を生む5種類の事象
- 雑音: ガウス分布状にセンサ値をばらつかせる
- バイアス: 常に距離、方角に一定値を加えす
- ファントム: 見えないはずのランドマークを観測する
- 見落とし: 見えるはずのランドマークを見落とす
- オクルージョン: ランドマークが他の物体に隠れて見えなくなる
不確かさの実装
雑音
- 距離の計測は遠くなるほど曖昧になる
- 方角はあまり曖昧にならないとする
- 距離に比例する標準偏差でガウス分布に従う雑音を付加する
- 方角に対しては一定の標準偏差でガウス分布に従う雑音を付加する
using Plots, Random, Distributions
pyplot()
mutable struct Sensor
dist_noise_rate
dir_noise
function Sensor(
dist_noise_rate=0.0,
dir_noise=0.0)
self.dist_noise_rate = dist_noise_rate
self.dir_noise = dir_noise
return self
end
end
function noise(self::Sensor, obsrv::Array)
ell = rand(Normal(obsrv[1], obsrv[1] * self.dist_noise_rate))
phi = rand(Normal(obsrv[2], self.dir_noise))
return [ell, phi]
end
function data(self::Sensor, sns_pose::Array)
observed = []
for obj in self.map.objects
obsrv = observation_function(sns_pose, obj.pose)
if visible(self, obsrv)
obsrv = noise(self, obsrv)
push!(observed, (obsrv, obj.id))
end
end
self.last_data = observed
end
バイアス
- 距離を一定の割合、方角を一定の値だけ恒久的にずらす
- 雑音と同様にガウス分布からドローして決定する
using Plots, Random, Distributions
pyplot()
mutable struct Sensor
dist_bias_rate_std
dir_bias
function Sensor(
dist_bias_rate_stddev=0.0,
dir_bias_stddev=0.0)
self.dist_bias_rate_std = rand(Normal(0.0, dist_bias_rate_stddev))
self.dir_bias = rand(Normal(0.0, dir_bias_stddev))
return self
end
end
function bias(self::Sensor, obsrv::Array)
return obsrv + [obsrv[1] * self.dist_bias_rate_std, self.dir_bias]
end
function data(self::Sensor, sns_pose::Array)
observed = []
for obj in self.map.objects
obsrv = observation_function(sns_pose, obj.pose)
if visible(self, obsrv)
obsrv = bias(self, obsrv)
obsrv = noise(self, obsrv)
push!(observed, (obsrv, obj.id))
end
end
self.last_data = observed
end
ファントム
- 存在しないはずのランドマークを観測してしまうケース
using Plots, Random, Distributions
pyplot()
mutable struct Sensor
phantom_dist_x
phantom_dist_y
phantom_prob
function Sensor(
phantom_prob=0.0,
phantom_rng_x::Tuple=(-5.0, 5.0),
phantom_rng_y::Tuple=(-5.0, 5.0))
rx = phantom_rng_x
ry = phantom_rng_y
self.phantom_dist_x = Uniform(rx[1], rx[2])
self.phantom_dist_y = Uniform(ry[1], ry[2])
self.phantom_prob = phantom_prob
return self
end
end
function phantom(self::Sensor, sns_pose::Array, obsrv::Array)
if rand(Uniform()) < self.phantom_prob
phantom_pose = [rand(self.phantom_dist_x), rand(self.phantom_dist_y)]
return observation_function(sns_pose, phantom_pose)
else
return obsrv
end
end
function data(self::Sensor, sns_pose::Array)
observed = []
for obj in self.map.objects
obsrv = observation_function(sns_pose, obj.pose)
obsrv = phantom(self, sns_pose, obsrv)
if visible(self, obsrv)
obsrv = bias(self, obsrv)
obsrv = noise(self, obsrv)
push!(observed, (obsrv, obj.id))
end
end
self.last_data = observed
end
見落とし
using Plots, Random, Distributions
pyplot()
mutable struct Sensor
oversight_prob
function Sensor(oversight_prob=0.0)
self.oversight_prob = oversight_prob
return self
end
end
function oversight(self::Sensor, obsrv::Array)
if rand(Uniform()) < self.oversight_prob
return nothing
else
return obsrv
end
end
function data(self::Sensor, sns_pose::Array)
observed = []
for obj in self.map.objects
obsrv = observation_function(sns_pose, obj.pose)
obsrv = phantom(self, sns_pose, obsrv)
obsrv = oversight(self, obsrv)
if visible(self, obsrv)
obsrv = bias(self, obsrv)
obsrv = noise(self, obsrv)
push!(observed, (obsrv, obj.id))
end
end
self.last_data = observed
end
オクルージョン
- センサで観測したい対象が別のものに隠される現象
- 「見落としていないけどセンサ値を大きく間違う」と定義する
- センサと壁の間を通行者が遮り、計測した距離が実勢より近くなる
using Plots, Random, Distributions
pyplot()
mutable struct Sensor
occlusion_prob
function Sensor(occlusion_prob=0.0)
self.occlusion_prob = occlusion_prob
return self
end
end
function occlusion(self::Sensor, obsrv::Array)
if rand(Uniform()) < self.occlusion_prob
ell = obsrv[1] - rand(Uniform()) * (self.dist_rng[2] - obsrv[1])
phi = obsrv[2]
return [ell, phi]
else
return obsrv
end
end
function data(self::Sensor, sns_pose::Array)
observed = []
for obj in self.map.objects
obsrv = observation_function(sns_pose, obj.pose)
obsrv = phantom(self, sns_pose, obsrv)
obsrv = occlusion(self, obsrv)
obsrv = oversight(self, obsrv)
if visible(self, obsrv)
obsrv = bias(self, obsrv)
obsrv = noise(self, obsrv)
push!(observed, (obsrv, obj.id))
end
end
self.last_data = observed
end
一通りの不確かさを実装したセンサクラスのコード
github.com