光孊远跡システムの䜜り方





2015幎に戻った。 Oculus DK2バヌチャルリアリティグラスが発売されたばかりで、VRゲヌム垂堎は急速に人気を博しおいたした。



そのようなゲヌムでのプレヌダヌの機䌚は限られおいたした。頭の動きの6自由床のみが監芖されたした-モニタヌに固定された赀倖線カメラの芖野内での回転ガラスの慣性によるず少量の動き。ゲヌムのプロセスは、ゲヌムパッドを手にした怅子に座っお、頭をさたざたな方向に回転させ、吐き気ず戊うこずで構成されおいたした。



あたりクヌルに聞こえたせんでしたが、これは、゚レクトロニクス開発の経隓ず新しいプロゞェクトぞの欲求を利甚しお、䜕か面癜いこずをする機䌚だず思いたした。このシステムをどのように改善できたすか



もちろん、ゲヌムパッドやワむダヌを取り陀き、プレむダヌに空間内を自由に移動し、手足を芋お、環境、他のプレむダヌ、実際のむンタラクティブオブゞェクトず察話する機䌚を䞎えたす。



私はそれをこのように芋たした



  1. 私たちは䜕人かのプレヌダヌを連れお行き、VRメガネ、ラップトップ、そしお腕、脚、胎䜓にセンサヌを装着したす。
  2. いく぀かの郚屋、廊䞋、ドアで構成される郚屋を取り、远跡システムを装備し、ドアにセンサヌず磁気ロックを掛け、いく぀かのむンタラクティブオブゞェクトを远加し、仮想の堎所のゞオメトリが実際の郚屋のゞオメトリを正確に繰り返すゲヌムを䜜成したす。
  3. ゲヌムを䜜成したす。このゲヌムはマルチプレむダヌク゚ストで、耇数のプレむダヌが装備を身に付けお仮想䞖界にいるこずに気づきたす。その䞭で、圌らは自分自身を芋お、お互いを芋お、その堎所を歩き回り、ドアを開け、共同でゲヌムの問題を解決するこずができたす。


私はこのアむデアを友人に話したした。友人は意倖にも熱心にそれを受け入れ、組織的な問題を匕き継ぐこずを申し出たした。そこで、スタヌトアップを混乱させるこずにしたした。



宣蚀された機胜を実装するには、2぀の䞻芁なテクノロゞヌを䜜成する必芁がありたした。



  1. プレむダヌの䜓の郚分の䜍眮を远跡する腕、脚、胎䜓のセンサヌで構成されるスヌツ
  2. 3D空間でプレヌダヌずむンタラクティブオブゞェクトを远跡する远跡システム。


この蚘事では、2番目のテクノロゞヌの開発に぀いお説明したす。倚分埌で私は最初のものに぀いお曞きたす。



远跡システム。



もちろん、これらすべおの予算がなかったので、すべおをスクラップ材料から䜜らなければなりたせんでした。宇宙のプレむダヌを远跡するために、VRメガネに取り付けられた光孊カメラずLEDマヌカヌを䜿甚するこずにしたした。私はそのような開発の経隓はありたせんでしたが、OpenCV、Pythonに぀いおすでに䜕かを聞いお、それができるず思いたした。



蚈画どおり、システムがカメラの䜍眮ず向きを認識しおいる堎合、フレヌム䞊のマヌカヌ画像の䜍眮によっお、このマヌカヌが配眮されおいる3D空間の盎線を決定できたす。このような2぀の線の亀点が、最終的なマヌカヌの䜍眮を瀺したす。







したがっお、カメラは倩井に固定しお、空間内の各ポむントが少なくずも2台のカメラで衚瀺されるようにする必芁がありたしたプレヌダヌの䜓が芖界を遮らないように、できればそれ以䞊。想定される敷地を玄100平方メヌトルの面積で远跡しおカバヌするには、玄60台のカメラが必芁でした。私はその時に最初に利甚可胜な安いusbりェブサむトを遞びたした。







これらのりェブサむトは䜕かに接続する必芁がありたす。実隓によるず、usb延長コヌド少なくずも安䟡なものを䜿甚するず、カメラに䞍具合が発生し始めたした。そのため、りェブサむトを8぀のグルヌプに分けお、倩井に固定されたシステムナニットに貌り付けるこずにしたした。自宅のコンピュヌタヌには10個のusbポヌトしかなかったので、テストベンチの開発を開始したす。



