[Documentation] [TitleIndex] [WordIndex

(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

Controlling a Car model in Gazebo

Description: This tutorial covers basics of controlling a car model in Gazebo from MATLAB using the Gazebo-MATLAB Bridge in here.

Keywords: Gazebo, MATLAB

Tutorial Level: INTERMEDIATE

Loading Car model in Gazebo

Create a world file called tutorial.world with the following content:

   1 <?xml version="1.0"?>
   2 <sdf version="1.4">
   3   <world name="default">
   4     <!-- Ground Plane -->
   5     <include>
   6       <uri>model://ground_plane</uri>
   7     </include>
   8     <!-- Load rccar mode -->
   9     <include>
  10       <uri>model://rccar</uri>
  11       <pose> 0 0 0.05  0 0 0</pose>
  12     </include>
  13     <!-- Load the world Plugin -->
  14     <plugin name="gazebo_rosmatlab_bridge" filename="libgazebo_rosmatlab_bridge.so">
  15       <joints>rear_left_wheel_joint;base_to_steeringblock1;rear_right_wheel_joint;base_to_steeringblock2</joints>
  16       <links>carbody</links>
  17     </plugin>
  18   </world>
  19 </sdf>

Content explanation

First we load the ground plane as

   1     <include>
   2       <uri>model://ground_plane</uri>
   3     </include>

Next we load a rccar model:

   1     <include>
   2       <uri>model://rccar</uri>
   3       <pose> 0 0 0.05  0 0 0</pose>
   4     </include>

The pose argument above can be used to place the model anywhere in the world file. The arguments for the pose are x,y,z position and r,p,y orientation.

Finally we load the plugin needed to communicate between the Gazebo and MATLAB as

   1 <plugin name="gazebo_rosmatlab_bridge" filename="libgazebo_rosmatlab_bridge.so">
   2       <joints>rear_left_wheel_joint;base_to_steeringblock1;rear_right_wheel_joint;base_to_steeringblock2</joints>
   3       <links>carbody</links>
   4     </plugin>

The joints and links listed in the plugin are the ones we are interested in controlling from MATLAB. For example in rccar model, we are interested in controlling rear wheel joints and front steering joints. We are also interested in feedback of the car's position which is given by the carbody link.

The joints and links are provided in a semi colon separated format and full scoped names such as rccar::left_wheel_joint can also be given to disambiguate between different joints with same names.

Finally run gazebo with the above world file as

gazebo tutorial.world

This will provide some information on the terminal such as

Dbg Loading Links...
Dbg carbody
Dbg Loading Joints...
Dbg rear_left_wheel_joint;base_to_steeringblock1;rear_right_wheel_joint;base_to_steeringblock2
Dbg Wrote Names
Dbg Done Loading Plugin!

Tip: The names of these joints and links, can be found in the left side panel in gazebo under various model names like rccar etc. Try adding another joint or link to the plugin to see if you understand how to load the plugin.

Matlab Setup

To use the Matlab interface, you have to run MATLAB from the matlab_scripts folder. To start with, create a convenience class for interacting with Gazebo from Matlab.

h = GazeboMatlabSimulator; %Creates a Matlab Bridge using a helper class

This class provides various methods to control the gazebo interface. It also shows up the list of links and joints loaded before as

>> h.AvailableNames{1}
ans =

>> h.AvailableNames{2}
ans =
'rear_left_wheel_joint''base_to_steeringblock1' 'rear_right_wheel_joint''base_to_steeringblock2'

Setting Model State

The initial position of the car model can be set anywhere in Gazebo World from MATLAB. To do this first we create a model state and assign some values to it

 modelstate = MatlabRigidBodyState;%Helper class to store rigidbody state
 modelstate.position = [ 1,1,0.05];%Initial position
 modelstate.orientation = rpy2quat([pi/2, 0, 0]);%Initial orientation
 modelstate.linearvelocity(1) = 1;%Initial velocity

The members of the model state are self explanatory. One thing to note is that, the velocities are written in body frame. Finally to set the model at this new state we run this command

 h.SetModelState('Unicycle',modelstate);%Set the model state. Joints are not modified.

The first argument is the name of the model found in the left panel of Gazebo. To see the car move in Gazebo, you can simulate the world for short time as:

h.Step(1);%Simulate Gazebo world for 1 second.

Controlling Joints

There are two ways to control a joint from MATLAB. In the first way, torque can be applied to a joint and in the second a servo motor can be attached to the joint which provides either position or velocity control. We will show how to use both the methods below.

Applying Torque to Joints

To apply a torque to a joint from MATLAB, first we pick the joints to be actuated. Then we set the torque to be applied to the joints. Finally we run the Gazebo simulation in the third step to move the car in the gazebo window

h.ActuatedJoints = [1;3];% The rear wheel joints
u = [1;1]; %Torques to be applied
h.Step(1.0,u);%Simulate the trajectory for 1 second with u as the torque

Similar result can be achieved by controlling the steering wheels(2,4) as well.

Attaching Servos to joints

To attach a servo to steering wheels we run the following line


The first argument selects the joints we are attaching the servos to. In this case the 2nd and 4th joints are the steering joints of the car. The second argument provides the gains (kp,kd,ki) in above equation. These control the behaviour of servo motor. Look here for more explanation on servo motors.

The third arguments provide bounds on the integration error and control bounds. If you do not know what these should be you can set zeros([0,0,0,0]) for all of them which suggest there are no bounds on applied torque.

The last argument specifies the type of servo. If it is a position control servo(arg = 0), it controls the joint angle. If it is a velocity control servo, it controls the joint velocity(arg = 1). Finally to test the servo, you can give commands to servo in a similar fashion to applying torques:

h.ActuatedJoints = [2;4];% Joints to which servos are attached
u = [1;1]; %Commands to servos (Angles in radians)
h.Step(1.0,u);%Simulate the car for 1 second to see the steering angles rotate to 1 radian

Self Check: Try attaching a velocity servo to joints 1 and 3 (driving wheels) and move the car in a circle at constant velocity

2019-02-16 12:13