Hi,
My objective is to get the updated scene octomap at a fast rate.
I am currently using the get_planning_scene service through the ros service request. However, it is very slow for regularly obtaining the collision octomap from the scene. This is as shown in
answers.ros.org/question/256222/how-to-save-octomap-from-moveit/However it is too slow for real-time use of the octomap
Client_get_planning_scene = nh.serviceClient<moveit_msgs::GetPlanningScene>("/get_planning_scene", true);
scene_srv.request.components.components = scene_srv.request.components.OCTOMAP;
if( Client_get_planning_scene.call(scene_srv) )
{
ROS_INFO("Planning_scene received");
moveit_msgs::PlanningScene scene_msg = scene_srv.response.scene;
octomap_msgs::OctomapWithPose octomap_pose = scene_msg.world.octomap;
octomap_msgs::Octomap octomap = octomap_pose.octomap;
octomap::AbstractOcTree* abstract_tree = octomap_msgs::msgToMap(octomap);
collision_octree = (octomap::OcTree*)abstract_tree;
}
else
{
ROS_WARN("Failed to call service /get_planning_scene");
nh.shutdown();
}
Is there a faster way to do this?
There is an occupancy map monitor as well in moveit. Is that to be used? How?
Can the planning scene monitor be used?
planning_scene_monitor::PlanningSceneMonitorPtr planning_scene_monitor_;
planning_scene_monitor_.reset( new planning_scene_monitor::PlanningSceneMonitor("robot_description") );
const std::string PLANNING_SCENE_SERVICE = "get_planning_scene";
planning_scene_monitor_->requestPlanningSceneState(PLANNING_SCENE_SERVICE);
planning_scene_monitor_->startWorldGeometryMonitor();
planning_scene_monitor::LockedPlanningSceneRW psrw = planning_scene_monitor::LockedPlanningSceneRW(planning_scene_monitor_);
planning_scene::PlanningScenePtr scene = psrw;