Skip to content

Commit 8d9e531

Browse files
henningkayserdavetcoleman
authored andcommitted
Highlight selected links in publishRobotState() + improved collision visualization (#45)
* Highlight only selected links in publishRobotState() * Apply suggestions from code review Improve documentation Co-Authored-By: henningkayser <[email protected]> * Check for and visualize collisions with checkAndPublishCollision()
1 parent 7b58966 commit 8d9e531

File tree

2 files changed

+86
-11
lines changed

2 files changed

+86
-11
lines changed

include/moveit_visual_tools/moveit_visual_tools.h

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,21 @@ class MoveItVisualTools : public rviz_visual_tools::RvizVisualTools
485485
*/
486486
bool publishWorkspaceParameters(const moveit_msgs::WorkspaceParameters& params);
487487

488+
/**
489+
* \brief Check if the robot state is in collision inside the planning scene and visualize the result.
490+
* If the state is not colliding only the robot state is published. If there is a collision the colliding
491+
* links are ghlighted and the contact points are visualized with markers.
492+
* \param robot_state - The robot state to check for collisions
493+
* \param planning_scene - The planning scene to use for collision checks
494+
* \param highlight_link_color - The color to use for highligting colliding links
495+
* \param contact_point_color - The color to use for contact point markers
496+
* \result - True if there is a collision
497+
*/
498+
bool checkAndPublishCollision(const moveit::core::RobotState& robot_state,
499+
const planning_scene::PlanningScene* planning_scene,
500+
const rviz_visual_tools::colors& highlight_link_color = rviz_visual_tools::RED,
501+
const rviz_visual_tools::colors& contact_point_color = rviz_visual_tools::PURPLE);
502+
488503
/**
489504
* \brief Given a planning scene and robot state, publish any collisions
490505
* \param robot_state
@@ -496,6 +511,17 @@ class MoveItVisualTools : public rviz_visual_tools::RvizVisualTools
496511
const planning_scene::PlanningScene* planning_scene,
497512
const rviz_visual_tools::colors& color = rviz_visual_tools::RED);
498513

514+
/**
515+
* \brief Given a contact map and planning scene, publish the contact points
516+
* \param contacts - The populated contacts to visualize
517+
* \param planning_scene
518+
* \param color - display color of markers
519+
* \return true on success
520+
*/
521+
bool publishContactPoints(const collision_detection::CollisionResult::ContactMap& contacts,
522+
const planning_scene::PlanningScene* planning_scene,
523+
const rviz_visual_tools::colors& color = rviz_visual_tools::RED);
524+
499525
/**
500526
* \brief Move a joint group in MoveIt for visualization
501527
* make sure you have already set the planning group name
@@ -607,11 +633,14 @@ class MoveItVisualTools : public rviz_visual_tools::RvizVisualTools
607633
* To use, add a RobotState marker to Rviz and subscribe to the DISPLAY_ROBOT_STATE_TOPIC, above
608634
* \param robot_state - joint values of robot
609635
* \param color - how to highlight the robot (solid-ly) if desired, default keeps color as specified in URDF
636+
* \param highlight_links - if the |color| is not |DEFAULT|, allows selective robot links to be highlighted. by default (empty) all links are highlighted
610637
*/
611638
bool publishRobotState(const moveit::core::RobotState& robot_state,
612-
const rviz_visual_tools::colors& color = rviz_visual_tools::DEFAULT);
639+
const rviz_visual_tools::colors& color = rviz_visual_tools::DEFAULT,
640+
const std::vector<std::string>& highlight_links = {});
613641
bool publishRobotState(const moveit::core::RobotStatePtr& robot_state,
614-
const rviz_visual_tools::colors& color = rviz_visual_tools::DEFAULT);
642+
const rviz_visual_tools::colors& color = rviz_visual_tools::DEFAULT,
643+
const std::vector<std::string>& highlight_links = {});
615644

