詳解確率ロボティクスの訂正・コードのアップデート

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月更新分

  • section_kalman_filter/kf3.ipynb
  • section_kalman_filter/kf4.ipynb
    • どのバージョンからかは調べてませんが、scipy.stats.multivariate_normalcovを直接書き換えられなくなりました。kf3.ipynbで書き直したmotion_updatekf4.ipynbで書き直したobservation_updateを掲載します。
    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月更新分

情報提供いただきました。ありがとうございます。

  • section_sensor/lidar_200.ipynbセル[9]: Pandas 2.x系で、前のセルのvalue_countが集計した列にcountと名前をつけるようになったことに対するコードの修正。

   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()

訂正事項

場所 訂正事項 発見者 一言
p.143 式(6.15)の真ん中の行列の2行目 \( \omega \Longrightarrow \omega_t \) 見落としてました・・・
p.254 コード2行目のコメント KfAgent \(\Longrightarrow\) EstimationAgent 上田 コメントなので油断しました。
p.262 2行目 角度と角速度 \(\Longrightarrow\) 速度と角速度 第5刷で訂正したp.91のと同じです🙏
p.321 amdp6.ipynbの102行目 dp.obs_... \(\Longrightarrow\) self.obs_... https://github.com/ryuichiueda/LNPR_BOOK_CODES/issues/6 一応これでも動きますが、申し訳ないっ!
p.325 amdp7.ipynbの116行目 dp.obs_... \(\Longrightarrow\) self.obs_... https://github.com/ryuichiueda/LNPR_BOOK_CODES/issues/6 同上
p.334 セル[8]の2行目 beta_0 \( \Longrightarrow \) zeta_0 https://github.com/ryuichiueda/LNPR/issues/1 すみません!下の計算結果は、運の良いことにわずかに違うだけになります。

第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}$$ すみません・・・
ノート   このエントリーをはてなブックマークに追加 
 

やり散らかし一覧

記事いろいろ