私が思い぀いたアヌキテクチャは次のずおりです。

ガヌランドのアクリル補の぀や消しボヌルにRGBLEDを接着しお、各グラスに吊るしたす。耇数のプレむダヌが同時にゲヌムに参加するこずになっおいたので、識別のために、R、G、B、RG、RB、GB、RBの色でそれらを分けるこずにしたした。これがその倖芳です







。実行する必芁がある最初のタスクは、フレヌム䞊のボヌルを芋぀けるためのプログラムを䜜成するこずです。



フレヌム䞊のボヌルを芋぀ける



カメラから来た各フレヌムで識別できるように、ボヌルの䞭心の座暙ずその色を探す必芁がありたした。簡単そうですね。OpenCV for Pythonをダりンロヌドし、カメラをusbに接続し、スクリプトを䜜成したす。フレヌムぞの䞍芁なオブゞェクトの圱響を最小限に抑えるために、カメラの露出ずシャッタヌ速床を最小限に蚭定し、LEDの茝床を高くしお、暗い背景に明るいスポットを取埗したす。最初のバヌゞョンでは、アルゎリズムは次のずおりでした。



  1. ( , , – ).
  2. .
  3. ( )






うたくいくようですが、ニュアンスがありたす。



たず、安䟡なカメラでは、マトリックスにかなりのノむズがあり、2倀化されたクラスタヌの茪郭が絶えず倉動し、その結果、䞭心がぎくしゃくしたす。プレむダヌがVRメガネで絵をひねるこずは䞍可胜なので、この問題を解決する必芁がありたした。異なるパラメヌタヌを䜿甚しお他のタむプの適応二倀化を適甚しようずしおも、あたり効果はありたせんでした。



次に、カメラの解像床は640 * 480しかないため、ある距離それほど倧きくないでは、ボヌルはフレヌム内の数ピクセルずしお衚瀺され、゚ッゞ怜玢アルゎリズムは正垞に機胜しなくなりたす。



私は新しいアルゎリズムを考え出さなければなりたせんでした。次のアむデアが思い浮かびたした。



  1. 画像をグレヌスケヌルに倉換する
  2. Gaussian blur – ,
  3. ,


これははるかにうたく機胜し、ボヌルが静止しおいるずきは䞭心の座暙が静止しおおり、カメラから遠く離れおいおも機胜したす。



これらすべおが1台のコンピュヌタヌの8台のカメラで機胜するこずを確認するには、ストレステストを実斜する必芁がありたす。



負荷テスト



8台のカメラをデスクトップに接続し、それぞれが光るドットを芋るように配眮し、説明したアルゎリズムが8぀の独立したプロセスで機胜しPythonマルチプロセッシングラむブラリのおかげで、すべおのスレッドを䞀床に凊理するスクリプトを実行したす。



そしお...私はすぐに倱敗に遭遇したす。カメラの画像が衚瀺されたり消えたり、フレヌムレヌトが0から100に跳ね䞊がる、悪倢。調査の結果、コンピュヌタヌの䞀郚のusbポヌトが内郚ハブを介しお同じバスに接続されおいるこずがわかりたした。そのため、バス速床が耇数のポヌトに分割され、カメラのビットレヌトには䞍十分です。カメラをコンピュヌタヌのさたざたなポヌトにさたざたな組み合わせで接続するず、独立したusbバスが4぀しかないこずがわかりたした。私は8぀のバスを備えたマザヌボヌドを芋぀けなければなりたせんでしたが、それはかなり難しい探求でした。



ネタバレ
Intel B85, 10 usb . 10- , OpenCV, .. 8 (?)



負荷テストを続けたす。今回は、すべおのカメラが接続され、通垞のストリヌムを出力したすが、すぐに次の問題である䜎fpsに遭遇したす。プロセッサは100ロヌドされおおり、8぀のWebサむトのそれぞれから毎秒8〜10フレヌムしか凊理できたせん。







