From fd6d730b3e5943a6482c7742d753b82f86e33fc5 Mon Sep 17 00:00:00 2001 From: rafal-gorecki <126687345+rafal-gorecki@users.noreply.github.com> Date: Wed, 15 May 2024 18:04:30 +0200 Subject: [PATCH] Add controller config path (#70) * Add controller_config_path arg * Add deprecated info * Readme update * pre-commit * spellcheck * Use pre-commit action instead spellcheck * Black inside pre-commit * Remove local repos from pre-commit * Update version * Fix noise --- .github/workflows/industrial_ci.yaml | 23 ++-- .pre-commit-config.yaml | 35 +++--- .wordlist.txt | 101 ----------------- README.md | 2 +- ROS_API.md | 4 +- rosbot_xl_bringup/launch/bringup.launch.py | 21 +++- rosbot_xl_bringup/launch/combined.launch.py | 6 ++ rosbot_xl_bringup/launch/microros.launch.py | 102 ++++++++++++++++++ .../launch/controller.launch.py | 20 ++-- rosbot_xl_description/urdf/gazebo.urdf.xacro | 85 +++++++++++++++ .../urdf/rosbot_xl.urdf.xacro | 41 +++---- .../urdf/rosbot_xl_macro.urdf.xacro | 58 ++-------- rosbot_xl_description/urdf/webots.urdf.xacro | 19 ++++ .../rosbot_xl_utils/flash_firmware.py | 4 +- wordlist.dic | Bin 2368 -> 0 bytes 15 files changed, 301 insertions(+), 220 deletions(-) delete mode 100644 .wordlist.txt create mode 100644 rosbot_xl_bringup/launch/microros.launch.py create mode 100644 rosbot_xl_description/urdf/gazebo.urdf.xacro create mode 100644 rosbot_xl_description/urdf/webots.urdf.xacro delete mode 100644 wordlist.dic diff --git a/.github/workflows/industrial_ci.yaml b/.github/workflows/industrial_ci.yaml index c96d356b..e1ab4a16 100644 --- a/.github/workflows/industrial_ci.yaml +++ b/.github/workflows/industrial_ci.yaml @@ -7,28 +7,19 @@ on: jobs: - black: - name: Black - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: psf/black@stable - with: - options: --line-length=99 - spellcheck: - name: Spellcheck + pre-commit: + name: pre-commit runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: rojopolis/spellcheck-github-actions@0.33.1 - name: Spellcheck + - uses: actions/checkout@v4 + - uses: actions/setup-python@v4 + - uses: pre-commit/action@v3.0.1 ros_industrial_ci: name: ROS Industrial CI needs: - - black - - spellcheck + - pre-commit strategy: fail-fast: false matrix: @@ -37,7 +28,7 @@ jobs: timeout-minutes: 30 steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup ROS2 Workspace and Clone Repositories run: | diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 40977956..22381d7b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,25 +51,26 @@ repos: - id: isort args: [--profile, black] - - repo: local - hooks: - - id: ament_lint_cmake - name: ament_lint_cmake - description: Check format of CMakeLists.txt files. - entry: ament_lint_cmake - language: system - files: CMakeLists\.txt$ + # Need to figure out how o check local repos in action + # - repo: local + # hooks: + # - id: ament_lint_cmake + # name: ament_lint_cmake + # description: Check format of CMakeLists.txt files. + # entry: ament_lint_cmake + # language: system + # files: CMakeLists\.txt$ - - repo: local - hooks: - - id: ament_copyright - name: ament_copyright - description: Check if copyright notice is available in all files. - stages: [commit] - entry: ament_copyright - language: system + # - repo: local + # hooks: + # - id: ament_copyright + # name: ament_copyright + # description: Check if copyright notice is available in all files. + # stages: [commit] + # entry: ament_copyright + # language: system - # Docs - RestructuredText hooks + # Docs - RestructuredText hooks - repo: https://github.com/PyCQA/doc8 rev: v1.1.1 hooks: diff --git a/.wordlist.txt b/.wordlist.txt deleted file mode 100644 index 0a7ac43a..00000000 --- a/.wordlist.txt +++ /dev/null @@ -1,101 +0,0 @@ -wordlist -wordlists -pyspelling -metapackage -preconfigured -colcon -rosbot_xl_description -vcs -vcstool -rosdep -rosdistro -Dockerfiles -gamepad -teleoperation -laserscan -amcl -env -usr -ros -husarion -apache -http -www -urdf -xacro -imu -xl -rosbot -https -cmake -github -ament -Wojciechowski -Stepien -Nowak -Nikolas -ROSbot -Maciej -Krzysztof -extrinsics -Duc -Dominik -bringup -gz -ign -Jakub -Delicat -mecanum -fdir -webots -accelerometer -cmd -config -rl -rr -unstamped -vel -msg -lidar -gpu -gazebosim -msgs -nav -pytest -FIXME -TODO -nan -rclpy -utils -tf -yaml -odometry -pyftdi -usbutils -CustomUdpTransport -UDPv -SHM -UDPv -laggy -CBUS -cbus -ftdi -RST -url -subprocess -Ftdi -Microros -namespaces -namespace -delihus -microros -remappings -unbuffered -py -len -ns -psutil -src -xml -spawner -sp diff --git a/README.md b/README.md index e9a24fff..6e3d377c 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ You can find ROS API and detailed package description in [ROS_API.md](./ROS_API. ```bash source install/setup.bash - ros2 launch rosbot_xl_bringup combined.launch.py + ros2 launch rosbot_xl_bringup bringup.launch.py ``` > [!IMPORTANT] diff --git a/ROS_API.md b/ROS_API.md index 0dc25beb..248c21f7 100644 --- a/ROS_API.md +++ b/ROS_API.md @@ -14,8 +14,8 @@ Package that contains launch, which starts all base functionalities with the mic **Available Launch Files:** -- `bringup.launch.py` - is responsible for activating all logic related to the robot's movement and processing of sensory data. -- `combined.launch.py` - launches `bringup.launch.py` ​​and communication with the firmware allows you to control the robot. +- `bringup.launch.py` - is responsible for communicating with firmware and activating all logic related to the robot's movement and processing of sensory data. +- `microros.launch.py` - establishes connection with the firmware. **Launch Params:** diff --git a/rosbot_xl_bringup/launch/bringup.launch.py b/rosbot_xl_bringup/launch/bringup.launch.py index 2fd498a4..5ebbdfdb 100644 --- a/rosbot_xl_bringup/launch/bringup.launch.py +++ b/rosbot_xl_bringup/launch/bringup.launch.py @@ -14,8 +14,14 @@ from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription +from launch.conditions import UnlessCondition from launch.launch_description_sources import PythonLaunchDescriptionSource -from launch.substitutions import LaunchConfiguration, PathJoinSubstitution +from launch.substitutions import ( + LaunchConfiguration, + PathJoinSubstitution, + PythonExpression, + ThisLaunchFileDir, +) from launch_ros.actions import Node, SetParameter from launch_ros.substitutions import FindPackageShare @@ -90,6 +96,12 @@ def generate_launch_description(): description="Which simulation engine will be used", ) + combined_launch_deprecated = LaunchConfiguration("combined_launch_deprecated") + declare_combined_launch_deprecated_arg = DeclareLaunchArgument( + "combined_launch_deprecated", + default_value="False", + ) + rosbot_xl_controller = FindPackageShare("rosbot_xl_controller") rosbot_xl_bringup = FindPackageShare("rosbot_xl_bringup") @@ -150,6 +162,11 @@ def generate_launch_description(): namespace=namespace, ) + microros_launch = IncludeLaunchDescription( + PythonLaunchDescriptionSource([ThisLaunchFileDir(), "/microros.launch.py"]), + condition=UnlessCondition(PythonExpression([use_sim, " or ", combined_launch_deprecated])), + ) + return LaunchDescription( [ declare_namespace_arg, @@ -159,7 +176,9 @@ def generate_launch_description(): declare_include_camera_mount_arg, declare_use_sim_arg, declare_simulation_engine_arg, + declare_combined_launch_deprecated_arg, SetParameter(name="use_sim_time", value=use_sim), + microros_launch, controller_launch, robot_localization_node, laser_filter_node, diff --git a/rosbot_xl_bringup/launch/combined.launch.py b/rosbot_xl_bringup/launch/combined.launch.py index ce39e541..f7d1451e 100644 --- a/rosbot_xl_bringup/launch/combined.launch.py +++ b/rosbot_xl_bringup/launch/combined.launch.py @@ -154,9 +154,15 @@ def generate_launch_description(): "lidar_model": lidar_model, "camera_model": camera_model, "include_camera_mount": include_camera_mount, + "combined_launch_deprecated": LaunchConfiguration( + "combined_launch_deprecated", default=True + ), }.items(), ) + print( + "\033[93m[WARN] [launch]: combined.launch.py will be is deprecated and will be removed please use bringup.launch.py instead.\033[0m" + ) return LaunchDescription( [ declare_port_arg, diff --git a/rosbot_xl_bringup/launch/microros.launch.py b/rosbot_xl_bringup/launch/microros.launch.py new file mode 100644 index 00000000..7e5dac59 --- /dev/null +++ b/rosbot_xl_bringup/launch/microros.launch.py @@ -0,0 +1,102 @@ +# Copyright 2024 Husarion +# +# 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 launch import LaunchDescription +from launch.actions import ( + DeclareLaunchArgument, + LogInfo, + OpaqueFunction, + SetEnvironmentVariable, +) +from launch.substitutions import LaunchConfiguration, PathJoinSubstitution +from launch_ros.actions import Node +from launch_ros.substitutions import FindPackageShare + + +def generate_microros_agent_node(context, *args, **kwargs): + env_setup_actions = [] + + ros_domain_id = os.environ.get("ROS_DOMAIN_ID") + if ros_domain_id: + env_setup_actions.append( + SetEnvironmentVariable(name="XRCE_DOMAIN_ID_OVERRIDE", value=ros_domain_id) + ) + + port = LaunchConfiguration("port").perform(context) + + localhost_only_fastrtps_profiles_file = LaunchConfiguration( + "localhost_only_fastrtps_profiles_file" + ).perform(context) + + if os.environ.get("ROS_LOCALHOST_ONLY") == "1": + env_setup_actions.extend( + [ + LogInfo( + msg=[ + "ROS_LOCALHOST_ONLY set to 1. Using FASTRTPS_DEFAULT_PROFILES_FILE=", + localhost_only_fastrtps_profiles_file, + ".", + ] + ), + SetEnvironmentVariable(name="RMW_IMPLEMENTATION", value="rmw_fastrtps_cpp"), + SetEnvironmentVariable( + name="FASTRTPS_DEFAULT_PROFILES_FILE", + value=localhost_only_fastrtps_profiles_file, + ), + ] + ) + + microros_agent_node = Node( + package="micro_ros_agent", + executable="micro_ros_agent", + arguments=["udp4", "--port", port], + output="screen", + ) + + return env_setup_actions + [microros_agent_node] + + +def generate_launch_description(): + declare_port_arg = DeclareLaunchArgument( + "port", + default_value="8888", + description="UDP4 port for micro-ROS agent", + ) + + # Locate the rosbot_bringup package + package_dir = FindPackageShare("rosbot_xl_bringup").find("rosbot_xl_bringup") + + # Construct the path to the XML file within the package + fastrtps_profiles_file = PathJoinSubstitution( + [package_dir, "config", "microros_localhost_only.xml"] + ) + + declare_localhost_only_fastrtps_profiles_file_arg = DeclareLaunchArgument( + "localhost_only_fastrtps_profiles_file", + default_value=fastrtps_profiles_file, + description=( + "Path to the Fast RTPS default profiles file for Micro-ROS agent for localhost only" + " setup" + ), + ) + + return LaunchDescription( + [ + declare_port_arg, + declare_localhost_only_fastrtps_profiles_file_arg, + OpaqueFunction(function=generate_microros_agent_node), + ] + ) diff --git a/rosbot_xl_controller/launch/controller.launch.py b/rosbot_xl_controller/launch/controller.launch.py index afc3256b..bea07fc7 100644 --- a/rosbot_xl_controller/launch/controller.launch.py +++ b/rosbot_xl_controller/launch/controller.launch.py @@ -183,6 +183,14 @@ def generate_launch_description(): ] ) + controller_config_path = PathJoinSubstitution( + [ + FindPackageShare("rosbot_xl_controller"), + "config", + controller_config_name, + ] + ) + robot_description_content = Command( [ PathJoinSubstitution([FindExecutable(name="xacro")]), @@ -194,6 +202,8 @@ def generate_launch_description(): "rosbot_xl.urdf.xacro", ] ), + " controller_config_file:=", + controller_config_path, " mecanum:=", mecanum, " lidar_model:=", @@ -212,20 +222,12 @@ def generate_launch_description(): ) robot_description = {"robot_description": robot_description_content} - robot_controllers = PathJoinSubstitution( - [ - FindPackageShare("rosbot_xl_controller"), - "config", - controller_config_name, - ] - ) - control_node = Node( package="controller_manager", executable="ros2_control_node", parameters=[ robot_description, - robot_controllers, + controller_config_path, ], remappings=[ ("imu_sensor_node/imu", "/_imu/data_raw"), diff --git a/rosbot_xl_description/urdf/gazebo.urdf.xacro b/rosbot_xl_description/urdf/gazebo.urdf.xacro new file mode 100644 index 00000000..8e713259 --- /dev/null +++ b/rosbot_xl_description/urdf/gazebo.urdf.xacro @@ -0,0 +1,85 @@ + + + + + + + + + + + + + ${config_file} + + + ${namespace} + rosbot_xl_base_controller/cmd_vel_unstamped:=cmd_vel + /tf:=tf + + + + + + + + + ${mean} + ${stddev} + ${bias_mean} + ${bias_stddev} + ${precision} + + + + + + + + + + + + + + + + true + 25 + ${ns}imu/data_raw + false + false + imu_link + imu_link + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rosbot_xl_description/urdf/rosbot_xl.urdf.xacro b/rosbot_xl_description/urdf/rosbot_xl.urdf.xacro index 46b07765..0a208b28 100644 --- a/rosbot_xl_description/urdf/rosbot_xl.urdf.xacro +++ b/rosbot_xl_description/urdf/rosbot_xl.urdf.xacro @@ -8,22 +8,24 @@ + + use_sim="$(arg use_sim)" /> + parent_link="body_link" + xyz="-0.155 -0.055 0.065" + rpy="0.0 0.0 0.0" + antenna_angle="0.0" /> @@ -38,8 +40,7 @@ + rpy="${lidar_rpy}" /> @@ -48,8 +49,7 @@ + rpy="${lidar_rpy}" /> @@ -58,8 +58,7 @@ + rpy="${lidar_rpy}" /> @@ -68,8 +67,7 @@ + rpy="${lidar_rpy}" /> @@ -78,8 +76,7 @@ + rpy="${lidar_rpy}" /> @@ -88,8 +85,7 @@ + rpy="${lidar_rpy}" /> @@ -109,8 +105,7 @@ parent_link="${camera_parent_link}" xyz="${camera_xyz}" rpy="${camera_rpy}" - use_nominal_extrinsics="$(arg use_sim)" - namespace="$(arg namespace)" /> + use_nominal_extrinsics="$(arg use_sim)" /> @@ -120,8 +115,7 @@ + rpy="${camera_rpy}" /> @@ -151,8 +145,7 @@ parent_link="${camera_parent_link}" xyz="${camera_xyz}" rpy="${camera_rpy}" - model="${camera_model_type}" - namespace="$(arg namespace)" /> + model="${camera_model_type}" /> diff --git a/rosbot_xl_description/urdf/rosbot_xl_macro.urdf.xacro b/rosbot_xl_description/urdf/rosbot_xl_macro.urdf.xacro index 84d01f6c..98a75560 100644 --- a/rosbot_xl_description/urdf/rosbot_xl_macro.urdf.xacro +++ b/rosbot_xl_description/urdf/rosbot_xl_macro.urdf.xacro @@ -1,15 +1,17 @@ + params="controller_config_file + mecanum + namespace + simulation_engine + use_sim"> - - - + @@ -21,6 +23,8 @@ + + @@ -126,51 +130,11 @@ - - - - - $(find rosbot_xl_controller)/config/mecanum_drive_controller.yaml - - - $(find rosbot_xl_controller)/config/diff_drive_controller.yaml - - - - ${gz_control_namespace} - rosbot_xl_base_controller/cmd_vel_unstamped:=cmd_vel - /tf:=tf - - - - - - true - 25 - ${ns}imu/data_raw - false - false - imu_link - imu_link - - ${ns} - - - + + - - - - true - /imu_broadcaster/imu - true - imu_link - imu gyro - imu accelerometer - imu inertial_unit - - + diff --git a/rosbot_xl_description/urdf/webots.urdf.xacro b/rosbot_xl_description/urdf/webots.urdf.xacro new file mode 100644 index 00000000..1db9aeda --- /dev/null +++ b/rosbot_xl_description/urdf/webots.urdf.xacro @@ -0,0 +1,19 @@ + + + + + + + + true + /imu_broadcaster/imu + true + imu_link + imu gyro + imu accelerometer + imu inertial_unit + + + + + diff --git a/rosbot_xl_utils/rosbot_xl_utils/flash_firmware.py b/rosbot_xl_utils/rosbot_xl_utils/flash_firmware.py index 5ce127a3..c824142a 100644 --- a/rosbot_xl_utils/rosbot_xl_utils/flash_firmware.py +++ b/rosbot_xl_utils/rosbot_xl_utils/flash_firmware.py @@ -80,8 +80,8 @@ def main(args=None): parser.add_argument( "-p", "--port", - default="/dev/ttyUSB0", - help="Specify the USB port (default: /dev/ttyUSB0)", + default="/dev/ttyUSBDB", + help="Specify the USB port (default: /dev/ttyUSBDB)", ) parser.add_argument("--file", help="Specify the firmware file") diff --git a/wordlist.dic b/wordlist.dic deleted file mode 100644 index a4339c658f3b3e825599e28a2c0ad338cd80816a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2368 zcmai#U5Fc16oAj>ceA^h{oi)`W7jHGqx45a5R25XglaZv$fRyx6lN#0*=Z)3I5TP5 z1<@C&5B`Fni1;81f-hABAMA^YP!JTK3O)$FC`b_n5d=ZMGn>G&J~%LZ_nv#sx%d3s z87u5Lp10C;Hm$xFt;91YSPA@rw{q(Esgv?QPu05qAB}5BULD^N*TzJCOYmky9!As} zY9p2;ZEnVr4M_?_1In#hb2|FcT`FDUW9sKnor5{h$#XGHc}ZEjAnz&7x_qK+ zl;m?*tXJh*sQLa8o@M=4WuqozW902jQI06fMLD5dE6XEF5_c|UO`eL`ke;$yl4q3U z|79hKc}q!tK8jhC>u}99v=VUTnxf zNgyvM@$-d}f_?+{KJ>CNn;Z-VaxhEH*6K8taX4?;w&OX0-*F-*kmVdpje6C@sWCs{ zT#f>_8@hHVlL-oJ7)iI&7b8`ukOgBpWp!*%rkPf8W~8l-(~VTMDn>r(wz@KvERcUT zcDk2jDO;$TjYEX3}=YYC9aK97i*oZ4r9UYI63n z=G92rou-;sOQ=s{-raOtWQHyz8LeKQWYCGGNpR`8Tshdj5^hKSrc5L>^+uw#Eeq+g zSv1M|Vy+E!Qc3A&b3d2Z7RI2FB%*=)Asu-fm?Puj)l ziA=?^UFRYvN_N7QETw5`zFWr9B<0uax2={&MUR`3p3PR>w$Co4MY}z{kgoazt1Sn| zX?h~7v*~ia7dSiN^#h8znC2p^>G>vlSK^-mb&}i|1)WR;0r7D$bm)-{?gps}{7??0 z>Lv}nIFYHJGdKK*(`S(DXqF`{;k*i(PEQsy2)>q&4knE`c+LfTmGDS5xd zU7Alb;hGu?S*DTidpJjQL5sAMU-vIkC40*sgl(6za$InCF!2bZbh2BlZKkU-~5S@FGjSu~*@4p$ph|b5ua~&E|*Y-X) zu>T$12eEm6=wln%E7-iw{50d!yY?H|-$btC^XT2$yT!Z7 gYYhF2{CdpaR2lk@?(%yM*|W?$yJRDq5mAwU0UZV^{Qv*}