Skip to content

InnoboticsSRL/ibt_ros2_autodocking

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🤖 ibt_ros2_autodocking

Python C++ ROS2

Simulation Demo


🎯 Overview

ibt_ros2_autodocking is a ROS 2 package designed to automate the docking and undocking procedures for a mobile robot AMR. It implements a robust and precise solution that combines high-level navigation provided by Nav2 with fine alignment based on vision and ArUco marker detection. The package includes both an Action Server to manage the multi-phase docking logic and an Action Client to request and monitor these operations.


✨ Key Features

  • Multi-Phase Docking: A docking procedure structured in several phases to ensure precision and reliability.
  • Nav2 Integration: Leverages Nav2's navigation capabilities for coarse approach to the docking station.
  • ArUco Precision Alignment: Utilizes ArUco markers and camera vision for millimeter-level corrections in position and orientation.
  • Charge Verification: Includes a battery status verification phase to confirm that the robot is actually charging after docking.
  • Undocking Procedure: Supports a controlled backward movement to move away from the dock.
  • Configurable Parameters: Numerous parameters are exposed for easy tuning and adaptation to different robots or environments.
  • ROS 2 Action Interface: Provides a standardized interface (ibt_ros2_interfaces/action/Docking) for interaction with other system nodes.

📂 Package Structure

The ibt_ros2_autodocking package is organized as follows:


ibt\_ros2\_autodocking/
│  
├── ibt\_ros2\_autodocking/         \# Folder containing the package's Python source code
│   ├── **init**.py                 \# File indicating that the directory is a Python module
│   ├── docking\_server\_node.py    \# The Action Server node for docking/undocking logic
│   └── docking\_client\_node.py    \# The Action Client node for interacting with the server
├── resource/                       \# Folder for resource files (required by ament\_python)
│   └── ibt\_ros2\_autodocking      \# Specific resource file for the package
├── .gitignore                      \# File to specify items to ignore in version control (Git)
├── package.xml                     \# The ROS 2 package manifest (metadata and dependencies)
├── setup.py                        \# Python build and installation script (used by setuptools/colcon)
├── setup.cfg                       \# Configuration file for setuptools
└── README.md                       \# This documentation file


🚀 Requirements and Dependencies

This package requires a ROS 2 Humble (or newer) environment and the following dependencies. Make sure they are installed on your ROS system.

ROS 2 Packages

Python Libraries (installable via pip)

  • setuptools
  • numpy
  • opencv-python (and potentially opencv-contrib-python for some ArUco modules)
  • tf-transformations

Dependency Installation

  1. Update rosdep (if necessary):
    sudo rosdep init
    rosdep update
  2. Install ROS dependencies (from your ROS 2 workspace):
    rosdep install -i --from-path src --rosdistro humble -y
  3. Install Python dependencies (you can create a requirements.txt or install them manually):
    # Option 1: Create a requirements.txt file in the package root with the Python libraries
    # Example requirements.txt:
    # numpy
    # opencv-python
    # opencv-contrib-python
    # tf-transformations
    #
    # Then install:
    # pip install -r src/ibt_ros2_autodocking/requirements.txt
    
    # Option 2: Manual installation (recommended for quick development)
    pip install numpy opencv-python opencv-contrib-python tf-transformations

Note on Vision (OpenCV/CvBridge): Depending on your ROS 2 distribution and operating system, you might need to install specific versions of opencv-python or the python3-opencv package via your system's package manager (e.g., sudo apt install ros-humble-opencv-ros-py). Ensure your OpenCV installation supports aruco modules.


🛠️ Build the Package

