床の模様から地図と自己位置を出す slam_tenchi の仕組みは、以前の記事に書いています。今回はその続きで、実写の動画にかけたときに処理がどこまで通るかを、2026年10月13日の記録からまとめたものです。
撮ったのは床だけではありません。人が通ったり荷物が置いてあったりすると、下を向けたカメラは床の模様を失います。そのときは天井の方が残ります。照明や天井板の目地が、床のタイルと同じ役割をします。今回は床と天井の両方で、キーフレームと移動軌跡ができ、その位置を床の地図と間取り図の上に表示し、さらに ArUco マーカーの設定を自動で作って、マーカーを優先してもう一度生成するところまで確認しました。
まだ言えないこともあります。実写で「本当の位置から何ミリずれていたか」は測っていません。正解の位置も、正解の経路も、この記録には入っていないからです。このあと出てくる距離や範囲は、処理が完了したことと、SLAM が自分の計算で積んだ長さの話です。
今回見ている方式
自己位置のとり方は、現場によって変えます。模様があって床が見える屋内なら、下向きカメラと床の地図です。床が人や荷物で隠れるなら、上向きカメラと天井の地図です。電波の強さを記録して照合する Wi-Fi は、既にある設備で大まかな区画を見るとき。カメラと IMU で動きを追う VIO は、地図が無い区間を連続して追うとき。立体物が多い場所では、形と 3D の地図を使う LiDAR です。
この5つは、どれを選ぶかの資料です。同じ条件で走らせて、精度を並べた結果ではありません。今回の実写で通したのは、床と天井の画像を使う方式です。
動画から地図になるまで
やっていることは、前後の画像で同じ模様を追うことです。
カメラを床か天井に向けて動画を撮ります。隣り合うフレームから、同じ筋や同じ傷を探します。その点がどちらへ動いたかで、進んだ量と向きの変化を計算します。一定のところまで来たら、その画像と推定した位置をキーフレームとして残します。残ったキーフレームと、その間の軌跡が地図です。
入力に使った床は、筋の入ったタイルカーペットです。天井は、蛍光灯と天井板、目地が写っています。追っているのは、その部屋に写っている見た目です。
床と天井で、地図と軌跡ができた
床は、以前の 51 キーフレーム版です。1,449 フレームの動画から 51 枚を残し、推定した移動距離は 6.61 m、動いた範囲は 1.57 m × 2.13 m でした。
天井はもっと短い動画です。157 フレームから 23 キーフレームを残し、推定した移動距離は 6.20 m、範囲は 3.31 m × 3.16 m でした。フレーム数は床より少ないのに、推定した範囲は床より広がっています。コースの長さが違ったのか、画像の上での動き方が違ったのかは、この数字だけでは分かれません。
どちらも、SLAM が自分で積んだ値です。巻尺でコース長を測って比べたものではないので、この 6.61 m や 6.20 m をもって精度が出たとは言えません。言えるのは、床の動画からも天井の動画からも、キーフレームと軌跡を持つ地図が残った、ということです。
間取り図の上に載せる
地図ができたあと、その軌跡を部屋の形の上に表示できるかも見ています。
床の表示は、上の 51 枚とは別の記録です。キーフレームは 59 枚、経路の点は 1,548、画面上の長さは 9.70 m でした。軌跡は一周するような形で、途中に自己位置が載っています。
天井側は、地図のなかに部屋の形が入っているわけではありません。開始位置と、どちらが前か、長さの縮尺をこちらで指定して、間取り図に重ねています。図の青い区間は 1.00 m です。開始位置から廊下が延びる方向へ進み、途中で曲がっています。
これは「指定した縮尺で、間取りの上に経路を描けた」という確認です。壁の位置と軌跡が何ミリずれているかは、この図からは読んでいません。
壁の近くでは、設定で結果が分かれた
もう一つ、壁に寄せた実写があります。壁までの距離は約 50 cm で、移動はかなりゆっくりです。距離は概算です。カメラは棚の正面を向いていて、床のタイルを広く映す構図とは違います。
マーカーを置かない通常の処理は、最後まで通りました。308 フレームすべてを処理し、キーフレーム 8 枚の地図が残っています。
同じように壁へ寄せ、マーカーが見える状態で通常の処理にすると、途中で止まりました。182 フレームのうち 83 フレーム目で、平面計算エラーになっています。このときの画面は、床のタイルではなく棚が大部分です。記録は、そこで失敗した、と残しています。
記録の「安全」は、失敗したときに中間画像を残す設定です。これに切り替えると、546 フレームのうち 544 まで処理でき、キーフレームは 7 枚、補完したフレームは 12 枚で完了しています。マーカーが見えていても、失敗の扱いが違うと、最後まで残るかどうかが分かれました。
マーカーの位置を登録した条件も見ています。登録した値は概算で、計算の途中で失敗し、そこまでに残った軌跡は短い直線でした。設置位置と寸法を測り直した条件は、まだやっていません。
マーカーは、登録した配置との差まで
ArUco は、ID が読める印刷のマーカーです。置いた場所が分かっていれば、地図を補正するときの拘束に使います。床や天井の模様だけでも軌跡は作れます。マーカーは、その軌跡に「この ID はここにある」という位置を足すためのものです。見えたフレームでは、その位置を優先して使います。
この記録では、処理した 443 フレームのうち、位置を算出できたのは 209 フレームです。検出した ID は 0 から 4 でした。計算上のマーカー残差は 1.28〜1.51 mm です。
この残差は、こちらが登録した配置と、画像から求めた位置との差です。部屋のなかの本当の位置を測って比べた誤差ではありません。「位置精度が 1 mm だった」とは読めません。登録が概算なら、残差が小さくても、それは概算の配置に合っていた、というところまでです。
検出して、設定を作り、優先してもう一度
マーカーをあらかじめ全部測って書き込むのではなく、動画から見つける流れも確認しました。
まず 5 個を検出します。次に、その検出から設定を自動で作って保存します。最後に、マーカーを優先してもう一度地図を生成します。完了した記録は 1,309/1,310 フレームです。キーフレームは 5 枚、マーカーを認識したフレームは 211、補完は 12 フレームでした。
ここでも、正解の位置は用意していません。処理が最後までつながり、5 個のマーカーが軌跡の上に載ったところまでは確認できています。その軌跡が実寸で何ミリ正しいかは、この完了記録からは出していません。
正解経路と比べられたのは、シミュレーションだけ
実写の誤差を出すには、通った経路の正解が要ります。今回の動画にはそれがありません。代わりに、正解経路のある Gazebo で、推定結果をあとから比べています。比べる値は SLAM には入れていません。推定が終わったあとで、正解と並べています。
地図を作ったときの位置誤差は 4.5 mm でした。自己位置は、地図を作ったときとは別の経路で 6.1 mm です。評価したフレームのうち、位置を求められない割合は 0% でした。
この数字はシミュレーションの評価です。上に書いた実写の 6.61 m や、間取り図上の 9.70 m が、同じ精度で合っていることは示しません。Gazebo での中身は、以前の記事にあります。
次に測ること
今回通ったのは、床の動画からキーフレームと移動軌跡を持つ地図を作れたこと、同じ作り方を天井の動画にも載せられたこと、ArUco の検出から設定の自動作成、マーカー優先の再生成までつながったことです。間取り図への表示と、壁際での設定の違いも、あわせて見ています。
精度として言うには、まだ二つ要ります。実写の環境に正解の経路と基準点を置き、絶対位置の誤差を測ること。マーカーの設置位置と寸法を実測し、概算のままではない条件でやり直すことです。
