TEAMZ
技術記事一覧へ戻る
技術記事2026-09-10

棚の死角を固定カメラで補い、Visual SLAMで歩くG1へつなぐ

棚の裏の人物を捉える固定カメラ、G1の歩行と前方カメラを並べたIsaac Simの比較映像
固定カメラ情報の有無で、G1の停止を比較。Isaac Simの実験映像です。

棚の向こうから来る人を、ロボット自身のカメラに映る前に知らせられるか。固定カメラの認識結果をROS2へ渡し、Visual SLAMで歩くG1の停止要求へつなぎました。この記事では、人物追跡のID改善から、棚の死角を補う実験までを紹介します。

通路を歩く人、その横で待つ人、周囲を見回す人、荷物の前でしゃがむ人、椅子に座っている人。Isaac Simの倉庫に、動作の異なる5人を配置しました。

シミュレーション映像・5秒・30fps・等倍速。

この映像を使って、2台のカメラから人物を検出・追跡し、ROS2へ渡すところまで試しています。目的は、カメラが認識した情報をロボットの判断に使うとき、何をそろえる必要があるのかを確かめることです。

全員が歩く場面から、違う動作をする場面へ

最初に作った映像では、5人全員が同じ歩行アニメーションを使っていました。すれ違いの追跡試験には使えますが、倉庫で人が働く場面としては単調です。そこで、購入した人物モデル「142_Kei」に付属するWalk、Idle、Look、Kneel、Sittingを、それぞれ別の人物へ割り当てました。

人物は一から作らず、元の骨格と各アニメーションを保ったまま、BlenderからUSDへ書き出しています。5体は同じ顔・体格の色違いです。顔の異なる5人を本人識別する実験ではありません。

橙の人が歩き、青の人が待機し、灰青の人が手を上げて周囲を見ます。緑の人は荷物の前でしゃがみ、薄い色の人は椅子に腰掛けています。Sittingは着座中の動作で、立った状態から椅子へ座る動きではありません。椅子はその姿勢に合わせて配置しました。

歩行は、その場歩きの足の動きに合わせて、人物全体を約1.55m/sで前へ動かしています。ほかの4人は配置を固定し、姿勢だけを各自のアニメーションで更新します。人同士の衝突回避や、手で荷物をつかむ処理は含めていません。

しゃがむ人も、同じIDで追えるか

2台のカメラで、640×480の画像を30fps・5秒間撮影しました。合計300枚です。画像からFaster R-CNNで人物を検出し、胴体の色と床上位置の近さを使って、カメラ間の対応を取ります。

複数カメラをまたいで同じ対象に共通IDを付ける処理が、マルチカメラトラッキング(MCT)です。今回は自社の簡易方式を使っています。シミュレーターが持つ正解IDや正解位置は、追跡処理には渡さず、事後評価に分けました。

シミュレーション映像・5秒・30fps・等倍速。

両カメラの観測を同じ正解人物へ対応付けられた724組のうち、共通IDが一致したのは648組でした。歩行者は対応できた300観測を通して同じIDでしたが、しゃがむ人には3種類のIDが付きました。姿勢の変化や手前を通る人との重なりがある場面でも、安定して追えるところまでは達していません。

この集計は、各フレームの推定位置とシミュレーター上の人物位置を距離で対応付けた簡易評価です。近接時には採点側の対応にも曖昧さがあり、一般的なMCT精度を示すベンチマーク値ではありません。また、全員が歩く場面とは条件が違うため、数値の違いを追跡アルゴリズムの改善とは扱いません。

追記:IDの切り替わりを減らす

初回の結果を受け、同じ画像・同じ検出枠で追跡処理だけを変更しました。まず、直前の検出枠とのつながりを強く使う方式を試すと、5動作の場面では改善しましたが、全員がすれ違う映像では別人にIDが乗り移り、悪化しました。この方式は採用していません。

そこで、最初に得た見た目の特徴を残し、人の検出枠が重なる間は特徴を更新しない方式へ変更しました。重なった相手の服や背景を「本人の見た目」として覚えてしまうのを抑えます。位置の許容範囲も見直し、検出枠の変化だけで新しいIDを作りにくくしました。

改善後。同じ5秒・300画像の検出結果を使用。画像から推定したIDであり、正解IDを表示した動画ではありません。

5動作の映像では、両カメラで同じIDになった組が648/724組(89.5%)から720/724組(99.4%)へ増えました。しゃがむ人は、採点で対応できた291観測を通して1種類のIDになりました。全員が歩く別映像でも、396/553組(71.6%)から526/553組(95.1%)へ改善しました。どちらも各映像の同じ入力を使った前後比較です。

ただし、5動作では4組、全員歩行では27組でカメラ間のIDが一致せず、別人への取り違えも残っています。5人は同じモデルの色違いなので、同じ服装の人や照明が変わる実環境への性能は示していません。別映像も改良の判断に使ったため、未使用データでの最終評価ではありません。ここで得たのは、今回の条件でIDの継続性を改善できたという結果です。

画像の位置を、ロボットが使える座標へ

カメラ画像で「右下に人がいる」と分かっても、それだけではロボットから何メートル離れているか分かりません。

今回は、検出枠の下端中央を床上の足元と仮定しました。カメラの内部パラメータと設置位置・向きが既知なら、その画素へ向かう光線と床の交点を求められます。その位置をtf2で地図や固定のロボット基準座標へ変換しました。

