/5dpo_localization_odom

Estimation of the robot pose based on odometric-only data (e.g., wheeled, laser, visual, and/or inertial odometry)

Primary LanguageC++GNU General Public License v3.0GPL-3.0

This repository implements a data processor for the estimation of the robot pose based on odometric-only data (e.g., wheeled, laser, visual, and/or inertial odometry). The ROS package implemented in this repository makes available nodes that may leverage one and/or multiple sources of odometry data for dead reckoning pose estimation of the robot.

Version 1.4.0

With this version, it is possible to do:

  • Wheeled odometry (four-wheeled omnidirectional steering geometry)
  • Wheeled odometry (differential and three-wheeled omnidirectional steering geometries)
  • Inverse wheeled odometry
  • Enable/disable publication of the tf base_frame_id > odom_frame_id
  • Limit the maximum angular speed of the wheels and scale the velocities

The next version will add these features:

  • Wheeled odometry (tricycle steering geometry)
  • Fusion of wheels and inertial odometry data
  • Dynamic reconfigure of the nodes parameters
  • Additional parameter for covariance (wheeled-inertial odometry fusion)

ROS

ROS 1

ROS 2

Dependencies

Parameters

  • base_frame_id (std::string = "base_footprint"): tf frame id of the robot base footprint coordinate frame
  • odom_frame_id (std::string = "odom"): tf frame id of the robot odometry coordinate frame
  • publish_tf (bool = true): enable the publication of the tf base_frame_id > odom_frame_id
  • invert_tf (bool = false): enable the invertion of the tf (odom_frame_id > base_frame_id instead of base_frame_id > odom_frame_id)
  • w_ref_max_enabled (bool = false): enable a maximum angular speed for the robot wheels
  • w_ref_max (double): maximum angular speed of the robot wheels
  • steering_geometry: steering geometry of the mobile robot (rad/s) ("diff" | "tricyc" | "omni3" | "omni4")
    • Differential drive
      • rob_dist_between_wh (double): distance between left-right wheels (m)
      • wh_right_diam (double): right wheel diameter (m)
      • wh_right_idx (size_t): right wheel index in the mot_enc_array.msg (0..1)
      • wh_right_inv (bool): invert positive direction of the right wheel angular motion
      • wh_left_diam (double): left wheel diameter (m)
      • wh_left_idx (size_t): left wheel index in the mot_enc_array.msg (0..1)
      • wh_left_inv (bool): invert positive direction of the left wheel angular motion
    • Tricycle
      • TBD
    • Three-wheeled omnidirectional robot
      • rob_dist_center_wh (double): distance between the robot geometric center and the omnidirectional wheels (m)
      • wh_front_right_diam (double): front-right wheel diameter (m)
      • wh_front_right_idx (size_t): front-right wheel index in the mot_enc_array.msg (0..2)
      • wh_front_right_inv (bool): invert positive direction of the front-right wheel angular motion
      • wh_front_left_diam (double): front-left wheel diameter (m)
      • wh_front_left_idx (size_t): front-left wheel index in the mot_enc_array.msg (0..2)
      • wh_front_left_inv (bool): invert positive direction of the front-left wheel angular motion
      • wh_back_diam (double): back wheel diameter (m)
      • wh_back_idx (size_t): back wheel index in the mot_enc_array.msg (0..2)
      • wh_back_inv (bool): invert positive direction of the back wheel angular motion
    • Four-wheeled omnidirectional robot
      • rob_dist_between_front_back_wh (double): distance between front-back wheels (m)
      • rob_dist_between_left_right_wh (double): distance between left-right wheels (m)
      • wh_front_left_diam (double): front-left wheel diameter (m)
      • wh_front_left_idx (size_t): front-left wheel index in the mot_enc_array.msg (0..3)
      • wh_front_left_inv (bool): invert positive direction of the front-left wheel angular motion
      • wh_front_right_diam (double): front-right wheel diameter (m)
      • wh_front_right_idx (size_t): front-right wheel index in the mot_enc_array.msg (0..3)
      • wh_front_right_inv (bool): invert positive direction of the front-right wheel angular motion
      • wh_back_left_diam (double): back-left wheel diameter (m)
      • wh_back_left_idx (size_t): back-left wheel index in the mot_enc_array.msg (0..3)
      • wh_back_left_inv (bool): invert positive direction of the back-left wheel angular motion
      • wh_back_right_diam (double): back-right wheel diameter (m)
      • wh_back_right_idx (size_t): back-right wheel index in the mot_enc_array.msg (0..3)
      • wh_back_right_inv (bool): invert positive direction of the back-right wheel angular motion

Subscribes

  • cmd_vel (geometry_msgs::Twist.msg)
  • motors_enc (sdpo_drivers_interfaces::MotEncArray.msg)

Publishes

  • cmd_vel_ref (geometry_msgs::Twist.msg)
  • motors_ref (sdpo_drivers_interfaces::MotRefArray.msg)
  • odom (nav_msgs::Odometry.msg)
  • tf2 (N/A)
    • base_frame_id > odom_frame_id

Services

None.

Actions

None.

Usage

Compilation

ROS 1

# ROS 1 environment setup
source source /opt/ros/noetic/setup.bash

# Create workspace
mkdir -p ~/ros1_ws/src

# Clone the repository
cd ~/ros1_ws/src
git clone git@github.com:5dpo/5dpo_localization_odom.git

# Build
cd ~/ros1_ws
catkin_make
# OR catkin_make_isolated (more slow, build and check dependencies individually)
# OR catkin build (requires the Pyhton-based catkin tools)
source devel/setup.bash

ROS 2

# ROS 2 environment setup
source /opt/ros/foxy/setup.bash

# Create workspace
mkdir -p ~/ros2_ws/src

# Clone the repository
cd ~/ros2_ws/src
git clone git@github.com:5dpo/5dpo_localization_odom.git

# Build
cd ~/ros2_ws
colcon build
source install/setup.bash

Launch

ROS 1

roslaunch sdpo_localization_odom sdpo_localization_odom_wh.launch

ROS 2

ros2 launch sdpo_hangfaq2_driver sdpo_localization_odom_wh.launch.xml

Acknowledges

Contacts

If you have any questions or you want to know more about this work, please contact any member of the 5dpo Robotics Team.