Skip to content
Snippets Groups Projects
Select Git revision
  • 6a216a42efd4aac49e0070c12160d7cfdf05713d
  • master default protected
  • v1.0
3 results

GazeboZoneSpawner.cpp

  • Forked from CeTI / ROS / ROS Packages / panda_simulation
    Source project has a limited visibility.
    GazeboZoneSpawner.cpp 2.53 KiB
    //
    // Created by Johannes Mey on 31.03.20.
    //
    
    
    #include "GazeboZoneSpawner.h"
    
    #include <sdformat-6.0/sdf/sdf.hh>  // for sdf model parsing
    #include <gazebo_msgs/SpawnModel.h> // for spawning stuff in gazebo
    #include <ros/ros.h>
    #include <ros/package.h>
    
    void GazeboZoneSpawner::spawnCollisionBox(shape_msgs::SolidPrimitive shape, geometry_msgs::Pose pose) {
      if (shape.type != shape.BOX) {
        ROS_ERROR("Safety-zone could not be created due to wrong shape-type");
        return;
      }
    
      sdf::SDFPtr sdf(new sdf::SDF());
      sdf::init(sdf);
    
      auto sdfFileName = ros::package::getPath(ROS_PACKAGE_NAME) + "/models/box.sdf";
    
      assert(sdf::readFile(sdfFileName, sdf));
    
      auto visualElement = sdf->Root()->GetElement("model")->GetElement("link")->GetElement("visual");
      auto poseElement = visualElement->GetElement("pose");
      auto sizeElement = visualElement->GetElement("geometry")->GetElement("box")->GetElement("size");
    
      std::ostringstream poseStream;
      poseStream << pose.position.x << " " << pose.position.y << " " << pose.position.z << " 0 0 0";
      poseElement->Set(poseStream.str());
    
      ROS_INFO_NAMED("GazeboZoneSpawner", "Set pose in SDF file to '%s'.", poseElement->GetValue()->GetAsString().c_str());
    
      std::ostringstream sizeStream;
      sizeStream << shape.dimensions[0] << " " << shape.dimensions[1] << " " << shape.dimensions[2];
      sizeElement->Set(sizeStream.str());
    
      ROS_INFO_NAMED("GazeboZoneSpawner", "Set size in SDF file to '%s'.", sizeElement->GetValue()->GetAsString().c_str());
    
      // FIXME orientation is currently ignored
    
      ros::NodeHandle n;
      ros::ServiceClient client = n.serviceClient<gazebo_msgs::SpawnModel>("/gazebo/spawn_sdf_model");
      gazebo_msgs::SpawnModel spawnService;
      spawnService.request.robot_namespace = "box space";
      // spawnModelService.request.initial_pose = pose; // not required here
      spawnService.request.model_name = std::string("box") + poseStream.str() + sizeStream.str();
      spawnService.request.model_xml = sdf->ToString().c_str();
      // spawnModelService.request.reference_frame = ; // if left empty, world is used
      if (client.call(spawnService)) {
        if ( spawnService.response.success) {
          ROS_INFO_NAMED("GazeboZoneSpawner", "Successfully spawned Box 's'.  %s", spawnService.request.model_name, spawnService.response.status_message.c_str());
        } else {
          ROS_INFO_NAMED("GazeboZoneSpawner", "Failed to spawn Box '%s'. %s", spawnService.request.model_name, spawnService.response.status_message.c_str());
        }
      } else {
        ROS_ERROR_NAMED("GazeboZoneSpawner", "Failed to call service '/gazebo/spawn_sdf_model'");
      }
    }