616645
/**
617646
* \brief Fake removing a Robot State display in Rviz by simply moving it very far away

src/moveit_visual_tools.cpp

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,6 +1057,33 @@ bool MoveItVisualTools::publishWorkspaceParameters(const moveit_msgs::WorkspaceP
10571057
"Planning_Workspace", 1);
10581058
}
10591059

1060+
bool MoveItVisualTools::checkAndPublishCollision(const moveit::core::RobotState& robot_state,
1061+
const planning_scene::PlanningScene* planning_scene,
1062+
const rviz_visual_tools::colors& highlight_link_color,
1063+
const rviz_visual_tools::colors& contact_point_color)
1064+
{
1065+
// Compute the contacts if any
1066+
collision_detection::CollisionRequest c_req;
1067+
collision_detection::CollisionResult c_res;
1068+
c_req.contacts = true;
1069+
c_req.max_contacts = 10;
1070+
c_req.max_contacts_per_pair = 3;
1071+
c_req.verbose = true;
1072+
1073+
// Check for collisions
1074+
planning_scene->checkCollision(c_req, c_res, robot_state);
1075+
std::vector<std::string> highlight_links;
1076+
for (const auto& contact : c_res.contacts)
1077+
{
1078+
highlight_links.push_back(contact.first.first);
1079+
highlight_links.push_back(contact.first.second);
1080+
}
1081+
1082+
publishRobotState(robot_state, highlight_link_color, highlight_links);
1083+
publishContactPoints(c_res.contacts, planning_scene, contact_point_color);
1084+
return c_res.collision;
1085+
}
1086+
10601087
bool MoveItVisualTools::publishContactPoints(const moveit::core::RobotState& robot_state,
10611088
const planning_scene::PlanningScene* planning_scene,
10621089
const rviz_visual_tools::colors& color)
@@ -1071,12 +1098,18 @@ bool MoveItVisualTools::publishContactPoints(const moveit::core::RobotState& rob
10711098

10721099
// Check for collisions
10731100
planning_scene->checkCollision(c_req, c_res, robot_state);
1101+
return publishContactPoints(c_res.contacts, planning_scene, color);
1102+
}
10741103

1104+
bool MoveItVisualTools::publishContactPoints(const collision_detection::CollisionResult::ContactMap& contacts,
1105+
const planning_scene::PlanningScene* planning_scene,
1106+
const rviz_visual_tools::colors& color)
1107+
{
10751108
// Display
1076-
if (c_res.contact_count > 0)
1109+
if (!contacts.empty())
10771110
{
10781111
visualization_msgs::MarkerArray arr;
1079-
collision_detection::getCollisionMarkersFromContacts(arr, planning_scene->getPlanningFrame(), c_res.contacts);
1112+
collision_detection::getCollisionMarkersFromContacts(arr, planning_scene->getPlanningFrame(), contacts);
10801113
ROS_INFO_STREAM_NAMED(LOGNAME, "Completed listing of explanations for invalid states.");
10811114

10821115
// Check for markers
@@ -1087,6 +1120,7 @@ bool MoveItVisualTools::publishContactPoints(const moveit::core::RobotState& rob
10871120
for (std::size_t i = 0; i < arr.markers.size(); ++i)
10881121
{
10891122
arr.markers[i].ns = "Collision";
1123+
arr.markers[i].id = i;
10901124
arr.markers[i].scale.x = 0.04;
10911125
arr.markers[i].scale.y = 0.04;
10921126
arr.markers[i].scale.z = 0.04;
@@ -1395,26 +1429,34 @@ bool MoveItVisualTools::publishRobotState(const std::vector<double> joint_positi
13951429
}
13961430

13971431
bool MoveItVisualTools::publishRobotState(const robot_state::RobotStatePtr& robot_state,
1398-
const rviz_visual_tools::colors& color)
1432+
const rviz_visual_tools::colors& color,
1433+
const std::vector<std::string>& highlight_links)
13991434
{
1400-
return publishRobotState(*robot_state.get(), color);
1435+
return publishRobotState(*robot_state.get(), color, highlight_links);
14011436
}
14021437

14031438
bool MoveItVisualTools::publishRobotState(const robot_state::RobotState& robot_state,
1404-
const rviz_visual_tools::colors& color)
1439+
const rviz_visual_tools::colors& color,
1440+
const std::vector<std::string>& highlight_links)
14051441
{
1442+
// when only a subset of links should be colored, the default message is used rather than the cached solid robot messages
1443+
rviz_visual_tools::colors base_color = color;
1444+
if (!highlight_links.empty())
1445+
base_color = rviz_visual_tools::DEFAULT;
1446+
14061447
// Reference to the correctly colored version of message (they are cached)
14071448
// May not exist yet but this will create it
1408-
moveit_msgs::DisplayRobotState& display_robot_msg = display_robot_msgs_[color];
1449+
moveit_msgs::DisplayRobotState& display_robot_msg = display_robot_msgs_[base_color];
14091450

14101451
// Check if a robot state message already exists for this color
14111452
if (display_robot_msg.highlight_links.size() == 0) // has not been colored yet, lets create that
14121453
{
14131454
if (color != rviz_visual_tools::DEFAULT) // ignore color highlights when set to default
14141455
{
14151456
// Get links names
1416-
const std::vector<const moveit::core::LinkModel*>& link_names =
1417-
robot_state.getRobotModel()->getLinkModelsWithCollisionGeometry();
1457+
const std::vector<std::string>& link_names =
1458+
highlight_links.empty() ? robot_state.getRobotModel()->getLinkModelNamesWithCollisionGeometry() :
1459+
highlight_links;
14181460
display_robot_msg.highlight_links.resize(link_names.size());
14191461

14201462
// Get color
@@ -1423,7 +1465,7 @@ bool MoveItVisualTools::publishRobotState(const robot_state::RobotState& robot_s
14231465
// Color every link
14241466
for (std::size_t i = 0; i < link_names.size(); ++i)
14251467
{
1426-
display_robot_msg.highlight_links[i].id = link_names[i]->getName();
1468+
display_robot_msg.highlight_links[i].id = link_names[i];
14271469
display_robot_msg.highlight_links[i].color = color_rgba;
14281470
}
14291471
}
@@ -1453,6 +1495,10 @@ bool MoveItVisualTools::publishRobotState(const robot_state::RobotState& robot_s
14531495
pub_robot_state_.publish(display_robot_msg);
14541496
ros::spinOnce();
14551497

1498+
// remove highlight links from default message
1499+
if (!highlight_links.empty())
1500+
display_robot_msg.highlight_links.clear();
1501+
14561502
return true;
14571503
}
14581504

0 commit comments

Comments
 (0)