mecanum_drive
mecanum_drive copied to clipboard
ROS mecanum controller and odometry node in python
= mecanum_drive -- Mecanum-Drive Controller :imagesdir: ./images
This package implements ROS nodes to control and monitor a mecanum-drive robot.
The package is intended as a lighter-weight solution than the ROS controller framework, albeit with lower performance since it is written in Python. If you need tight, real-time control, you may want to look at link:http://wiki.ros.org/ros_controllers[ros_controllers]. Those controllers are designed to integrate with hardware in the same process, rather than using topics. Instead, this package expects to publish the desired motor speeds using standard ROS messages.
== Supplied Nodes
-
mecanum_drive_controller
-- Converts from twist to wheel velocities for motors. -
mecanum_drive_odometry
-- Publishes odometry from wheel encoder data.
The nodes in this package are designed with these considerations:
- The node and hardware implementing mecanum drive should deal only in encoder ticks.
- Conversions to and from physical coordinates should happen within the nodes in this package.
- This package should integrate cleanly with the navigation stack, perhaps with remappings.
- Nodes should use standard topic and parameter names used by the navigation stack, but should allow remapping.
== ROS API
=== 1. mecanum_drive_controller
Listens for desired linear and angular velocity, and publishes corresponding wheel velocities, in encoder ticks per second, required to achieve those velocities.
==== Published Topics
~wheels_desired_rate
(std_msgs/Int16MultiArray)::
Desired [front left, front right, rear left, rear right] wheel rotation rates, in encoder ticks per second.
==== Subscribed Topics
~cmd_vel
(geometry_msgs/Twist)::
Desired linear and angular velocity.
==== Parameters
~ticks_per_meter
(double)::
Number of encoder ticks per meter of travel.
~wheel_separation
(double)::
Distance between the two wheels on the same axis (meters).
~wheel_separation_length
(double)::
Distance between the front and rear axis (meters).
~rate
(int, default: 50)::
The rate that the output velocity target messages will be published (Hz).
~timeout_ticks
(int, default: 2)::
The number of velocity target messages that will be published after the last twist message is received.
=== 2. mecanum_drive_odometry
Listens for wheel movement and rates and publishes the transform between the odom frame and the robot frame.
==== Published Topics
~odom
-- (nav_msgs/Odometry)::
The robot odometry -- the current robot pose.
~tf
::
The transform between the odometry frame and the robot frame.
==== Subscribed Topics
~wheel_ticks
(std_msgs/Int16MultiArray)::
Cumulative encoder ticks of the [front left, front right, rear left, rear right] wheels.
==== Parameters
~ticks_per_meter
(double)::
Number of encoder ticks per meter of travel.
~wheel_separation
(double)::
Distance between the two wheels (m).
~wheel_separation_length
(double)::
Distance between the front and rear axis (meters).
~rate
(double, default 10.0)::
The rate at which the tf
and odom
topics are published (Hz).
~timeout
(double, default 0.2)::
The amount of time to continue publishing desired wheel rates after receiving a twist message (seconds).
If set to zero, wheel velocities will be sent only when a new twist message is received.
~base_frame_id
(string, default: "base_link")::
The name of the base frame of the robot.
~odom_frame_id
(string, default: "odom")::
The name of the odometry reference frame.
~encoder_min
(int, default: -32768)::
~encoder_max
(int, default: 32768)::
The min and max value the encoder should output. Used to calculate odometry when the values wrap around.
~wheel_low_wrap
(int, default: 0.3 * (encoder_max - encoder_min + 1) + encoder_min)::
~wheel_high_wrap
(int, default: 0.7 * (encoder_max - encoder_min + 1) + encoder_min)::
If a reading is greater than wheel_high_wrap and the next reading is less than wheel_low_wrap, then the reading has wrapped around in the positive direction, and the odometry will be calculated appropriately. The same concept applies for the negative direction.