コヌドを最適化する必芁があるようです。ボトルネックはガりスブラヌであるこずが刀明したしたフレヌムの各ピクセルに察しお9 * 9マトリックスで畳み蟌む必芁があるため、驚くこずではありたせん。カヌネルを枛らしおも状況は保存されたせんでした。フレヌム䞊のスポットの䞭心を芋぀けるための別の方法を探す必芁がありたした。



解決策は、OpenCVに組み蟌たれおいるSimpleBlobDetector関数で突然芋぀かりたした。圌女は私が必芁ずしおいるこずを正確にそしお非垞に迅速に行いたす。この利点は、さたざたなしきい倀を䜿甚した画像の順次2倀化ず、茪郭の怜玢によっお実珟されたす。その結果、CPU負荷が40未満で最倧30fpsになりたす。負荷テストに合栌したした



色分類



次のタスクは、マヌカヌをその色で分類するこずです。スポットピクセル党䜓の平均カラヌ倀は、非垞に䞍安定で、カメラたでの距離ずLEDの明るさによっお倧きく倉化するRGBコンポヌネントを瀺したす。しかし、優れた解決策がありたす。HSVを䜿甚したRGB空間からの倉換色盞、圩床、倀です。この衚珟では、「赀」、「青」、「緑」の代わりにピクセルが「色盞」、「圩床」、「明るさ」のコンポヌネントに分解されたす。この堎合、圩床ず明るさは単玔に陀倖し、色盞によっおのみ分類できたす。







技術的な詳现
, «» . , . , . «» .



:



  1. (, R – )
  2. , , . «hue – saturation»
  3. . , .
  4. , , . . , , . .. , . , - , , .






そのため、珟時点では、倚数のカメラからフレヌム内のマヌカヌを芋぀けお識別する方法を孊びたした。これで、次の段階である宇宙での远跡に進むこずができたす。



远跡



私は、すべおの光線がマトリックスの焊点長にある点を通っおマトリックスに圓たるピンホヌルカメラモデルを䜿甚したした。







このモデルは、フレヌム䞊の点の2次元座暙を、空間内の盎線の3次元方皋匏に倉換したす。



マヌカヌの3D座暙を远跡するには、異なるカメラから空間内で少なくずも2぀の亀差する線を取埗し、それらの亀差点を芋぀ける必芁がありたす。 2台のカメラでマヌカヌを確認するこずは難しくありたせんが、これらの線を䜜成するには、接続されおいるカメラに぀いおすべおを知るシステムが必芁です。カメラがぶら䞋がっおいる堎所、角床、各レンズの焊点長などです。問題は、これのどれも知られおいないずいうこずです。パラメヌタの蚈算には、ある皮の校正手順が必芁です。



トラッキングキャリブレヌション



最初のバヌゞョンでは、トラッキングキャリブレヌションを可胜な限りプリミティブにするこずにしたした。



  1. 8台のカメラの最初のブロックを倩井に吊るし、同じ堎所に吊るされたシステムナニットに接続し、最倧ゲヌムボリュヌムをカバヌするようにカメラを向けたす。
  2. レヌザヌレベルずレンゞファむンダヌを䜿甚しお、すべおのカメラのXYZ座暙を単䞀の座暙系で枬定したす
  3. カメラの向きず焊点の長さを蚈算するために、私は特別なステッカヌの座暙を枬定したす。私は次のようにステッカヌを掛けたす

    • カメラからの写真を衚瀺するためのむンタヌフェヌスで、2぀のポむントを描画したす。1぀はフレヌムの䞭倮にあり、もう1぀は䞭倮の右偎に200ピクセルありたす。

    • フレヌムを芋るず、これらのポむントは壁、床、たたは郚屋の䞭の他のオブゞェクトのどこかにありたす。玙のステッカヌを適切な堎所に掛け、マヌカヌでドットを描きたす
    • 同じレベルずレンゞファむンダヌを䜿甚しお、これらのポむントのXYZ座暙を枬定したす。合蚈で、8台のカメラのブロックの堎合、カメラ自䜓の座暙ず、それぞれにさらに2぀のポむントを枬定する必芁がありたす。それら。座暙の24トリプレット。そしお、そのようなブロックは玄10個あるはずです。それは長い退屈な仕事になりたす。しかし、䜕も、埌でキャリブレヌションを自動化したす。
    • 枬定デヌタに基づいお蚈算を開始したす




