Show EOL distros: 

ros_controllers: ackermann_steering_controller | diff_drive_controller | effort_controllers | force_torque_sensor_controller | forward_command_controller | gripper_action_controller | imu_sensor_controller | joint_state_controller | joint_trajectory_controller | position_controllers | rqt_joint_trajectory_controller | velocity_controllers

Package Summary

Controller for a steer drive mobile base.

ros_controllers: ackermann_steering_controller | diff_drive_controller | effort_controllers | force_torque_sensor_controller | forward_command_controller | gripper_action_controller | imu_sensor_controller | joint_state_controller | joint_trajectory_controller | position_controllers | rqt_joint_trajectory_controller | velocity_controllers

Package Summary

Controller for a steer drive mobile base.

ros_controllers: ackermann_steering_controller | diff_drive_controller | effort_controllers | force_torque_sensor_controller | forward_command_controller | gripper_action_controller | imu_sensor_controller | joint_state_controller | joint_trajectory_controller | position_controllers | velocity_controllers

Package Summary

Controller for a steer drive mobile base.

ros_controllers: ackermann_steering_controller | diff_drive_controller | effort_controllers | force_torque_sensor_controller | forward_command_controller | gripper_action_controller | imu_sensor_controller | joint_state_controller | joint_trajectory_controller | position_controllers | velocity_controllers

Package Summary

Controller for a steer drive mobile base.

An example of using the packages can be seen in Robots/CIR-KIT-Unit03.

Overview

Controller for wheel systems with ackermann steering mechanism. Control is in the form of a velocity command, that is split then sent on the single rear wheel and the single front steer of a ackermann steering drive wheel base. Odometry is computed from the feedback from the hardware, and published.

Velocity commands

The controller works with a velocity twist from which it extracts the x component of the linear velocity and the z component of the angular velocity. Velocities on other components are ignored.

Hardware interface type

The controller inherits multi_interface_controller to work with wheel joints through a velocity interface for a linear wheel and a position interface for a front steer wheel, which is the the most basic configuration for the ackermann steering driving mechanism.

Converting controller's interfaces to actual controller's interfaces

If you want rviz to show states of robot's actual joint interfaces' tf through joint_state_controller and robot_state_publisher, you need to convert the two interfaces of ackermann_steering_controller to your robot's specific ones via RobotHW or RobotHWSim (generally used for GAZEBO). This is because the controller only update it's basic interfaces mentioned in the previous section.

Other features

  • Realtime-safe implementation.

  • Odometry publishing
  • Task-space velocity, acceleration and jerk limits
  • Automatic stop after command time-out

Robots

CIR-KIT-Unit03

ROS API

Description

The controller main input is a geometry_msgs::Twist topic in the namespace of the controller.

Subscribed Topics

cmd_vel (geometry_msgs/Twist)
  • Velocity command.

Published Topics

odom (nav_msgs/Odometry)
  • Odometry computed from the hardware feedback.
/tf (tf/tfMessage)
  • Transform from odom to base_footprint

Joint Parameters

rear_wheel (string)

  • Rear wheel joint name
front_steer (string)
  • Front steer joint name

Coveriance Parameters

pose_covariance_diagonal (double[6])

  • Diagonal of the covariance matrix for odometry pose publishing
twist_covariance_diagonal (double[6])
  • Diagonal of the covariance matrix for odometry twist publishing

publish_rate (double, default: 50.0)

  • Frequency (in Hz) at which the odometry is published. Used for both tf and odom
cmd_vel_timeout (double, default: 0.5)
  • Allowed period (in s) allowed between two successive velocity commands. After this delay, a zero speed command will be sent to the wheels.

base_frame_id (string, default: base_link)

  • Base frame_id, which is used to fill in the child_frame_id of the Odometry messages and TF.
odom_frame_id (string, default: odom)
  • Odometry frame_id
enable_odom_tf (bool, default: true)
  • Publish to TF directly or not

Multiplier Parameters

wheel_separation_h_multiplier (double, default: 1.0)

  • Multiplier applied to the wheel separation parameter. This is used to account for a difference between the robot model and a real robot (e.g. odometry tuning).
wheel_radius_multiplier (double, default: 1.0)
  • Multiplier applied to the wheel radius parameter. This is used to account for a difference between the robot model and a real robot (e.g. odometry tuning).
steer_pos_multiplier (double, default: 1.0)
  • Steer position angle multipliers for fine tuning.

Limiter Parameters

linear/x/has_velocity_limits (bool, default: false)

  • Whether the controller should limit linear speed or not.
linear/x/max_velocity (double)
  • Maximum linear velocity (in m/s)
linear/x/min_velocity (double)
  • Minimum linear velocity (in m/s). Setting this to 0.0 will disable backwards motion. When unspecified, -max_velocity is used.
linear/x/has_acceleration_limits (bool, default: false)
  • Whether the controller should limit linear acceleration or not.
linear/x/max_acceleration (double)
  • Maximum linear acceleration (in m/s^2)
