ロボット操作用ボタンの作成と、Unityからロボットへ速度指令を送信する手順を紹介します。
本ステップ実行後の状態のSceneファイルはMobileRobotUITutorialProject/Assets/Scenes/Step2.unityから入手できます。
- Windows
- Windows 10 Home バージョン 21H2
- Windows 11 Pro バージョン 22H2
- Unity
- Unity 2021.3.4f1
- Unity 2022.3.8f1
- Unity-Technologies/ROS-TCP-Connector v0.7.0
- ROS 2
- ROS 2 Foxy Fitzroy
- ROS 2 Humble Hawksbill
パッケージマネージャからROS-TCP-Connectorをインストールします。パッケージマネージャはメニューバーのWindow -> Package Managerから開けます。
左上の+ボタンからAdd package from git URLをクリックします。
ROS-TCP-ConnectorのGitリポジトリへのURLを最新のタグを指定して入力し、Addをクリックします。2023年9月現在の最新のタグはv0.7.0です。
この場合のGitリポジトリへのURLは https://github.com/Unity-Technologies/ROS-TCP-Connector.git?path=/com.unity.robotics.ros-tcp-connector#v0.7.0 となります。
※今後のバージョンアップによって使い方が変わる可能性があります。本チュートリアルでは「動作確認環境」に記載のバージョンでのみ動作確認をしています。
メニューバーにRoboticsというメニューが追加されます。メニューバーからRobotics -> ROS Settingsを開き、以下の設定となっていることを確認します。ProtocolはROS 2を選択します。ROS IP AddressはRaspberry Pi MouseのIPアドレスを指定します。
- Connect on Startup: True
- Protocol: ROS 2
- ROS IP Address: 192.168.1.89(例)
- ROS Port: 10000
- Show HUD: True
まず、Gameビューを調整するためにカメラのアングルを調整します。
Main Cameraビューを確認しながらMain CameraのPositionとRotationを調整します。
以下が参考値です。
- Position
- X : 1.0
- Y : 2.1
- Z : -0.5
- Rotation
- X : 70
- Y : -35
- Z : 0
Hierarchyウィンドウを右クリックしてUI->Panelを選択します。
InspectorウィンドウでPanelの位置とサイズを調整します。 PanelはGameウィンドウから確認することができます。
Rect Transformコンポーネント左上にある二重の四角をクリックすると
Panel位置を調整するためのAnchor Presetsが開くので右下寄せになるright-bottomを選択します。
Pos X, Pos Y, Pos Z, Width, Heightはそれぞれ-170, 170, 0, 320, 320にします。
次にHierarchyウィンドウでCanvas->Panelを右クリックしてUI->Buttonを選択し、ButtonForwardと名前をつけます。
画像のようなウィンドウが表示された場合、TextMesh Proを使用するために、Import TMP Essentialsをクリックします。
InspectorウィンドウでButtonの位置とサイズを調整します。
Pos X, Pos Y, Pos Z, Width, Heightはそれぞれ0, 100, 0, 100, 100にします。
次にHierarchyウィンドウからButtonForwardオブジェクトの子のTextオブジェクトを選択し、Buttonのラベルを「Forward」に修正します。
- テキストがボタンをはみ出してしまう場合は、テキストのフォントサイズを小さくするなどして対応できます。
同様にしてBackward, Left, Rightについても作成します。
| Button | Pos X | Pos Y | Pos Z | Width | Height | Text |
|---|---|---|---|---|---|---|
| ButtonForward | 0 | 100 | 0 | 100 | 100 | Foraward |
| ButtonBackward | 0 | -100 | 0 | 100 | 100 | Backward |
| ButtonLeft | -100 | 0 | 0 | 100 | 100 | Left |
| ButtonRight | 100 | 0 | 0 | 100 | 100 | Right |
次にHierarchyウィンドウを右クリックしてCreate Emptyを選択し、PublisherとしてGameObjectを作成します。
次に作成したボタンにイベントを登録します。
UnityScripts/ScriptsフォルダをUnityプロジェクトのAssetsフォルダにコピー(Assets/Scriptsとして配置)します。
コピーしたScriptsフォルダ内のCmdVelPublisher.csを先程作成したPublisherオブジェクトにコンポーネントとして追加します。
PublisherオブジェクトのInspectorウィンドウを確認するとCmd Vel Publisherスクリプトが追加されていることを確認できます。ここのLinear Velが進行方向の基準となる速度、Angular Velが旋回方向の基準となる角速度となっています。今回はそれぞれを0.5と1.5に設定します。速度の単位はm/s、角速度の単位はrad/sです。
ButtonForwardオブジェクトのInspectorウィンドウのAdd ComponentボタンからEvent Triggerコンポーネントを追加します。
Add New Event TypeからPointer Downイベントを追加します。
Pointer Downイベントのリストを2つに増やし、それぞれにPublisherオブジェクトを指定します。
追加したPointer Downイベントに上から順にCmdVelPublisher.SetForwardVelファンクションとCmdVelPublisher.Publishファンクションを指定します。
このときCmdVelPublisher.SetForwardVelファンクションの引数は1を指定します。
この引数がPublisherオブジェクトのInspectorウィンドウから確認できる基準速度、基準角速度にかける倍率です。
今回は進行方向の基準速度が0.5、倍率が1.0なので0.5m/sの移動指令を送信することになります。
同様にしてPointer UpイベントにCmdVelPublisher.SetStopVelとCmdVelPublisher.Publishファンクションを指定します。
このイベントを登録することでボタンを離したら移動指令を止める(押している間だけ移動指令を出す)ことができるようになります。
同様にして各ボタンに移動指令を送信のイベントを登録します。
繰り返しでイベントを登録する際にはコンポーネントを使いまわしすると楽です。
ButtonForwardオブジェクトのEvent TriggerコンポーネントのオプションからCopy Componentを選びます。
ButtonBackwardオブジェクトにEvent Triggerコンポーネントを追加し、オプションからPaste Component Valuesを選びます。
Pointer Downイベントの1つ目のファンクションをCmdVelPublisher.SetBackwardVelファンクションに変更します。
以上で2つ目のボタンへのイベント登録は完了です。
同様にしてButtonLeftオブジェクトとButtonRightオブジェクトにEvent Triggerコンポーネントを追加して設定をコピーし、
それぞれCmdVelPublisher.SetLeftTurnVelとCmdVelPublisher.SetRightTurnVelを指定します。
以上で4つのボタンへのイベントの登録が完了です。
Raspberry Pi Mouseの電源を入れます。
Tera Termなどを使用して、PCからRaspberry Pi MouseへSSHで接続します。
以下のコマンドでデバイスドライバのインストールを行います。
cd RaspberryPiMouse/utils
./build_install.bash
Raspberry Pi MouseのモータのスイッチをONにします。
一つ目の端末で以下のコマンドを順番に実行して、Raspberry Pi Mouseを動かすためのノードを起動します。
source ~/ros2_ws/install/setup.bash
ros2 launch raspimouse raspimouse.launch.py次に、もうひとつ別にSSHで接続して端末を開き、以下のコマンドを実行して、RPLiDARのノードを起動します。
# モータをONにする
source ~/ros2_ws/install/setup.bash
ros2 service call /motor_power std_srvs/SetBool '{data: true}'
# RPLiDARのノードを起動
ros2 launch rplidar_ros rplidar.launch.pyさらにもうひとつ別にSSHでログインして端末を開き、以下のコマンドを順番に実行して、ウェブカメラのノードを起動します。
source ~/ros2_ws/install/setup.bash
ros2 run v4l2_camera v4l2_camera_nodeそして最後に4つめの端末を開いて、以下のコマンドを順番に実行して、Unityと通信するためのノードを起動します。
ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=192.168.1.89のROS_IPは、
Raspberry Pi MouseのIPアドレスを指定してください。
source ~/ros2_ws/install/setup.bash
ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=192.168.1.89ros_tcp_endpointの起動コマンドに関する参考ページ
Unityで再生ボタンを押し、再生モードでプロジェクトを実行します。
このとき、以下のようなメッセージがUnityのコンソールに出る場合もありますが、無視して問題ありません。
Connection to 127.0.0.1:10000 failed - System.Net.Sockets.SocketException (0x80004005): 対象のコンピューターによって拒否されたため、接続できませんでした。
再生モード中の画面表示が小さい場合は、GameビューのLow Resolution Aspect Ratiosのチェックを外して下さい。
再生モードのUnityでボタンを操作すると移動指令が送信され、実機のロボットが移動することを確認できます。
このとき、Unity上のロボットは動きません。 Unity上のロボットも実機のロボットにあわせて動かせるようにする方法は次のSTEP3にて紹介します。
最後に、動作確認が終わったら全ての端末でCtrl+Cを押してコマンドを終了させます。
ロボット操作用ボタンを作成し、Unityから実機のロボットへ速度指令を送信できるようにする方法を紹介しました。 さらに実機のロボットを動かすまでを紹介しました。
次はSTEP3で実機のロボットの位置姿勢を可視化(Unity上に反映)する方法を紹介します。


