2぀の座暙系がありたす。1぀は郚屋に関連付けられたグロヌバルで、もう1぀は各カメラにロヌカルです。私のアルゎリズムでは、各カメラの結果は、その䜍眮ず方向を含む4 * 4のマトリックスになり、座暙をロヌカルからグロヌバルに倉換できるようになりたす。







アむデアは次のずおりです。



  1. 回転ずオフセットがれロの元のマトリックスを䜿甚したす。
  2. , .
  3. , .
  4. , . , . . 200 . , .
  5. (, 200 ).


確かにこの問題は分析的に解決できたすが、簡単にするために、募配降䞋の数倀解法を䜿甚したした。怖くないから蚈算は、カメラの蚭眮埌に1回実行されたす。



キャリブレヌション結果を芖芚化するために、マップを䜿甚しお2Dむンタヌフェむスを䜜成したした。このむンタヌフェむス䞊に、スクリプトがカメラのラベルずマヌカヌが衚瀺される方向を描画したす。䞉角圢は、カメラの向きず衚瀺角床を衚したす。







远跡のテスト



芖芚化の実行を開始できたす。これにより、カメラの向きが正しく識別されおいるかどうか、およびフレヌムが正しく解釈されおいるかどうかが瀺されたす。理想的には、カメラアむコンからの線は1点で亀差する必芁がありたす。



䜕が起こったのか





真実のように芋えたすが、粟床は明らかに高くなる可胜性がありたす。頭に浮かんだ䞍完党さの最初の理由は、カメラレンズの歪みです。これは、これらの歪みを䜕らかの方法で補正する必芁があるこずを意味したす。



カメラのキャリブレヌション

理想的なカメラには、焊点の長さずいう1぀の重芁なパラメヌタヌしかありたせん。実際のカメラカヌブでは、レンズの歪みずマトリックスの䞭心のオフセットも考慮する必芁がありたす。

これらのパラメヌタを枬定するために、暙準の校正手順がありたす。この手順では、チェッカヌボヌドの䞀連の写真が枬定されたカメラで撮圱され、正方圢間の角床がサブピクセルの粟床で認識されたす。







キャリブレヌションの結果は、2぀の軞に沿った焊点長ず、光孊䞭心に察するマトリックスオフセットを含むマトリックスです。これらはすべおピクセル単䜍で枬定されたす。







たた、







ピクセル座暙倉換を䜿甚しおレンズの歪みを補正できる歪み係数のベクトルもあり たす。



これらの係数を䜿甚した倉換をフレヌム䞊のマヌカヌの座暙に適甚するこずにより、システムを理想的なピンホヌルカメラのモデルにするこずができたす。



新しい远跡テストの実行







はるかに優れおいたす芋た目も良さそうなので、うたくいくようです。



しかし、キャリブレヌションプロセスは非垞に面倒であるこずが刀明したした。各カメラの座暙を盎接枬定し、各カメラからの画像の衚瀺を開始し、ステッカヌを切り、各ステッカヌの座暙を枬定し、結果をテヌブルに曞き蟌み、レンズをキャリブレヌションしたす。これにはすべお、数日ず1キログラムの神経が必芁でした。私は远跡を扱い、より自動化されたものを曞くこずにしたした。



マヌカヌ座暙の蚈算



それで、私はたくさんの盎線を空間に散らばらせ、その亀差点にマヌカヌがあるはずです。空間内の盎線だけが実際には亀差したせんが、亀差したす。互いにある皋床の距離を眮いお通過したす。私の仕事は、䞡方の盎線にできるだけ近いポむントを芋぀けるこずです。正匏に蚀えば、䞡方の線に垂盎なセグメントの䞭点を芋぀ける必芁がありたす。







セグメントABの長さも有甚です。埗られた結果の「品質」を反映しおいたす。短いほど、盎線同士が近くなり、結果が良くなりたす。



次に、ペアで線の亀点を蚈算し同じ色で、互いに十分な距離にあるカメラから、最適なものを探し、それをマヌカヌ座暙ずしお䜿甚する远跡アルゎリズムを䜜成したした。次のフレヌムでは、同じペアのカメラを䜿甚しお、他のカメラでの远跡に切り替えるずきに座暙がゞャンプしないようにしたす。



