詳解確率ロボティクスの訂正・コードのアップデート
Sun May 23 09:15:20 JST 2021 (modified: Thu Jun 20 19:20:21 JST 2024)
views: 4488, keywords:詳解確率ロボティクス
コードのアップデート
Pythonやライブラリ、Jupyterなどの仕様変更によるコードの修正です。こちらはGitHubのコードに随時反映しています。本の内容については、もし第2版が出たらそのときにアップデートします。アップデート前のコードについては、横にコメントアウトして残してあるので、もし動かないときは、そちらのコードを試してみてください。
2024年6月更新分
def motion_update(self, nu, omega, time): #追加
if abs(omega) < 1e-5: omega = 1e-5 #値が0になるとゼロ割りになって計算ができないのでわずかに値を持たせる
M = matM(nu, omega, time, self.motion_noise_stds)
A = matA(nu, omega, time, self.belief.mean[2])
F = matF(nu, omega, time, self.belief.mean[2])
cov = F.dot(self.belief.cov).dot(F.T) + A.dot(M).dot(A.T) #旧バージョンではself.belef.covに直接代入
mean = IdealRobot.state_transition(nu, omega, time, self.belief.mean) #旧バージョンではself.belef.meanに直接代入
self.belief = multivariate_normal(mean=mean, cov=cov) #旧バージョンではこの行なし
self.pose = self.belief.mean #他のクラスで使う
def observation_update(self, observation): #追加
mean, cov = self.belief.mean, self.belief.cov #旧バージョンではこの行なし
for d in observation:
z = d[0]
obs_id = d[1]
H = matH(mean, self.map.landmarks[obs_id].pos)
estimated_z = IdealCamera.observation_function(mean, self.map.landmarks[obs_id].pos)
Q = matQ(estimated_z[0]*self.distance_dev_rate, self.direction_dev)
K = cov.dot(H.T).dot(np.linalg.inv(Q + H.dot(cov).dot(H.T)))
mean += K.dot(z - estimated_z) #旧バージョンではself.belief.meanを直接更新
cov = (np.eye(3) - K.dot(H)).dot(cov) #旧バージョンではself.belief.covを直接更新
self.belief = multivariate_normal(mean=mean, cov=cov) #旧バージョンではこの行なし
self.pose = self.belief.mean
2023年4月更新分
情報提供いただきました。ありがとうございます。
freqs["probs"] = freqs["count"]/len(freqs["count"]) # 古いバージョン: freqs["probs"] = freqs["lidar"]/len(data["lidar"]) ###addprobs###
freqs.transpose()
### lidar_600.ipynbセル[11] ###
p_z = pd.DataFrame(probs.transpose().sum()).sort_values("lidar") #行と列を転置して各列を合計 #旧バージョン: p_z = pd.DataFrame(probs.transpose().sum())
p_z.plot()
p_z.transpose()
### lidar_600.ipynbセル[13] ###
cond_z_t = (probs/p_t[0]).sort_values("lidar") #列(時間)ごとにP(t)で割るとP(x|t)となる ###lidar600cond #旧バージョン: cond_z_t = probs/p_t[0]
cond_z_t
### lidar_600.ipynb ###
sns.jointplot(data, x="hour", y="lidar", kind="kde") #古いバージョン: sns.jointplot(data["hour"], data["lidar"], data, kind="kde")
plt.show()
### multi_gauss1.ipynb ###
sns.jointplot(d, x="ir", y="lidar", kind="kde") #旧バージョン: sns.jointplot(d["ir"], d["lidar"], d, kind="kde")
plt.show()
### multi_gauss2.ipynb ###
sns.jointplot(d, x="ir", y="lidar", kind="kde") #度数分布を描画 #旧バージョン: sns.jointplot(d["ir"], d["lidar"], d, kind="kde")
d.cov()
訂正事項
第6刷で訂正済み
p.247 12行目 |
消費電力量を0からマイナスしたものに-1をかけたものを \( \Longrightarrow \)消費電力量に-1をかけたものを |
|
いとこのいとこは自分だみたいな文になってますね・・・ |
第5刷で訂正済み
p.8 14行目 |
一般的 \( \Longrightarrow \) 一般化 |
|
変換ミスです・・・ |
p.20 下から2行目 |
頻度が大きい \( \Longrightarrow \) 頻度が高い |
上田 |
頻度は「高い」「低い」です。 |
p.91 1、3行目 |
角度、角速度\( \Longrightarrow \)速度、角速度 |
|
1箇所ならともかくコピペで2箇所間違えました。 |
p.96 noise_simulation7 .ipynb [3] 19行目、p.97 noise_simulation8 .ipynb [3] 26行目、p.98 noise_simulation9 .ipynb [3] 31、38行目、p.99 noise_simulation10 .ipynb [3] 47行目、p.127 mcl11.ipynb [2] 19行目 |
relative_polar_pos $$\longrightarrow$$ observation_function |
|
コードの差し替えミスでした。 |
p.173 式(7.33)、式(7.35) |
\( (1-\tilde{N})/N \) \( \Longrightarrow \) \( (N-\tilde{N})/N \) |
|
算数は苦手です。 |
第4刷で訂正済み
p.56 式(2.94) |
積分は不要 |
上田 |
\( \boldsymbol{x}\)で積分したら\(p_3\)が\( \boldsymbol{x} \)の関数にならないじゃないか・・・ |
p.62 |
section_sentor \( \Longrightarrow \) section_sensor |
|
sentorとは。 |
p.80 ideal_robot10.ipynb [7] 21行目 |
relative_polar_pos $$\longrightarrow$$ observation_function |
@maskot1977さん |
コードの差し替えミスでした。 |
p.186 ページ上にある式番号を振っていない3行の式 |
1行目から2行目のイコールまでが不要。2行目の「右の分布から不要な・・・」という補足も不要。つまり、2行目と3行目をイコールでつないだ式が書いてあれば十分。 |
上田 |
式(8.10)と比べると余計な記述をしていると思いました。 |
p.191 式(8.33)の最後の行列 |
右上の要素の\( \ell^2_{\hat{\boldsymbol{m}}_{t-1}} \)と左下の要素の\( \ell_{\hat{\boldsymbol{m}}_{t-1}} \)を入れ替え |
|
コピペミスです・・・。 |
p.196 式(8.54) |
\( \lt N(m) \gt_m \) \( \Longrightarrow \) \( [[ N(m) ]]_m \) |
上田 |
凡ミスです。 |
p.233 式(9.65) |
\( \Omega_{j,t} = R_{j,t}Q_{j,t}R_{j,t}^\top \) \( \Longrightarrow \) \( \Omega_{j,t} = (R_{j,t}Q_{j,t}R_{j,t}^\top)^{-1} \) |
hotsuyukiさん |
気を抜いておりました・・・ |
p.233 式(9.65)の下の行 |
写像した共分散行列です。\( \Longrightarrow \)写像して得られる精度行列です。 |
hotsuyukiさん |
上の訂正に伴う訂正です |
p.233 セルの24行目、p.237 セルの16行目 |
右辺の行列をnp.linalg.inv( R.dot(Q1).dot(R.T)) と逆行列に訂正 |
hotsuyukiさん |
上の訂正に伴う訂正です |
p.234 図9.12(c) |
この図に差し替え |
hotsuyukiさん |
上の訂正に伴う訂正です |
p.234 最終行 |
方向に星印が移動\( \Longrightarrow \)方向に、わずかに星印が移動 |
hotsuyukiさん |
上の訂正に伴う訂正です |
p.364 脚注2 |
共分散行列 \( \Longrightarrow \) 半正定値対称行列 |
|
もう少し補足すると共分散行列ではなくて精度行列です。 |
第3刷で訂正済み
p.16 本文下から2行目 |
とうてい受け入れにくい$$\longrightarrow$$とうてい受け入れがたい |
上田 |
「難い」をひらがなに直すときに手違いがありました。 |
p.8 「冷戦期」の下の文 |
Roudolf$$\longrightarrow$$Rudolf |
|
大変失礼いたしました。 |
p.8 下から10行目 |
ネリ・ゴードン(Neli ...$$\longrightarrow$$ニール・ゴードン(Neil ... |
|
ずーっと間違えて覚えてました。名前間違えるのは最悪です。すんません・・・ |
p.19 本文9行目 |
こと分かります。$$\longrightarrow$$ことが分かります。 |
|
|
p.56 数式も含めて10行目 |
足し合わせもの$$\longrightarrow$$足し合わせたもの |
|
|
p.121 5.3.4の表題の下の行 |
$$\delta_{\omega\omega} = 0.2 \delta_{\nu\omega} = 0$$$$\longrightarrow$$$$\delta_{\omega\omega} = 0.2, \delta_{\nu\omega} = 0$$ |
|
|
p.125 式も含めて下から10行目 |
は,はそれぞれ$$\longrightarrow$$はそれぞれ |
|
|
p.147 式(6.26) |
$$\hat{\mu}_x - m_y$$ $$\longrightarrow$$ $$\hat{\mu}_y - m_y$$ |
|
校正から漏れました |
p.156 式も含めて6行目 |
N個ぶ$$\longrightarrow$$N個選ぶ |
|
|
p.239 6行目 |
graphbased_slam..._sensor2$$\longrightarrow$$graphbased_slam...sensor2.ipynb |
|
|
p.259 本文6行目 |
区関数$$\longrightarrow$$区間数 |
|
|
p.285 下から3行目 |
ようにをつけて$$\longrightarrow$$ように値をつけて |
|
|
p.313 12.4.1の表題の2行上 |
この方法には$$\longrightarrow$$この方法は |
|
|
p.315 1行目 |
越えることに$$\longrightarrow$$越えるごとに |
|
|
p.327 下から4行目 |
作ること相当し$$\longrightarrow$$作ることに相当し |
|
|
p.345 中央 |
負担率(responsibilty)$$\longrightarrow$$負担率(responsibility) |
|
愛が足りない。 |
p.375 本文下から2行目 |
リポリトリ$$\longrightarrow$$リポジトリ |
|
|
p.379 [Gordon 1993] |
Neli$$\longrightarrow$$Neil |
|
上に同じ。大変すみません。 |
p.380 [Igl 2018] |
Leanring$$\longrightarrow$$Learning |
|
勢いでタイプしてそのままになってました。 |
p.380 [Kalman 1960] |
Roudolf$$\longrightarrow$$Rudolf |
|
すみません! |
p.382 [Sutton 1996] |
Advannces$$\longrightarrow$$Advances |
|
Macのキーボードが・・・ |
第2刷で訂正済み
p.75 ideal_robot7.ipynb [6]の6行目 |
landmark_id = len(self.landmarks) + 1 $$\longrightarrow$$ landmark_id = len(self.landmarks) |
|
リポジトリのコードも直しておきました。 |
p.94 4.3節の5行目 |
次の4種類 $$\longrightarrow$$ 次の5種類 |
|
修正漏れです |
p.99 下から2,3行目、p.100のコードと1行目 |
occulusion $$\longrightarrow$$ occlusion |
|
よくやるタイプミス&修正漏れですすみません・・・ |
|
|
|
|
p.364 式(B.20)の右辺 |
$$-\frac{1}{2}\boldsymbol{x}^\top (G^\top \Sigma_2^{-1} G - \Sigma_1^{-1})\boldsymbol{x}$$ $$\longrightarrow$$ $$-\frac{1}{2}\boldsymbol{x}^\top (G^\top \Sigma_2^{-1} G + \Sigma_1^{-1})\boldsymbol{x}$$ |
|
すみません・・・ |