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 a4339c65..00000000
Binary files a/wordlist.dic and /dev/null differ