䞊行しお、センサヌ付きのスヌツを開発しおいるずきに、奇劙な珟象を発芋したした。すべおのセンサヌは、それぞれが独自の北を持っおいるかのように、ペヌ角氎平面の方向の異なる倀を瀺したした。たず、デヌタフィルタリングアルゎリズムやボヌドのレむアりトに間違いがないか確認するのに圹立ちたしたが、䜕も芋぀かりたせんでした。それから私は磁気蚈の生デヌタを芋るこずに決め、問題を芋たした。

私たちの郚屋の磁堎は垂盎に䞋向きでしたどうやら、これは建物の構造の鉄によるものです。



しかし、VRメガネも磁力蚈を䜿甚しおいたす。なぜこの効果がないのですか確認したす。圌も県鏡を持っおいるこずが刀明したした...じっず座っおいるず、仮想䞖界がゆっくりず、しかし確実にランダムな方向にあなたの呚りを回転する様子を芋るこずができたす。 10分で、圌はほが180床を離れたす。私たちのゲヌムでは、これは必然的に仮想珟実ず珟実の珟実の間の同期のずれや壁にぶ぀かったガラスに぀ながりたす。



ガラスの座暙に加えお、氎平面での方向を決定する必芁があるようです。解決策はそれ自䜓を瀺唆しおいたす-1぀ではなく2぀の同䞀のマヌカヌをグラスに眮くこずです。 180床の粟床で方向を決定するこずができたすが、内蔵の慣性センサヌの存圚を考慮するず、これで十分です。







小さなわき柱はあるものの、システム党䜓が機胜したした。しかし、ク゚ストを開始するこずが決定されたした。これは、ミニチヌムに参加したgamedev開発者によっお完了されようずしおいたした。プレむ゚リア党䜓が砎壊され、センサヌず磁気ロック付きのドアが蚭眮され、2぀のむンタラクティブオブゞェクトが䜜成されたした。







プレむダヌはグラス、スヌツ、コンピュヌタヌのバックパックを身に着けおプレむ゚リアに入った。远跡座暙はwi-fiを介しお送信され、仮想キャラクタヌの配眮に䜿甚されたした。すべおが十分に機胜し、蚪問者は満足しおいたす。最も楜しいこずは、仮想の幜霊が暗闇から圌らを攻撃した瞬間に、特に印象的な蚪問者の恐怖ず悲鳎を芋るこずでした=







スケヌリング



突然、銃を手にした8人甚の倧型VRシュヌタヌの泚文を受けたした。そしお、これらは震える必芁がある16のオブゞェクトです。幞運なこずに、远跡を4人ず぀の2぀のゟヌンに分割する可胜性を想定しおいたので、問題なく泚文を受け付けお䜕も気にしないこずにしたした。自宅でシステムをテストするこずは䞍可胜でした。広い面積ず倚くの機噚を顧客が賌入する必芁があったため、むンストヌルする前に、トラッキングキャリブレヌションの自動化に時間を費やすこずにしたした。



自動校正



カメラを向けたり、これらすべおのステッカヌを掛けたり、手動で座暙を枬定したりするのは非垞に䞍䟿でした。私はこれらすべおのプロセスを取り陀きたいず思っおいたした-ブルドヌザヌからカメラを切り、空間内のマヌカヌをランダムに歩き、キャリブレヌションアルゎリズムを実行したす。理論的にはこれは可胜であるはずですが、アルゎリズムの䜜成方法は明確ではありたせん。



最初のステップは、システム党䜓を䞀元化するこずでした。プレむ゚リアを8台のカメラのブロックに分割する代わりに、すべおのカメラのフレヌム䞊のポむントの座暙を䞀床に受信する単䞀のサヌバヌを䜜成したした。



アむデアは次のずおりです。



  1. カメラを吊るしお、目でプレむ゚リアに誘導したす
  2. サヌバヌで蚘録モヌドを開始したす。このモヌドでは、カメラからのすべおの2Dポむントがファむルに保存されたす。
  3. マヌカヌを手に持っお暗いゲヌムの堎所を歩き回る
  4. 蚘録を停止し、すべおのカメラの䜍眮、向き、焊点の長さを蚈算するキャリブレヌションデヌタの蚈算を開始したす。
  5. 前の段萜の結果ずしお、カメラで満たされた単䞀のスペヌスが埗られたす。なぜなら このスペヌスは実際の座暙に関連付けられおいたせん。ランダムなオフセットず回転があり、手動で枛算したす。


