From b99b5dac470835b654643a6defe1055698644739 Mon Sep 17 00:00:00 2001 From: Amanda <31416491+at669@users.noreply.github.com> Date: Fri, 11 Feb 2022 12:02:02 -0800 Subject: [PATCH 1/2] AIRO-1709 Documentation Update (#356) * #355 Linebreak * Remove references to rosparam/yaml for ROS_IP * Precommit fixes * Update physics README section * Update handshake troubleshooting --- README.md | 16 --------- tutorials/pick_and_place/0_ros_setup.md | 6 ++-- tutorials/pick_and_place/2_ros_tcp.md | 4 +-- .../images/troubleshoot_hud_success.png | Bin 58995 -> 5034 bytes tutorials/ros_unity_integration/network.md | 31 ++++++++---------- tutorials/ros_unity_integration/setup.md | 4 +++ 6 files changed, 24 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 12736a99..053a0f61 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,6 @@ [![License](https://img.shields.io/badge/license-Apache--2.0-green.svg)](LICENSE.md) -![ROS](https://img.shields.io/badge/ros-melodic-brightgreen) -![ROS](https://img.shields.io/badge/ros-noetic-brightgreen) -![ROS](https://img.shields.io/badge/ros2-foxy-brightgreen) -![Unity](https://img.shields.io/badge/unity-2020.2+-brightgreen) This is a central repository for tools, tutorials, resources, and documentation for robotic simulation in Unity. @@ -83,18 +79,6 @@ Use articulation bodies to easily prototype industrial designs with realistic mo - [Unity Computer Vision](https://unity.com/computer-vision) - [Unity ML-Agents Toolkit](https://github.com/Unity-Technologies/ml-agents) -## New Physics Features in Unity -### New Features -- **Contact Modification API** This API will allow users to define custom contact reactions, such as ignoring subsets of contact points, in order to help simulate holes, slippery surfaces, soft contacts, and more. It is available in Unity versions **2021.2a12+**. [Read more about the new Contact Modification API](https://forum.unity.com/threads/experimental-contacts-modification-api.924809/). -- **Collision detection modes exposed for ArticulationBody: discrete, sweep-based CCD, and speculative CCD**. New continuous collision detection (CCD) modes will ensure that fast-moving objects collide with objects, instead of tunneling or passing through those objects, which can happen in the default “discrete” mode. This API is available in Unity versions **2020.3.5f1+**. [Read more about continuous collision detection](https://docs.unity3d.com/2020.3/Documentation/ScriptReference/ArticulationBody-collisionDetectionMode.html). - -### Coming Soon -Here’s a peek into what our Physics Team is hard at work on… - -- **Wheel Collider shapes**. This feature will allow the user to specify the shape of the collider to be used for collision detection. Currently the collider shape is fixed to a cylinder, and collision detection is performed by casting a ray from the center of the cylinder. Custom shapes will improve the accuracy of simulating wheels over rough terrains, holes, etc. [Read more about Wheel Collider](https://docs.unity3d.com/Manual/class-WheelCollider.html). -- **Force/Torque Sensor API**. This API will allow users to get the force and torque acting on an articulation body (useful for simulating a force/torque sensor!), as well as to get the motor torque applied by an articulation drive. -- **Query primitives**. These simple, GameObject-less shapes allow for collision detection without requiring simulation (i.e., without calling Physics.Simulate). This feature will allow users to initialize objects in feasible locations, and can also be used for motion planning. - ## ROS 2 ROS2 support is now available! You can get started by following [this tutorial](https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/ros_unity_integration/publisher.md). diff --git a/tutorials/pick_and_place/0_ros_setup.md b/tutorials/pick_and_place/0_ros_setup.md index 8381a2fe..dca2dd5c 100644 --- a/tutorials/pick_and_place/0_ros_setup.md +++ b/tutorials/pick_and_place/0_ros_setup.md @@ -56,7 +56,9 @@ The ROS workspace is now ready to accept commands! - Copy or download this directory to your ROS operating system if you are doing ROS operations in another machine, VM, or container. > Note: This contains the ROS packages for the pick-and-place task, including [ROS TCP Endpoint](https://github.com/Unity-Technologies/ROS-TCP-Endpoint), [Niryo One ROS stack](https://github.com/NiryoRobotics/niryo_one_ros), [MoveIt Msgs](https://github.com/ros-planning/moveit_msgs), `niryo_moveit`, and `niryo_one_urdf`. -1. The provided files require the following packages to be installed. ROS Melodic users should run the following commands if the packages are not already present: +1. The provided files require the following packages to be installed. + + ROS Melodic users should run the following commands if the packages are not already present: ```bash sudo apt-get update && sudo apt-get upgrade @@ -72,7 +74,7 @@ The ROS workspace is now ready to accept commands! sudo -H pip3 install rospkg jsonpickle ``` -1. If you have not already built and sourced the ROS workspace since importing the new ROS packages, navigate to your ROS workplace, and run `catkin_make && source devel/setup.bash`. Ensure there are no errors. +2. If you have not already built and sourced the ROS workspace since importing the new ROS packages, navigate to your ROS workplace, and run `catkin_make && source devel/setup.bash`. Ensure there are no errors. The ROS workspace is now ready to accept commands! diff --git a/tutorials/pick_and_place/2_ros_tcp.md b/tutorials/pick_and_place/2_ros_tcp.md index e46089e9..2434cc89 100644 --- a/tutorials/pick_and_place/2_ros_tcp.md +++ b/tutorials/pick_and_place/2_ros_tcp.md @@ -212,9 +212,9 @@ ROS and Unity have now successfully connected! - `...failed because unknown error handler name 'rosmsg'` This is due to a bug in an outdated package version. Try running `sudo apt-get update && sudo apt-get upgrade` to upgrade. -- If Unity fails to find a network connection, ensure that the ROS IP address is entered correctly as the ROS IP Address in the RosConnect in Unity, and that the `src/niryo_moveit/config/params.yaml` values are set correctly. +- If Unity fails to find a network connection, ensure that the ROS IP address is entered correctly as the ROS IP Address in the ROS Settings in Unity. This should default to `127.0.0.1`. -- If the ROS TCP handshake fails (e.g. `ROS-Unity server listening...` printed on the Unity side but no `ROS-Unity Handshake received` on the ROS side), the ROS IP may not have been set correctly in the params.yaml file. Try running `echo "ROS_IP: $(hostname -I)" > src/niryo_moveit/config/params.yaml` in a terminal from your ROS workspace. +- If the ROS TCP handshake fails (e.g. no `Connection from 172.17.0.1` on the ROS side after starting the endpoint and entering Play in Unity), the ROS IP may not have been set correctly. The endpoint defaults to `0.0.0.0`, assuming a native or Docker setup. To override this, you can configure the address and/or port by passing them into the launchfile when you launch it, e.g. `roslaunch niryo_moveit part_2.launch tcp_ip:=127.0.0.1 tcp_port:=10005`. - If the UI buttons appear to be unresponsive, such as not responding to clicks, ensure there is an [EventSystem](https://docs.unity3d.com/2020.1/Documentation/Manual/UIE-Events.html) in the scene hierarchy. This should be added automatically when adding UI elements, but if it is not, you can add one to your scene from the Hierarchy window via `(+) > UI > Event System`. You can also access this dropdown from right-clicking in an empty area in the Hierarchy window. diff --git a/tutorials/ros_unity_integration/images/troubleshoot_hud_success.png b/tutorials/ros_unity_integration/images/troubleshoot_hud_success.png index c8a5ef835c53ce2f5ce0f6b0e8ba2e5ddd472490..6d9da0952a605c58fa2f7332c74b87b9379c6db2 100644 GIT binary patch literal 5034 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 AL;wH) literal 58995 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 z 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 diff --git a/tutorials/ros_unity_integration/network.md b/tutorials/ros_unity_integration/network.md index f5d28f08..ae5b9e7a 100644 --- a/tutorials/ros_unity_integration/network.md +++ b/tutorials/ros_unity_integration/network.md @@ -16,7 +16,13 @@ > It is possible to set both of these variables on the machines running Unity and ROS. The specifics of where and why each of these settings will be described below. -On the ROS machine, these settings are set as a rosparam and will typically be set in a launch file like [this](ros_packages/unity_robotics_demo/launch/robo_demo.launch) or in a [param file](https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/pick_and_place/ROS/src/niryo_moveit/config/params.yaml) loaded by a launch file like [this](https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/pick_and_place/ROS/src/niryo_moveit/launch/part_3.launch#L2). The param file can also be loaded manually by running the `rosparam load params.yaml` command. +On the ROS machine, these settings can be set via arguments when running the endpoint's roslaunch like this: + +``` +roslaunch ros_tcp_endpoint endpoint.launch tcp_ip:=127.0.0.1 tcp_port:=10000 +``` + +Or, if using a launchfile like in the Pick-and-Place demo, the settings can be passed as arguments in a launch file like [this](https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/pick_and_place/ROS/src/niryo_moveit/launch/part_3.launch#L2-L3). On the Unity machine, these settings are set from the menu by going to `Robotics` -> `ROS Settings` @@ -27,17 +33,7 @@ The minimum settings required for Unity to communicate with ROS is to set the `R ## If Using Docker -The container will need to be started with the following arguments to forward the ports used for communication between ROS and Unity. - -`-p 10000:10000 -p 5005:5005` - - -- On the ROS side, set `ROS_IP` to `0.0.0.0`. - ```bash - rosparam set ROS_IP 0.0.0.0 - ``` - -- On the Unity side, set `ROS_IP` to `127.0.0.1`. +The container will need to be started with the default arguments to forward the ports used for communication between ROS and Unity. The `unity_endpoint` will listen on IP 0.0.0.0 (i.e. allowing all incoming addresses) and port 10000, but these settings are configurable. ![](images/settings_ros_ip.png) @@ -49,18 +45,17 @@ The container will need to be started with the following arguments to forward th When play is pressed in the Editor, Unity will establish the connection to ROS using the ROS_IP. -If Unity can communicate with ROS, you should see a heads-up display showing the connection in Unity Editor. +If Unity can communicate with ROS, you should see a heads-up display showing the connection in Unity Editor's Game view. ![](images/troubleshoot_hud_success.png) The icon in front of ROS IP should be blue indicating the connection between Unity and ROS is successful. -On ROS side, you should see a message printed to the console screen running the `server_endpoint.py` script, something similar to the following: +On ROS side, you should see a message printed to the console screen running the server endpoint, something similar to the following: ```Connection from 172.17.0.1``` - If the previous message is not shown and either of the following errors are thrown instead: ``` @@ -73,13 +68,15 @@ SocketException: Connection refused Confirm that: -- `server_endpoint` is running. On ROS side, you can run ```rosrun ros_tcp_endpoint default_server_endpoint.py``` +- The `unity_endpoint` is running. On ROS side, you can run ```rosrun ros_tcp_endpoint default_server_endpoint.py``` - You can ping ROS machine from Unity machine - From a terminal on the Unity machine, run the following command to confirm whether the ROS machine is reachable over the network. ```ping ROS_IP``` If issue still persists: - If on Windows you may need to [open ports for the firewall](#open-port-on-windows-firewall). +- Ensure your Connector and Endpoint packages are using matching versions. You will see a `Incompatible ROS-TCP-Endpoint version...` message in your Unity console if these are not the same. + - You can verify which Connector version is being used in the `Window > Package Manager` window, and you can run `rosversion ros_tcp_endpoint` on the ROS side. Ensure these values match. ### 2. Can ROS send messages to Unity? @@ -87,7 +84,7 @@ After it is confirmed that Unity can communicate with ROS, publish a message to You can confirm the connection status by checking the heads-up display in your Unity Scene after entering the Play mode. -If an error is thrown in the `server_endpoint` console then ROS cannot connect to Unity. +If an error is thrown in the `unity_endpoint` console then ROS cannot connect to Unity. If issue still persists: diff --git a/tutorials/ros_unity_integration/setup.md b/tutorials/ros_unity_integration/setup.md index bede9048..60ea07d6 100644 --- a/tutorials/ros_unity_integration/setup.md +++ b/tutorials/ros_unity_integration/setup.md @@ -113,3 +113,7 @@ The instructions so far have set up the ROS-TCP-Connector package for general us ![](images/generate_messages_3.png) The generated files will be saved in the default directories `Assets/RosMessages/UnityRoboticsDemo/msg` and `Assets/RosMessages/UnityRoboticsDemo/srv`. Note, there is no difference between the message scripts generated in ROS1 and ROS2 mode. You don't need to regenerate messages when you switch between them. + +## Troubleshooting + +Check out the [ROS–Unity Integration Networking](network.md) document for more details on troubleshooting your connection. \ No newline at end of file From a2337e97cde75e9488c4f5a415970baa6c6f19f8 Mon Sep 17 00:00:00 2001 From: Florence Rolland <46744097+florence-rolland@users.noreply.github.com> Date: Thu, 14 Apr 2022 01:30:24 +0200 Subject: [PATCH 2/2] Use pinned version of mac image (#367) --- .yamato/sonar.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.yamato/sonar.yml b/.yamato/sonar.yml index 19a4bdae..9fdbf291 100644 --- a/.yamato/sonar.yml +++ b/.yamato/sonar.yml @@ -2,7 +2,7 @@ csharp: name: Sonarqube C# Scan agent: type: Unity::metal::macmini - image: package-ci/mac + image: package-ci/mac:v1.8.1-822785 flavor: m1.mac variables: PROJECT_PATH: tutorials/pick_and_place/PickAndPlaceProject @@ -36,7 +36,7 @@ standard: name: Sonarqube Standard Scan agent: type: Unity::metal::macmini - image: package-ci/mac + image: package-ci/mac:v1.8.1-822785 flavor: m1.mac variables: SONARQUBE_PROJECT_KEY: ai-robotics-hub-standard @@ -49,4 +49,4 @@ standard: expression: | ((pull_request.target eq "main" OR pull_request.target eq "dev") AND NOT pull_request.push.changes.all match "**/*.md") OR - (push.branch eq "main" OR push.branch eq "dev") \ No newline at end of file + (push.branch eq "main" OR push.branch eq "dev")