From c3f7d75e3dee43ac1e766ff5745e8b2c29d26ead Mon Sep 17 00:00:00 2001 From: Evan Palmer Date: Mon, 24 Jun 2024 20:39:07 -0700 Subject: [PATCH 01/10] Updated controller manager launch in demo --- .../launch/bluerov2/bluerov2.launch.py | 158 ----------------- .../bluerov2_heavy/bluerov2_heavy.launch.py | 158 ----------------- .../bluerov2_heavy_reach.launch.py | 159 ------------------ .../launch/bluerov2_controllers.launch.py | 34 +--- .../bluerov2_heavy_controllers.launch.py | 34 +--- 5 files changed, 8 insertions(+), 535 deletions(-) delete mode 100644 blue_bringup/launch/bluerov2/bluerov2.launch.py delete mode 100644 blue_bringup/launch/bluerov2_heavy/bluerov2_heavy.launch.py delete mode 100644 blue_bringup/launch/bluerov2_heavy_reach/bluerov2_heavy_reach.launch.py diff --git a/blue_bringup/launch/bluerov2/bluerov2.launch.py b/blue_bringup/launch/bluerov2/bluerov2.launch.py deleted file mode 100644 index fcf0f2c1..00000000 --- a/blue_bringup/launch/bluerov2/bluerov2.launch.py +++ /dev/null @@ -1,158 +0,0 @@ -# Copyright 2023, Evan Palmer -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription -from launch.launch_description_sources import PythonLaunchDescriptionSource -from launch.substitutions import ( - Command, - FindExecutable, - LaunchConfiguration, - PathJoinSubstitution, -) -from launch_ros.substitutions import FindPackageShare - - -def generate_launch_description() -> LaunchDescription: - """Generate a launch description to run the system. - - Returns: - The launch description for the BlueROV2 base configuration. - """ - args = [ - DeclareLaunchArgument( - "controller", - default_value="ismc", - description=( - "The controller to use; this should be the same name as the" - " controller's executable." - ), - choices=["ismc"], - ), - DeclareLaunchArgument( - "localization_source", - default_value="gazebo", - choices=["mocap", "camera", "gazebo"], - description="The localization source to stream from.", - ), - DeclareLaunchArgument( - "use_camera", - default_value="false", - description=( - "Launch the BlueROV2 camera stream. This is automatically set to true" - " when using the camera for localization." - ), - ), - DeclareLaunchArgument( - "use_mocap", - default_value="false", - description=( - "Launch the Qualisys motion capture stream. This is automatically" - " set to true when using the motion capture system for localization." - ), - ), - DeclareLaunchArgument( - "use_sim", - default_value="false", - description="Launch the Gazebo + ArduSub simulator.", - ), - DeclareLaunchArgument( - "use_rviz", default_value="false", description="Launch RViz2." - ), - DeclareLaunchArgument( - "use_joy", default_value="false", description="Use a joystick controller." - ), - DeclareLaunchArgument( - "rviz_config", - default_value="bluerov2.rviz", - description="The RViz2 configuration file to load.", - ), - DeclareLaunchArgument( - "prefix", - default_value="", - description=( - "The prefix of the model. This is useful for multi-robot setups." - " Expected format '/'." - ), - ), - ] - - robot_description = Command( - [ - PathJoinSubstitution([FindExecutable(name="xacro")]), - " ", - PathJoinSubstitution( - [ - FindPackageShare("blue_description"), - "xacro", - "bluerov2", - "config.xacro", - ] - ), - " ", - "prefix:=", - LaunchConfiguration("prefix"), - " ", - "use_sim:=", - LaunchConfiguration("use_sim"), - ] - ) - - return LaunchDescription( - [ - *args, - IncludeLaunchDescription( - PythonLaunchDescriptionSource( - PathJoinSubstitution( - [FindPackageShare("blue_bringup"), "launch", "base.launch.py"] - ) - ), - launch_arguments={ - "configuration_type": "bluerov2", - "controller": LaunchConfiguration("controller"), - "localization_source": LaunchConfiguration("localization_source"), - "use_camera": LaunchConfiguration("use_camera"), - "use_mocap": LaunchConfiguration("use_mocap"), - "use_sim": LaunchConfiguration("use_sim"), - "use_rviz": LaunchConfiguration("use_rviz"), - "rviz_config": LaunchConfiguration("rviz_config"), - "gazebo_world_file": LaunchConfiguration( - "gazebo_world_file", default="bluerov2_underwater.world" - ), - "prefix": LaunchConfiguration("prefix"), - "robot_description": robot_description, - "use_joy": LaunchConfiguration("use_joy"), - }.items(), - ), - IncludeLaunchDescription( - PythonLaunchDescriptionSource( - PathJoinSubstitution( - [ - FindPackageShare("blue_bringup"), - "launch", - "bluerov2", - "tf.launch.py", - ] - ) - ), - launch_arguments={"prefix": LaunchConfiguration("prefix")}.items(), - ), - ] - ) diff --git a/blue_bringup/launch/bluerov2_heavy/bluerov2_heavy.launch.py b/blue_bringup/launch/bluerov2_heavy/bluerov2_heavy.launch.py deleted file mode 100644 index 1c01286a..00000000 --- a/blue_bringup/launch/bluerov2_heavy/bluerov2_heavy.launch.py +++ /dev/null @@ -1,158 +0,0 @@ -# Copyright 2023, Evan Palmer -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription -from launch.launch_description_sources import PythonLaunchDescriptionSource -from launch.substitutions import ( - Command, - FindExecutable, - LaunchConfiguration, - PathJoinSubstitution, -) -from launch_ros.substitutions import FindPackageShare - - -def generate_launch_description() -> LaunchDescription: - """Generate a launch description to run the system. - - Returns: - The launch description for the BlueROV2 base configuration. - """ - args = [ - DeclareLaunchArgument( - "controller", - default_value="ismc", - description=( - "The controller to use; this should be the same name as the" - " controller's executable." - ), - choices=["ismc"], - ), - DeclareLaunchArgument( - "localization_source", - default_value="gazebo", - choices=["mocap", "camera", "gazebo"], - description="The localization source to stream from.", - ), - DeclareLaunchArgument( - "use_camera", - default_value="false", - description=( - "Launch the BlueROV2 camera stream. This is automatically set to true" - " when using the camera for localization." - ), - ), - DeclareLaunchArgument( - "use_mocap", - default_value="false", - description=( - "Launch the Qualisys motion capture stream. This is automatically" - " set to true when using the motion capture system for localization." - ), - ), - DeclareLaunchArgument( - "use_sim", - default_value="false", - description="Launch the Gazebo + ArduSub simulator.", - ), - DeclareLaunchArgument( - "use_rviz", default_value="false", description="Launch RViz2." - ), - DeclareLaunchArgument( - "use_joy", default_value="false", description="Use a joystick controller." - ), - DeclareLaunchArgument( - "rviz_config", - default_value="bluerov2_heavy.rviz", - description="The RViz2 configuration file to load.", - ), - DeclareLaunchArgument( - "prefix", - default_value="", - description=( - "The prefix of the model. This is useful for multi-robot setups." - " Expected format '/'." - ), - ), - ] - - robot_description = Command( - [ - PathJoinSubstitution([FindExecutable(name="xacro")]), - " ", - PathJoinSubstitution( - [ - FindPackageShare("blue_description"), - "xacro", - "bluerov2_heavy", - "config.xacro", - ] - ), - " ", - "prefix:=", - LaunchConfiguration("prefix"), - " ", - "use_sim:=", - LaunchConfiguration("use_sim"), - ] - ) - - return LaunchDescription( - [ - *args, - IncludeLaunchDescription( - PythonLaunchDescriptionSource( - PathJoinSubstitution( - [FindPackageShare("blue_bringup"), "launch", "base.launch.py"] - ) - ), - launch_arguments={ - "configuration_type": "bluerov2_heavy", - "controller": LaunchConfiguration("controller"), - "localization_source": LaunchConfiguration("localization_source"), - "use_camera": LaunchConfiguration("use_camera"), - "use_mocap": LaunchConfiguration("use_mocap"), - "use_sim": LaunchConfiguration("use_sim"), - "use_rviz": LaunchConfiguration("use_rviz"), - "rviz_config": LaunchConfiguration("rviz_config"), - "gazebo_world_file": LaunchConfiguration( - "gazebo_world_file", default="bluerov2_heavy_underwater.world" - ), - "prefix": LaunchConfiguration("prefix"), - "robot_description": robot_description, - "use_joy": LaunchConfiguration("use_joy"), - }.items(), - ), - IncludeLaunchDescription( - PythonLaunchDescriptionSource( - PathJoinSubstitution( - [ - FindPackageShare("blue_bringup"), - "launch", - "bluerov2_heavy", - "tf.launch.py", - ] - ) - ), - launch_arguments={"prefix": LaunchConfiguration("prefix")}.items(), - ), - ] - ) diff --git a/blue_bringup/launch/bluerov2_heavy_reach/bluerov2_heavy_reach.launch.py b/blue_bringup/launch/bluerov2_heavy_reach/bluerov2_heavy_reach.launch.py deleted file mode 100644 index 2201e297..00000000 --- a/blue_bringup/launch/bluerov2_heavy_reach/bluerov2_heavy_reach.launch.py +++ /dev/null @@ -1,159 +0,0 @@ -# Copyright 2023, Evan Palmer -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription -from launch.launch_description_sources import PythonLaunchDescriptionSource -from launch.substitutions import ( - Command, - FindExecutable, - LaunchConfiguration, - PathJoinSubstitution, -) -from launch_ros.substitutions import FindPackageShare - - -def generate_launch_description() -> LaunchDescription: - """Generate a launch description to run the system. - - Returns: - The launch description for the BlueROV2 base configuration. - """ - args = [ - DeclareLaunchArgument( - "controller", - default_value="ismc", - description=( - "The controller to use; this should be the same name as the" - " controller's executable." - ), - choices=["ismc"], - ), - DeclareLaunchArgument( - "localization_source", - default_value="gazebo", - choices=["mocap", "camera", "gazebo"], - description="The localization source to stream from.", - ), - DeclareLaunchArgument( - "use_camera", - default_value="false", - description=( - "Launch the BlueROV2 camera stream. This is automatically set to true" - " when using the camera for localization." - ), - ), - DeclareLaunchArgument( - "use_mocap", - default_value="false", - description=( - "Launch the Qualisys motion capture stream. This is automatically" - " set to true when using the motion capture system for localization." - ), - ), - DeclareLaunchArgument( - "use_sim", - default_value="false", - description="Launch the Gazebo + ArduSub simulator.", - ), - DeclareLaunchArgument( - "use_rviz", default_value="false", description="Launch RViz2." - ), - DeclareLaunchArgument( - "use_joy", default_value="false", description="Use a joystick controller." - ), - DeclareLaunchArgument( - "rviz_config", - default_value="bluerov2_heavy_reach.rviz", - description="The RViz2 configuration file to load.", - ), - DeclareLaunchArgument( - "prefix", - default_value="", - description=( - "The prefix of the model. This is useful for multi-robot setups." - " Expected format '/'." - ), - ), - ] - - robot_description = Command( - [ - PathJoinSubstitution([FindExecutable(name="xacro")]), - " ", - PathJoinSubstitution( - [ - FindPackageShare("blue_description"), - "xacro", - "bluerov2_heavy_reach", - "config.xacro", - ] - ), - " ", - "prefix:=", - LaunchConfiguration("prefix"), - " ", - "use_sim:=", - LaunchConfiguration("use_sim"), - ] - ) - - return LaunchDescription( - [ - *args, - IncludeLaunchDescription( - PythonLaunchDescriptionSource( - PathJoinSubstitution( - [FindPackageShare("blue_bringup"), "launch", "base.launch.py"] - ) - ), - launch_arguments={ - "configuration_type": "bluerov2_heavy_reach", - "controller": LaunchConfiguration("controller"), - "localization_source": LaunchConfiguration("localization_source"), - "use_camera": LaunchConfiguration("use_camera"), - "use_mocap": LaunchConfiguration("use_mocap"), - "use_sim": LaunchConfiguration("use_sim"), - "use_rviz": LaunchConfiguration("use_rviz"), - "rviz_config": LaunchConfiguration("rviz_config"), - "gazebo_world_file": LaunchConfiguration( - "gazebo_world_file", - default="bluerov2_heavy_reach_underwater.world", - ), # noqa - "prefix": LaunchConfiguration("prefix"), - "robot_description": robot_description, - "use_joy": LaunchConfiguration("use_joy"), - }.items(), - ), - IncludeLaunchDescription( - PythonLaunchDescriptionSource( - PathJoinSubstitution( - [ - FindPackageShare("blue_bringup"), - "launch", - "bluerov2_heavy_reach", - "tf.launch.py", - ] - ) - ), - launch_arguments={"prefix": LaunchConfiguration("prefix")}.items(), - ), - ] - ) diff --git a/blue_demos/control_integration/launch/bluerov2_controllers.launch.py b/blue_demos/control_integration/launch/bluerov2_controllers.launch.py index a3f6345f..b4e6d059 100644 --- a/blue_demos/control_integration/launch/bluerov2_controllers.launch.py +++ b/blue_demos/control_integration/launch/bluerov2_controllers.launch.py @@ -21,12 +21,7 @@ from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, RegisterEventHandler from launch.event_handlers import OnProcessExit -from launch.substitutions import ( - Command, - FindExecutable, - LaunchConfiguration, - PathJoinSubstitution, -) +from launch.substitutions import PathJoinSubstitution from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare @@ -52,29 +47,6 @@ def generate_launch_description() -> LaunchDescription: ), ] - robot_description_content = Command( - [ - PathJoinSubstitution([FindExecutable(name="xacro")]), - " ", - PathJoinSubstitution( - [ - FindPackageShare("blue_demos"), - "control_integration", - "description", - "urdf", - "bluerov2.config.xacro", - ] - ), - " ", - "prefix:=", - LaunchConfiguration("prefix"), - " ", - "use_sim:=", - LaunchConfiguration("use_sim"), - ] - ) - robot_description = {"robot_description": robot_description_content} - # The ISMC expects state information to be provided in the FSD frame mobile_to_maritime_velocity_state = Node( package="mobile_to_maritime", @@ -95,7 +67,6 @@ def generate_launch_description() -> LaunchDescription: executable="ros2_control_node", output="both", parameters=[ - robot_description, PathJoinSubstitution( [ FindPackageShare("blue_demos"), @@ -105,6 +76,9 @@ def generate_launch_description() -> LaunchDescription: ] ), ], + remappings=[ + ("/controller_manager/robot_description", "/robot_description"), + ], ) velocity_controller_spawner = Node( diff --git a/blue_demos/control_integration/launch/bluerov2_heavy_controllers.launch.py b/blue_demos/control_integration/launch/bluerov2_heavy_controllers.launch.py index 9e196b7c..5e367672 100644 --- a/blue_demos/control_integration/launch/bluerov2_heavy_controllers.launch.py +++ b/blue_demos/control_integration/launch/bluerov2_heavy_controllers.launch.py @@ -21,12 +21,7 @@ from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, RegisterEventHandler from launch.event_handlers import OnProcessExit -from launch.substitutions import ( - Command, - FindExecutable, - LaunchConfiguration, - PathJoinSubstitution, -) +from launch.substitutions import PathJoinSubstitution from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare @@ -51,29 +46,6 @@ def generate_launch_description() -> LaunchDescription: ), ] - robot_description_content = Command( - [ - PathJoinSubstitution([FindExecutable(name="xacro")]), - " ", - PathJoinSubstitution( - [ - FindPackageShare("blue_demos"), - "control_integration", - "description", - "urdf", - "bluerov2_heavy.config.xacro", - ] - ), - " ", - "prefix:=", - LaunchConfiguration("prefix"), - " ", - "use_sim:=", - LaunchConfiguration("use_sim"), - ] - ) - robot_description = {"robot_description": robot_description_content} - # The ISMC expects state information to be provided in the FSD frame mobile_to_maritime_velocity_state = Node( package="mobile_to_maritime", @@ -94,7 +66,6 @@ def generate_launch_description() -> LaunchDescription: executable="ros2_control_node", output="both", parameters=[ - robot_description, PathJoinSubstitution( [ FindPackageShare("blue_demos"), @@ -104,6 +75,9 @@ def generate_launch_description() -> LaunchDescription: ] ), ], + remappings=[ + ("/controller_manager/robot_description", "/robot_description"), + ], ) velocity_controller_spawner = Node( From 2dcecb298d7cdfdfe8d105285aefc19e2b679da7 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 14:13:46 -0700 Subject: [PATCH 02/10] Resolved bug in BlueROV2 Heavy and Heavy Reach launch configurations (#193) (#194) * Fixed ardusub_gazebo install and mavros configurations * Remapped controller manager topic to robot state publisher topic * Added missing gstreamer dependency (cherry picked from commit 9ddb154b1e34800d7f58c0b345bd09370ba74e23) Co-authored-by: Evan Palmer --- blue_bringup/launch/bluerov2_heavy/bluerov2_heavy.launch.yaml | 2 +- .../bluerov2_heavy_reach/bluerov2_heavy_reach.launch.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blue_bringup/launch/bluerov2_heavy/bluerov2_heavy.launch.yaml b/blue_bringup/launch/bluerov2_heavy/bluerov2_heavy.launch.yaml index 28819c61..93897099 100644 --- a/blue_bringup/launch/bluerov2_heavy/bluerov2_heavy.launch.yaml +++ b/blue_bringup/launch/bluerov2_heavy/bluerov2_heavy.launch.yaml @@ -43,7 +43,7 @@ launch: - arg: name: mavros_file - default: $(find-pkg-share blue_description)/config/mavros.yaml + default: $(find-pkg-share blue_description)/config/ardusub/mavros.yaml - arg: name: manager_file diff --git a/blue_bringup/launch/bluerov2_heavy_reach/bluerov2_heavy_reach.launch.yaml b/blue_bringup/launch/bluerov2_heavy_reach/bluerov2_heavy_reach.launch.yaml index d4c01132..d16e459b 100644 --- a/blue_bringup/launch/bluerov2_heavy_reach/bluerov2_heavy_reach.launch.yaml +++ b/blue_bringup/launch/bluerov2_heavy_reach/bluerov2_heavy_reach.launch.yaml @@ -43,7 +43,7 @@ launch: - arg: name: mavros_file - default: $(find-pkg-share blue_description)/config/mavros.yaml + default: $(find-pkg-share blue_description)/config/ardusub/mavros.yaml - arg: name: manager_file From 86d3b77957786bc72f9b591b33396ca235d359a5 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 23:43:32 -0700 Subject: [PATCH 03/10] Added additional resources for USB/IP tutorial (#196) (#198) (cherry picked from commit 531ed83b0ee6859070be48208b6779f42db24309) Co-authored-by: Evan Palmer --- docs/docs/tutorials/teleop.mdx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/docs/tutorials/teleop.mdx b/docs/docs/tutorials/teleop.mdx index 0171bcb4..c1519576 100644 --- a/docs/docs/tutorials/teleop.mdx +++ b/docs/docs/tutorials/teleop.mdx @@ -138,10 +138,12 @@ inputs, press and release the left trigger. ## USB/IP gamepad teleoperation -This tutorial describes how to configure [USB/IP](https://www.kernel.org/doc/html/latest/usb/usbip_protocol.html) +This tutorial describes how to configure [USB/IP](https://usbip.sourceforge.net/) so that you can teleoperate a remote vehicle connected to a topside computer -via a tether with a gamepad connected to your topside machine. In this +via tether with a gamepad connected to your topside machine. In this configuration, we recommend using a [Logitech F310 Gamepad](https://www.logitechg.com/en-us/products/gamepads/f310-gamepad.940-000110.html). +Additional USB/IP tutorials can be found on the [RidgeRun Developer Wiki](https://developer.ridgerun.com/wiki/index.php?title=How_to_setup_and_use_USB/IP) +and in the [Linux Magazine](https://www.linux-magazine.com/Issues/2018/208/Tutorial-USB-IP). ### Dependencies From 2cb72121e10ff67bfe70b24736dfce7c74e59d99 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 21:31:54 -0700 Subject: [PATCH 04/10] Bump docker/build-push-action from 6.1.0 to 6.2.0 (#200) (#202) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.1.0 to 6.2.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v6.1.0...v6.2.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit 8639c4191064a415b5a9898a44f7d2b6440b63ce) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index fb01cad0..5230aea7 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -49,7 +49,7 @@ jobs: type=raw,value=${{ matrix.ROS_DISTRO }}-${{ github.job }} - name: Build and push Docker image - uses: docker/build-push-action@v6.1.0 + uses: docker/build-push-action@v6.2.0 with: context: . file: .docker/Dockerfile @@ -96,7 +96,7 @@ jobs: type=raw,value=${{ matrix.ROS_DISTRO }}-${{ github.job }} - name: Build and push Docker image - uses: docker/build-push-action@v6.1.0 + uses: docker/build-push-action@v6.2.0 with: context: . file: .docker/Dockerfile @@ -138,7 +138,7 @@ jobs: type=raw,value=${{ matrix.ROS_DISTRO }}-${{ github.job }} - name: Build and push Docker image - uses: docker/build-push-action@v6.1.0 + uses: docker/build-push-action@v6.2.0 with: context: . file: .docker/Dockerfile @@ -179,7 +179,7 @@ jobs: type=raw,value=${{ matrix.ROS_DISTRO }}-${{ github.job }} - name: Build and push Docker image - uses: docker/build-push-action@v6.1.0 + uses: docker/build-push-action@v6.2.0 with: context: . file: .docker/Dockerfile From 42c6a48ca469da82ab66bb2df59b340ed61c5bf0 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 15:40:58 -0700 Subject: [PATCH 05/10] Add xacro as an exec_depend for blue_description (#215) (#219) Co-authored-by: Aaron Marburg (cherry picked from commit 506be0642c94239b9d4c40ed2ab9d05497abafae) Co-authored-by: Aaron Marburg --- blue_description/package.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/blue_description/package.xml b/blue_description/package.xml index 0eca687e..e176cb73 100644 --- a/blue_description/package.xml +++ b/blue_description/package.xml @@ -16,6 +16,8 @@ ament_cmake + xacro + ament_cmake From 3e5c96443aab591e8ad96bb3afb58d3e1ed6267f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 16:18:11 -0700 Subject: [PATCH 06/10] Style: Upcase "as" in Dockerfile (backport #214) (#217) * Fix case on "as" in Dockerfile (#214) Co-authored-by: Aaron Marburg (cherry picked from commit 8bbb19e38e5ccb929ded96512d100877389cde66) # Conflicts: # .docker/Dockerfile * Resolved merge conflicts * Bump build versions --------- Co-authored-by: Aaron Marburg Co-authored-by: Evan Palmer --- .docker/Dockerfile | 8 ++++---- .github/workflows/ci.yaml | 2 +- .github/workflows/docker.yaml | 18 +++++++++--------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.docker/Dockerfile b/.docker/Dockerfile index 0112cad9..fe30b39a 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -1,5 +1,5 @@ ARG ROS_DISTRO=iron -FROM ros:$ROS_DISTRO-ros-base as ci +FROM ros:$ROS_DISTRO-ros-base AS ci ENV DEBIAN_FRONTEND=noninteractive @@ -36,7 +36,7 @@ RUN apt-get -q update \ && apt-get clean -y \ && rm -rf /var/lib/apt/lists/* -FROM ci as robot +FROM ci AS robot # Configure a new non-root user ARG USERNAME=blue @@ -99,7 +99,7 @@ RUN sudo apt-get -q update \ RUN echo "source ${USER_WORKSPACE}/install/setup.bash" >> /home/$USERNAME/.bashrc \ && echo "source /opt/ros/${ROS_DISTRO}/setup.bash" >> /home/$USERNAME/.bashrc -FROM robot as desktop +FROM robot AS desktop ENV DEBIAN_FRONTEND=noninteractive ENV GZ_VERSION=garden @@ -177,7 +177,7 @@ RUN . "/opt/ros/${ROS_DISTRO}/setup.sh" \ # Setup the simulation environment variables RUN echo "source ${USER_WORKSPACE}/src/blue/.docker/entrypoints/sim.sh" >> /home/$USERNAME/.bashrc -FROM desktop as desktop-nvidia +FROM desktop AS desktop-nvidia # Install NVIDIA software RUN sudo apt-get update \ diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 693ac20d..33ffca7f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -28,7 +28,7 @@ jobs: submodules: recursive - name: Log into registry - uses: docker/login-action@v3.2.0 + uses: docker/login-action@v3.3.0 with: registry: ghcr.io username: ${{ github.actor }} diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 5230aea7..92a44e85 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -33,7 +33,7 @@ jobs: - name: Log into registry if: env.PUSH == 'true' - uses: docker/login-action@v3.2.0 + uses: docker/login-action@v3.3.0 with: registry: ghcr.io username: ${{ github.actor }} @@ -49,7 +49,7 @@ jobs: type=raw,value=${{ matrix.ROS_DISTRO }}-${{ github.job }} - name: Build and push Docker image - uses: docker/build-push-action@v6.2.0 + uses: docker/build-push-action@v6.5.0 with: context: . file: .docker/Dockerfile @@ -73,14 +73,14 @@ jobs: uses: actions/checkout@v4 - name: Set up QEMU - uses: docker/setup-qemu-action@v3.0.0 + uses: docker/setup-qemu-action@v3.2.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log into registry if: env.PUSH == 'true' - uses: docker/login-action@v3.2.0 + uses: docker/login-action@v3.3.0 with: registry: ghcr.io username: ${{ github.actor }} @@ -96,7 +96,7 @@ jobs: type=raw,value=${{ matrix.ROS_DISTRO }}-${{ github.job }} - name: Build and push Docker image - uses: docker/build-push-action@v6.2.0 + uses: docker/build-push-action@v6.5.0 with: context: . file: .docker/Dockerfile @@ -122,7 +122,7 @@ jobs: - name: Log into registry if: env.PUSH == 'true' - uses: docker/login-action@v3.2.0 + uses: docker/login-action@v3.3.0 with: registry: ghcr.io username: ${{ github.actor }} @@ -138,7 +138,7 @@ jobs: type=raw,value=${{ matrix.ROS_DISTRO }}-${{ github.job }} - name: Build and push Docker image - uses: docker/build-push-action@v6.2.0 + uses: docker/build-push-action@v6.5.0 with: context: . file: .docker/Dockerfile @@ -163,7 +163,7 @@ jobs: - name: Log into registry if: env.PUSH == 'true' - uses: docker/login-action@v3.2.0 + uses: docker/login-action@v3.3.0 with: registry: ghcr.io username: ${{ github.actor }} @@ -179,7 +179,7 @@ jobs: type=raw,value=${{ matrix.ROS_DISTRO }}-${{ github.job }} - name: Build and push Docker image - uses: docker/build-push-action@v6.2.0 + uses: docker/build-push-action@v6.5.0 with: context: . file: .docker/Dockerfile From da4a996f9d751e79edf66010e2547100b96f6e37 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 13:43:13 -0700 Subject: [PATCH 07/10] Add "robot" container (backport #221) (#225) * Add "robot" container (#221) * Initial commit of _robot container and devcontainer * Add xacro as an exec_depend for blue_description * Update comments * Remove unused Docker stage "blue_src_and_deps" Renamed *.repos --> blue.repos and sim.repos --------- Co-authored-by: Aaron Marburg (cherry picked from commit ba77c25bdcddf1d7ad04779320550820cd4e3b53) # Conflicts: # blue.repos * Fixed merge conflict from mergify * Use "iron" branch of ros_gz --------- Co-authored-by: Aaron Marburg Co-authored-by: Evan Palmer Co-authored-by: Aaron Marburg --- .devcontainer/robot/Dockerfile | 31 +++++++++++++++++++++ .devcontainer/robot/devcontainer.json | 40 +++++++++++++++++++++++++++ .docker/Dockerfile | 19 +++++++++++-- .docker/compose/robot.yaml | 21 ++++++++++++++ .dockerignore | 1 + blue.repos | 5 ---- sim.repos | 11 ++++++++ 7 files changed, 121 insertions(+), 7 deletions(-) create mode 100644 .devcontainer/robot/Dockerfile create mode 100644 .devcontainer/robot/devcontainer.json create mode 100644 .docker/compose/robot.yaml create mode 100644 sim.repos diff --git a/.devcontainer/robot/Dockerfile b/.devcontainer/robot/Dockerfile new file mode 100644 index 00000000..f10cb1e8 --- /dev/null +++ b/.devcontainer/robot/Dockerfile @@ -0,0 +1,31 @@ +# +# Dockerfile for *-robot development container +# +ARG BLUE_GITHUB_REPO=Robotic-Decision-Making-Lab/blue +ARG ROS_DISTRO=rolling +FROM ${BLUE_GITHUB_REPO}:${ROS_DISTRO}-robot + +# Install ROS dependencies +# This is done in a previous stage, but we include it again here in case anyone wants to +# add new dependencies during development +ENV USERNAME=blue +ENV USER_WORKSPACE=/home/$USERNAME/ws_blue +WORKDIR $USER_WORKSPACE + +COPY --chown=$USER_UID:$USER_GID . src/blue +RUN sudo apt-get -q update \ + && sudo apt-get -q -y upgrade \ + && rosdep update \ + && rosdep install -y --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} --skip-keys="gz-transport12 gz-sim7 gz-math7 gz-msgs9 gz-plugin2" \ + && sudo apt-get autoremove -y \ + && sudo apt-get clean -y \ + && sudo rm -rf /var/lib/apt/lists/* + +# Install debugging/linting Python packages +RUN python3 -m pip install \ + pre-commit \ + mypy + +# Disable the setuputils installation warning +# This prevents us from needing to pin the setuputils version (which doesn't always work) +ENV PYTHONWARNINGS="ignore" diff --git a/.devcontainer/robot/devcontainer.json b/.devcontainer/robot/devcontainer.json new file mode 100644 index 00000000..d57e5f09 --- /dev/null +++ b/.devcontainer/robot/devcontainer.json @@ -0,0 +1,40 @@ +{ + "name": "Robot Dev Container", + "build": { + "dockerfile": "Dockerfile", + "context": "../..", + "args": { + "BLUE_GITHUB_REPO": "ghcr.io/robotic-decision-making-lab/blue", + "ROS_DISTRO": "rolling" + } + }, + "workspaceMount": "source=${localWorkspaceFolder},target=/home/blue/ws_blue/src/blue,type=bind", + "workspaceFolder": "/home/blue/ws_blue/src/blue", + "remoteUser": "blue", + "runArgs": [ + "--network=host", + "--cap-add=SYS_PTRACE", + "--security-opt=seccomp:unconfined", + "--security-opt=apparmor:unconfined", + "--volume=/dev:/dev", + "--privileged", + "--volume=/run/user/1000:/run/user/1000" + ], + "containerEnv": {}, + "customizations": { + "vscode": { + "extensions": [ + "ms-azuretools.vscode-docker", + "ms-python.python", + "njpwerner.autodocstring", + "redhat.vscode-xml", + "redhat.vscode-yaml", + "smilerobotics.urdf", + "esbenp.prettier-vscode", + "charliermarsh.ruff", + "josetr.cmake-language-support-vscode", + "unifiedjs.vscode-mdx" + ] + } + } +} diff --git a/.docker/Dockerfile b/.docker/Dockerfile index fe30b39a..6e7c955b 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -26,7 +26,8 @@ RUN apt-get -q update \ && apt-get clean -y \ && rm -rf /var/lib/apt/lists/* -# Install all ROS dependencies +# Install all ROS dependencies for _just_ blue +# (we have not imported other repos from .repos files) RUN apt-get -q update \ && apt-get -q -y upgrade \ && rosdep update \ @@ -36,6 +37,14 @@ RUN apt-get -q update \ && apt-get clean -y \ && rm -rf /var/lib/apt/lists/* +# This stage includes +# - Switching to the non-root user +# - Copying 'blue' source from this repo into the non-root user's workspace +# - Installing blue deps using pip, apt and rosdep +# - Installs the remaining blue dependencies from blue_robot.repos +# - Installs deps from rosdep for all src dependencies +# - colcon build +# FROM ci AS robot # Configure a new non-root user @@ -88,14 +97,20 @@ RUN sudo apt-get -q update \ && sudo apt-get clean -y \ && sudo rm -rf /var/lib/apt/lists/* +WORKDIR $USER_WORKSPACE RUN sudo apt-get -q update \ && sudo apt-get -q -y upgrade \ + && vcs import src < src/blue/blue.repos \ && rosdep update \ && rosdep install -y --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} \ && sudo apt-get autoremove -y \ && sudo apt-get clean -y \ && sudo rm -rf /var/lib/apt/lists/* +# Actually build workspace +RUN . "/opt/ros/${ROS_DISTRO}/setup.sh" \ + && colcon build + RUN echo "source ${USER_WORKSPACE}/install/setup.bash" >> /home/$USERNAME/.bashrc \ && echo "source /opt/ros/${ROS_DISTRO}/setup.bash" >> /home/$USERNAME/.bashrc @@ -161,7 +176,7 @@ RUN [ "/bin/bash" , "-c" , " \ WORKDIR $USER_WORKSPACE RUN sudo apt-get -q update \ && sudo apt-get -q -y upgrade \ - && vcs import src < src/blue/blue.repos \ + && vcs import src < src/blue/sim.repos \ && rosdep update \ && rosdep install -y --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} --skip-keys="gz-transport12 gz-sim7 gz-math7 gz-msgs9 gz-plugin2" \ && sudo apt-get autoremove -y \ diff --git a/.docker/compose/robot.yaml b/.docker/compose/robot.yaml new file mode 100644 index 00000000..faf1be02 --- /dev/null +++ b/.docker/compose/robot.yaml @@ -0,0 +1,21 @@ +services: + blue: + image: ghcr.io/robotic-decision-making-lab/blue:rolling-robot + build: + dockerfile: .docker/Dockerfile + target: robot + context: ../../ + network_mode: host + privileged: true + cap_add: + - SYS_PTRACE + security_opt: + - seccomp:unconfined + - apparmor:unconfined + volumes: + - /dev:/dev + - /run/user/1000:/run/user/1000 + - type: bind + source: ../../ + target: /home/blue/ws_blue/src/blue + command: tail -f /dev/null diff --git a/.dockerignore b/.dockerignore index 211fad8d..ae633710 100644 --- a/.dockerignore +++ b/.dockerignore @@ -7,5 +7,6 @@ !blue_description !blue_demos !blue.repos +!sim.repos !.docker/entrypoints !requirements-build.txt diff --git a/blue.repos b/blue.repos index 23486eb3..20a32377 100644 --- a/blue.repos +++ b/blue.repos @@ -1,10 +1,5 @@ repositories: - ros_gz: - type: git - url: https://github.com/gazebosim/ros_gz - version: iron - hydrodynamics: type: git url: https://github.com/Robotic-Decision-Making-Lab/hydrodynamics.git diff --git a/sim.repos b/sim.repos new file mode 100644 index 00000000..b530a5f9 --- /dev/null +++ b/sim.repos @@ -0,0 +1,11 @@ +# +# Note this is _in addition to_ blue.repos +# (i.e. you need to vcs import both files independently) +# +repositories: + + # ROS-Gazebo integration + ros_gz: + type: git + url: https://github.com/gazebosim/ros_gz + version: iron From 5f7f740299460c949ffb496892062ebf2d77dcfd Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 13:03:40 -0700 Subject: [PATCH 08/10] Use Gazebo Harmonic (#223) (#231) * Update to use Harmonic * Add "third-party" rosdep from OSRF for gazebo deps. * Added comment on "user ROOT" rather than sudo, joined two adjacent apt-get install steps. * Correct error in comment --------- Co-authored-by: Aaron Marburg (cherry picked from commit 8a4e05aa5e211cd0bab0e72466530f70054814fb) Co-authored-by: Aaron Marburg --- .docker/Dockerfile | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/.docker/Dockerfile b/.docker/Dockerfile index 6e7c955b..83b8740e 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -117,38 +117,40 @@ RUN echo "source ${USER_WORKSPACE}/install/setup.bash" >> /home/$USERNAME/.bashr FROM robot AS desktop ENV DEBIAN_FRONTEND=noninteractive -ENV GZ_VERSION=garden - -# Install Gazebo Garden: https://gazebosim.org/docs/garden/install_ubuntu -RUN sudo wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg \ - && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null \ - && sudo apt-get -q update \ - && sudo apt-get -y --quiet --no-install-recommends install \ - gz-garden \ - && sudo apt-get autoremove -y \ - && sudo apt-get clean -y \ - && sudo rm -rf /var/lib/apt/lists/* - -# Install ArduPilot and ardupilot_gazebo dependencies -RUN sudo apt-get -q update \ - && sudo apt-get -q -y upgrade \ - && sudo apt-get -q install --no-install-recommends -y \ +ENV GZ_VERSION=harmonic + +# Install Gazebo Harmonic: https://gazebosim.org/docs/harmonic/install_ubuntu +# Per DL3004, use "USER root" rather than "sudo" +# https://github.com/hadolint/hadolint/wiki/DL3004 +USER root +# Install custom rosdep list +ADD --chown=root:root --chmod=0644 https://raw.githubusercontent.com/osrf/osrf-rosdep/master/gz/00-gazebo.list /etc/ros/rosdep/sources.list.d/00-gazebo.list +RUN wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null \ + && apt-get -q update \ + && apt-get -y --quiet --no-install-recommends install \ + gz-${GZ_VERSION} \ + python3-pexpect \ python3-wxgtk4.0 \ + python3-future \ rapidjson-dev \ xterm \ - libgz-sim7-dev \ rapidjson-dev \ libopencv-dev \ - && sudo apt-get autoremove -y \ - && sudo apt-get clean -y \ - && sudo rm -rf /var/lib/apt/lists/* + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /var/lib/apt/lists/* +USER $USERNAME # Clone ArduSub # ArduSub is installed for simulation purposes ONLY # When deployed onto hardware, the native installation of ArduSub # (on the FCU) will be used. WORKDIR /home/$USERNAME -RUN git clone https://github.com/ArduPilot/ardupilot.git --recurse-submodules +# Really should do version pinning but Sub-4.5 is waaaay behind master +# (e.g. it doesn't know about "noble" yet) +ARG ARDUPILOT_RELEASE=master +RUN git clone -b ${ARDUPILOT_RELEASE} https://github.com/ArduPilot/ardupilot.git --recurse-submodules # Install ArduSub dependencies WORKDIR /home/$USERNAME/ardupilot From 0e297bc109aad194e82148c530da0a9027b5c78d Mon Sep 17 00:00:00 2001 From: Aaron Marburg Date: Fri, 9 Aug 2024 14:50:01 -0700 Subject: [PATCH 09/10] Install ros_gz from binary package (iron, humble) (#228) * Install ros_gz from package, not from source, remove sim.repos * Removed additional apt-get lines from cherry-pick --------- Co-authored-by: Aaron Marburg --- .docker/Dockerfile | 2 +- sim.repos | 11 ----------- 2 files changed, 1 insertion(+), 12 deletions(-) delete mode 100644 sim.repos diff --git a/.docker/Dockerfile b/.docker/Dockerfile index 83b8740e..dc31ea0b 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -130,6 +130,7 @@ RUN wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pk && apt-get -q update \ && apt-get -y --quiet --no-install-recommends install \ gz-${GZ_VERSION} \ + ros-${ROS_DISTRO}-ros-gz${GZ_VERSION} \ python3-pexpect \ python3-wxgtk4.0 \ python3-future \ @@ -178,7 +179,6 @@ RUN [ "/bin/bash" , "-c" , " \ WORKDIR $USER_WORKSPACE RUN sudo apt-get -q update \ && sudo apt-get -q -y upgrade \ - && vcs import src < src/blue/sim.repos \ && rosdep update \ && rosdep install -y --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} --skip-keys="gz-transport12 gz-sim7 gz-math7 gz-msgs9 gz-plugin2" \ && sudo apt-get autoremove -y \ diff --git a/sim.repos b/sim.repos deleted file mode 100644 index b530a5f9..00000000 --- a/sim.repos +++ /dev/null @@ -1,11 +0,0 @@ -# -# Note this is _in addition to_ blue.repos -# (i.e. you need to vcs import both files independently) -# -repositories: - - # ROS-Gazebo integration - ros_gz: - type: git - url: https://github.com/gazebosim/ros_gz - version: iron From f7ac114fc89518758288383c34b70423585f352f Mon Sep 17 00:00:00 2001 From: Aaron Marburg Date: Fri, 9 Aug 2024 14:50:01 -0700 Subject: [PATCH 10/10] Install ros_gz from binary package (iron, humble) (#228) * Install ros_gz from package, not from source, remove sim.repos * Removed additional apt-get lines from cherry-pick --------- Co-authored-by: Aaron Marburg (cherry picked from commit 0e297bc109aad194e82148c530da0a9027b5c78d) # Conflicts: # sim.repos --- .docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.docker/Dockerfile b/.docker/Dockerfile index 00e5e193..97cc5792 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -130,6 +130,7 @@ RUN wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pk && apt-get -q update \ && apt-get -y --quiet --no-install-recommends install \ gz-${GZ_VERSION} \ + ros-${ROS_DISTRO}-ros-gz${GZ_VERSION} \ python3-pexpect \ python3-wxgtk4.0 \ python3-future \ @@ -178,7 +179,6 @@ RUN [ "/bin/bash" , "-c" , " \ WORKDIR $USER_WORKSPACE RUN sudo apt-get -q update \ && sudo apt-get -q -y upgrade \ - && vcs import src < src/blue/sim.repos \ && rosdep update \ && rosdep install -y --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} --skip-keys="gz-transport12 gz-sim7 gz-math7 gz-msgs9 gz-plugin2" \ && sudo apt-get autoremove -y \