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 ros.org]
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 http://gazebosim.org/wiki/1.9/install
4. Start here for tutorials on working with ROS and Gazebo. Complete all the tutorials http://gazebosim.org/wiki/Tutorials/1.9/Overview_of_new_ROS_integration
5. Download the IRobot Create SDF from the online repo. It is possible to download the entire library of models from https://bitbucket.org/osrf/gazebo_models
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 http://gazebosim.org/wiki/Tutorials/1.9/ROS_Motor_and_Sensor_Plugins. I am unable to paste the modified xml markup or attach it. So email me at sauravag@tamu.edu 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: http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29

#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;


One thought on “How to use irobot create in gazebo with ROS hydro?

  1. 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…

    1. 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 *