ただし、足元が隠れて検出枠が上半身だけになれば、下端は足元を指しません。しゃがんだ姿勢でも、枠の形や基準点は変わります。変換計算が正しくても、入力した点の意味が違えば、地図上の位置は誤ります。

外部の認識エンジンへ接続するときも、出力が画像上の2D枠なのか、校正済みの3D位置なのかを確認する必要があります。2D枠をROS2で受け取ることと、ロボットが使える実空間の位置を得ることは、別の確認項目です。

時刻も同様です。毎秒1.55メートルで歩く人なら、1秒前の位置は約1.55メートル後方です。遅れて届いた認識情報を今の位置だと思って使うと、すでに人が入った領域を、まだ空いていると判断する可能性があります。

そこで観測時刻と受信時刻を分け、遅延・欠損・順序逆転・二重入力を意図的に加える試験も実行しました。古い入力を捨てたあと、情報がない状態を「人がいない」と扱わないことも、ロボット側と決める必要があります。

同じ映像から、判断をやり直せるようにする

RGB画像、認識情報、追跡結果、座標変換、時計、可視化用マーカー、停止要求をROS2で配信し、rosbag2に記録しました。再生時には300件の認識入力の内容と順序、画像300枚のハッシュが一致しました。

さらに、ログから復元した画像を同じGPU・モデル・ソフトウェア環境で再推論すると、実行時間を除く検出結果と追跡結果も一致しました。これなら、しゃがむ人のIDが変わった場面に戻って、関連付けや座標変換の処理を変更した前後を比較できます。

今回確認したのは、保存した入力からの再現性です。物理シミュレーションを再実行して同じ映像を生成したわけではありません。人物検出はオフライン処理で、5秒分の300画像に17.55秒かかりました。この初回の5人の実験では、ロボット側への出力は停止要求の配信までです。続く棚の実験で、シミュレーション内のG1の減速を確認しました。実機の制動や安全機能は検証していません。

動作を分けたことで、歩いている人だけでなく、姿勢が変わる人、動かずにいる人も同じ接続環境で試せるようになりました。次は認識エンジンが出すIDの範囲、時刻の基準、位置の意味、欠損通知を確認し、受け取る情報とロボット側の判断を合わせていきます。

実験日:2026年9月10日。Isaac Sim 5.1.0.0、ROS2 Humble、NVIDIA L4、Blender 5.2.1 LTSを使用。外部のMCT製品を評価した結果ではありません。

追記:棚の死角を補い、Visual SLAMで歩くG1へつなぐ

続いて、棚の裏から歩いてくる人を固定カメラで認識し、G1へ停止要求を出す実験を行いました。ここでは人物を1人に絞り、G1もIsaac Simの物理シミュレーションで実際に歩かせています。

G1の頭部ステレオ画像をcuVSLAMへ入力し、その推定位置を使って短い経路を追従します。地図上の初期配置は既知という前提です。シミュレーターの正解位置を自己位置として与えるのではなく、画像から得た位置を歩行指令へつなぎました。正解の位置・速度は、停止までの動きを事後評価するために記録します。

9秒・10fps・等倍速。左が固定カメラ情報あり、右がG1のカメラだけで判断する条件。上段はG1の物理シミュレーション、下段は認識に使ったカメラ映像です。

固定カメラとG1のカメラで人物を検出し、床上の推定位置をtf2で地図へ変換します。指定領域に入ったら、ROS2で停止要求を送ります。固定カメラの情報を使う場合と使わない場合を、同じ制御コードでそれぞれ18秒実行しました。

固定カメラ情報ありでは10.33秒、G1のカメラだけでは10.83秒に停止要求が出ました。固定カメラを使うと0.50秒早く要求でき、G1の最終位置は約27cm手前になりました。映像の10.33秒時点では、棚の裏の人を固定カメラが捉えている一方、G1の前方映像にはまだ映っていません。

ただし、要求を出しても瞬時に止まりません。固定カメラ情報ありでは、歩行指令がゼロになるのは要求の0.02秒後。その後、水平速度が0.08m/s未満で0.5秒続く状態に入るまで1.82秒かかり、約39cm進みました。外部情報なしでも要求後の変位は約39cmです。今回の違いは、減速能力を変えたことではなく、早い位置から停止を始められたことです。

Visual SLAMは両条件とも450回の推定を返し、地図も保存しました。さらに各条件の認識入力180件と停止要求900件をrosbag2で再生し、追跡ID、座標変換、停止判断を再計算して照合しました。入力と停止要求は、実際のROS2通信でも内容・順序が一致しています。

この棚の実験では、固定カメラと移動するG1カメラのID統合はまだ行っていません。先ほどの2台の固定カメラ間でのID改善とは分けて評価しています。また、認識器はG1自身も人として検出することがあり、足元の隠れによる位置誤差も残ります。

画像推論中はシミュレーション時計が止まる構成なので、実時間の応答性能を測った結果ではありません。最終比較は各条件1回で、実機の安全機能や停止性能を保証するものでもありません。今回確認できたのは、外部カメラの認識を、Visual SLAMで歩くG1の停止要求へつなぎ、要求と実際の減速を別々に測れることです。

お問い合わせ