diff --git a/Makefile b/Makefile index 63b06df..fda612d 100644 --- a/Makefile +++ b/Makefile @@ -5,11 +5,20 @@ docker_start: @./scripts/run_dev.sh nav2: - @cd deploy && docker build --tag go2py_nav2:latest -f docker/Dockerfile.nav2 . + @cd deploy && docker build --no-cache --tag go2py_nav2:latest -f docker/Dockerfile.nav2 . + +nav2_source: + @cd deploy && docker build --tag robocaster/navigation2:aarch64 -f docker/Dockerfile.nav2_source . nav2_start: @ ./scripts/run_nav2.sh +mexplore: + @cd deploy && docker build --no-cache --tag go2py_mexplore:latest -f docker/Dockerfile.mexplore . + +mexplore_start: + @ ./scripts/run_mexplore.sh + messages: @cd scripts && ./make_msgs.sh diff --git a/deploy/docker/Dockerfile.mexplore b/deploy/docker/Dockerfile.mexplore new file mode 100644 index 0000000..f55441d --- /dev/null +++ b/deploy/docker/Dockerfile.mexplore @@ -0,0 +1,28 @@ +# FROM isaac_ros_dev-aarch64 +FROM ros:humble +ENV DEBIAN_FRONTEND=noninteractive +SHELL ["/bin/bash", "-c"] +# uodate and install dependencies +RUN apt-get update && apt-get install -y \ + ros-humble-rmw-cyclonedds-cpp ros-humble-rosidl-generator-dds-idl \ + libyaml-cpp-dev \ + ros-humble-xacro \ + libboost-all-dev\ + build-essential \ + cmake \ + git \ + ros-humble-cv-bridge \ + && rm -rf /var/lib/apt/lists/* + +# Cheange the ROS2 RMW to CycloneDDS as instructed by Unitree +RUN cd / && git clone https://github.com/unitreerobotics/unitree_ros2 && cd /unitree_ros2/cyclonedds_ws/src && \ +git clone https://github.com/ros2/rmw_cyclonedds -b humble && git clone https://github.com/eclipse-cyclonedds/cyclonedds -b releases/0.10.x &&\ +cd .. && colcon build --packages-select cyclonedds && source /opt/ros/humble/setup.bash && colcon build + +# copy the required scripts and source files +COPY ros2_nodes/m-explore-ros2 /explore_ws/src/m-explore-ros2 +# RUN cd /explore_ws && source /opt/ros/humble/setup.bash && colcon build --symlink-install + +# set the entrypoint to bash +#ENTRYPOINT ["/bin/bash"] +ENTRYPOINT ["/bin/bash", "/root/scripts/front_cam_publisher.sh"] diff --git a/deploy/docker/Dockerfile.nav2 b/deploy/docker/Dockerfile.nav2 index ed26aec..180bf00 100644 --- a/deploy/docker/Dockerfile.nav2 +++ b/deploy/docker/Dockerfile.nav2 @@ -1,148 +1,28 @@ -# FROM isaac_ros_dev-aarch64 -# This dockerfile can be configured via --build-arg -# Build context must be the /navigation2 root folder for COPY. -# Example build command: -# export UNDERLAY_MIXINS="debug ccache lld" -# export OVERLAY_MIXINS="debug ccache coverage-gcc lld" -# docker build -t nav2:latest \ -# --build-arg UNDERLAY_MIXINS \ -# --build-arg OVERLAY_MIXINS ./ -ARG FROM_IMAGE=ros:rolling -ARG UNDERLAY_WS=/opt/underlay_ws -ARG OVERLAY_WS=/opt/overlay_ws - -# multi-stage for caching -FROM $FROM_IMAGE AS cacher - -# clone underlay source -ARG UNDERLAY_WS -WORKDIR $UNDERLAY_WS/src -# Clone the repositories -RUN cd /home && mkdir nav2_ws && cd nav2_ws && mkdir src && cd src && \ - git clone -b master https://github.com/BehaviorTree/BehaviorTree.CPP.git && \ - git clone -b ros2 https://github.com/ros/angles.git && \ - git clone -b rolling https://github.com/ros-perception/vision_opencv.git && \ - git clone -b ros2 https://github.com/ros/bond_core.git && \ - git clone -b ros2 https://github.com/ros/diagnostics.git && \ - git clone -b ros2 https://github.com/ros-geographic-info/geographic_info.git && \ - git clone -b main https://github.com/ompl/ompl.git && \ - git clone -b ros2 https://github.com/cra-ros-pkg/robot_localization.git && \ - git clone -b 1.0.1 https://github.com/ros-navigation/nav2_minimal_turtlebot_simulation.git - -# copy overlay source -ARG OVERLAY_WS -WORKDIR $OVERLAY_WS/src -RUN git clone https://github.com/ros-navigation/navigation2.git && git clone https://github.com/SteveMacenski/slam_toolbox.git -b ros2 - -# copy manifests for caching -WORKDIR /opt -RUN find . -name "src" -type d \ - -mindepth 1 -maxdepth 2 -printf '%P\n' \ - | xargs -I % mkdir -p /tmp/opt/% && \ - find . -name "package.xml" \ - | xargs cp --parents -t /tmp/opt && \ - find . -name "COLCON_IGNORE" \ - | xargs cp --parents -t /tmp/opt || true - -# multi-stage for building -FROM $FROM_IMAGE AS builder - -# config dependencies install -ARG DEBIAN_FRONTEND=noninteractive -RUN echo '\ -APT::Install-Recommends "0";\n\ -APT::Install-Suggests "0";\n\ -' > /etc/apt/apt.conf.d/01norecommend -ENV PYTHONUNBUFFERED 1 - -# install CI dependencies -ARG RTI_NC_LICENSE_ACCEPTED=yes -RUN apt-get update && \ - apt-get upgrade -y --with-new-pkgs && \ - apt-get install -y \ - ccache \ - lcov \ - lld \ - python3-pip \ - ros-$ROS_DISTRO-rmw-fastrtps-cpp \ - ros-$ROS_DISTRO-rmw-connextdds \ - ros-$ROS_DISTRO-rmw-cyclonedds-cpp \ - ros-$ROS_DISTRO-rmw-cyclonedds-cpp\ - ros-$ROS_DISTRO-rosidl-generator-dds-idl \ - && pip3 install --break-system-packages \ - fastcov \ - git+https://github.com/ruffsl/colcon-cache.git@a937541bfc496c7a267db7ee9d6cceca61e470ca \ - git+https://github.com/ruffsl/colcon-clean.git@a7f1074d1ebc1a54a6508625b117974f2672f2a9 \ - && rosdep update \ - && colcon mixin update \ - && colcon metadata update \ +FROM robocaster/navigation2:aarch64 +ENV DEBIAN_FRONTEND=noninteractive +SHELL ["/bin/bash", "-c"] +# uodate and install dependencies +RUN apt-get update && apt-get install -y \ + ros-rolling-rmw-cyclonedds-cpp ros-rolling-rosidl-generator-dds-idl \ + libyaml-cpp-dev \ + libboost-all-dev\ + build-essential \ + cmake \ + git \ && rm -rf /var/lib/apt/lists/* -# install underlay dependencies -ARG UNDERLAY_WS -ENV UNDERLAY_WS $UNDERLAY_WS -WORKDIR $UNDERLAY_WS -COPY --from=cacher /tmp/$UNDERLAY_WS ./ -RUN . /opt/ros/$ROS_DISTRO/setup.sh && \ - apt-get update && rosdep install -q -y \ - --from-paths src \ - --skip-keys " \ - slam_toolbox \ - " \ - --ignore-src \ - && rm -rf /var/lib/apt/lists/* - -# build underlay source -COPY --from=cacher $UNDERLAY_WS ./ -ARG UNDERLAY_MIXINS="release ccache lld" -ARG CCACHE_DIR="$UNDERLAY_WS/.ccache" -RUN . /opt/ros/$ROS_DISTRO/setup.sh && \ - colcon cache lock && \ - colcon build \ - --symlink-install \ - --mixin $UNDERLAY_MIXINS \ - --event-handlers console_direct+ \ - --cmake-args -DCMAKE_BUILD_TYPE=Release - -# install overlay dependencies -ARG OVERLAY_WS -ENV OVERLAY_WS $OVERLAY_WS -WORKDIR $OVERLAY_WS -COPY --from=cacher /tmp/$OVERLAY_WS ./ - -RUN . $UNDERLAY_WS/install/setup.sh && \ - apt-get update && rosdep install -q -y \ - --from-paths src \ - --skip-keys " \ - slam_toolbox \ - "\ - --ignore-src \ - && rm -rf /var/lib/apt/lists/* - -# multi-stage for testing -FROM builder AS tester - -# build overlay source -COPY --from=cacher $OVERLAY_WS ./ -ARG OVERLAY_MIXINS="release ccache lld" -ARG CCACHE_DIR="$OVERLAY_WS/.ccache" -RUN . $UNDERLAY_WS/install/setup.sh && \ - colcon cache lock && \ - colcon build \ - --symlink-install \ - --mixin $OVERLAY_MIXINS \ - --cmake-args -DCMAKE_BUILD_TYPE=Release - -# source overlay from entrypoint -RUN sed --in-place \ - 's|^source .*|source "$OVERLAY_WS/install/setup.bash"|' \ - /ros_entrypoint.sh - +# Cheange the ROS2 RMW to CycloneDDS as instructed by Unitree +RUN cd / && git clone https://github.com/unitreerobotics/unitree_ros2 && cd /unitree_ros2/cyclonedds_ws/src && \ +git clone https://github.com/ros2/rmw_cyclonedds -b rolling && git clone https://github.com/eclipse-cyclonedds/cyclonedds -b releases/0.10.x &&\ +cd .. && colcon build --packages-select cyclonedds && source /opt/ros/rolling/setup.bash && colcon build # copy the go2py ros2 nodes -COPY ros2_nodes/m-explore-ros2 /home/nav2_ws/src/m-explore-ros2 -# COPY ros2_nodes/sportmode_nav2 /home/nav2_ws/src/sportmode_nav2 -# RUN cd /home/nav2_ws && source /opt/ros/rolling/setup.bash && \ -# colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release --symlink-install +# COPY ros2_nodes/go2py_messages /bridge_ws/src/go2py_messages +# RUN cd /bridge_ws && source /opt/ros/humble/setup.bash && source /unitree_ros2/cyclonedds_ws/install/setup.bash && colcon build --symlink-install -ENTRYPOINT ["/bin/bash"] +# Copy the script to start the nodes +COPY docker/scripts /root/scripts +COPY launch_files /root/launch + +# set the entrypoint to bash +ENTRYPOINT ["/bin/bash", "/root/scripts/nav2_start.sh"] diff --git a/deploy/docker/Dockerfile.nav2_source b/deploy/docker/Dockerfile.nav2_source new file mode 100644 index 0000000..14ab7e8 --- /dev/null +++ b/deploy/docker/Dockerfile.nav2_source @@ -0,0 +1,148 @@ +# FROM isaac_ros_dev-aarch64 +# This dockerfile can be configured via --build-arg +# Build context must be the /navigation2 root folder for COPY. +# Example build command: +# export UNDERLAY_MIXINS="debug ccache lld" +# export OVERLAY_MIXINS="debug ccache coverage-gcc lld" +# docker build -t nav2:latest \ +# --build-arg UNDERLAY_MIXINS \ +# --build-arg OVERLAY_MIXINS ./ +ARG FROM_IMAGE=ros:rolling +ARG UNDERLAY_WS=/opt/underlay_ws +ARG OVERLAY_WS=/opt/overlay_ws + +# multi-stage for caching +FROM $FROM_IMAGE AS cacher + +# clone underlay source +ARG UNDERLAY_WS +WORKDIR $UNDERLAY_WS/src +# Clone the repositories +RUN cd /home && mkdir nav2_ws && cd nav2_ws && mkdir src && cd src && \ + git clone -b master https://github.com/BehaviorTree/BehaviorTree.CPP.git && \ + git clone -b ros2 https://github.com/ros/angles.git && \ + git clone -b rolling https://github.com/ros-perception/vision_opencv.git && \ + git clone -b ros2 https://github.com/ros/bond_core.git && \ + git clone -b ros2 https://github.com/ros/diagnostics.git && \ + git clone -b ros2 https://github.com/ros-geographic-info/geographic_info.git && \ + git clone -b main https://github.com/ompl/ompl.git && \ + git clone -b ros2 https://github.com/cra-ros-pkg/robot_localization.git && \ + git clone -b 1.0.1 https://github.com/ros-navigation/nav2_minimal_turtlebot_simulation.git + +# copy overlay source +ARG OVERLAY_WS +WORKDIR $OVERLAY_WS/src +RUN git clone https://github.com/ros-navigation/navigation2.git && git clone https://github.com/SteveMacenski/slam_toolbox.git -b ros2 + +# copy manifests for caching +WORKDIR /opt +RUN find . -name "src" -type d \ + -mindepth 1 -maxdepth 2 -printf '%P\n' \ + | xargs -I % mkdir -p /tmp/opt/% && \ + find . -name "package.xml" \ + | xargs cp --parents -t /tmp/opt && \ + find . -name "COLCON_IGNORE" \ + | xargs cp --parents -t /tmp/opt || true + +# multi-stage for building +FROM $FROM_IMAGE AS builder + +# config dependencies install +ARG DEBIAN_FRONTEND=noninteractive +RUN echo '\ +APT::Install-Recommends "0";\n\ +APT::Install-Suggests "0";\n\ +' > /etc/apt/apt.conf.d/01norecommend +ENV PYTHONUNBUFFERED 1 + +# install CI dependencies +ARG RTI_NC_LICENSE_ACCEPTED=yes +RUN apt-get update && \ + apt-get upgrade -y --with-new-pkgs && \ + apt-get install -y \ + ccache \ + lcov \ + lld \ + python3-pip \ + ros-$ROS_DISTRO-rmw-fastrtps-cpp \ + ros-$ROS_DISTRO-rmw-connextdds \ + ros-$ROS_DISTRO-rmw-cyclonedds-cpp \ + ros-$ROS_DISTRO-rmw-cyclonedds-cpp\ + ros-$ROS_DISTRO-rosidl-generator-dds-idl \ + && pip3 install --break-system-packages \ + fastcov \ + git+https://github.com/ruffsl/colcon-cache.git@a937541bfc496c7a267db7ee9d6cceca61e470ca \ + git+https://github.com/ruffsl/colcon-clean.git@a7f1074d1ebc1a54a6508625b117974f2672f2a9 \ + && rosdep update \ + && colcon mixin update \ + && colcon metadata update \ + && rm -rf /var/lib/apt/lists/* + +# install underlay dependencies +ARG UNDERLAY_WS +ENV UNDERLAY_WS $UNDERLAY_WS +WORKDIR $UNDERLAY_WS +COPY --from=cacher /tmp/$UNDERLAY_WS ./ +RUN . /opt/ros/$ROS_DISTRO/setup.sh && \ + apt-get update && rosdep install -q -y \ + --from-paths src \ + --skip-keys " \ + slam_toolbox \ + " \ + --ignore-src \ + && rm -rf /var/lib/apt/lists/* + +# build underlay source +COPY --from=cacher $UNDERLAY_WS ./ +ARG UNDERLAY_MIXINS="release ccache lld" +ARG CCACHE_DIR="$UNDERLAY_WS/.ccache" +RUN . /opt/ros/$ROS_DISTRO/setup.sh && \ + colcon cache lock && \ + colcon build \ + --symlink-install \ + --mixin $UNDERLAY_MIXINS \ + --event-handlers console_direct+ \ + --cmake-args -DCMAKE_BUILD_TYPE=Release + +# install overlay dependencies +ARG OVERLAY_WS +ENV OVERLAY_WS $OVERLAY_WS +WORKDIR $OVERLAY_WS +COPY --from=cacher /tmp/$OVERLAY_WS ./ + +RUN . $UNDERLAY_WS/install/setup.sh && \ + apt-get update && rosdep install -q -y \ + --from-paths src \ + --skip-keys " \ + slam_toolbox \ + "\ + --ignore-src \ + && rm -rf /var/lib/apt/lists/* + +# multi-stage for testing +FROM builder AS tester + +# build overlay source +COPY --from=cacher $OVERLAY_WS ./ +ARG OVERLAY_MIXINS="release ccache lld" +ARG CCACHE_DIR="$OVERLAY_WS/.ccache" +RUN . $UNDERLAY_WS/install/setup.sh && \ + colcon cache lock && \ + colcon build \ + --symlink-install \ + --mixin $OVERLAY_MIXINS \ + --cmake-args -DCMAKE_BUILD_TYPE=Release + +# source overlay from entrypoint +RUN sed --in-place \ + 's|^source .*|source "$OVERLAY_WS/install/setup.bash"|' \ + /ros_entrypoint.sh + + +# copy the go2py ros2 nodes +# COPY ros2_nodes/m-explore-ros2 /home/nav2_ws/src/m-explore-ros2 +# COPY ros2_nodes/sportmode_nav2 /home/nav2_ws/src/sportmode_nav2 +# RUN cd /home/nav2_ws && source /opt/ros/rolling/setup.bash && \ +# colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release --symlink-install + +ENTRYPOINT ["/bin/bash"] diff --git a/deploy/docker/scripts/mexplore_start.sh b/deploy/docker/scripts/mexplore_start.sh new file mode 100644 index 0000000..e640470 --- /dev/null +++ b/deploy/docker/scripts/mexplore_start.sh @@ -0,0 +1,7 @@ +source /opt/ros/humble/setup.bash +source /unitree_ros2/cyclonedds_ws/install/setup.bash +export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp +export CYCLONEDDS_URI=' + + ' +source /explore_ws/install/setup.bash && /bin/bash \ No newline at end of file diff --git a/deploy/docker/scripts/nav2_start.sh b/deploy/docker/scripts/nav2_start.sh new file mode 100644 index 0000000..a14cacd --- /dev/null +++ b/deploy/docker/scripts/nav2_start.sh @@ -0,0 +1,7 @@ +source /opt/ros/rolling/setup.bash +source /unitree_ros2/cyclonedds_ws/install/setup.bash +export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp +export CYCLONEDDS_URI=' + + ' +source /opt/overlay_ws/install/setup.bash && /bin/bash \ No newline at end of file diff --git a/deploy/ros2_nodes/sportmode_nav2/launch/cbf_navigation_launch.py b/deploy/ros2_nodes/sportmode_nav2/launch/cbf_navigation_launch.py deleted file mode 100644 index 2231a26..0000000 --- a/deploy/ros2_nodes/sportmode_nav2/launch/cbf_navigation_launch.py +++ /dev/null @@ -1,272 +0,0 @@ -# Copyright (c) 2018 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os - -from ament_index_python.packages import get_package_share_directory - -from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, GroupAction, SetEnvironmentVariable -from launch.conditions import IfCondition -from launch.substitutions import LaunchConfiguration, PythonExpression -from launch_ros.actions import LoadComposableNodes -from launch_ros.actions import Node -from launch_ros.descriptions import ComposableNode, ParameterFile -from nav2_common.launch import RewrittenYaml - - -def generate_launch_description(): - # Get the launch directory - bringup_dir = get_package_share_directory('sportmode_nav2') - - namespace = LaunchConfiguration('namespace') - use_sim_time = LaunchConfiguration('use_sim_time', default='false') - autostart = LaunchConfiguration('autostart') - params_file = LaunchConfiguration('params_file') - use_composition = LaunchConfiguration('use_composition') - container_name = LaunchConfiguration('container_name') - container_name_full = (namespace, '/', container_name) - use_respawn = LaunchConfiguration('use_respawn') - log_level = LaunchConfiguration('log_level') - - lifecycle_nodes = ['controller_server', - 'smoother_server', - 'planner_server', - 'behavior_server', - 'bt_navigator', - 'waypoint_follower', - 'velocity_smoother'] - - # Map fully qualified names to relative ones so the node's namespace can be prepended. - # In case of the transforms (tf), currently, there doesn't seem to be a better alternative - # https://github.com/ros/geometry2/issues/32 - # https://github.com/ros/robot_state_publisher/pull/30 - # TODO(orduno) Substitute with `PushNodeRemapping` - # https://github.com/ros2/launch_ros/issues/56 - remappings = [('/tf', 'tf'), - ('/tf_static', 'tf_static'), ('/cmd_vel', '/nav2/cmd_vel')] - - # Create our own temporary YAML files that include substitutions - param_substitutions = { - 'use_sim_time': use_sim_time, - 'autostart': autostart} - - configured_params = ParameterFile( - RewrittenYaml( - source_file=params_file, - root_key=namespace, - param_rewrites=param_substitutions, - convert_types=True), - allow_substs=True) - - stdout_linebuf_envvar = SetEnvironmentVariable( - 'RCUTILS_LOGGING_BUFFERED_STREAM', '1') - - declare_namespace_cmd = DeclareLaunchArgument( - 'namespace', - default_value='', - description='Top-level namespace') - - declare_use_sim_time_cmd = DeclareLaunchArgument( - 'use_sim_time', - default_value='false', - description='Use simulation (Gazebo) clock if true') - - declare_params_file_cmd = DeclareLaunchArgument( - 'params_file', - default_value=os.path.join(bringup_dir, 'params', 'nav2_params.yaml'), - description='Full path to the ROS2 parameters file to use for all launched nodes') - - declare_autostart_cmd = DeclareLaunchArgument( - 'autostart', default_value='true', - description='Automatically startup the nav2 stack') - - declare_use_composition_cmd = DeclareLaunchArgument( - 'use_composition', default_value='False', - description='Use composed bringup if True') - - declare_container_name_cmd = DeclareLaunchArgument( - 'container_name', default_value='nav2_container', - description='the name of conatiner that nodes will load in if use composition') - - declare_use_respawn_cmd = DeclareLaunchArgument( - 'use_respawn', default_value='False', - description='Whether to respawn if a node crashes. Applied when composition is disabled.') - - declare_log_level_cmd = DeclareLaunchArgument( - 'log_level', default_value='info', - description='log level') - - load_nodes = GroupAction( - condition=IfCondition(PythonExpression(['not ', use_composition])), - actions=[ - Node( - package='nav2_controller', - executable='controller_server', - output='screen', - respawn=use_respawn, - respawn_delay=2.0, - parameters=[configured_params], - arguments=['--ros-args', '--log-level', log_level], - remappings=remappings + [('cmd_vel', 'cmd_vel_nav')]), - Node( - package='nav2_smoother', - executable='smoother_server', - name='smoother_server', - output='screen', - respawn=use_respawn, - respawn_delay=2.0, - parameters=[configured_params], - arguments=['--ros-args', '--log-level', log_level], - remappings=remappings), - Node( - package='nav2_planner', - executable='planner_server', - name='planner_server', - output='screen', - respawn=use_respawn, - respawn_delay=2.0, - parameters=[configured_params], - arguments=['--ros-args', '--log-level', log_level], - remappings=remappings), - Node( - package='nav2_behaviors', - executable='behavior_server', - name='behavior_server', - output='screen', - respawn=use_respawn, - respawn_delay=2.0, - parameters=[configured_params], - arguments=['--ros-args', '--log-level', log_level], - remappings=remappings), - Node( - package='nav2_bt_navigator', - executable='bt_navigator', - name='bt_navigator', - output='screen', - respawn=use_respawn, - respawn_delay=2.0, - parameters=[configured_params], - arguments=['--ros-args', '--log-level', log_level], - remappings=remappings), - Node( - package='nav2_waypoint_follower', - executable='waypoint_follower', - name='waypoint_follower', - output='screen', - respawn=use_respawn, - respawn_delay=2.0, - parameters=[configured_params], - arguments=['--ros-args', '--log-level', log_level], - remappings=remappings), - Node( - package='nav2_velocity_smoother', - executable='velocity_smoother', - name='velocity_smoother', - output='screen', - respawn=use_respawn, - respawn_delay=2.0, - parameters=[configured_params], - arguments=['--ros-args', '--log-level', log_level], - remappings=remappings + - [('cmd_vel', 'cmd_vel_nav'), ('cmd_vel_smoothed', 'cmd_vel')]), - Node( - package='nav2_lifecycle_manager', - executable='lifecycle_manager', - name='lifecycle_manager_navigation', - output='screen', - arguments=['--ros-args', '--log-level', log_level], - parameters=[{'use_sim_time': use_sim_time}, - {'autostart': autostart}, - {'node_names': lifecycle_nodes}]), - ] - ) - - load_composable_nodes = LoadComposableNodes( - condition=IfCondition(use_composition), - target_container=container_name_full, - composable_node_descriptions=[ - ComposableNode( - package='nav2_controller', - plugin='nav2_controller::ControllerServer', - name='controller_server', - parameters=[configured_params], - remappings=remappings + [('cmd_vel', 'cmd_vel_nav')]), - ComposableNode( - package='nav2_smoother', - plugin='nav2_smoother::SmootherServer', - name='smoother_server', - parameters=[configured_params], - remappings=remappings), - ComposableNode( - package='nav2_planner', - plugin='nav2_planner::PlannerServer', - name='planner_server', - parameters=[configured_params], - remappings=remappings), - ComposableNode( - package='nav2_behaviors', - plugin='behavior_server::BehaviorServer', - name='behavior_server', - parameters=[configured_params], - remappings=remappings), - ComposableNode( - package='nav2_bt_navigator', - plugin='nav2_bt_navigator::BtNavigator', - name='bt_navigator', - parameters=[configured_params], - remappings=remappings), - ComposableNode( - package='nav2_waypoint_follower', - plugin='nav2_waypoint_follower::WaypointFollower', - name='waypoint_follower', - parameters=[configured_params], - remappings=remappings), - ComposableNode( - package='nav2_velocity_smoother', - plugin='nav2_velocity_smoother::VelocitySmoother', - name='velocity_smoother', - parameters=[configured_params], - remappings=remappings + - [('cmd_vel', 'cmd_vel_nav'), ('cmd_vel_smoothed', 'cmd_vel')]), - ComposableNode( - package='nav2_lifecycle_manager', - plugin='nav2_lifecycle_manager::LifecycleManager', - name='lifecycle_manager_navigation', - parameters=[{'use_sim_time': use_sim_time, - 'autostart': autostart, - 'node_names': lifecycle_nodes}]), - ], - ) - - # Create the launch description and populate - ld = LaunchDescription() - - # Set environment variables - ld.add_action(stdout_linebuf_envvar) - - # Declare the launch options - ld.add_action(declare_namespace_cmd) - ld.add_action(declare_use_sim_time_cmd) - ld.add_action(declare_params_file_cmd) - ld.add_action(declare_autostart_cmd) - ld.add_action(declare_use_composition_cmd) - ld.add_action(declare_container_name_cmd) - ld.add_action(declare_use_respawn_cmd) - ld.add_action(declare_log_level_cmd) - # Add the actions to launch all of the navigation nodes - ld.add_action(load_nodes) - ld.add_action(load_composable_nodes) - - return ld diff --git a/deploy/ros2_nodes/sportmode_nav2/launch/navigation.launch.py b/deploy/ros2_nodes/sportmode_nav2/launch/navigation.launch.py deleted file mode 100644 index 0df875a..0000000 --- a/deploy/ros2_nodes/sportmode_nav2/launch/navigation.launch.py +++ /dev/null @@ -1,146 +0,0 @@ -# Copyright (c) 2018 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os - -from ament_index_python.packages import get_package_share_directory - -from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, SetEnvironmentVariable -from launch.substitutions import LaunchConfiguration -from launch_ros.actions import Node -from nav2_common.launch import RewrittenYaml - - -def generate_launch_description(): - # Get the launch directory - bringup_dir = get_package_share_directory('sportmode_nav2') - - namespace = LaunchConfiguration('namespace') - use_sim_time = LaunchConfiguration('use_sim_time') - autostart = LaunchConfiguration('autostart') - params_file = LaunchConfiguration('params_file') - default_bt_xml_filename = LaunchConfiguration('default_bt_xml_filename') - map_subscribe_transient_local = LaunchConfiguration('map_subscribe_transient_local') - - lifecycle_nodes = ['controller_server', - 'planner_server', - 'recoveries_server', - 'bt_navigator', - 'waypoint_follower'] - - # Map fully qualified names to relative ones so the node's namespace can be prepended. - # In case of the transforms (tf), currently, there doesn't seem to be a better alternative - # https://github.com/ros/geometry2/issues/32 - # https://github.com/ros/robot_state_publisher/pull/30 - # TODO(orduno) Substitute with `PushNodeRemapping` - # https://github.com/ros2/launch_ros/issues/56 - remappings = [('/tf', '/tf'), - ('/tf_static', '/tf_static'), - ('/cmd_vel', '/go2/cmd_vel')] - - # Create our own temporary YAML files that include substitutions - param_substitutions = { - 'use_sim_time': use_sim_time, - 'default_bt_xml_filename': default_bt_xml_filename, - 'autostart': autostart, - 'map_subscribe_transient_local': map_subscribe_transient_local} - - configured_params = RewrittenYaml( - source_file=params_file, - root_key=namespace, - param_rewrites=param_substitutions, - convert_types=True) - - return LaunchDescription([ - # Set env var to print messages to stdout immediately - SetEnvironmentVariable('RCUTILS_LOGGING_BUFFERED_STREAM', '1'), - - DeclareLaunchArgument( - 'namespace', default_value='', - description='Top-level namespace'), - - DeclareLaunchArgument( - 'use_sim_time', default_value='false', - description='Use simulation (Gazebo) clock if true'), - - DeclareLaunchArgument( - 'autostart', default_value='true', - description='Automatically startup the nav2 stack'), - - DeclareLaunchArgument( - 'params_file', - default_value=os.path.join(bringup_dir, 'params', 'nav2_params.yaml'), - description='Full path to the ROS2 parameters file to use'), - - DeclareLaunchArgument( - 'default_bt_xml_filename', - default_value=os.path.join( - get_package_share_directory('nav2_bt_navigator'), - 'behavior_trees', 'navigate_w_replanning_and_recovery.xml'), - description='Full path to the behavior tree xml file to use'), - - DeclareLaunchArgument( - 'map_subscribe_transient_local', default_value='false', - description='Whether to set the map subscriber QoS to transient local'), - - Node( - package='nav2_controller', - executable='controller_server', - output='screen', - parameters=[configured_params], - remappings=remappings), - - Node( - package='nav2_planner', - executable='planner_server', - name='planner_server', - output='screen', - parameters=[configured_params], - remappings=remappings), - - Node( - package='nav2_recoveries', - executable='recoveries_server', - name='recoveries_server', - output='screen', - parameters=[configured_params], - remappings=remappings), - - Node( - package='nav2_bt_navigator', - executable='bt_navigator', - name='bt_navigator', - output='screen', - parameters=[configured_params], - remappings=remappings), - - Node( - package='nav2_waypoint_follower', - executable='waypoint_follower', - name='waypoint_follower', - output='screen', - parameters=[configured_params], - remappings=remappings), - - Node( - package='nav2_lifecycle_manager', - executable='lifecycle_manager', - name='lifecycle_manager_navigation', - output='screen', - parameters=[{'use_sim_time': use_sim_time}, - {'autostart': autostart}, - {'node_names': lifecycle_nodes}]), - - ]) diff --git a/deploy/ros2_nodes/sportmode_nav2/params/mapping_async.yaml b/deploy/ros2_nodes/sportmode_nav2/params/mapping_async.yaml deleted file mode 100644 index 926356e..0000000 --- a/deploy/ros2_nodes/sportmode_nav2/params/mapping_async.yaml +++ /dev/null @@ -1,73 +0,0 @@ -slam_toolbox: - ros__parameters: - - # Plugin params - solver_plugin: solver_plugins::CeresSolver - ceres_linear_solver: SPARSE_NORMAL_CHOLESKY - ceres_preconditioner: SCHUR_JACOBI - ceres_trust_strategy: LEVENBERG_MARQUARDT - ceres_dogleg_type: TRADITIONAL_DOGLEG - ceres_loss_function: None - - # ROS Parameters - odom_frame: odom - map_frame: map - base_frame: base_link # ToDo: add a base_footprint to the URDF - scan_topic: /go2/scan - mode: mapping #localization - - # if you'd like to immediately start continuing a map at a given pose - # or at the dock, but they are mutually exclusive, if pose is given - # will use pose - #map_file_name: test_steve - # map_start_pose: [0.0, 0.0, 0.0] - #map_start_at_dock: true - - debug_logging: false - throttle_scans: 1 - transform_publish_period: 0.02 #if 0 never publishes odometry - map_update_interval: 5.0 - resolution: 0.05 - max_laser_range: 5.0 #for rastering images - minimum_time_interval: 0.5 - transform_timeout: 0.2 - tf_buffer_duration: 30. - stack_size_to_use: 40000000 #// program needs a larger stack size to serialize large maps - enable_interactive_mode: true - - # General Parameters - use_scan_matching: true - use_scan_barycenter: true - minimum_travel_distance: 0.5 - minimum_travel_heading: 0.5 - scan_buffer_size: 10 - scan_buffer_maximum_scan_distance: 10.0 - link_match_minimum_response_fine: 0.1 - link_scan_maximum_distance: 1.5 - loop_search_maximum_distance: 3.0 - do_loop_closing: true - loop_match_minimum_chain_size: 10 - loop_match_maximum_variance_coarse: 3.0 - loop_match_minimum_response_coarse: 0.35 - loop_match_minimum_response_fine: 0.45 - - # Correlation Parameters - Correlation Parameters - correlation_search_space_dimension: 0.5 - correlation_search_space_resolution: 0.01 - correlation_search_space_smear_deviation: 0.1 - - # Correlation Parameters - Loop Closure Parameters - loop_search_space_dimension: 8.0 - loop_search_space_resolution: 0.05 - loop_search_space_smear_deviation: 0.03 - - # Scan Matcher Parameters - distance_variance_penalty: 0.5 - angle_variance_penalty: 1.0 - - fine_search_angle_offset: 0.00349 - coarse_search_angle_offset: 0.349 - coarse_angle_resolution: 0.0349 - minimum_angle_penalty: 0.9 - minimum_distance_penalty: 0.5 - use_response_expansion: true diff --git a/scripts/run_mexplore.sh b/scripts/run_mexplore.sh new file mode 100755 index 0000000..b1c506c --- /dev/null +++ b/scripts/run_mexplore.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +CONTAINER_NAME="go2py_mexplore" + +# Function to print usage +function usage() { + echo "Usage: run_mexplore.sh" +} + +# Function to check if docker command succeeded +function check_docker() { + if [ $? -ne 0 ]; then + echo "Docker command failed. Please check your Docker installation." + exit 1 + fi +} + +# Prevent running as root +if [ $(id -u) -eq 0 ]; then + echo "This script cannot be executed with root privileges." + echo "Please re-run without sudo and configure docker for non-root user if needed." + exit 1 +fi + +# Check if user can run docker without root +if [[ ! $(groups $USER) =~ docker ]]; then + echo "User |$USER| is not a member of the 'docker' group and cannot run docker commands without sudo." + echo "Run 'sudo usermod -aG docker \$USER && newgrp docker' to add user to 'docker' group, then re-run this script." + echo "See: https://docs.docker.com/engine/install/linux-postinstall/" + exit 1 +fi + +# Check if able to run docker commands +docker ps &>/dev/null +check_docker + +# Check if the container is running +if [ "$(docker ps -q -f name=$CONTAINER_NAME)" ]; then + echo "Attaching to running container: $CONTAINER_NAME" + docker exec -it --workdir /home/nav2_ws $CONTAINER_NAME /bin/bash + check_docker +else + echo "Starting new container: $CONTAINER_NAME" + sudo docker run -it --rm --name $CONTAINER_NAME --privileged --network host --ipc=host -v $(pwd)/deploy/ros2_nodes/m-explore-ros2:/home/explore_ws/src/m-explore-ros2 -v /dev/*:/dev/* -v /etc/localtime:/etc/localtime:ro --workdir /home/explore_ws go2py_mexplore:latest + check_docker +fi diff --git a/scripts/run_nav2.sh b/scripts/run_nav2.sh index 6ed9a32..6df3834 100755 --- a/scripts/run_nav2.sh +++ b/scripts/run_nav2.sh @@ -41,6 +41,6 @@ if [ "$(docker ps -q -f name=$CONTAINER_NAME)" ]; then check_docker else echo "Starting new container: $CONTAINER_NAME" - sudo docker run -it --rm --name $CONTAINER_NAME --privileged --network host --ipc=host -v $(pwd)/deploy/ros2_nodes/sportmode_nav2:/home/nav2_ws/src/sportmode_nav2 -v /dev/*:/dev/* -v /etc/localtime:/etc/localtime:ro -v /home/unitree/Go2Py/deploy/SGNav/llm_planner:/home/llm_planner --runtime nvidia --workdir /home/nav2_ws go2py_nav2:latest + sudo docker run -it --rm --name $CONTAINER_NAME --privileged --network host --ipc=host -v $(pwd)/deploy/ros2_nodes/sportmode_nav2:/home/nav2_ws/src/sportmode_nav2 -v /dev/*:/dev/* -v /etc/localtime:/etc/localtime:ro -v /home/unitree/Go2Py/deploy/SGNav/llm_planner:/home/llm_planner --workdir /home/nav2_ws go2py_nav2:latest check_docker fi