###### tags: `ROS` `Unity` # Ros#を用いたUnity-Autoware間通信 AutowareからRosBridgeと呼ばれるRosのノードをWebSocket通信を介してデータのやり取りを行う。 今回はその中でも特に購読(Subscribe)に注目をする。Autoware側の設定については別途記載する。 ## Ros#を利用する ### UnityにアセットROS#を導入する まず,UnityのメニューバーからWindow->Asset Storeと選択する。 ![](https://i.imgur.com/EHjqvcn.png) その後,Asset Storeウィンドウでsearch onlineを選択する。 ![](https://i.imgur.com/0Ds2QH6.png) ブラウザでAssetStoreが開くので,検索ボックスにRos#と入力して検索を行う。 ![](https://i.imgur.com/evt8oK3.jpg) ROS#を選択し,Add to My Assetを選択。その後,Open in Unityを選ぶ。 ![](https://i.imgur.com/qIk4ppP.jpg) ![](https://i.imgur.com/WYxRjao.png) ![](https://i.imgur.com/g4rdLEx.jpg) すると,Unity Editor上でPackage Managerが開く。そこでRos#を選択し,Downloadを選択する。その後,Importを選択する。 ![](https://i.imgur.com/kNhZyAs.png) ![](https://i.imgur.com/noAi9AY.jpg) <img src="https://i.imgur.com/u8rklb3.png" width="30%"> #### UnityでRosとの通信をおこなうための設定 UnityでRosConnectorという空のオブジェクトを作成。 RosConnector.csスクリプトをRosConnectorのコンポーネントに追加する。 RosConnectorオブジェクトを選択し,インスペクタのRosConnectorのRosBrideServerURLを ``` ws://<IPaddress>:9090 ``` に設定を変更する。 ※SecondsTimeoutはRosへのソケット通信のタイムアウト時間を設定する箇所で時間は秒単位,シーン開始時ではなく実行からの時間でタイムアウトが発生する。 #### Autowareの位置・姿勢情報について取得 RosConnectorオブジェクトにPoseStampedPublisher.csスクリプトを追加する。 RosConnectorオブジェクトを選択し,インスペクタのPoseStampedPublisherにあるTopicを`/current_pose`に変更する。 また,PublishedTransformは受け取ったTransformの値を代入するオブジェクトを設定する項目となっている。 #### 速度の取得 RosConnectorに適応するスクリプトをPoseStampedPublisherではなく,下記のmsgsSubscriber.csを作成し,Topic名は`/linear_velocity_viz`を参照にする。 ``` using UnityEngine; namespace RosSharp.RosBridgeClient { public class msgsSubscriber : UnitySubscriber<MessageTypes.Std.Float32> { public string PublishedMessage; private string msgs; private bool isMessageReceived; protected override void Start() { base.Start(); } private void Update() { if (isMessageReceived) ProcessMessage(); } protected override void ReceiveMessage(MessageTypes.Std.Float32 message) { msgs = GetMessage(message); isMessageReceived = true; } private void ProcessMessage() { PublishedMessage = msgs; } private string GetMessage(MessageTypes.Std.Float32 message) { return message.data.ToString(); } } } ``` Unityで受け取りたい型は以下のURLなどから参照する。 1. [std_msgsドキュメント](http://docs.ros.org/en/noetic/api/std_msgs/html/index-msg.html) 2. [geometry_msgsドキュメント](http://docs.ros.org/en/noetic/api/geometry_msgs/html/index-msg.html) 3. AutowareからPublishされるTopicの場合は、Topicsタブから確認可能 Autowareのtopicの中身はGitHubで確認することが可能 例.[can_info](https://github.com/streetdrone-home/Autoware/blob/master/ros/src/msgs/autoware_can_msgs/msg/CANInfo.msg) ``` using UnityEngine; namespace RosSharp.RosBridgeClient { public class msgsSubscriber : UnitySubscriber<MessageTypes.ライブラリ名.変数の型名> { public string PublishedMessage; private string msgs; private bool isMessageReceived; protected override void Start() { base.Start(); } private void Update() { if (isMessageReceived) ProcessMessage(); } protected override void ReceiveMessage(MessageTypes.ライブラリ名.変数の型名 message) { msgs = GetMessage(message); isMessageReceived = true; } private void ProcessMessage() { PublishedMessage = msgs; } private string GetMessage(MessageTypes.ライブラリ名.変数の型名 message) { return message.data.ToString(); } } } ```