ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange |
1 | initial version |
Thanks for posting your example code, it really helped me even if you weren't 100% there. Here's some collision-checking code with PlanningSceneMonitor that works for me:
#include <moveit/planning_scene_monitor/planning_scene_monitor.h>
...
const robot_model::RobotModelPtr& kinematic_model = model_loader_ptr->getModel();
planning_scene::PlanningScene planning_scene(kinematic_model);
collision_detection::CollisionRequest collision_request;
collision_request.group_name = parameters.move_group_name;
collision_request.distance = true;
collision_detection::CollisionResult collision_result;
robot_state::RobotState& current_state = planning_scene.getCurrentStateNonConst();
planning_scene_monitor::PlanningSceneMonitorPtr planning_scene_monitor;
planning_scene_monitor.reset(new planning_scene_monitor::PlanningSceneMonitor(model_loader_ptr));
planning_scene_monitor->startSceneMonitor();
planning_scene_monitor->startStateMonitor();
if(planning_scene_monitor->getPlanningScene())
{
planning_scene_monitor->startSceneMonitor("/planning_scene");
planning_scene_monitor->startWorldGeometryMonitor();
planning_scene_monitor->startStateMonitor();
}
else
{
ROS_ERROR_STREAM_NAMED(LOGNAME, "Error in setting up the PlanningSceneMonitor.");
exit(EXIT_FAILURE);
}
// Wait for initial messages
ROS_INFO_NAMED(LOGNAME, "Waiting for first joint msg.");
ros::topic::waitForMessage<sensor_msgs::JointState>(parameters.joint_topic);
ROS_INFO_NAMED(LOGNAME, "Received first joint msg.");
...
while (ros::ok())
{
// ** Update robot joints. This could happen in a callback function**
pthread_mutex_lock(&shared_variables.joints_mutex);
sensor_msgs::JointState jts = shared_variables.joints;
pthread_mutex_unlock(&shared_variables.joints_mutex);
for (std::size_t i = 0; i < jts.position.size(); ++i)
current_state.setJointPositions(jts.name[i], &jts.position[i]);
collision_result.clear();
planning_scene_monitor->getPlanningScene()->checkCollision(collision_request, collision_result, current_state);