linear/x/min_acceleration (double)
  • Minimum linear acceleration (in m/s^2). When unspecified, -max_acceleration is used.
linear/x/has_jerk_limits (bool, default: false)
  • Whether the controller should limit linear jerk or not.
linear/x/max_jerk (double)
  • Maximum linear jerk (in m/s^3).
angular/z/has_velocity_limits (bool, default: false)
  • Whether the controller should limit angular velocity or not.
angular/z/max_velocity (double)
  • Maximum angular velocity (in rad/s)
angular/z/min_velocity (double)
  • Minimum angular velocity (in rad/s). Setting this to 0.0 will disable counter-clockwise rotation. When unspecified, -max_velocity is used.
angular/z/has_acceleration_limits (bool, default: false)
  • Whether the controller should limit angular acceleration or not.
angular/z/max_acceleration (double)
  • Maximum angular acceleration (in rad/s^2)
angular/z/min_acceleration (double)
  • Minimum angular acceleration (in rad/s^2). When unspecified, -max_acceleration is used.
angular/z/has_jerk_limits (bool, default: false)
  • Whether the controller should limit angular jerk or not.
angular/z/max_jerk (double)
  • Maximum angular jerk (in m/s^3).

Calibration Parameters

wheel_separation_h (double)

  • The distance of the rear wheel and the front wheel. The ackermann_steering_controller will attempt to read the value from the URDF if this parameter is not specified.
wheel_radius (double)
  • Radius of the wheels. It is expected they all have the same size. The ackermann_steering_controller will attempt to read the value from the URDF if this parameter is not specified.

Other Parameters

velocity_rolling_window_size (int, default: 10)

  • The number of velocity samples to average together to compute the odometry twist.linear.x and twist.angular.z velocities

Controller configuration examples

Minimal description

mobile_base_controller:
  type: "ackermann_steering_controller/AckermannSteeringController"
  rear_wheel: 'rear_wheel_joint'
  front_steer: 'front_steer_joint'
  pose_covariance_diagonal: [0.001, 0.001, 1000000.0, 1000000.0, 1000000.0, 1000.0]
  twist_covariance_diagonal: [0.001, 0.001, 1000000.0, 1000000.0, 1000000.0, 1000.0]

Complete description

mobile_base_controller:
  type        : "ackermann_steering_controller/AckermannSteeringController"
  rear_wheel: 'rear_wheel_joint'
  front_steer: 'front_steer_joint'
  publish_rate: 50.0               # default: 50
  pose_covariance_diagonal : [0.001, 0.001, 1000000.0, 1000000.0, 1000000.0, 1000.0]
  twist_covariance_diagonal: [0.001, 0.001, 1000000.0, 1000000.0, 1000000.0, 1000.0]

  # Wheel separation between the rear and the front, and diameter of the rear. 
  # These are both optional.
  # ackermann_steering_controller will attempt to read either one or both from the
  # URDF if not specified as a parameter.
  wheel_separation_h : 1.0
  wheel_radius : 0.3

  # Wheel separation and radius multipliers for odometry calibration.
  wheel_separation_h_multiplier: 1.0 # default: 1.0
  wheel_radius_multiplier    : 1.0 # default: 1.0

  # Steer position angle multipliers for fine tuning.
  steer_pos_multiplier       : 1.0

  # Velocity commands timeout [s], default 0.5
  cmd_vel_timeout: 0.25

  # Base frame_id
  base_frame_id: base_footprint #default: base_link

  # Odom frame_id
  odom_frame_id: odom

  # Velocity and acceleration limits
  # Whenever a min_* is unspecified, default to -max_*
  linear:
    x:
      has_velocity_limits    : true
      max_velocity           : 1.0  # m/s
      min_velocity           : -0.5 # m/s
      has_acceleration_limits: true
      max_acceleration       : 0.8  # m/s^2
      min_acceleration       : -0.4 # m/s^2
      has_jerk_limits        : true
      max_jerk               : 5.0 # m/s^3

  angular:
    z:
      has_velocity_limits    : true
      max_velocity           : 1.7  # rad/s
      has_acceleration_limits: true
      max_acceleration       : 1.5  # rad/s^2
      has_jerk_limits        : true
      max_jerk               : 2.5 # rad/s^3

RobotHW

An example for usage of ackermann_steering_controller with RobotHW can be grabbed from Robots/CIR-KIT-Unit03.

RobotHWSim for GAZEBO

We developped a general RobotHWSim plugin for usage of GAZEBO. You can get the plugin from steer_bot_hardware_gazebo and also see an example of application on Robots/CIR-KIT-Unit03.

Recovery Behavior

We also provide a recovery behavior plugin of move_base specifically desigined for ackermann steering mechanism base robots in stepback_and_steerturn_recovery. Feel free to see Robots/CIR-KIT-Unit03 to learn how to use it.

Wiki: ackermann_steering_controller (last edited 2021-05-19 01:27:14 by MattReynolds)