To compile and install the package in your ROS 2 workspace:

  1. Navigate to your ROS 2 workspace:

    cd ~/ros2_ws/
  2. Clone the necessary repositories (if you haven't already. Ensure ibt_ros2_interfaces is in the same workspace):

    # git clone https://github.com/Vor7reX/ibt_ros2_autodocking.git
    # git clone https://github.com/Vor7reX/ibt_ros2_interfaces.git
  3. Build the workspace with colcon:

    colcon build --symlink-install --packages-select ibt_ros2_autodocking ibt_ros2_interfaces
    • Use --symlink-install for development mode installations, which is convenient for quick changes to Python code.
    • --packages-select ibt_ros2_autodocking ibt_ros2_interfaces compiles only the specified packages, speeding up the process.
  4. Source the ROS 2 environment to make the new packages available:

    source install/setup.bash

🚀 Usage

Sourcing the Environment

Before running any nodes, make sure you have correctly sourced your ROS 2 environment in each new terminal:

source /opt/ros/humble/setup.bash # Replace 'humble' with your ROS 2 distribution
source ~/ros2_ws/install/setup.bash

Running the Docking Server

Start the docking action server in a separate terminal. It's recommended to load parameters from docking_server_node file for more control:

# Running with default parameters (for quick tests)
ros2 run ibt_ros2_autodocking docking_server_node


### Using the Docking Client

Once the server is running, you can send commands using the client from another terminal:

  * **Start the docking procedure:**
    ```bash
    ros2 run ibt_ros2_autodocking docking_client_node dock
    ```
  * **Start the undocking procedure:**
    ```bash
    ros2 run ibt_ros2_autodocking docking_client_node undock
    ```
  * **Monitor real-time battery status:**
    ```bash
    ros2 run ibt_ros2_autodocking docking_client_node percentage
    ```

-----

## ⚙️ Node Parameters

The `DockingActionServer` exposes numerous parameters that can be configured via a ROS 2 launch YAML file to adapt to your specific setup, allowing fine-tuning of the navigation and alignment phases.
--------------------------------------------------------------------------------------------------------------------------------------
| Parameter                      | Type   | Default | Description                                                                    |
| :----------------------------- | :----- | :------ | :----------------------------------------------------------------------------- |
| `phase0_goal_x`                | double | 0.13    | X coordinate of the initial Nav2 goal in Phase 0.                              |
| `phase0_goal_y`                | double | 0.87    | Y coordinate of the initial Nav2 goal in Phase 0.                              |
| `phase0_kp_correction`         | double | 0.5     | Proportional gain for odometric corrections in Phase 0.                        |
| `phase0_max_correction_vel`    | double | 0.05    | Maximum velocity for odometric corrections in Phase 0 (m/s).                   |
| `phase0_pose_correction`       | double | 0.005   | Tolerance for pose corrections in Phase 0 (m).                                 | 
| `target_marker_id`             | int    | 10      | ID of the target ArUco marker on the docking station.                          |
| `marker_size`                  | double | 0.10    | Physical size of the ArUco marker's side (meters).                             |
| `goal_offset_z`                | double | 0.99    | Z offset from the marker for the robot's final pose (meters).                  |
| `num_samples_to_average`       | int    | 50      | Number of ArUco pose samples to average in Phase 1.                            |
| `num_samples_for_verification` | int    | 50      | Number of ArUco samples for the verification phase.                            |
| `kp_linear_correction`         | double | 0.5     | Proportional gain for linear corrections based on ArUco.                       |
| `max_linear_vel`               | double | 0.05    | Maximum linear velocity for ArUco corrections (m/s).                           |
| `pose_correction_tolerance`    | double | 0.005   | Tolerance for ArUco pose corrections (m).                                      |
| `kp_yaw_correction`            | double | 1.0     | Proportional gain for yaw corrections based on ArUco.                          |
| `max_angular_vel`              | double | 0.25    | Maximum angular velocity for ArUco corrections (rad/s).                        |
| `yaw_correction_tolerance`     | double | 0.017   | Tolerance for ArUco yaw corrections (radians, \~1 degree).                     |
| `min_angular_vel`              | double | 0.05    | Minimum angular velocity for yaw corrections (rad/s).                          |
| `strafe_speed`                 | double | -0.05   | Lateral velocity for the final strafe movement (m/s).                          |
| `final_strafe_offset`          | double | 0.05    | Distance offset for the final strafe, relative to the marker's pose (m).       |
| `undocking_distance`           | double | 0.50    | Distance traveled backward during undocking (meters).                          |
| `charge_verification_timeout`  | double | 20.0    | Timeout for charge status verification (seconds).                              |
--------------------------------------------------------------------------------------------------------------------------------------
-----

## 📝 Example Launch File

You can create a `docking.launch.py` file in the `launch/` folder (which you'll need to add to your structure if it doesn't exist) to start the `docking_action_server` node with your custom parameters:

```python
# docking.launch.py
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    pkg_share_dir = get_package_share_directory('ibt_ros2_autodocking')
    # Make sure to create the 'config' folder in the root of your package
    # and place the docking_params.yaml file there
    params_file = os.path.join(pkg_share_dir, 'config', 'docking_params.yaml')

    return LaunchDescription([
        Node(
            package='ibt_ros2_autodocking',
            executable='docking_server_node',
            name='docking_action_server',
            output='screen',
            parameters=[params_file]
        ),
        # You can add the client here for testing, if you want to launch it automatically
        # Node(
        #     package='ibt_ros2_autodocking',
        #     executable='docking_client_node',
        #     name='docking_client',
        #     output='screen',
        #     arguments=['dock'] # or 'undock' or 'percentage'
        # )
    ])

🤝 Contribution

Contributions are welcome! If you find bugs, have suggestions for improvements, or wish to add new features, feel free to open an issue or a pull request.


📧 Contacts


📄 License

This project is released under the Apache 2.0 License. You can find the full text of the license in the LICENSE file in the root of this repository.

About

"ROS 2 package for automating robot docking and undocking procedures. It implements a robust and precise solution that combines high-level navigation provided by Nav2 with fine alignment based on vision and ArUco marker detection."

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Python 100.0%