私は線圢代数に関する膚倧な量の資料を調べお、䜕癟行ものPythonコヌドを曞かなければなりたせんでした。それがどのように機胜するかを私はほずんど芚えおいないほどです。











これは、プリンタヌに印刷された特別なキャリブレヌションスティックがどのように芋えるかです。



倧芏暡なプロゞェクトのテスト



問題は、プロゞェクトの開始の数週間前に斜蚭でのテスト䞭に始たりたした。 8぀の異なるマヌカヌの色を識別するこずはひどく機胜し、テストプレヌダヌは垞に互いにテレポヌトし、䞀郚の色はショッピングコンプレックスの倖郚のハむラむトずたったく異ならなかった。眠れない倜ごずに䜕かを盎そうずする無駄は、私をたすたす絶望に远いやった。これはすべお、1秒あたり数䞇の盎線を蚈算するずきのサヌバヌパフォヌマンスの欠劂によっお悪化したした。



血䞭のコルチゟヌルのレベルが理論䞊の最倧倀を超えたずき、私は別の角床から問題を芋るこずにしたした。マヌカヌの数を枛らすこずなく、色付きのドットの数を枛らすにはどうすればよいですか远跡をアクティブにしたす。たずえば、各プレヌダヌが垞に巊偎のホヌンに赀いホヌンを持っおいるようにしたす。たた、サヌバヌからのコマンドの到着時に2番目のコマンドが緑色に点灯するこずがあるため、䞀床に1人のプレヌダヌだけが点灯したす。緑色のラむトが1人のプレヌダヌから別のプレヌダヌにゞャンプし、赀色のラむトぞのトラッキングバむンディングを曎新し、マグネトメヌタヌの方向゚ラヌをリセットしおいるように芋えるこずがわかりたした。



これを行うには、最寄りのチップディップたで走り、LED、ワむダヌ、トランゞスタヌ、はんだ付けアむロン、電気テヌプを賌入し、このために蚭蚈されおいないスヌツボヌドにLED制埡機胜を吊るす必芁がありたした。念のため、ボヌドを配線するずきに、コンタクトパッドに2本のフリヌのstm-kiレッグを掛けおおくずよいでしょう。







远跡アルゎリズムはかなり耇雑にする必芁がありたしたが、最終的には機胜したした。プレむダヌ同士のテレポヌテヌションが消え、プロセッサヌの負荷が䞋がり、フレアが干枉しなくなりたした。





プロゞェクトは成功裏に開始されたした。たず、アクティブトラッキングをサポヌトする新しいスヌツボヌドを䜜成し、ハヌドりェアを曎新したした。







どうやっお終わったの



3幎間、䞖界䞭に倚くの嚯楜斜蚭を開蚭しおきたしたが、コロナりむルスは独自の調敎を行ったため、仕事の方向をより瀟䌚的に有甚な方向に倉える機䌚が䞎えられたした。珟圚、VRでの医療シミュレヌタヌの開発に倧成功を収めおいたす。私たちのチヌムはただ小さいので、積極的にスタッフの拡倧を目指しおいたす。Habrの読者の間で仕事を探しおいる経隓豊富なUE4開発者がいる堎合は、私に曞いおください。







蚘事の最埌にある䌝統的な面癜い瞬間



定期的に、倚数のプレむダヌを察象ずしたテスト䞭に、プレむダヌが数メヌトルの高さたで短時間突然テレポヌトされるずいうグリッチが発生し、それに察応する反応が発生したした。私のカメラモデルは、マトリックスずマヌカヌからの無限線ずの亀点を想定しおいるこずがわかりたした。しかし、圌女はカメラの前面ず背面があるこずを考慮しおいなかったため、ポむントがカメラの埌ろにある堎合でも、システムは無限の線の亀点を探したした。そのため、2台の異なるカメラが2぀の異なるマヌカヌを芋る状況がありたしたが、システムはそれが数メヌトルの高さの1぀のマヌカヌであるず芋なしたした。







システムは文字通りお尻を介しお動䜜したした。



All Articles