void WorldRosItem::start() { static bool initialized = false; if (initialized) return; world = this->findOwnerItem<WorldItem>(); if (world) ROS_INFO("Found WorldItem: %s", world->name().c_str()); sim = SimulatorItem::findActiveSimulatorItemFor(this); if (sim == 0) return; std::string name = sim->name(); ROS_INFO("Found SimulatorItem: %s", name.c_str()); std::replace(name.begin(), name.end(), '-', '_'); rosnode_ = boost::shared_ptr<ros::NodeHandle>(new ros::NodeHandle(world->name())); pub_clock_ = rosnode_->advertise<rosgraph_msgs::Clock>("/clock", 10); pub_link_states_ = rosnode_->advertise<gazebo_msgs::LinkStates>("link_states", 10); pub_model_states_ = rosnode_->advertise<gazebo_msgs::ModelStates>("model_states", 10); TimeBar* timeBar = TimeBar::instance(); timeBar->sigTimeChanged().connect(boost::bind(&WorldRosItem::timeTick, this, _1)); std::string pause_physics_service_name("pause_physics"); ros::AdvertiseServiceOptions pause_physics_aso = ros::AdvertiseServiceOptions::create<std_srvs::Empty>( pause_physics_service_name, boost::bind(&WorldRosItem::pausePhysics,this,_1,_2), ros::VoidPtr(), &rosqueue_); pause_physics_service_ = rosnode_->advertiseService(pause_physics_aso); std::string unpause_physics_service_name("unpause_physics"); ros::AdvertiseServiceOptions unpause_physics_aso = ros::AdvertiseServiceOptions::create<std_srvs::Empty>( unpause_physics_service_name, boost::bind(&WorldRosItem::unpausePhysics,this,_1,_2), ros::VoidPtr(), &rosqueue_); unpause_physics_service_ = rosnode_->advertiseService(unpause_physics_aso); std::string reset_simulation_service_name("reset_simulation"); ros::AdvertiseServiceOptions reset_simulation_aso = ros::AdvertiseServiceOptions::create<std_srvs::Empty>( reset_simulation_service_name, boost::bind(&WorldRosItem::resetSimulation,this,_1,_2), ros::VoidPtr(), &rosqueue_); reset_simulation_service_ = rosnode_->advertiseService(reset_simulation_aso); std::string spawn_vrml_model_service_name("spawn_vrml_model"); ros::AdvertiseServiceOptions spawn_vrml_model_aso = ros::AdvertiseServiceOptions::create<gazebo_msgs::SpawnModel>( spawn_vrml_model_service_name, boost::bind(&WorldRosItem::spawnModel,this,_1,_2), ros::VoidPtr(), &rosqueue_); spawn_vrml_model_service_ = rosnode_->advertiseService(spawn_vrml_model_aso); std::string spawn_urdf_model_service_name("spawn_urdf_model"); ros::AdvertiseServiceOptions spawn_urdf_model_aso = ros::AdvertiseServiceOptions::create<gazebo_msgs::SpawnModel>( spawn_urdf_model_service_name, boost::bind(&WorldRosItem::spawnModel,this,_1,_2), ros::VoidPtr(), &rosqueue_); spawn_urdf_model_service_ = rosnode_->advertiseService(spawn_urdf_model_aso); std::string spawn_sdf_model_service_name("spawn_sdf_model"); ros::AdvertiseServiceOptions spawn_sdf_model_aso = ros::AdvertiseServiceOptions::create<gazebo_msgs::SpawnModel>( spawn_sdf_model_service_name, boost::bind(&WorldRosItem::spawnModel,this,_1,_2), ros::VoidPtr(), &rosqueue_); spawn_sdf_model_service_ = rosnode_->advertiseService(spawn_sdf_model_aso); std::string delete_model_service_name("delete_model"); ros::AdvertiseServiceOptions delete_aso = ros::AdvertiseServiceOptions::create<gazebo_msgs::DeleteModel>( delete_model_service_name, boost::bind(&WorldRosItem::deleteModel,this,_1,_2), ros::VoidPtr(), &rosqueue_); delete_model_service_ = rosnode_->advertiseService(delete_aso); async_ros_spin_.reset(new ros::AsyncSpinner(0)); async_ros_spin_->start(); rosqueue_thread_.reset(new boost::thread(&WorldRosItem::queueThread, this)); initialized = true; }