Skip to content →

How to use irobot create in gazebo with ROS hydro?

I’ve not been able to find any clear examples on how to achieve a simple simulation which involves moving a virtual model of an iRobot Create/Roomba in Gazebo using ROS Hydro. Hence this tutorial.  I’m starting with the very basics, so please bear with me.

Steps :

1. Follow the ROS instruction guidelines for Hydro [follow]
2. Setup your catkin workspace (again instructions in ROS wiki)
3. Download and install standalone gazebo. Instructions here for the ROS compatible version 1.9
4. Start here for tutorials on working with ROS and Gazebo. Complete all the tutorials
5. Download the IRobot Create SDF from the online repo. It is possible to download the entire library of models from
6. Put the “create” folder from the downloaded models into your ~/catkin_ws/src/ directory
7. Insert the differential drive plugin into the model-1_4.sdf file. Some changes had to be made to suit the create sdf. The plugin info can be found in the gazeo ros integration tutorials at I am unable to paste the modified xml markup or attach it. So email me at for the file.

Assuming you completed all the steps above, here are the instructions to control the icreate with velocity commands from terminal:

1. From the terminal launch roscore. $roscore
2. Launch gazebo with an empty world. $roslaunch gazebo_ros empty_world.launch
3. In another terminal, spawn the create into the gazebo instance. Change directory to your create model. Then: $rosrun gazebo_ros spawn_model -file ~/catkin_ws/src/create/model-1_4.sdf -sdf -model create
4. Then send commands to make the robot move. $rostopic pub /cmd_vel geometry_msgs/Twist — ‘[1.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1]’

To send motion commands to the Create from code, write a publisher that advertises a geometry_msgs::Twist message with the velocity commands to “/cmd_vel” topic.
Instructions on writing a publisher are here:

#include “ros/ros.h”
#include <math.h>
#include “geometry_msgs/Twist.h”
#include “std_msgs/String.h”

* This tutorial demonstrates simple sending of velocity commands to the IRobot Create in Gazebo.
int main(int argc, char **argv)

ros::init(argc, argv, “CreateController”);

ros::NodeHandle n;

ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>(“/cmd_vel”, 1);

ros::Rate loop_rate(5);

int count = 0;

while (ros::ok())
geometry_msgs::Twist cmd_vel;

cmd_vel.linear.x = 0.5;
cmd_vel.linear.y = 0;
cmd_vel.linear.z = 0;
cmd_vel.angular.x = 0;
cmd_vel.angular.y = 0;
cmd_vel.angular.z = 0.4*sin(count);





return 0;


Published in Research Tutorial


  1. Faizan Faizan

    Dear Saurav Agarwal,

    I am Faizan. I am really thankful for your shared knowledge page. This code really helps me to boost towards ROS and working in Roomba. I just bought roomba and work with your code and it really words.
    I need your help to move roomba for 1 meter on x axis and then follow a circular path. I want to calculate the error of the desired and actual path which roomba covers.

    Please help me to modify your code. I will be really thankful to you…

    • sauravagarwal sauravagarwal

      Hi Faizan,

      Please read about differential drive robots and the kinematic formulation for these robots. Once you build up a mathematical model of how the robot moves then you can calculate what linear and angular velocity to give so that it follows a trajectory you desire. If there is actuator noise/disturbances, the robot usually wont follow the trajectory correctly. In that case you need feedback control.


Leave a Reply

Your email address will not be published. Required fields are marked *