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 [email protected] 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);
vel_pub.publish(cmd_vel);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}