BLDC motored wheels
Brushless DC (BLDC) motors offer high efficiency, smooth operation, and excellent power density, making them a common choice in robotics and automation. Their electronic commutation provides better control and reliability compared to traditional brushed motors.
In this project, we replace the stock wheel motors of our robot with more powerful BLDC motors, resulting in significantly higher speed and improved overall performance. This tutorial outlines the key steps and considerations involved in integrating BLDC motors into a mobile robot platform.
What to expect?β
After completing this tutorial, you will have a fully operational Leo Rover equipped with BLDC motor-driven wheels
Software integrationβ
To make the process as straightforward as possible, we've prepared a dedicated version of LeoOS that includes all the necessary software for the BLDC motor system. Simply download the image, flash it onto the SD card, and insert it into the robot.
You can follow this guide for detailed instructions on flashing the OS image:
Once the new system is installed, ensure that LeoCore is properly
communicating with it by updating the firmware on the board.
Follow this guide to update the firmware:
After completing the firmware update, reboot the robot or restart the ROS nodes:
ros-nodes-restart
Now you should be able to control the robot with BLDC motors in their default configuration.
Configurationβ
The prepared BLDC motor integration is highly configurable β you can adjust each
parameter at runtime to observe how it affects the system and the rover's
behavior.
This part of the tutorial will guide you through accessing one of the most
convenient interfaces for configuring these parameters.
You will need ROS Jazzy installed on your computer. If you don't have ROS installed, follow this guide:
If for some reason you don't want to install ROS on your machine, you can always
use the ros2 param CLI tool which will allow you to change parameter values -
you just have to connect to the rover through ssh.
You can learn how to use ros2 param tool from
this
tutorial.
Before configuring any parameters, make sure your computer is connected to the rover's access point:
Next, connect your local ROS environment to the one running on the robot.
To do so, source either the /opt/ros/jazzy/setup.bash file or the
install/setup.bash file from your ROS workspace (if you have one).
Then verify the connection by running:
ros2 node list
If this command displays a list of running nodes, the connection has been established successfully. You can now launch the configuration interface:
rqt -s rqt_reconfigure
If this command returns an error, the plugin might not be installed. Install it by running:
sudo apt install ros-jazzy-rqt-reconfigure
In the rqt window, select the bldc_manager node from the list on the left
side of the screen. You will see all available parameters that can be configured
in real time.
Hover your cursor over a parameter name to display its description and learn what it controls.
The next section provides a detailed explanation of each parameter, including valid value ranges and usage notes.
Parametersβ
The parameters are divided into three main groups:
nodeparameters - general settings that affect the ROS-related aspects of the system.wheel controllerparameters - define the BLDC motor configuration and behavior (these apply to all motors simultaneously).robot controllerparameters - used primarily for odometry calculations and system timeouts.
It's recommended to leave these unchanged unless you know exactly what you're adjusting.
bldc_manager nodeβ
-
mecanum_wheels(type:bool, default:false)
Indicates whether the rover is equipped with mecanum wheels.
When set totrue, the robot operates in holonomic motion mode.
When set tofalse, it uses differential motion mode. -
max_linear_velocity(type:float, default:5.0)
The maximum linear velocity of the robot, expressed in meters per second.
Accepted values range from 0.1 m/s to 20.0 m/s.infoKeep in mind that even though the parameter accepts high values, the physical rover may not be capable of reaching them.
-
max_angular_velocity(type:float, default:4.8)
The maximum angular velocity of the robot, expressed in radians per second.
Accepted values range from 0.1 rad/s to 20.0 rad/s.infoAs with linear velocity, higher values may exceed the physical limits of the rover's drivetrain.
-
tf_frame_prefix(type:string, default:'')
Prefix added to the names of published TF frames. -
robot_frame_id(type:string, default:base_footprint)
The TF frame associated with the robot base. -
odom_frame_id(type:string, default:odom)
The TF frame associated with odometry readings. -
wheel_joint_names(type:string[], default:
['wheel_RL_joint', 'wheel_RR_joint', 'wheel_FL_joint', 'wheel_FR_joint'])
The names of the wheel joints used in thejoint_statestopic.
The order of names is: rear left, rear right, front left, front right. -
wheel_odom_twist_covariance_diagonal(type:float[], default:
[0.0001, 0, 0, 0, 0, 0.001])
The diagonal elements of the covariance matrix for standard wheel odometry twist readings.
The array must contain exactly six values representing variances for linear x, linear y, linear z, angular x, angular y, and angular z. -
wheel_odom_mecanum_twist_covariance_diagonal(type:float[], default:
[0.0001, 0.0001, 0, 0, 0, 0.001])
The diagonal elements of the covariance matrix for mecanum wheel odometry twist readings.
The array must contain exactly six values representing variances for linear x, linear y, linear z, angular x, angular y, and angular z.
Wheel Controllerβ
-
max_torque(type:float, default:1.5)
The maximum torque that the motors can produce (in newton-meters). -
pid_constants(type:float[], default:[0.2, 0.5, 0.0])
The proportional (P), integral (I), and derivative (D) constants of the PID controller.
The array must contain exactly three non-negative values.warningThis is one of the most critical parameters, as it significantly affects how the rover drives.
Incorrect configuration can result in poor control, unstable motion, or even motor damage.When using the D component, keep its value low (preferably below
0.0001).
A high derivative value can make the motors noisy and increase the risk of overheating or failure. -
pid_integral_max(type:float, default:20.0)
The upper limit for the output of the integral component in the PID controller (in radians per second).
The value must be non-negative. -
profile_velocity(type:float, default:6.0)
The target velocity for the velocity profile motion mode (in radians per second).
Acceptable values range from 0.0 rad/s to 60.0 rad/s. -
profile_acceleration(type:float, default:6.0)
The target acceleration for the velocity profile motion mode (in radians per secondΒ²).
Acceptable values range from 0.0 rad/s^2 to 100.0 rad/s^2. -
motion_mode(type:int, default:0)
The motion mode used by the motor controller.
Possible values are:0- VELOCITY_PID1- VELOCITY_PROFILE2- IDLE
infoYou can read about the
VELOCITY_modes here. InIDLEmode the motors don't produce any torque. -
min_velocity(type:float, default:0.1)
The minimum velocity for a wheel to be considered rotating (in radians per second).
This threshold is used to detect when the rover is stationary, allowing the system to disable motor effort to conserve power when appropriate.
Robot Controllerβ
-
diff_drive/wheel_radius(type:float, default:0.0625)
The radius of each wheel (in meters).
Valid range: 0.01-0.2.
Used only when themecanum_wheelsparameter is set tofalse. -
diff_drive/wheel_separation(type:float, default:0.358)
The distance between the centers of the left and right wheels (in meters).
Valid range: 0.1-1.0.
Used only whenmecanum_wheelsisfalse. -
diff_drive/angular_velocity_multiplier(type:float, default:1.76)
A scaling factor for angular velocity.
The angular velocity in thecmd_velcommand is multiplied by this value,
while the calculated odometry's angular velocity is divided by it.
Valid range: 0.01-5.0.
Used only whenmecanum_wheelsisfalse. -
mecanum/wheel_radius(type:float, default:0.0635)
The radius of each mecanum wheel (in meters).
Valid range: 0.01-0.2.
Used only whenmecanum_wheelsistrue. -
mecanum/wheel_separation(type:float, default:0.354)
The distance between the centers of the left and right mecanum wheels (in meters).
Valid range: 0.1-1.0.
Used only whenmecanum_wheelsistrue. -
mecanum/wheel_base(type:float, default:0.3052)
The distance between the centers of the front and rear mecanum wheels (in meters).
Valid range: 0.1-1.0.
Used only whenmecanum_wheelsistrue. -
mecanum/angular_velocity_multiplier(type:float, default:1.0)
A scaling factor for angular velocity in mecanum drive mode.
The angular velocity in thecmd_velcommand is multiplied by this value,
while the odometry's angular velocity is divided by it.
Valid range: 0.01-5.0.
Used only whenmecanum_wheelsistrue. -
input_timeout(type:int, default:500)
The timeout (in milliseconds) forcmd_velmessages.
The controller is disabled if no command is received within this period.
Setting this value to0disables the timeout.
Valid range: 0-2000. -
effort_timeout(type:int, default:500)
The timeout (in milliseconds) before motor effort is released.
If the robot remains stationary for this duration, motor effort is set to zero.
Valid range: 100-2000.