HololensとROSを連携してロボットを動かしたいと思ったので,ROSを使ったHololensのアプリケーションを作ってみました!(以下の動画)
このアプリケーションの作り方についてまとめたいと思います(^^)/
ちなみにこの件でけちょんけちょんになっていた記事はこちら。。。
Contents
対象と環境
対象、というかこのアプリケーション作る前の私は次の通りでした_(:3 」∠)_
- ROSは使ったことある!topicわかる!
- ROS bridgeなんて知らん!
- UWPってなんじゃ!
- Hololensの実機を持ってる!(エミュレータは使ってないです)
- Hololensで遊んだことある!(ブラウザ見るとかHolotubeとか程度、Hololensの操作方法がわかる人)
- Unityなんて触ったことない!(今回はじめて触りました(*´Д`))
最新バージョンのUnityとかライブラリを動かしたいってわけでなく,とりあえず動くものができればよい人向け。Unity2017と2017年のHololensライブラリを使いました.いま2019年。。。
必要なものと開発環境は次の通りです(^^)/
- Windows10のPC(Unityとかvisual studio動かす)
- Ubuntu18.04のPC(rosbridge動かす,Hololensと連携するPC, Ubuntu古いのでもいいかもしれない)
- Hololens
- ネット環境(HololensとUbuntuPCの連携が無線)
Unityのインストール
使うのはwin10のPCです.Unity Hubをダウンロード&インストールしてUnity2017.4.3をインストール.インストール時にこのバージョンが表示されないと思うので,以下画像のダウンロードアーカイブのリンクから探す.
インストール時にアカウント認証とかあると思いますが,personalなら無料なので適当にやってください.
他のバージョンを幾つか試しましたが動きませんでした.Unity2017.4.3を使うことを強くおススメします.
プロジェクトの作成
- Unity HUBを起動して,プロジェクトを新規作成します.
- 新規作成ボタン横の▼を押すとインストールされているUnityのバージョンのリストが出てくるので,2017.4.3f1を選択.
一つしかインストールしてない人は何も出てこないかも. - プロジェクト名は適当な名前で,テンプレートは3Dにする.保存先も適当(私はUnityProjectsというフォルダを作ってそこに保存した)
- 作成をクリック
Unity 起動!Unityちゃんインポート!
プロジェクトを作成するとUnityが起動して,以下の画像のようなエディタが開きます.
Unityちゃんをインポートします.アセットストアを開いて「unity chan」を検索&インポートしてください(^^♪
インポートできてれば以下のように,ProjectのAssetの中にunitychan!があるはずです!
Hololens用のライブラリのダウンロード&インポート
次にHololens用のライブラリをダウンロードしてプロジェクトにインポートします.新しいバージョンが沢山あるけど,他のだと上手く動かなかった(*´Д`)
- HoloToolKit 2017.4.3.0 RefreshからHoloToolkit-Unity-2017.4.3.0-Refresh.unitypackageをダウンロード
- Assets->Import Package -> Custom Packageからダウンロードした HoloToolkit-Unity-2017.4.3.0-Refresh.unitypackage を選択してImport
Importできたら以下のようになっているはずです!
Unityちゃんをシーンに追加する
Assets -> unity-chan! -> Unity-chan! Model -> Prefabs -> for Locomotion
にあるunitychan.prefabをドラッグ&ドロップします(以下画像)
以下画像のようにunitychanが追加されてればOK(^^♪
Hololensで認識した現実の床を組み合わせる
Assets -> HoloToolKit -> SpatialMapping -> PrefabsにあるSpatialMapping.prefabをドラッグ&ドロップします
シーンに追加できたらこんなかんじ↓
仮想床を置く
デフォルトでUnityちゃんに重力がかかるようになっています.上☝で現実空間の床を認識して組み合わせることをしましたが,アプリを起動してから認識されるまでに少しラグがあります.このままだと,起動直後にUnityちゃんが地底にストーンって感じに。行方不明になります_(:3 」∠)__(:3 」∠)__(:3 」∠)_
仮想床を置いてあげると最初に落ちていくことがなくなります.
hierarchyで右クリック -> 3D Object -> Plane
planeが追加出来たらこんな感じ↓
デフォルトではscaleが1m×1mで小さいのでscaleを10m×10mにして大きくします.
位置(position)はx = 0, y = -1.5, z = 0にします.y = -1.5というのは,現実の床よりも下に仮想床を配置するためです.現実の床が認識されると仮想床の上に床ができます.
※y = -1.5は環境によっては変える必要があるかもしれません.この設定はアプリを椅子に座ったまま起動する場合の設定です.Hololensの原点はアプリを起動したときにHololensがいた場所になるみたいなので,立ったまま起動すると現実の床が -1.6とかになります.椅子に座って起動するとHololensの位置が床から1mくらいなので,今回の設定で良いと思います.
途中だけど,ビルドしてHololensで起動してみる
作成途中ですが,ビルドしてHololensに転送&起動してみます(^_-)-☆
まずシーンをctrl+sで保存してください.シーンの名前がUntitledから保存した名前になるはずです.
上部メニューからFile -> Build settingsを開きます.PlayerSettingsボタンを押すと,Unityエディタの右のほう(Inspector)にPlayerSettingsが開きます.
Other SettingsにあるConfigurationのScripting BackendがIL2CPPになってると思うので,.NETに変更します.
Publishing SettingsのCapabilitiesにあるSpatialPerceptionにチェックを入れます
XR SettingsのVertual Reality Supporedにチェックを入れる
さっき開いたBuild Settingの画面で以下のように設定します.
Platform : Universal Windows Platform
Target Device HoloLens
Unity C# Projectにチェック
Add Open Scenesでシーンを追加する
設定したらBuildボタンを押します.押した後に聞かれるbuild先の設定は適当でよいですがAppフォルダを作成してそこにするのをお勧め
Visual Studioに必要なコンポーネントがされてない場合はその旨のメッセージが表示されるので,コンポーネントを入れてください
わたしの場合はbuildしたらエラーが出ました_(:3 」∠)_
UnityちゃんのC#コードでエラー?みたいです.consoleのエラー項目をダブルクリックするとVisual Studioで開くので,該当のコードを3か所ほどコメントアウトしました.buildできました(いいのかこれで( ゚Д゚)
無事(?)buildが終わったらbuild先であるAppフォルダに行きます.slnファイルをvisual studioで開きます.
ソリューション構成をRelease,ソリューションプラットホームをx86,ビルド先をリモートコンピュータにします.最初にリモートコンピュータを選ぶとき,Hololensのipアドレスの設定が必要です.
Hololensのipアドレスは,HololensでSetteing -> Network&Internet -> Wi-Fi -> (下のほうの)Hardware propertiesから確認できます(*´ω`*)
設定したらHololensの電源を入れてVisual Studioの緑の▶ボタンを押すとビルド&Hololensへの転送が開始されます.Hololensの電源がついてないと「配置に失敗しました」というエラーが出ます.電源をつけてから▶ボタンを押してください.
以下のような画面が出たら成功です.「デバッグを中止」を押します.
HololensでAll Appsを見ると,自分の名付けたシーンのアプリがあるはずです.それが今回作成したアプリ!
下の動画のように,起動したらUnityちゃんが最初は仮想床の上に立ってるけど,しばらくしたらリアル床が認識されてその上に立つようになってます(^^)/
仮想床を見えないようにする
起動してみたらわかると思いますが,仮想床が見えててうーんって感じです(゜-゜)
見えなくしたいです.planeを選択して右側のInspector -> Mesh RendererのElement 0を変更します.横の丸いボタンを押すとSelect Materialウィンドウが開くので,SpatialMappingWireframeを選択します.
これで仮想床が見えなくなるはずです!
ROSとの連携
ROSと連携を試してみる最低限のunity環境が整いました.いよいよ。いよいよのいよいよ。ROSとの連携です(^^)/(^^)/(^^)/
まだ使うのはwin10のPCです(*’ω’*)
UnityちゃんのposeをUbuntuマシンでsubscribeしてみます
ROS #のインストール
ここからROS#をダウンロード&解凍してください!(リンク先は古いcommitバージョンです.古いのじゃないと動かない。。。)
これは本家ROS#のforkで,UWPに対応させたリポジトリみたいです.結局UWPがなんだかわからず使ってます( ゚Д゚)( ゚Д゚)( ゚Д゚)
先ほどダウンロード&解凍したフォルダ内のUnity3DフォルダをAssetsにドラッグ&ドロップします.エラーが出てても無視してください.以下の設定を行えば消えるはず!
次にネットワークの設定です
Edit -> Project Setting s -> Player -> Publishing Settingsで
- InternetClient
- InternetClientServer
- PrivateNetworkClientSever
にチェックを入れます
次に同じPlayer settings内のother settings でScripting Runtime Versionを.NET 4.6にします.するとUnityを再起動するとポップアップが出るので,再起動してください.
再起動したら出てたエラーが消えると思います.
Unityちゃんにpublisherを与える
Unityちゃんにpublisherを付与してあげて,Unityちゃんの位置をpublishしてもらいます.
Unityエディタの左側のhierarchy画面でunitychanを選択して,エディタ右側にあるInspector画面の一番下のAdd Componetボタンから「ROS Connector」を追加&設定します.
ProtocolをUWPに,Ros Bridge Serverを「ws://(ubuntuPCのIPアドレス):9090」にします.「192.168.0.1」のとこをubuntuPCのIPに変更する(*’ω’*)
次にAssets -> Unity3D -> RosSharp -> Scripts -> Ros CommunicationにあるPoseStampedPublisher.csをhierarchy画面のunitychanにドラッグ&ドロップします.unitychanのInspector画面にPose Stamped Publisher(Script)があれば成功です!
次にPublisherの設定です.Inspector画面で設定します.
Topic名を適当に指定して(ここでは/unitychan/poseとします),published Transformはunitychanにします.
これでunity側の設定終わりです!さっきと同じようにビルドしてHololensに転送してください!
Inertiar tensorがどうたらこうたらエラーが出たりでなかったりすることがありますが,出たなら該当のコードをコメントアウトすれば動きます( ゚Д゚)( ゚Д゚)( ゚Д゚)
Ubuntuの設定
rosbridge suiteをaptでインストールしてください
apt install ros-melodic-rosbridge-suite
rosbridge serbverを起動します.これで設定終わり(^^)/
roslaunch rosbridge_server rosbridge_websocket.launch
アプリの起動とコネクションの確認
Hololens上で作成したアプリを起動します.rosの設定をしただけなので,Hololens上での見た目は変わらないと思います.
起動したらubuntu PCでrosbridge serverを起動しているターミナルで「Client connected. 1 clients total.」という表示が出ると思います.出てればコネクション成功です(*´ω`*)
rostopic listで確認すると/unitychan/poseのトピックが確認できます!
サブスクライブの確認
そのままだとUnityちゃんが動かなくてちゃんとposeがサブスクライブされてるのか不明なので,unityちゃんを動かしましょう.実はこの時点でブラウザから動かすことができます!(^^)!
適当なブラウザ(Chromeがいいと思う)でHololensのIPアドレスを打ちます.するとWindows Device Portalというサイトが見えます(以下の画像).これはHololensがサーバーになってる(という言い方は正しいのか?)サイトです.ここからHololensにいろいろアクション出来るのです!
詳しくはMicrosoftのページを確認してください_(:3 」∠)_
このサイトの左側のメニューからSystem -> Virtual inputに行きます.
Vertual keyboradがあるので,それをクリックしてwキーを押してみましょう.
するとUnityちゃんが前に歩くはずです!
Unityちゃんにはデフォルトでwasdキーで動くスクリプトがついてるので,(offにしてなければ)このように動くわけです.
動かしながら同時に
rostopic echo /unitychan/pose
でサブスクライブしているposeを確認してみましょう.なんか動いているのが確認できるはずです!(^^)!
ちなみにDevice PortalのViews -> Mixed Reality Captureに行くと,Hololensで見ている景色をライブプレビューで見たり録画したりできるので,確認してみると良いと思います(*´ω`*)
ROSとの連携2
次にunityちゃんをROS経由でps3コントローラで動かしてみましょう.やることは,
- win10PCでunityちゃんにsubscriberを与える
- ubuntuPCでps3コントローラの入力からTwistメッセージをパブリッシュするプログラムを作る
Unityちゃんにサブスクライバを与える
Assets -> Unity3D -> Assets -> RosSharp -> Scripts -> RosCommunicationにあるTwistSubscriber.csをunityちゃんに追加します.
poseのpublisherと同様にtopicとtransformを設定します.
ビルドしてHololensに転送してください.
ps3コントローラの入力からTwistメッセージをパブリッシュするプログラム
もうこれは適当に作ってください(笑)
一応作ったプログラムをgithubに上げておきます.(ここ)
Ubuntu上でcatkin_makeしてusageの通り,launchしてください.PS3コントローラも接続しておいてください.
Hololensアプリを起動して,ps3コントローラで動かせるはずです!左スティックで動いて,×ボタンでジャンプ!
以上になります(*´ω`*)_(:3 」∠)_(^^)/
ボール動かしたり,MRオブジェクトにインタラクションしたりは普通にHololensアプリを作るところなので,こことか参考にしてみてください.
結局UWPってなんじゃ!って感じだけど知らなくても作れる!気になる人は自分で調べてクレメンス_(:3 」∠)_
No responses yet