研究より趣味が好き
この夏にこの記事を見てOculus Goを買い,研究を一時そっちのけでVR開発をやっていました
この人の記事はとても分かりやすく細かいところまでサポートしていて,この記事を書き上げた熱量には本当に頭が下がります
なので,この記事を参考にすれば基本的なことができますが,4か月過ぎた今少しバージョンアップされていてカメラのみでなくLRFの連携が含まれていたり,やり方が変わっているので補足的なことを書いてみたいと思います
インストールなどの開発環境は全て終わっているものとします
Unity 2017.4.1f1
使用するAssets
ROS# Version 1.3
Oculus Utilities for Unity 1.28.0
Oculus Utilities for Unity | Developer Center | Oculus
基本的な設定
PlatformをAndroidに変更
- File > Build Settingsを開き,Androidを選択してSwitch PlatformをクリックしてPlatformを変更
VRの設定
- Edit > Project Settings > Playerを選択
- XR SettingsのVirtual Reality Supportedにチェック
- Virtual Reality SDKsの欄にOculusを追加
Buildのための設定
- アプリのパッケージ名を設定
Edit > Project Settings > Player > Other > Package Nameを、com.[CompanyName].[ProductName]の形で適当な組織名とプロダクト名に変更 - APIレベルを設定
Edit > Project Settings > Player > Other Settings > Identification > Minimum API Level > API Level 25 - Scripting Runtime Versionを設定
Edit > Project Settings > Player > Other Settings > Configuration > Scripting Runtime Versionを.NET 4.x Equivalentに変更
OculusUtilities Unityをインポート
- 解凍して,OculusUtilities.unitypackageをAssetsにインポート
この時アップデートできるよと聞かれるので,更新する(更新しないとなんか動かなかった気がする)
ROS#をインポート
- 解凍してROS#をAssetsにインポート
Oculus用のカメラを設置
- HierarchyウィンドウからMain Cameraを削除。
- ProjectウィンドウからAssets/Oculus/VR/Prefabsを開き、OVRCameraRigをHierarchyウィンドウにドラッグ&ドロップ
RosConnectorの設定
- Hierarchyウィンドウで右クリック > Create EmptyでGameObjectを作成し、名前をRosConnectorに変更。
- RosConnectorのInspectorウインドウを開き、Assets/RosSharp/Scripts/RosCommunicationからRosConnectorをドラッグ&ドロップ
- RosBridgeServerUrlを設定。
ROS側のPCのIPアドレス(例:192.168.0.100)とポート番号(デフォルト:9090)をあわせて、"ws://192.168.0.100:9090"のように入力。
ここまでは@Spritaroさんの方法ですが,ここから少し違います
カメラ画像の受信
ImageSubscriberの作成
- Hierarchyウィンドウで右クリック > 3D Object > Planeで平面を作成する
- InspectorウィンドウでPositionを(0, 0, 10)に、Rotationを(90, 0, 180)に変更
- ProjectウィンドウのAssets/RosSharp/Scripts/RosCommunicationからImageSubscriberスクリプトを、RosConnectorのInspectorウィンドウにドラッグ&ドロップ
- ImageSubscriberのTopicを”/cv_camera/image_raw/compressed”に設定
- ImageSubscriberのMeshRendererに作成したPlaneをドラッグ&ドロップ
LRFデータの受信
Laser Scan Subscriberの作成
- ProjectウィンドウのAssets/RosSharp/Scripts/RosCommunicationからLaserScanSubscriberスクリプトを、RosConnectorのInspectorウィンドウにドラッグ&ドロップ
- LaserScanSubscriberのTopicを”/scan”に設定
LRFデータを表示するスクリプトはAssets/RosSharp/Scripts/RosCommunicationにMesh,Line,Spheresが用意されていますが,自分はMeshとSpheresができました
ここでは見栄えが良かったLaserScanVisualizerMeshを例に作成します
LaserScanVisualizerMeshの作成
- Hierarchyウィンドウで右クリック > Create EmptyでGameObjectを作成し、名前をLaserScanVisualizerMeshに変更
- InspectorウィンドウでPositionを(0, -3, 0)に、Rotationを(0, 0, 0)に変更
- ProjectウィンドウのAssets/RosSharp/Scripts/MessageHandlingからLaserScanWriterをLaserScanVisualizerMeshのInspectorウィンドウにドラッグ&ドロップ
- ProjectウィンドウのAssets/RosSharp/Scripts/SensorDataVisualizationからLaserScanVisualizerMesh.csをLaserScanVisualizerMeshのInspectorウィンドウにドラッグ&ドロップ
- RosConnectorに追加したLaserScanSubscriberのLaserScanWriterにLaserScanVisualizerMeshをドラッグ&ドロップ
これで実行すると,自分の足元にLRFのデータをMeshでつなぎ合わせた多角形が出てきます
ですが,これには少し問題がありLRFのデータ数が数百あると表示が全くできません
なので,LRFはURG-04LX-UG01の場合,urg_nodeの実行時に"cluster"を90ぐらいにして点群の数を8個にするとリアルタイムで再生できました
また,表示の向きをいくら変えてもカメラに対して常に水平のMeshが出来る上がるため,目の前に表示したいのですが出来ませんでした
後は@Spritaroさんの所を見れば,Oculus Goの向きを取得出来たり,カメラ画像を常に目の前に表示出来たりします
再度になりますが,この記事は@Spritaroの部分を引用した部分が多くあり申し訳なくありますが,LRFの表示に自分が何日も嵌った部分がありどうしても記事にしたくこの方法で書きました
ですので,これが誰かの参考になれば幸いです
追記2019/6/8
ROS#単体で使うときにはUnityにROS#をインポートするときに
Scripting Runtime Versionを設定
Edit > Project Settings > Player > Other Settings > Configuration > Scripting Runtime Versionを.NET 4.x Equivalentに変更
を必ず行う
行わないとnameスペースの結びつきが無くなってそもそも動かない
※なんでそうなるかは知らない