From 2857b7bf443eda1739cf89b441f2e5db84ea201c Mon Sep 17 00:00:00 2001 From: <> Date: Thu, 16 Nov 2023 04:08:08 +0000 Subject: [PATCH] Deployed 602b82b with MkDocs version: 1.5.3 --- .nojekyll | 0 404.html | 714 ++ .../ROS2/AddACustomROS2Message/index.html | 1227 +++ .../ROS2/ROS2ForUnity/clock_publisher.png | Bin 0 -> 24027 bytes Components/ROS2/ROS2ForUnity/index.html | 1333 ++++ Components/ROS2/ROS2TopicList/index.html | 1082 +++ .../Sensors/CameraSensor/InspectorSetup.png | Bin 0 -> 38792 bytes .../CameraSensor/SceneObjectHierarchy.png | Bin 0 -> 13217 bytes .../Sensors/CameraSensor/components.png | Bin 0 -> 33878 bytes Components/Sensors/CameraSensor/compute.png | Bin 0 -> 14671 bytes Components/Sensors/CameraSensor/gui.png | Bin 0 -> 222339 bytes Components/Sensors/CameraSensor/index.html | 1179 +++ Components/Sensors/CameraSensor/link.png | Bin 0 -> 15701 bytes .../Sensors/CameraSensor/main_component.png | Bin 0 -> 96913 bytes Components/Sensors/CameraSensor/script.png | Bin 0 -> 38926 bytes .../Sensors/CameraSensor/script_ros2.png | Bin 0 -> 35544 bytes Components/Sensors/IMUSensor/components.png | Bin 0 -> 24833 bytes Components/Sensors/IMUSensor/index.html | 1101 +++ Components/Sensors/IMUSensor/link.png | Bin 0 -> 16037 bytes Components/Sensors/IMUSensor/script.png | Bin 0 -> 8100 bytes Components/Sensors/IMUSensor/script_ros2.png | Bin 0 -> 16795 bytes DeveloperGuide/Documentation/image_0.png | Bin 0 -> 112999 bytes DeveloperGuide/Documentation/index.html | 893 +++ DeveloperGuide/License/index.html | 1457 ++++ GettingStarted/QuickStartDemo/Image_1.png | Bin 0 -> 32839 bytes GettingStarted/QuickStartDemo/index.html | 1006 +++ GettingStarted/SetupUnityProject/index.html | 997 +++ GettingStarted/SetupUnityProject/pic-0.png | Bin 0 -> 37879 bytes GettingStarted/SetupUnityProject/pic-1.png | Bin 0 -> 65118 bytes GettingStarted/SetupUnityProject/pic-2.png | Bin 0 -> 75218 bytes GettingStarted/SetupUnityProject/pic-3.png | Bin 0 -> 40811 bytes GettingStarted/SetupUnityProject/pic-4.png | Bin 0 -> 291720 bytes GettingStarted/SetupUnityProject/pic-5.png | Bin 0 -> 379504 bytes assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.81fa17fe.min.js | 29 + assets/javascripts/bundle.81fa17fe.min.js.map | 7 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.el.min.js | 1 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.he.min.js | 1 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.f886a092.min.js | 42 + .../workers/search.f886a092.min.js.map | 7 + assets/stylesheets/main.4b4a2bd9.min.css | 1 + assets/stylesheets/main.4b4a2bd9.min.css.map | 1 + assets/stylesheets/palette.356b1318.min.css | 1 + .../stylesheets/palette.356b1318.min.css.map | 1 + index.html | 828 ++ search/search_index.json | 1 + sitemap.xml | 3 + sitemap.xml.gz | Bin 0 -> 127 bytes 80 files changed, 19111 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 Components/ROS2/AddACustomROS2Message/index.html create mode 100644 Components/ROS2/ROS2ForUnity/clock_publisher.png create mode 100644 Components/ROS2/ROS2ForUnity/index.html create mode 100644 Components/ROS2/ROS2TopicList/index.html create mode 100644 Components/Sensors/CameraSensor/InspectorSetup.png create mode 100644 Components/Sensors/CameraSensor/SceneObjectHierarchy.png create mode 100644 Components/Sensors/CameraSensor/components.png create mode 100644 Components/Sensors/CameraSensor/compute.png create mode 100644 Components/Sensors/CameraSensor/gui.png create mode 100644 Components/Sensors/CameraSensor/index.html create mode 100644 Components/Sensors/CameraSensor/link.png create mode 100644 Components/Sensors/CameraSensor/main_component.png create mode 100644 Components/Sensors/CameraSensor/script.png create mode 100644 Components/Sensors/CameraSensor/script_ros2.png create mode 100644 Components/Sensors/IMUSensor/components.png create mode 100644 Components/Sensors/IMUSensor/index.html create mode 100644 Components/Sensors/IMUSensor/link.png create mode 100644 Components/Sensors/IMUSensor/script.png create mode 100644 Components/Sensors/IMUSensor/script_ros2.png create mode 100644 DeveloperGuide/Documentation/image_0.png create mode 100644 DeveloperGuide/Documentation/index.html create mode 100644 DeveloperGuide/License/index.html create mode 100644 GettingStarted/QuickStartDemo/Image_1.png create mode 100644 GettingStarted/QuickStartDemo/index.html create mode 100644 GettingStarted/SetupUnityProject/index.html create mode 100644 GettingStarted/SetupUnityProject/pic-0.png create mode 100644 GettingStarted/SetupUnityProject/pic-1.png create mode 100644 GettingStarted/SetupUnityProject/pic-2.png create mode 100644 GettingStarted/SetupUnityProject/pic-3.png create mode 100644 GettingStarted/SetupUnityProject/pic-4.png create mode 100644 GettingStarted/SetupUnityProject/pic-5.png create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.81fa17fe.min.js create mode 100644 assets/javascripts/bundle.81fa17fe.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.el.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.he.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.f886a092.min.js create mode 100644 assets/javascripts/workers/search.f886a092.min.js.map create mode 100644 assets/stylesheets/main.4b4a2bd9.min.css create mode 100644 assets/stylesheets/main.4b4a2bd9.min.css.map create mode 100644 assets/stylesheets/palette.356b1318.min.css create mode 100644 assets/stylesheets/palette.356b1318.min.css.map create mode 100644 index.html create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/404.html b/404.html new file mode 100644 index 0000000000..0161b73169 --- /dev/null +++ b/404.html @@ -0,0 +1,714 @@ + + + +
+ + + + + + + + + + + + + + +If you want to use custom message in AWSIM, you need to generate the appropriate files, to do this you have to build ROS2ForUnity
yourself - please follow the steps below. Remember to start with prerequisities though.
ROS2ForUnity role
+For a better understanding of the role of ROS2ForUnity
and the messages used, we encourage you to read this section.
custom_msgs
+In order to simplify this tutorial, the name of the package containing the custom message is assumed to be custom_msgs
- remember to replace it with the name of your package.
ROS2ForUnity
depends on a ros2cs - a C# .NET library for ROS2.
+This library is already included so you don't need to install it, but there are a few prerequisites that must be resolved first.
Please select your system and resolve all prerequisites:
+ros2cs
prerequisites for Ubuntuhumble
and is located in /opt/ros/humble
~/custom_msgs
or is hosted on git repository.bash
shell ros2cs
prerequisites for Windows
Question
+Tests are not working ('charmap'
codec can't decode byte) on Windows - look at troubleshooting here
ROS2 version is humble
and is located in C:\ros2_humble
C:\custom_msgs
or is hosted on git repository.powershell
shellClone ROS2ForUnity
repository by execute command:
git clone https://github.com/RobotecAI/ros2-for-unity ~/
+
Warning
+The cloned ROS 2 For Unity
repository must be located in the home directory ~/
.
git clone https://github.com/RobotecAI/ros2-for-unity /C
+
Warning
+The cloned ROS 2 For Unity
repository must be located in the home directory C:\
.
Pull dependent repositories by execute commands:
+cd ~/ros2-for-unity
+. /opt/ros/humble/setup.bash
+./pull_repositories.sh
+
cd C:\ros2-for-unity
+C:\ros2_humble\local_setup.ps1
+.\pull_repositories.ps1
+
custom_msgs
packageThe method to add a custom package to build depends on where it is located. The package can be on your local machine or just be hosted on a git repository.
+Please, choose the appropriate option and follow the instructions.
Copy the custom_msgs
package with custom message to the folder to src/ros2cs/custom_messages
directory
cp -r ~/custom_msgs ~/ros2-for-unity/src/ros2cs/custom_messages/
+
Copy-Item 'C:\custom_msgs' -Destination 'C:\ros2-for-unity\src\custom_messages'
+
ros2-for-unity/ros2_for_unity_custom_messages.repos
file in editor.Modify the contents of the file shown below, uncomment and set:
+<package_name>
- to your package name - so in this case custom_msgs
,<repo_url>
- to repository address, <repo_branch>
- to desired branch.
+repositories:
+# src/ros2cs/custom_messages/<package_name>:
+# type: git
+# url: <repo_url>
+# version: <repo_branch>
+
Example
+Below is an example of a file configured to pull 2 packages (custom_msgs
,autoware_auto_msgs
) of messages hosted on a git repository.
+
# NOTE: Use this file if you want to build with custom messages that reside in a separate remote repo.
+# NOTE: use the following format
+
+repositories:
+ src/ros2cs/custom_messages/custom_msgs:
+ type: git
+ url: https://github.com/tier4/custom_msgs.git
+ version: main
+ src/ros2cs/custom_messages/autoware_auto_msgs:
+ type: git
+ url: https://github.com/tier4/autoware_auto_msgs.git
+ version: tier4/main
+
Now pull the repositories again (also the custom_msgs
package repository)
cd ~/ros2-for-unity
+./pull_repositories.sh
+
cd C:\ros2-for-unity
+.\pull_repositories.ps1
+
Build ROS2ForUnity
with custom message packages using the following commands:
cd ~/ros2-for-unity
+./build.sh --standalone
+
cd C:\ros2-for-unity
+.\build.ps1 -standalone
+
custom_msgs
to AWSIMNew ROS2ForUnity
build, which you just made in step 3, contains multiple libraries that already exist in the AWSIM.
+To install custom_msgs
and not copy all other unnecessary files, you should get the custom_msgs
related libraries only.
You can find them in following directories and simply copy to the analogous directories in AWSIM/Assets/Ros2ForUnity
folder, or use the script described here.
ros2-for-unity/install/asset/Ros2ForUnity/Plugins
which names matches custom_msgs_*
ros2-for-unity/install/asset/Ros2ForUnity/Plugins/Linux/x86_64/
which names matches libcustom_msgs_*
ros2-for-unity/install/asset/Ros2ForUnity/Plugins
which names matches custom_msgs_*
ros2-for-unity/install/asset/Ros2ForUnity/Plugins/Windows/x86_64/
which names matches custom_msgs_*
To automate the process, you can use a script that copies all files related to your custom_msgs
package.
copy_custom_msgs.sh
in directory ~/ros2-for-unity/
and paste the following content into it.
+#!/bin/bash
+echo "CUSTOM_MSGS_PACKAGE_NAME: $1"
+echo "AWSIM_DIR_PATH: $2"
+find ./install/asset/Ros2ForUnity/Plugins -maxdepth 1 -name "$1*" -type f -exec cp {} $2/Assets/Ros2ForUnity/Plugins \;
+find ./install/asset/Ros2ForUnity/Plugins/Linux/x86_64 -maxdepth 1 -name "lib$1*" -type f -exec cp {} $2/Assets/Ros2ForUnity/Plugins/Linux/x86_64 \;
+
chmod a+x copy_msgs.sh
+
Run the script with two arguments: +
./copy_custom_msgs.sh <CUSTOM_MSGS_PACKAGE_NAME> <AWSIM_DIR_PATH>
+
<CUSTOM_MSGS_PACKAGE_NAME>
- the first one which is the name of the package with messages - in this case custom_msgs
,
<AWSIM_DIR_PATH>
- the second which is the path to the cloned AWSIM repository.Example
+./copy_custom_msgs.sh custom_msgs ~/unity/AWSIM/
+
To automate the process, you can use these commands with changed:
+<CUSTOM_MSGS_PACKAGE_NAME>
- the name of your package with messages - in this case custom_msgs
,<AWSIM_DIR_PATH>
- to path to the cloned AWSIM repository
+Get-ChildItem C:\ros2-for-unity\install\asset\Ros2ForUnity\Plugins\* -Include @('<CUSTOM_MSGS_PACKAGE_NAME>*') | Copy-Item -Destination <AWSIM_DIR_PATH>\Assets\Ros2ForUnity\Plugins
+Get-ChildItem C:\ros2-for-unity\install\asset\Ros2ForUnity\Plugins\Windows\x86_64\* -Include @('<CUSTOM_MSGS_PACKAGE_NAME>*') | Copy-Item -Destination <AWSIM_DIR_PATH>\Assets\Ros2ForUnity\Plugins\Windows\x86_64
+
Example
+Get-ChildItem C:\ros2-for-unity\install\asset\Ros2ForUnity\Plugins\* -Include @('custom_msgs*') | Copy-Item -Destination C:\unity\AWSIM\Assets\Ros2ForUnity\Plugins
+Get-ChildItem C:\ros2-for-unity\install\asset\Ros2ForUnity\Plugins\Windows\x86_64\* -Include @('custom_msgs*') | Copy-Item -Destination C:\unity\AWSIM\Assets\Ros2ForUnity\Plugins\Windows\x86_64
+
Make sure that the package files custom_msgs
have been properly copied to the AWSIM/Assets/Ros2ForUnity
.
+Then try to create a message object as described in this section and check in the console of Unity Editor if it compiles without errors.
g!Uwt~q6yAoXyHg~Hqq$*@gb;+NY2{1rg zu8AaFMNUnbGfbuD%a<=iRE3Z##D`jAvSYE1;xU0S9MiFR^weqveig0iL}bgFZFZlt zcAE}&39^MHx%=i`m)-s4u0;Z1il&M@01+v(wVjDy%co9^jcubJx832}Xq^3U2nwh5 z^^pmmR*CZ9rFa(RR*QS)Uv|tjk7HHS8*@M{uQsw6;6An`frildTO_bCP31)Xk z>&6X4!){sb2Qj4Ni==|7YA+nqnRPM?$*puj;h2VjgQ_5u=B)n{G9zMZWbmM!S;8>S zwEv!zw@Qk=n;s-n>xY_L2SAI#5q~utAYKwW5Y$kF(r-*3AvogR><){69FVuKl#e59 zyYM6ABoQ2=dJvDae5!)g(3x+oM=2swh$$(P21euz%q%Q^Bh+By_E^~qOS}sOp5^rE zJ M!)#@$RDbJDc?}A_vj)kYaS@mO(K_ zUx5=WgWPakU%mLDbGFA|@iC1RTXqX05$4{b$8Y?#yx;o0Rj+u&VhwB~Rn>iZ?tiyi zd&arwtrA$$qb(&VsVaH>cUP|>@g4kE5`H; Ha#C*Tg+{rOq}R|Z|GV2#C5PcKc)4yrnIyp969 zFG1OSg}vqOg8Ida+c7}5*u6CvMeH*5Gtu70;*9n0dNJ AIREC zOc-^%*Y~ymNF=I2p^6uN-u7j3hx6lRLHYJy8x-QfUQ|42klj7x#H`L|1aW~v#jV;k zWk98hU1qT)YZ!$awG+E1_3gH%Uuqq}4f8Bx=AO08%-BLsC$JC |Oytd6caU zNI RW8=S|FOYlU kraY$HK<@Szbmi2d!r!ne2}6oH2L5^c7`ZqPPeYn^cP}xD z2VoQWMq)w=7ApN&%V_x(kbd}TtM3eSb(ydfM`$?|?K>K9VwXX(WVEzi+-P~3%*VNp zlGt&-ssbX#J%l|ybxtQ`0Hc@uJK<>`;soOQ3Nb3|^NeO9n#ReQsJ45U@~FE 1^76>F7SL!?1Kv;=n7ag3k8H!V0s$I37T#kC2a6igleh!)oum*9J(8jErPNDCGP1 z@4D?_b%Vq_C7{nNr?eMYRvC2e-?qD7{HxMpqwW4_GCAS7mq!mq*I@Gb^^}_PdZjl2 z2EVny63^dQ8S_pbdW=kWz0oqD6p_n?qm7CQF$;Y6Q@`~zBo0s*sGLSfWOv!tar2D5 zPEIBU89>O+uY3!Jl{}Ll6x*4Oq1c?9FeHm0bAwFw74@#CKNCE9)aS&t*RoID^(+LV z ho1y%#~2|3OKyI#I%fdm5O7hrKtS{c9a%;sL)Urwn_)@5LUwu}3yc&K znZ PpP)|(-_QC_g7RGFtZbbbJkHOX!xLd@80#M>^ zW{ FEv0Gv}};pTZ;p&Z8EczFTL|31uB2S|VMrw&sq6C$usr%}s)SmMzy? zIU{#ZMEo`vy*AIrZoIUw1&*E+jNGiNp>EK;^D5U0lK0RkQbm2M+(F?8$~IXY2Nk zhMeQjDxr?$E!x@Hp_Ts?j;l*gt)kUaG=*^mok+Hu4>s%D@8fMSHC
SHQQLT3 m{Wx-LHq-`D!J8iVHregDE1r}y24R`ByL|yAK2IxwJxAR$p6G3Rr@OuSL=zN zIXf`}JWFq7(ij`oK;2V#R7(^;-X5GbH9TxhzmsrzJQllaAi7jwv?7UzA{nCE<;{Z! z57HhuAlPSXY;4R2BZ6dvy!0#(dp|m-VgJW_n3a^*E61n^XueLYs+NYvkD*q{|By-6 ziN&ejQy%^9U^^pW&}De(=wR=VpbKzmyeG-gQh;>{25M;*4JrE>0tr|NQu~~@U@@7V z>#o>JtK5~hGfJuv< 9P7wv=NAh>WM4`e%93I5 zMHC$(pfm-A^<|*wz6ELMlWN4^b`QphArcSSZjV8R=JMqoF#Qs~$>IwzD%%r9t>#s? zGMnJ-LK%jVTYOw6rgSm`st%vcuM0#19OF@m0ihL3UrRcae2H@nZ+JwBP8(3HQG7KJ zb{0gvrSa@W_gIJJM--w!$|nzZITm#%bxN{_&bwwH zvji~`lEa6H=K|;^x5TtRoIocesxV}Kz-thzkuwwUH!I{%m3$(WBVDH`k-EV`5R };o4Trq}Ih*>2C1qI(W&g52eqEKLkegR87>uGFgF#h|is@bXL zCa*QzLAkVGu^5bPqXomDAhqvaKXBkcHI|uR_QWg>#0$KGFSN>F7kKMrMcv}@;SoED zPe=?iA)#9sNGjah=+3fwIlnmaf05597fq)eSgbGxF=A|tEi9p)9S2Pcn;juEUW4jD z-PL!y$Vf3@tI|Xa9OnrD4BmwB3m$>yI3lPdr3X}A7bXu?6+eZ!9NEHM_3A)?m}|el zpl^u{dDfDVFu~f#pffPJ4j+MNf!V6V&un)b!~rfsKx_>zSB-Htk?}(u25FFyGf1(4 zsYw@J&&AxNLX==8WJK&bG+U&ki+-P`Ga4( E0dZxpIO)c8%vZMFA4P`` R{%6G8I7HYcOlvU3?a~(u{@BQ!77}#3DSP0Ekn+ zIk3{c9&V)f<>=9)j18qP>MCX%&!1Yi%I-jW`;D)i3gn^$%=TiZR-5N!K`A4OC^XY^ z2&idbs1|xBSs~d?aYz$bGY~_pCuWoXA{Qsy`Lo3BEO;`)z^DiSex#UJRS^f3WBUKn z(iDr4kr7cu$Vwck#WvSw*YI41CzCo;W@xI=7F*idFs)=#^Y}2ry6+pa2%3y%IM9ZE z@l#ATKqLU#dC_?G281dGh fFD18pYis*sbBh;f z4jv;sH(^ce5U7d+;f@eScziiln|mESzLmuG2zKtibU1!YaX-cl?CfT@N1htCwJGrU z^D*b;n>Q3WS`#xpMhBgp<^LI(Di*%HecLt+N4g$1O#EgFmf+El-+l<$O+=Mv6crW! zU@&*6+o^Z{T*f3U2@q&Z#Kb9nY6x{&JblzxlShAge!nvjhxsD9ohiaWU0%=qVeabA z;|0Y~Zv>S%`zHsyY|P7v3rYZ!{;;^Book zW>X2miyZ~WIiY2wD_kd2hug>c%(syZJ-0>X?{glTTh^Ap)F{bHZS~$Sb@SDXT?`*L z`G*Y&j_BJd4!Mth#HLkEeh*7?9Mc-Jbeb*daU2qCoM _Ty;JJLQ(A}rddAKLzFtUcL#Rq@RtKp zpNntuMK*PJ2YGvMiR$ycuSH?Q527bYe#B5$U-JMS&*A81OZ*zCa+4%Qq!nX#yXl*I zG}JlZtf;*(=|~uY$Rc=jvO45VUy0tzq(hPCg6_&IAm9gO1w~<#-f2rIJlD#)x}D{p zjg_4yyCiLFGFuZ$X=9v_(}OMcth;Kp`nBfc{d9B`7#@JNgH-n3^3RWoz^FcS&>CVR z6Qc(8QD+ag>5ngm$+4Agu20R%Hv~8E>xxu;`a}#AIyQzPn|w-o>Pl3gWjiti+NJLF zNH_7MnqW>O*P_D*F>Gji8Zj+InZ9u6PFjoE ^AZWWzo0EW{d $66c$D?H #Qz z(LB8H1GDy+{)kDZb}1%C)GOdD0SD^!0Z{^&5`;4lgR_W$d>Ro&@JJG)DI3d;UQ);Q z>Z33}kv%5JY@KlN(xsWR_9?25hGN}zqd*`H=&(`@E5MN>EJ)#y$2%+zi;xf<`n`W} zFm>tjpF{Ar`td#&fUqZf%Nol}Ahlye`c!pV<&RnUV|!DRMr4NQGh*P-EbsR|Yt<77 z)Gf}NHO@C?5vB37wX^dO6f%qtlE8}6R#9SRW`< ?b|<7;yaZ`3AsP=yA-zmjk82Mw)*2?rpIy761J=Bs}~+awMKZ4X6be*CiTC z1+o*oLPA3NObBd3tnWMJwY-y=Do)g8FBXM1wk#>>UhiaaQPCmd=^@M1hfQh)TU~QM ze1ITt&=@Or{KN@wpnY^|AjJD{YrXa9&{>a)h;$lx@iW#0brONU;juAN-WkbuRF&%L zYMZhCHwu^XQV}zUOJoP({z_3Sb~&Dif}yUg4sX}Fb2YYtcgD}~?(fBbKZXthV`G_6 z=!r^r_x8`YuiQ)rov--ev-$ha_EMq|fa@QLsDsSzTU#slP9t+G5?{FGG?e#_^YD;i zRb^!*@XQ4G*$}j$_WDWv({6F6h?mXHJpj!`O{B>3$NMcHca{;l;LOZHw*?p=0r^vl zGRD{yue|39zz8C;T@W)5L#n4^V3305bK&UImcgTT5mGNn>aqko@8#v?B_OSW<%7*i z`v-|oDQKQhwgb`EZr!{|(%s!1+H T!*CPnKak7_V$5@vNg8NS)9jA2*OD2 z9^k5bg*e}4^%y0hv|1Aat%7?f@2SyFz1C_(_@WPLwG8ACBA1w4E2^20;hiEUD_f2` z8vo7oz00hz`1Et^pAK4DT3_b1K61wv9^GOPM9SpH{6kx*9}m1YZ{^g^x8A~7(~sni z6r3|K<@eB_NLYK1t*op-jKQQDB?*FZ ` zeet5!tNdh`91+x7f>+1R74^l?M`C(&*5PnW%T*7OKE%B5VImpNklC|;|2>qi0bn#A z-He*Hv>VB)JbZaeD=V*3Q|m0X)YT8Vdw9U`=lDuWf<|1q^HlL&0ODUDS^2hulz3th zdzax=o(O3cnsOX4L b!sMRWg-)v*9`ASFlR^rz z$R+uwB5kXIMHCVjjHINb*e8VCUGF$|EoBHG_dY^q80f3DT>0U+RLQ(izW6FI;?FR{ zbIOMod|(Q?L(ZpTWb{LQ01KX;?w2NMx$VX0hIOFXyVoa4K0>QR7bwWSX^XRIANGO1 zLxl~a$>RO~iHTiLW&Ot5Gcb^a %=cIo zL<*4xx6f^H(%VQA(VM-X4&|T!2omuS6gVRIj>iP}&th2XoJRP)3r8h^)j;{T-27 *F>6#{lN!yDjn{hx6aX#zSAAxBGlEz2M}OcWsJDl|Jt2 z(cKuj7;r!zo~YxjVonVE+nOJOnjcK}U{aU3`RF7YJN>IvM?2cv{b7O@ &nU`DXO(fUe0h45;JxM zQ;8B!>q d2q%jnX9aemCK(}@^g^ZJa~Com zlm*(4Ibxl+Vj2Ga{fq3A49*b|M}@;Do!Y83m`M{*<<5kyL;Mto5EhYGK_)R*Kd>FA zkB3$eM3{KI9?Tt8f~ATj00JD{O88l6TW|YT+?;(W99vo{p1S%V;o*Z8v*f>{`WXt) zUg7-GV9XZb<6o#!f_6geHyVj(DO*{ zB6@|gcjVM5>RXx4S`$jf5nl|Ypt0pz_3kEtfDkqJwvMUbv5cM`Go=4btK!Hybd#m- zDNldQ?jbJDfVp=;7t~Qa9HI3#_K (!k$ammr z4t-u*LdB8?#Rfb`qpx7`jQAp_Q4;h)cCc(v(9aT?KPdgwXDz$#!fgIR8aPLS@;2tq zgiRZ_K5n9chbefC=jZ2}>6~qdb`q`$kxO#Mv$L97TKI35xU}3!PWf;dsbzQ|6FnL1 zbu$+SK`UfnIzzI5?Qun&l7ix{)XQ?j%AVj!7Epqs#XT7C1SwQDe%qLkNF!c4YveYO z>2&OB6p#_ks;Sh(O~2jtu7WT(F^qv-4c(f${IfL>GARjY&{1ygT{z817WrXxez9~> zj4(VMgHykmV#w6{pq~3T ~4x~Q-AS6i3c+fPk2E8u)U0RK&vOYuRo0xccmd; z1rQy=@5m!qKldLHA|4VETx%}CKpab?BmHzU{Bg+D)gxL@YhTUH9LiZj#@uMXDC0R> zKjs$Zj9AVvO0c^~HF}Q9{S&_}q5{M5K|NL%UgqcjV59v+PEL++ g `Vwvs@XsX!4Ys;#q|8}Z;RA?IlpjqobC);{-k9z^mTmAVhv@!|3D3kVa! zyahG7AAEj;u$D3Bc+t!2Jo-5DWp_`ir)wOx`T(;LNaEMovgKXyuUd=_*GJkt7V|<< z0W!&bU~AbVm4CqH Tw&PYt(DQu>{@2$#-Hz@1= z;!IUp-rjx?L#Sn%6x+6 r8}%F5v3rq z5qK&~i&@wmz9Gid*o_U()N@DExeoqi9N5m}N5dD><;r^ZPU~5 zD|>eA#8!Zka} KM3Srbn~<+~pa2+b`l;7L2Q z(EV+lY@B1Yc=$Yk8H$QJUpocRNd0;H^5qe5(vEehGpE2pBFE6vZ}QTa>JS{IoR_M& zxR@nO?oRWcD&?I=>|#_o|BsXh*@9h&doH|Y@%y@St2c>l0i#?}GkefhYN@U(sjUD4 zAb+U}WIK)+rZX@x-M^IJt(H1?aP~ud5#tfd*DWLEHjLX3`#o_XdNneYleP!#lUYC2 zBWF%`-^S@Q#gR`*boVn?6Pbv0k)nt^!*sUh|Ec53!>LZ&@XwM%7{nZsPE?mPbL F57%+d`Tc(0_kEuGxu5%fFvM!Rv$Hd0ai^SvA|>O~uNAATZtnt0M2{9}^FIYa zL71b7W4xOTgyRw@X)0?~1r(w?ycqqXU`8V`+(*I4Xa{IL0G|dT;P;c;KjrZ&ymDj? zVnkZs&c=oYL %4#;wYtiZV|kPo-EwH*X)3-b8&-!~CwfZ;dje-eWb1mC&$?#bfg zgz=}6CVeVES+35+8JR&%2@(xr0vf6eXgKE=7SJ3daFmjl+MEWtE|?%vGy+iEv zRQ^4^y;0z%aX$ED#&z4;+fCsJK!rvtx9`Y_BLy_)O`55)N1La{8p}1tga>DZG?Q%B zpH%;{iL|H#0*p)hVe3q{@x{at9Xn3%IQHst4oyHneoMUf&-9JGAsKlHR3_xz6op-Y zjo$#O%R7TR_hW*s5`TLIk}GAQ{Ze+jBe`Z%nEtt+&6#u$RI=<#mzrU~7p2fPGl!T7 zDh}ANa0-YVcj+qx0}PbeT;D2}jBqE5f|`dC5fy#P90Umvo%(b%&45AlLR3BMTk!B< z!DB4)dDJxYFK1-LKt%y$xxBoLnP2=!elv@U76@n{1ZJjde>d5g27Ny-P!cZ%?h_Of zY -M eII zd@vaYw^GcyS(B%~u@mYYU0!l4EPCv
1~*AaOUJ I)zHN` zz3;kkT4p~l gcxUkPxQ{yrG zMt=n_WORtsgJGA+4p&8qSz5_V#KTg?sFL74Z*lq~G$7oktHw1l@J)(6Q$V@c0({j0 zG$M%uDsCK6@w>N`n6>m@;q62Qw!Jo}fnlO0RdKo(4fUOa)o<67!tQhq*b+tSubBy0 zKFI1ZI#CSx3-HcC`PB8xmoK7@ovV{RTquPOnz$hU-E#|{07n!jcUCX~eErwg!l+$| zs?A(3B=Pw_{UiWWP^dFBC5Yni&g9;`D^pijm(EG7uHFv^f3fq# Tbn(I207LA2Db4Rl1EkEF9o)vegE+dwV6v zwRw*CjGd8-J6dGN+QcApct9-kr9hJaiyJZ(lpfMMF086UMv-%2UR@`-5&h^G3_k #suB)5mW|jHoG29CBT|tOV!U$0k8hnvuo{5;KY->TenU;m^#>c48U<( zg;&8d7CPB`yKPKO`KW>UuZZiox>_2Q{;DrRC_t3oC%8lA447J17JW-RKRQv?omFMH zKQrLfh_o76WQ{ Da^P-VDnpB4Jnu~#U}0GcX4sKdOftnP8h!wJQ{Rs;Z3=H zTMK{!8cVdUbIZ!Q$CtFBGFm^43m&mC7*i{?$R{(+h~ydS6cW9F1u2W`k=imMp)UZw za9nD+u+-TUhwB3TqM23x08wlf9@x=FF{1#T!i?0mTZM)GK@x%rn!6G2U &3( zkcFCCTdzK$* hVBTafR@yO+jsy{=t=zH~LtlLS&^v`y0nO|DslgavB{XlTp z9%ON_{q_}}LO6m$qoWXN?<<^JM1m{on=?xJaFZP1=QWb3{m)LA P6Fv~-FwYA0vR4M zdhYNnqz#yYw;38ZM3m>hgl$84rlL%aG1)%$s-^!R59ViPE0@PD2t_AQl*ch z|0RnRj}8qFg;bM<;T70s`0w9W7G{4yjZ9i;gwTbXqG&-gB5gQ*>E(qTh#ZB5LYb;A zv6-2fgC2!_ClIF~S)@>-AcT^#;CM(TY@v`xDL{jYEsj+=@g5$rSC8Hi^mKvaT$j+* z)wR{Zm + + + + + + + + + + + + + + + + + + + + + ROS2 For Unity - CoRE.SIM document + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ + + + Skip to content + + +++ ++ + + + + + ++ + ++ + + + + + + + + +++ + + + + + ++++ + CoRE.SIM document + +++ + + ROS2 For Unity + + +++ ++ + ++ ++++++++ ++
+ ++ ++ GitHub ++ + ++ + + + + + +++ + + + ++ + + ++ + + + + + + + + +++ + + + ++ + + + + + + + + +ROS2 For Unity
+Ros2ForUnity(
+R2FU
)モジュールは、UnityとROS2エコシステムを効果的に接続するコミュニケーションソリューションで、強力な統合を維持します。 +他のソリューションとは異なり、通信をブリッジングに依存せず、むしろROS2ミドルウェアスタック(特にrcl
レイヤーおよびそれ以下)を利用して、Unityシミュレーション内でROS2ノードを含めることができます。+
R2FU
は多くの理由でCoRE.SIMで使用されています。 +まず第一に、UnityとROS2間の高性能な統合を提供し、ブリッジングソリューションと比較してスループットが向上し、レイテンシが低くなります。 +Unity内のシミュレーションエンティティに対して実際のROS2機能を提供し、標準およびカスタムメッセージをサポートし、Unityアセットとしてラップされた便利な抽象化とツールを含んでいます。 +詳細な説明については、READMEをご覧ください。前提条件
+このアセットは、2つの異なるモードで準備できます:
++
+- スタンドアロンモード - このモードでは、対象のマシンに ROS2 のインストールが必要ありません。例:Unity シミュレーションサーバー。 +必要なすべての依存関係がインストールされ、完全な Unity プラグインセットとして使用できます。
+- オーバーレイモード - このモードでは、対象のマシンに ROS2 のインストールが必要です。 +アセットライブラリと生成されたメッセージのみがインストールされるため、ROS2 のインスタンスをソース化する必要があります。
+デフォルトでは、CoRE.SIM のアセット
+R2FU
は スタンドアロンモード で準備されています。 +これにより、ROS2 のインスタンスをソース化する必要がなく、Unity エディタを実行するだけで済みます。++トピックが表示されない
+エラーは表示されませんが、
+R2FU
によって発行されたトピックが表示されません。+
+- DDS(localhostの設定)の設定が正しいことを確認してください。
+- 時々 ROS2 デーモンはネットワークインターフェースの変更や ROS2 バージョンの変更時に中断することがあります。
+強制的に停止してみてください(
+pkill -9 ros2_daemon
) そして再起動してください(ros2 daemon start
)。Concept
+「CoRE.SIM」内で「R2FU」の概念を説明する際、以下の点を区別します:
++
+- ROS2Node - これは ROS2 のノードに相当し、独自の名前を持ち、任意の数のサブスクライバ、パブリッシャ、サービスサーバ、およびサービスクライアントを持つことができます。現在の CoRE.SIM の実装では、メインノードは1つしかありません。
+- ROS2Clock - これは選択したソースを使用してシミュレーション時間を生成する責任があります。
+- SimulatorROS2Node - これは CoRE.SIM<->ROS2 の通信に直接責任を負うクラスで、ROS2Node および ROS2Clock の各1つのインスタンスを含み、ROS2 でメインの CoRE.SIM ノードを作成し、選択したソースから時間をシミュレーションします(現在は UnityTimeSource が使用されています)。これは Unity シーンを実行する瞬間に
+RuntimeInitializeOnLoadMethod
マークを使用して初期化されます。- Publisher - これは ROS2 のパブリッシャに相当し、選択したメッセージのタイプを発行できる単一のトピックを使用し、選択した QoS プロファイルを持っています。CoRE.SIM 内の各パブリッシャは、SimulatorROS2Node クラスの ROS2Node オブジェクト内で作成されます。
+- Subscriber - これは ROS2 のサブスクライバに相当し、選択したメッセージのタイプをサブスクライブするための単一のトピックを使用し、選択した QoS プロファイルを持っています。CoRE.SIM 内の各サブスクライバは、SimulatorROS2Node クラスの ROS2Node オブジェクト内で作成されます。
+「SimulatorROS2Node」の実装は、「R2FU」の使用により、任意の Unity コンポーネントに対して ROS2 を介した通信を追加することができます。例えば、他の ROS2 ノードから制御コマンドを受信し、Ego の現在の状態(環境内の位置など)を発行することができます。
+++シミュレーション時間
+Unity の時間の代わりにシステム時間(ROS2 時間)を使用したい場合は、
+SimulatorROS2Node
クラスでUnityTimeSource
の代わりにROS2TimeSource
を使用してください。パッケージ構造
++
Ros2ForUnity
アセットには以下が含まれています:+
+- プラグイン - Windows と Linux 用の動的に読み込まれるライブラリ (
+*.dll
および*.so
ファイル)。 +必要なライブラリに加えて、ROS2 メッセージの種類を生成した結果として作成されたライブラリも含まれています。これらは通信に使用されます。- スクリプト -
+R2FU
を Unity で使用するためのスクリプト - 詳細は以下の 下記 をご覧ください。- 拡張スクリプト -
+R2FU
を CoRE.SIM で使用するためのスクリプト。単一のメイン Node の抽象化とインタフェースの簡略化を提供します - 詳細は以下の 下記 をご覧ください。これらのスクリプトはライブラリ自体ではなく、直接ディレクトリAssets/CoRE.SIM/Scripts/ROS/**
にあります。スクリプト
++
+- +
ROS2UnityCore
- ROS2 ノードと実行可能なアクションの処理を行うための主要なクラス。専用スレッドで回転し、アクションを実行します(例:クロック、センサーのパブリッシュトリガーなど)。- +
ROS2UnityComponent
- Unity コンポーネントとして動作するように適応されたROS2UnityCore
。- +
ROS2Node
- ROS2 ノードを表すクラスで、ROS2UnityComponent
クラスを介して構築する必要があり、回転もこのクラスで処理されます。- +
ROS2ForUnity
- ROS2 通信の確認、適切な初期化、シャットダウンを処理する内部クラス。- +
ROS2ListenerExample
- 基本的な ROS2->Unity 通信のテスト用に提供される例類クラス。- +
ROS2TalkerExample
- 基本的な Unity->ROS2 通信のテスト用に提供される例類クラス。- +
ROS2PerformanceTest
- ROS2<->Unity 通信のパフォーマンステスト用に提供される例類クラス。- +
Sensor
- ROS2 対応のセンサーの抽象基本クラス。- +
Transformations
- Unity と ROS2 の座標系間の変換関数のセット。- +
PostInstall
-R2FU
メタデータファイルのインストールを処理する内部クラス。- +
Time
スクリプト - 異なる時間源を使用できるようにする一連のクラス:+
+- +
ROS2Clock
- Unity または ROS2 システム時間と ROS2 メッセージ間のインタフェースを提供する ROS2 クロッククラス。- +
ROS2TimeSource
- ROS2 時間を取得します(デフォルトではシステム時間)。- +
UnityTimeSource
- Unity 時間を取得します。- +
DotnetTimeSource
-Stopwatch
を使用して解像度を高めた UnityDateTime
ベースのクロックを取得します。- +
ITimeSource
- 任意のソースからの一般的な時間の取得用のインタフェース。- +
TimeUtils
- 時間変換用のユーティリティ。拡張スクリプト +さらに、CoRE.SIMを
+R2FU
の使用に適応させるために、以下のスクリプトが使用されています。+
+- +
SimulatorROS2Node
- これはCoRE.SIM<->ROS2の通信に直接責任を持つクラスです。- +
++ +
ClockPublisher
- SimulatorROS2Nodeで実行されているクロックからのシミュレーション時間の発行を可能にします。 +シーンにコンポーネントとして追加する必要があり、シーンが実行されると現在の時間を発行します。- +
++
QoSSettings
- これはCoRE.SIM内のサブスクライバーとパブリッシャーのQoSを指定するROS2の相当です。 +Ros2csライブラリからQualityOfServiceProfile
の実装を使用しています。- +
ROS2Utility
- これは、例えば、ROS2の座標系からCoRE.SIMの座標系に位置を変換するためのユーティリティを持つクラスです。- +
DiagnosticsManager
-*.yaml
設定ファイルで説明されている要素に対する診断情報を出力します。Default message types
+The basic ROS2 msgs types that are supported in CoRE.SIM by default include:
++
+- common_interfaces:
++
+- +
std_msgs
.- +
geometry_msgs
,- +
sensor_msgs
,- +
nav_msgs
,- +
diagnostic_msgs
,- rcl_interfaces:
++
+- +
builtin_interfaces
,- +
action_msgs
,- +
rosgraph_msgs
,- +
test_msgs
.- autoware_auto_msgs: +
+- tier4_autoware_msgs: +
+- Others: +
+In order for the message package to be used in Unity, its
+*.dll
and*.so
libraries must be generated usingR2FU
.++Custom message
+If you want to generate a custom message to allow it to be used in CoRE.SIM please read this tutorial.
+Use of generated messages in Unity
+Each message type is composed of other types - which can also be a complex type. +All of them are based on built-in C# types. +The most common built-in types in messages are
+bool
,int
,double
andstring
. +These types have their communication equivalents using ROS2.A good example of a complex type that is added to other complex types in order to specify a reference - in the form of a timestamp and a frame - is std_msgs/Header. +This message has the following form:
++builtin_interfaces/msg/Time stamp +string frame_id +
++ROS2 directive
+In order to work with ROS2 in Unity, remember to add the directive
+using ROS2;
at the top of the file to import types from this namespace.Create an object
+The simplest way to create an object of
+Header
type is:+var header = new std_msgs.msg.Header() +{ + Frame_id = "map" +} +
It is not required to define the value of each field. +As you can see, it creates an object, filling only
+frame_id
field - and left the field of complexbuiltin_interfaces/msg/Time
type initialized by default. +Time is an important element of any message, how to fill it is written here.Accessing and filling in message fields
+As you might have noticed in the previous example, a ROS2 message in Unity is just a structure containing the same fields - keep the same names and types. +Access to its fields for reading and filling is the same as for any C# structure.
++var header2 = new std_msgs.msg.Header(); +header2.Frame_id = "map"; +header2.Stamp.sec = "1234567"; +Debug.Log($"StampSec: {header2.Stamp.sec} and Frame: {header2.Frame_id}"); +
++Field names
+There is one always-present difference in field names. +The first letter of each message field in Unity is always uppercase - even if the base ROS2 message from which it is generated is lowercase.
+Filling a time
+In order to complete the time field of the
+Header
message, we recommend the following methods in CoRE.SIM:+
+- +
+When the message has no
+Header
but only theTime
type:+var header2 = new std_msgs.msg.Header(); +header2.Stamp = SimulatorROS2Node.GetCurrentRosTime(); +
- +
+When the message has a
+Header
- like for example autoware_auto_vehicle_msgs/VelocityReport:+velocityReportMsg = new autoware_auto_vehicle_msgs.msg.VelocityReport() +{ + Header = new std_msgs.msg.Header() + { + Frame_id = "map", + } +}; +var velocityReportMsgHeader = velocityReportMsg as MessageWithHeader; +SimulatorROS2Node.UpdateROSTimestamp(ref velocityReportMsgHeader); +
These methods allow to fill the
+Time
field in the message object with the simulation time - from ROS2ClockCreate a message with array
+Some message types contain an array of some type. +An example of such a message is
+nav_msgs/Path
, which has aPoseStamped
array. +In order to fill such an array, you must first create aList<T>
, fill it and then convert it to a raw array.+var posesList = new List<geometry_msgs.msg.PoseStamped>(); +for(int i=0; i<=5;++i) +{ + var poseStampedMsg = new geometry_msgs.msg.PoseStamped(); + poseStampedMsg.Pose.Position.X = i; + poseStampedMsg.Pose.Position.Y = 5-i; + var poseStampedMsgHeader = poseStampedMsg as MessageWithHeader; + SimulatorROS2Node.UpdateROSTimestamp(ref poseStampedMsgHeader); + posesList.Add(poseStampedMsg); +} +var pathMsg = new nav_msgs.msg.Path(){Poses=posesList.ToArray()}; +var pathMsgHeader = pathMsg as MessageWithHeader; +SimulatorROS2Node.UpdateROSTimestamp(ref pathMsgHeader); +// pathMsg is ready +
Publish on the topic
+In order to publish messages, a publisher object must be created. +The static method
+CreatePublisher
of theSimulatorROS2Node
makes it easy. +You must specify the type of message, the topic on which it will be published and the QoS profile.
+Below is an example ofautoware_auto_vehicle_msgs.msg.VelocityReport
type message publication with a frequency of30Hz
on/vehicle/status/velocity_status
topic, the QoS profile is(Reliability=Reliable, Durability=Volatile, History=Keep last, Depth=1
):+using UnityEngine; +using ROS2; + +namespace CoRE.SIM +{ + public class VehicleReportRos2Publisher : MonoBehaviour + { + float timer = 0; + int publishHz = 30; + QoSSettings qosSettings = new QoSSettings() + { + ReliabilityPolicy = ReliabilityPolicy.QOS_POLICY_RELIABILITY_RELIABLE, + DurabilityPolicy = DurabilityPolicy.QOS_POLICY_DURABILITY_VOLATILE, + HistoryPolicy = HistoryPolicy.QOS_POLICY_HISTORY_KEEP_LAST, + Depth = 1, + }; + string velocityReportTopic = "/vehicle/status/velocity_status"; + autoware_auto_vehicle_msgs.msg.VelocityReport velocityReportMsg; + IPublisher<autoware_auto_vehicle_msgs.msg.VelocityReport> velocityReportPublisher; + + void Start() + { + // Create a message object and fill in the constant fields + velocityReportMsg = new autoware_auto_vehicle_msgs.msg.VelocityReport() + { + Header = new std_msgs.msg.Header() + { + Frame_id = "map", + } + }; + + // Create publisher with specific topic and QoS profile + velocityReportPublisher = SimulatorROS2Node.CreatePublisher<autoware_auto_vehicle_msgs.msg.VelocityReport>(velocityReportTopic, qosSettings.GetQoSProfile()); + } + + bool NeedToPublish() + { + timer += Time.deltaTime; + var interval = 1.0f / publishHz; + interval -= 0.00001f; + if (timer < interval) + return false; + timer = 0; + return true; + } + + void FixedUpdate() + { + // Provide publications with a given frequency + if (NeedToPublish()) + { + // Fill in non-constant fields + velocityReportMsg.Longitudinal_velocity = 1.00f; + velocityReportMsg.Lateral_velocity = 0.00f; + velocityReportMsg.Heading_rate = 0.00f; + + // Update Stamp + var velocityReportMsgHeader = velocityReportMsg as MessageWithHeader; + SimulatorROS2Node.UpdateROSTimestamp(ref velocityReportMsgHeader); + + // Publish + velocityReportPublisher.Publish(velocityReportMsg); + } + } + } +} +
Subscribe to the topic
+In order to subscribe messages, a subscriber object must be created. +The static method
CreateSubscription
of theSimulatorROS2Node
makes it easy. +You must specify the type of message, the topic from which it will be subscribed and the QoS profile. +In addition, the callback must be defined, which will be called when the message is received - in particular, it can be defined as a lambda expression.
+Below is an example ofstd_msgs.msg.Bool
type message subscription on/vehicle/is_vehicle_stopped
topic, the QoS profile is“system default”
: ++ + + + + + +using UnityEngine; +using ROS2; + +namespace CoRE.SIM +{ + public class VehicleStoppedSubscriber : MonoBehaviour + { + QoSSettings qosSettings = new QoSSettings(); + string isVehicleStoppedTopic = "/vehicle/is_vehicle_stopped"; + bool isVehicleStopped = false; + ISubscription<std_msgs.msg.Bool> isVehicleStoppedSubscriber; + + void Start() + { + isVehicleStoppedSubscriber = SimulatorROS2Node.CreateSubscription<std_msgs.msg.Bool>(isVehicleStoppedTopic, VehicleStoppedCallback, qosSettings.GetQoSProfile()); + } + + void VehicleStoppedCallback(std_msgs.msg.Bool msg) + { + isVehicleStopped = msg.Data; + } + + void OnDestroy() + { + SimulatorROS2Node.RemoveSubscription<std_msgs.msg.Bool>(isVehicleStoppedSubscriber); + } + } +} +
+ ++ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Components/ROS2/ROS2TopicList/index.html b/Components/ROS2/ROS2TopicList/index.html new file mode 100644 index 0000000000..6840e4e174 --- /dev/null +++ b/Components/ROS2/ROS2TopicList/index.html @@ -0,0 +1,1082 @@ + + + + + + + + + + + + + + + + + + + + + + +ROS2 トピックリスト - CoRE.SIM document + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ + + + Skip to content + + +++ ++ + + + + + ++ + ++ + + + + + + + + +++ + + + + + ++++ + CoRE.SIM document + +++ + + ROS2 トピックリスト + + +++ ++ + ++ ++++++++ ++
+ ++ ++ GitHub ++ + ++ + + + + + +++ + + + ++ + + ++ + + + + + + + + +++ + + + ++ + + + + + + + +ROS2 topic list
+The following is a summary of the ROS2 topics that the AWSIM node subscribes to and publishes on.
+++Ros2ForUnity
+AWSIM works with ROS2 thanks to the use of
+Ros2ForUnity
- read the details here.
+If you want to generate a custom message to allow it to be used in AWSIM please read this tutorial.List of subscribers
++ +
++ + + +Category +Topic +Message type ++ frame_id
+ Hz
+ QoS
+ ++ Control
+ + + + + + +Ackermann Control ++ /control/command/control_cmd
+ autoware_auto_control_msgs/AckermannControlCommand
- ++ 60
+ Reliable
,
TransientLocal
,
KeepLast/1
+ +Gear ++ /control/command/gear_cmd
+ autoware_auto_vehicle_msgs/GearCommand
- ++ 10
+ Reliable
,
TransientLocal
,
KeepLast/1
+ +Turn Indicators ++ /control/command/turn_indicators_cmd
+ autoware_auto_vehicle_msgs/TurnIndicatorsCommand
- ++ 10
+ Reliable
,
TransientLocal
,
KeepLast/1
+ +Hazard Lights ++ /control/command/hazard_lights_cmd
+ autoware_auto_vehicle_msgs/HazardLightsCommand
- ++ 10
+ Reliable
,
TransientLocal
,
KeepLast/1
+ + +Emergency ++ /control/command/emergency_cmd
+ tier4_vehicle_msgs/msg/VehicleEmergencyStamped
- ++ 60
+ Reliable
,
TransientLocal
,
KeepLast/1
List of publishers
++ +
+ + + + + + ++ + + +Category +Topic +Message type ++ frame_id
+ Hz
+ QoS
+ ++ Clock
+ /clock
+ rosgraph_msgs/Clock
- ++ 100
+ Best effort
,Volatile
,Keep last/1
+ ++ Sensors
+ + + + + + +Camera ++ /sensing/camera/traffic_light/camera_info
+ sensor_msgs/CameraInfo
+ traffic_light_left_camera/camera_link
+ 10
+ Best effort
,Volatile
,Keep last/1
+ +Camera ++ /sensing/camera/traffic_light/image_raw
+ sensor_msgs/Image
+ traffic_light_left_camera/camera_link
+ 10
+ Best effort
,Volatile
,Keep last/1
+ +GNSS ++ /sensing/gnss/pose
+ geometry_msgs/Pose
+ gnss_link
+ 1
+ Reliable
,Volatile
,Keep last/1
+ +GNSS ++ /sensing/gnss/pose_with_covariance
+ geometry_msgs/PoseWithCovarianceStamped
+ gnss_link
+ 1
+ Reliable
,Volatile
,Keep last/1
+ +IMU ++ /sensing/imu/tamagawa/imu_raw
+ sensor_msgs/Imu
+ tamagawa/imu_link
+ 30
+ Reliable
,Volatile
,Keep last/1000
+ +Top LiDAR ++ /sensing/lidar/top/pointcloud_raw
+ sensor_msgs/PointCloud2
+ sensor_kit_base_link
+ 10
+ Best effort
,Volatile
,Keep last/5
+ +Top LiDAR ++ /sensing/lidar/top/pointcloud_raw_ex
+ sensor_msgs/PointCloud2
+ sensor_kit_base_link
+ 10
+ Best effort
,Volatile
,Keep last/5
+ ++ Vehicle Status
+ + + + + + +Velocity ++ /vehicle/status/velocity_status
+ autoware_auto_vehicle_msgs/VelocityReport
+ base_line
+ 30
+ Reliable
,Volatile
,Keep last/1
+ +Steering ++ /vehicle/status/steering_status
+ autoware_auto_vehicle_msgs/SteeringReport
- ++ 30
+ Reliable
,Volatile
,Keep last/1
+ +Control Mode ++ /vehicle/status/control_mode
+ autoware_auto_vehicle_msgs/ControlModeReport
- ++ 30
+ Reliable
,Volatile
,Keep last/1
+ +Gear ++ /vehicle/status/gear_status
+ autoware_auto_vehicle_msgs/GearReport
- ++ 30
+ Reliable
,Volatile
,Keep last/1
+ +Turn Indicators ++ /vehicle/status/turn_indicators_status
+ autoware_auto_vehicle_msgs/TurnIndicatorsReport
- ++ 30
+ Reliable
,Volatile
,Keep last/1
+ +Hazard Lights ++ /vehicle/status/hazard_lights_status
+ autoware_auto_vehicle_msgs/HazardLightsReport
- ++ 30
+ Reliable
,Volatile
,Keep last/1
+ ++ Ground Truth
+ + + + + + + +Pose ++ /awsim/ground_truth/vehicle/pose
+ geometry_msgs/PoseStamped
+ base_link
+ 100
+ Reliable
,Volatile
,Keep last/1
+ ++ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Components/Sensors/CameraSensor/InspectorSetup.png b/Components/Sensors/CameraSensor/InspectorSetup.png new file mode 100644 index 0000000000000000000000000000000000000000..6d8a1ae5f2492402d233bf2cea3ae28b0f5b1bf8 GIT binary patch literal 38792 zcmeFZby!y0);D}pf(QyK4N^)-cc*lNNK1osccUmE0wUcarBW&&T>>I4E!`#3E%lAt zz0Y~h`M&3m?_AgW{&)7ibOZNVbFDe&nBx~?u*20KD4nW+E7Y(Zo@V~Q_s#P^8*ync3G1V?mK6|H< gfc?GRO@KxqWbQ9J$Pv_sKt6eKL?~lhL0@^#4 z^Vvr4Zst~(jCO4M%m2Q NehFH%IECKvF1++3B4jyf_qr2GSf8Y15t#(g>HR1MHxp?+0N=JLZNgsf+` z{)_2zfm=jOl%@t8BAEK`KeolkH55)enJJ5`56bQM^k>{ZO;hx`HGbyOJ3y*B6|87x z{GpMh;cPA7@R{!rHZ?;+j%e);S@z>@?l^%u7ZQ@ohZLH=sHfW}`?B83=HG8xl*`e7 z*yU;QyR-X1e^uUXPICTi=t 9N%v4Es_(d306g)`Uo<@e7hi zDc&im7Q>^KnP%#uOl &+zz7lBiMBKIylf zpzm077S&r=H}E@jditB5*CQ6u 7oT(;yz`(|NO{2YrfLYioTUufqBJ&x)~cBEc@ z+r{{(9xbq)CYF2A4%6ZV&eDxHlUp%DL`EbJmd;CRt5O2n^-uGYT@@xBEjOaQPgrgB zxyw!?c!!>1zgKme-mWWhQ|wONDyrMi<0-mMpNze6RZEx0^NVNi*y|DWF3D7ZJU!o( z^Fh6S!vF)x*t1CIiP~z_caf`})F}f)<#b`+Ri9bTqb^*(Z0D~$O{z^ni}%^V# nv nT$uxAbtUleo$tw!{$52VmL!pk!C zv9Y8beG4L15 5K%p$$NG|A zYy35{F)?Pj+-Ko+ Dx2K{n;k%u}HjxZ};GKfnj~E=UXe3HR|kWopH@(wruV9?e|Wf z+}og>K3;t3OR;N@D$KDU6Cr_q$x #RI) zJ66I_#}2V0)b!k5hoA=av{W#iN&U9E*Gu+$mb|=z8YRQiB#QGHy6< z z))tQqLUrs1SfjL(%g@p^FN~x1h43keW-y*FNxkmq%8I#)Ah7C?8h1dcG79B?G>Bsw z$8Lve>e~HY;1%&V%lv|`mk2TL1kS%WDZT&Q@NNd<@m-Gowlb4cOXFFy(I37~KIU@< z3(_kxRlc-8c9v<3VUIYUBtT7jyg^C%G|;*WEs=zzih(MQuqB){Cn^awj3+u-((TCt z|7)S+;KPlWacXCRaQW%PYToGHFTB)mjg(%D2`{m3ou7BfI(d zN!rc3inT2qg?A$i#i=oxLTut&&?g1VPX)U@&e0;~9cd;6dsMfR_F~3-&Ly5`2Cvr_ ze6_f9O|O$2hlnH3m eu5Xa(I1d&|SZB%%p_m;*aAQqqcVRwAoA~#@j!) zyAm%^u%P%nKtm{ExrO^1o769T{2L)O^KwgQ+xFw`Z?{HClY@Oa6DPE9@%%hY&JNJk z_94X5LaUuI&Z8yw%gq%& iarZ-Sz&RZOqDpv~R);dsWX42KwJh-?gpH zz{Pn%)Hu9H-(>lTQae7HZ2RnU0FD^;Z$*t_N}UWr`Dao7f<<_O3|&cUeAzGg*=wG! zzMNWpL$hOHjYliZV2gH3g|3X~jRkF)tjvAqP;t~s1(!=fC`l{75jtpNW;D;A{8r^W zn`2nPYKg4)WpX#IX$BLe`H{HOHhb)Xq2o aX@vAFUyJV~bXIzP_?kA1AFP5AS_gNsc}(*_1`}o}49wdvb-JPy_vfVJ4uz zJ6hE9y{gmL9C`=em(Nmk#52!bg>>9=YhLnX+>B$8D2}AWc1;LMl~CN0`|%~qN$aVG zT<5p3DJt}rs5>ZUT)pP2RqN=Fl~&L?o;|^k57DUe3vnmvTeM aXEx| zEAc)h{ZuGQW!RG+KitvvL&%S`U;j9ekMj$~>Lfu^ykbcuqRFpGEQwvXkxuaa{LwQS z&F1($-HBC( AzHt_1q-VGy4NAR zQMq8z{DY~$nl9j`YV52&c0+dr-xCZ *a*UifdF4Hu`WfayeRl{dG>)|EOQQ5Lz(kS43XdGf~jWzaJkO<}XwTk#D z-kgJ`LeRh>utCZsrhnrO9s%3I^(o^DX95B)@n()k<6SPirqWzWGB5Ds$+s@~v&D(= zJbm`2MT-8iTo+koYo15h-F^x*@$+mCa*5jfHw>z=%6925-Zb^+G?Jrs-Sv|_6z`|# z<-lhfL5&}{ =BLL$2M^HH#-g6KjO_{LO %=o{db@GD$R}CtEe@}j&EI@D3SyO+7e%2T+|D@3xp>OC zVrv}xd~8U*%&G5YsJ#5pG=;=_&KJ*(=F>hSvIxn2tR9vNb!N3{@We(-c0TObCV68S zb0y*QoGKBcs&Y@PFOc9avEoEBnaNp#exBz&lczWB2WS>?hvrLOS7XMZPh5YZW~c2R ztCf{4M&%x3O{Zk9z1~YD$(s8qND}X+0EW{uRdEq(XT;ML?0gibnntcLY2JG%h-HJ{ zkFUyn2}8}&PRUhScUon+iFA67| z?oO(^y~SCYq*4_^LAU`SB4rfsa1dTM^dARhsjpm_V7t;}jTYPTB G>OO_L&u@^OD6KeIKb>?rQ~H=)5!G>Nx)X1!7a*`p!1y$@7gsf*kl^)G8!}|hznHf#vyGmj`0+pJPp;D0o!Kz$H@f@2t`>qp8EZN;5UTLeD zzW5hBWrDXQv~d-P;u}jH1vK}m1>4y}pZ6z_%kc4vCw;nX-Ks!aF&S|q+vXag!w5CE zC(Opt6!$tpZLCXw>{{KA%r@gU>)|PO;?$Q1$)3tebSzD&j2r*{U8#9GXzAjZddKGE z-~i{_twxrahJ*=TQffB;!yz@Qmu!`5sH6sTdlJc&IbQs)w&}lEam~E^Omq8NSKUGd zBjZ-|fRz)r{B(U^#YQi0UCvY?{`7a0I~0oeb@#75yV!Q%*CLF5g695?8MDI5k>Vt< z548;6a6N<8e`2MfX#EVY n(MKG6rHgjk z0ix7(8>cR*CpCxu7vju4ejX%OScUTMkx=(2jc1SX4W Ro-K^1_DfUtL*BcDN&T0s4ag|G)~cf W+);5TTj~e?r&Z!=1?-H_MIl$!4y->G-?9@A?}ag&%9(G#b~HfX4TboJ^iLX zP4@*Wm%bV&L!pqM?+Ue%q~_+1=7&?Zz%tgnA@2l!`uErNurx5Naqf|b`Z66We9DT6 zE2lE %&zc#&w&`@aAkc zjsU~4R{?e_j%SotoqoL^yBm2MYvpRyl2OLX^3+SG ((~V80Y$ z3p~4eG5@nO^26BfqW=z6&O!0zfq-|+*YO;&$=+VF3=T`mii%>9yp^qFariQrM&3N< zJTT@0^}$n9slIx#RPbp+tnb}ZlfQTGAJz;QGHL!XB67{* plEH6kZfiLW19FU!$4@9D9$*qZdPre_A+d$lGSn*HC#`U5q+x|W z-{dSdHR(H1hZf?KY^~Ks{Cf3svI<>`or5$^9ZiU+8*Nxv7qgkxD~&A*qeHB%eb%1R z)7~=ypP|~;pddNnW}E>!L;8%dGTfe%7Im#x59VCw)MHuYPQSUg&hzz1Ct_rf@NlgP z%rSh_u`|n!)NLOOqYpQGpLf6h<-X2hZL2Pmw(f4m>C@TT`q~!vlzVcfC=oBIBqa#Q z7@B3$w9;>0u^v-BI>LO|AjSIBfXsLyNfv|DeB|0WW !(gvvRYtvq*bcdvMZ-Vp9pbm|F^JNXh&?1bin#W98=N zB*@0*>FLSp$;ImE@`#N?KtO {Z8&Kc7LX0ZpLO|XJHSQy24XA z{_T;n^2%!eyaTxekF4#T{@ewN{cl&gSzG?kV*T5@AwT&uoqv51xc#5w{@d06nERiL z;VNZiK`BQwcjW8IONr1RpD$?cXl89L_~%PgK66u3P98HB3tkg*7H&%ub`}#84oenx zUQSMKZay 4g%mO(S49;o| 0^Wv`gPX;KozIem zhlksYiwDd=3jzK=Z)0vIDC6j2ZvxwCZEy0(g3Za{(Vq{H3oa<3CNDz6$;$peKT)$Y zakGRQL}-+(9o)VC=L1b^dyD&SCdk#~;N=(K<>O%IX6NJL;o$$5yR|G_Tp<#XV{)*w za{cuQa$5vpGO(~F$T)=o{tOFq5xnPOVdCcKqUq>pCqjdKB`V~df5Mwe_^(Zovv!3m zypa+Acg)|naQ^GNzm9;N^`DQZsQ!elpo!UE4{ z;t|XgW&;8AXEsy}f0mN*->>$xvOumAJ0}+lJ0A-Nza|HVAUn4pJ3A9QC;Uyr_V ^sce(zf75I-X{%>^sA6qW${}DVE4#0vuLC$>G`&187=#r_T ztQ6t``S0tx{8;$OWhXgZR|Mk94dfpbL`oVl{1DSkURfG*8T0yObi@L&FaZKVg^-t$ z(DWMnHR Gu_3VQh81UZ^yz2;T_**ipmt$Rr{-}$qm;F&s z8g;bydiluFK<4@FayH}*+a$!hgpIS0#e(+NMqEc8ddja~LEh$fsVwusS2A9^#zmLy zWw8t0;>SmlTf4i>HsuP^Skx`(FJHbCH#EHE?Cgvf931@MI4ydYiK*@OSxLZt0m5#& z{;cB(e^Ejt86WCa&GgyT&}NRg=^>>IVed5^tsm9yYqbHzR)sUg%OlRyZ+vxY-AM|T zC!RM {lZeEe=Jcpf$WN^635?>^u3-}KdCCVcrWTiZjh5J>FSce&^dW|uVQ1L46KsJ zQf+k_opWYoW&Ii}UwePvGv&A24e#i(@D1O`$4BOtuwgwl2M2z3AO8xQo4dQZx;ls5 z7l#V6{Lc2#G1r!-Up1!GqDp!asV=A{9Qf|W|ExCp-qod4f4*NbFgn^kTKXtFEX?@q z_kK%T+wNB~#}_Bpa`cLpKDOPW<>ya&f_d%Dkc}=(EtXz&=_!#RvFGCc_BJ&OOC Q=ejiI0z`y^7kfo4$!hO8T>W9U`Q7XOr@LE3~Yv zZ0mHlH@dnIR#V}Msju(J+klE`qnWWWJ&pVKF>$`bVw9Jc(<&U9@5|ph-*mhy7PzQw zglW88+UXV0e9`v!UDb$)mtKVf1uib`>90p(_p9eN>JAMFS@c?pAJ$koIDEC@ewCW4 zC?|&%85v0~?1fh_q@bpT*O|aF|1E|#CqI9FbF();GvK*ik>%`{r$6j?4}Oi_^Yr9H z2&P9J?=IgUBU9AZCp$UZ%&)1@mtQ{Gp6^QGiMT?<>U4UvEwNiyOTb7+_l!cwgFzK% zxi^!ZiAm9#g_L#r^wcj;HB$wi_4Mgeg*9C%DfHyzWOPhS*X=p!s}zDcWp38xdP}{T zss;w+6ciNjZZ8iG4kUUl$}TBhxLkS?+!{dyFQ*z15YTXzU9?;O>C-1Tl=o4~Vg}1) zvQ5rUk0BZc`uduJ(J)t5R*2afo BpY*FBgra|Z`CzkK<^z{ vqhAus8JAhFOzzmz&W^c2tLV+APp@F()kZTC z6Zz&4PL++tj_h7{ipz*fjSxS^#}#dDZ5ylzUYD20PfbnX-w_sZ5DYxoPzl)UaV6dh zsB|8fG+SEb(ce1Uzfhw29TbF^^4%0EY5d6+czgx(+N~Bl-t3Vz@40Y#rz(TExHzZz zNIp*A1G|jCb8jWO8%$b-R3akj!^2u|#F7PE>3CBkqoS@t=pus+LR>soW4qfiAhxoS z|9M12GN0qE2tt-QS+U L^mXWgHw>-QC^Oggm3n+M=9) z{on|~UrddOk$|m*!^mt{o0NIJmtR& ziyS$;cg&wZf1U(SQ%qo 5)(Y@U1M49Z_@#%Bkn3x!t z*w#= FUZu z?t&FChJ7ph{P{XD@wd6w2=CS0L }JKu`uc49ABZiLrH)$#`&X6;)DRBmo=yqh;e zWU|#i3#6-%l9I}#eUK??GH34_oBZ<1y27>c7gns~JO_zVW;+H?GV9{_#Kf=iNz;!E z>a~U?%Yhe%fmL4HG!VUI<>k(6MHSca@LrP#Zp}!Do*$Vdu;_nH_nd0~Y(LJx!m@aN zvZ-w;uA0gl32}M8D|Qk4=@Tc;B{Z?4rfc7NdbChqz}9?(KPJ2TWeh$YzhMm%YBuXr z9sSqz6$-u!ZPwm{3=y^?; mel{g3!!!!Qskpd{{#XiEruc||6U6!+u=eJI0|SRWb(f==E2dZiyE(Xw{38f z(OXWua_w4vb~ajKC(oPe3_ wWd=`jpo^ZkZlSukbDo?Az `4J)(zza0w-p3|m`h z3`Wbz$zk{0m?%&w*ldX|NIvBtyo7_GxQYpBN=jCiX`GadOqS>9EL^+7Y33J78Y_M4 zP`*>m!?&6?Q3*sJ&h#4^Ht2tn5U*~Ed97u4ThcNxge`U^-XI{zeerY;{T_mag$1Et zJlxlpb^6P?e0y+wq~YBCPW6Ztx0I9=LzCQe-h9^1IvD~rO~CaT5&>IUTG;)6yJ;2b zG|fkg^&B=_oZ&C7C5z8o4)OQ*XJlf^hScx7S(ljVSf31`$2ggh!7cKz6>>K>4-Y;W zSwWn2rRCPy$>DtigTm9a^z j1Nn5Lp0>7pqr?+6cZwS~vdcQW zZ>0nrcN+O%_%;u9Lb8qD9EZQ*xG#OkoZr}RI6XaGh++=G8 N*e0h)z}O=f2__~cXMS=>i?XX<(R3gY@=dzkXgKb642z7k0GzGe?GdUyUP@I; z o{GX-qWK}a)p4Ld}8w`EiDZ)NK%rVhX*fZz!5dT)Zp-N|G+>q@SU(1 zFUZ~N{q+-&*$l!fnbQKhGm&i>@Ou7Teuf6>qbE(T(GAYe&$E9E4~~rZDx=FQDg7c! zx|UeKJb{XeYGrLLk*fhGwz#qf(?@(o=$A=l^~Q<#ED2RwQWF1rc}5sqnQkELnKm)b zGn7YCz~hL?AW`jNBQACl8xT&1lb*g5TpAhjREesmD{Bh$!HpO0ve6#WFC@^!E5?=m z{Y7Hwl;70X2MnGK20s&jpYk4y>)DN8luELy^t$q;94okR=F9bpeofV-#xrT}l$ZEN zzIj6ffT9DS4%0QL^@=Gg;|7R+)SJ<2$ICS7l HWI*|Wye7(@HE(H>EDzGCZx&Z>^1LALT17f}h%&dtK;|?{E zhf}`M$y|?oFw_7tJ9&6{UnM1lX%)22I^pP#q^G9?^f}b5^Pa;Z0Y@g+DmG~E4Lo d=pW{w+^7=&eZ%4OjNLGtzW^`qavqkL>Wh7PRH zMg1Cb)2*pA+py2n-CEuTSTv~^*RA)1sPAf8ba6gCat8XS4C{J)e7vx*u(c4Y3UPJM z#AKFWabS4(t0G%n3vz{Oy>|gSk-Xv6t5*RJQyar}iwX+n7ZZ(^qJ%bP;H5BF-9^q1 z126dM>gx6m4x;WFMRPssaoU&=xaBp2qIs8Ka&oeEr-KPtj~y>r;88QB4p1p%7W1e{ zj~4wM1_uzOt^A?G&fxQu+y`Cmttpk7jpj`!N~EVf`Wq12V)e#%B-9m z^A`6yhe^TDcB79c9hRS56P-Cd-lZ*0gxKMAn2-ZXZ((6kd$Li}QLid?7FXi8$aLD- zaC${mWdA0-4#Z5>kj)*$P029ZU$Ls9S&(#UYlQ*$;~L_%Yw-4TlulO)YHCt}fiYa% z!W{x+oHWz5-h>nTHmYGhN~rkc>4SHg#E~+ET1*}_b<+X8^#u 5QH<1p!_E zFz!@#?6cw~2-92n`Sa%?%6^XZN1fvKHv_cFM%jI@hiov{S?l^;AzAueoJ{9``0!ym z<)zuf5jZjcp&2uf97X6=(i(ev9UDKA*_4w~Qc~vDc(0F@FDxzXI9?n$(mGh&L ol_H;vLD;)zh bfH1OjG0|5=_I#h9_y2Em|f0v7m{DQh(r_6su>Bb+)XcUC_J~E I}tZY_*WP z{UU7A;m>^NjH&p)f1p@JC6qM4kCb`R&>%({`IU*?jh|e>^W!*+V+w@EM?z3xrlvH( z!NCYOH#aqPbzpMiK`1lgUzrhuHsugS_}8yL9$(M<_%WuVqeJ}yW$W l^07FlRaefn;E>3W|yX?murLsHv&D(gb3E{
08WtA>QQxXtTtY(BU5bcSNoVKnu*cQ!?&rhFkhHfi@}mi0Nk7 zv7D+ZCd_Zn=^?4v8+F?cdWEp$tOk`qLpBcr=xJykSGg{`{NA(f$q
Adw6d^KNM$rX-`pNcFSh&XX=rG6pVe=SLP*oi=f!$Obj-|l-_Ph` zts6P+f$N~< {qOMz z2%ff^Yvl18RXRzCl7M+JQMvlTO>KHA2%7*ucs2=#&ax{>0u&q(o1tb@I*%=(Z1k<% zk00?X2klLGQ`@_{bKk$mt{9Juj=pyJ@?~P2OM-%eaT(|UF>#Fd!B3#4rba0p?LsmU zZtLr?FWh{5_wV1&M&}1LO~=muvbdNPR?Jy2U4gW_yIU!RJG}H!FU0qyZnoREL;Oz; z7!S)IKSur1++2tHE^FsqK>;lc2^`SdyK2O)HY5by&)?tL#zy0o=}F!r-qd$*-!=k1 z>1@OhGuH)g%p%_^@@qg*K=wPuh*laSEb8K{mKG_9l=vAoK|#ICh; dDhpWFJ1Hz{kh$O5(UzMTvAs;^L(4-@ozk z B?SS{Gi++S-ZHp#&aX(oxFTjZZ1Z}xQJB%%nBG6 z>}D`*6+)|EXwAg+tsfi&d4S}1?=FjpiIw;(CbG6VRNOZ*>K%M{KRi5Ky+0x>>~&Ta z3Vgb=v!e!wx kYWis>+)qJ*H~GxDj9By8O|*u#&%xExOAz1Z0tRHV5wy{ z@<=F9{eW*@T&ZPc3Cf_K2hH}us*k42lIt(pgAc*eXVqfGy%QaHdXI#Xn20Ff&FJlr zP44)JYxeqyxt@l`8)02ioJ(`_^8$hA!XhFfZXO;{4E+R>FGTV?r9*RLd0mClhkF$H z7{qRz2cQt|T`DmHmR(o<1k*QZqQ rTny!+6s{Qa` p>)y5%snbZ|zp##AK zi&90y2!}mA5ufz>=`OCC$&Dcz{-oEhsW>?~v9PdK_`Y^KR4^T4Cw49l{ahf?Fy$uQ z-ru)a?a%EH4GatfMF|0Xw!wFAab$cPNg)}TnUPu%awS}fw6u6BYbJ~1dch-EW6)zJ zgtLtFsfvn gT>9L0@_BNYy z_DxM~xTh^=`INachE#rrOo9xs;^H3LowVg?$Q^)A1`P (mX;b_3scD_`!ocW z$OseSmk{lbS*I5ab-_`)r+z%k3?an6fQLxHf))DZQKOCbc3>4$TJGDoR#MiH?Zo1d zGWS$eu7Xc7N=QLbR5nrm`7 M8H0UFOZ1m?!F%u+8WtjQJJ3~3eG`HeEieqS+xw#h=_=I`Yt$h zmfa~&Cmq__+CsrMC}9n40!0FFpbG>V9LKL;Wh@f(K<$E82q3AZrbd;CLtV^8aF^Q# z7bO5?rA+WBkmYeAX5cLV06@?LHY1=Rk_AH=4<6)BF#TLxOBVL# F3c5&?< ?7iR0Vb-PKMzUL^K+ z#3MB_JOg4Z1i1W4UpB}Qz$K#mD!JjVS c!9NU|C-iIo5V08i1lFNPwF}>;=-c;No ztq6tOFL3g_J|`o2H|0^)qytcKO!7}08)%I{7OS31zCg>ktbH}q?E5eiQ2F^#AhvC7 zj~XwRa>grSalEHevz&qgMoWIeT_nK|d5KU%5`0NH1j8Ru@c&}`SeFrhgg^+=Q$$|( zw~C-fdHtW<{*O_OaK=6=+3hT}1N;Lo2p+XtY6-uwu)I9)QA00faddK0>UZn{JL+6B ziL_@YYdi-A252*HA|LJNU^O>4_c=;h5`1dAiAww@P2vw85YWYjV_YEwTHXjs|Es?= zAnz^TUmP$9l1W4M2NCuPN>&mQ!G0RZIc`^R(6I#Bl&64)7@L daJZ-IX=rG|o M=$(vg*k*4EZEvA|nFTU$;@z{AEyN(@@rD5Pub+TPPc z2h|3EQIOxO;Q8+vJX26aZj IL&=+I3_LaMM()8pqsh5`OBD?V3m9`&`OY()z#F36msWa zKsqL-h=c?}U}H^Ro?a1fS-^rsTBu(U1s)JUq_VOyH!tti6h|X4VxC?hx_ ?U-kWuY&$>qj-e4Jj)cH~GFNE}t=f6fm)>g?7Za>*