搞定了,有需要的自己看吧
#include <iostream> #include <ostream> #include <memory> #include <vector> #include <rclcpp/rclcpp.hpp> #include <moveit/robot_model_loader/robot_model_loader.h> #include <moveit/planning_scene/planning_scene.h> #include <moveit/kinematic_constraints/utils.h> #include <moveit/moveit_cpp/moveit_cpp.h> #include <moveit/robot_model/robot_model.h> #include <moveit/robot_state/robot_state.h> #include <moveit_msgs/msg/planning_scene.hpp> #include <moveit/collision_detection_fcl/collision_common.h> #include <moveit/collision_detection_fcl/collision_env_fcl.h> #include <moveit/planning_scene/planning_scene.h> #include <moveit/kinematic_constraints/utils.h> #include <moveit/moveit_cpp/moveit_cpp.h> #include <moveit/robot_model/robot_model.h> #include <moveit/robot_state/robot_state.h> #include <moveit/collision_detection/collision_detector_allocator.h> #include <moveit/collision_detection_fcl/collision_common.h> #include <moveit/collision_detection_fcl/collision_env_fcl.h> #include <moveit/collision_detection_fcl/collision_detector_allocator_fcl.h> #include <moveit/collision_detection_fcl/collision_detector_fcl_plugin_loader.h> #include <moveit/collision_detection_fcl/fcl_compat.h> #include <moveit/rdf_loader/rdf_loader.h> #include <moveit/planning_scene_interface/planning_scene_interface.h> #include <moveit/move_group_interface/move_group_interface.h> #include <moveit_visual_tools/moveit_visual_tools.h> // #include <shape_msgs/msg/solid_primitive.hpp> #define PI 3.1415926 using namespace std; static const rclcpp::Logger LOGGER = rclcpp::get_logger("collision_node"); int main(int argc, char **argv) { // ROS2 init rclcpp::init(argc, argv); rclcpp::NodeOptions node_options; node_options.automatically_declare_parameters_from_overrides(true); auto collision_node = rclcpp::Node::make_shared("collision_node", node_options); rclcpp::executors::SingleThreadedExecutor executor; executor.add_node(collision_node); std::thread([&executor]() { executor.spin(); }) .detach(); robot_model_loader::RobotModelLoader robot_model_loader(collision_node, "robot_description"); const moveit::core::RobotModelPtr &robot_model = robot_model_loader.getModel(); planning_scene::PlanningScene planning_scene(robot_model); moveit::core::RobotState ¤t_state = planning_scene.getCurrentStateNonConst(); // ----- check SRDF ----- // // srdf::ModelConstSharedPtr model_srdf = robot_model->getSRDF(); // RCLCPP_INFO_STREAM(LOGGER, "SRDF model load " << (model_srdf ? "SUCCESS." : "FAILED!")); // success // ----- check ACM ----- // collision_detection::AllowedCollisionMatrix &acm = planning_scene.getAllowedCollisionMatrixNonConst(); // acm.print(std::cout); // acm.setEntry("panda_link5", "panda_hand", true); // in collision,-0.045408 // acm.setEntry("panda_link5", "panda_link7", true); // in collision,-0.0131087 // acm.setEntry("panda_link5", "panda_rightfinger", true); // not in collision,0.00929973 // acm.setEntry("panda_link5", "panda_leftfinger", true); // 0.0284744 // acm.setEntry("panda_link5", "panda_link2", true); // 0.241446 // RCLCPP_INFO_STREAM(LOGGER, "acm.Size = " << acm.getSize()); // std::vector<std::string> allEntrynames; // acm.getAllEntryNames(allEntrynames); // for (auto name : allEntrynames) RCLCPP_INFO_STREAM(LOGGER, "Entryname : " << name); // acm.print(std::cout); // ----- check disabled and enabled collision pairs ----- // // std::vector<srdf::Model::CollisionPair> disabled_collision_pairs = model_srdf->getDisabledCollisionPairs(); // std::vector<srdf::Model::CollisionPair> enabled_collision_pairs = model_srdf->getEnabledCollisionPairs(); // RCLCPP_INFO_STREAM(LOGGER, "enabled collision pair size: " << enabled_collision_pairs.size()); // empty // for (auto it : enabled_collision_pairs) RCLCPP_INFO_STREAM(LOGGER, "enabled collision pair: (" << it.link1_ << " - " << it.link2_ << ")"); // RCLCPP_INFO_STREAM(LOGGER, "disabled collision pair size: (" << disabled_collision_pairs.size()); // for (auto it : disabled_collision_pairs) // RCLCPP_INFO_STREAM(LOGGER, "disabled collision pair: (" << it.link1_ << " - " << it.link2_ << ") | reason: " << it.reason_); // ----- 01:use CollisionEnvFCL -> distanceRobot() ----- // /* { RCLCPP_INFO_STREAM(LOGGER, "----- 01:use CollisionEnvFCL -> distanceRobot() -----"); // RCLCPP_INFO_STREAM(LOGGER, "std::numeric_limits<double>::max = " << std::numeric_limits<double>::max()); current_state.setToDefaultValues(); collision_detection::CollisionEnvFCL collision_env(robot_model, 0.0, 1.0); collision_detection::DistanceRequest distance_request; distance_request.enable_nearest_points = true; distance_request.enable_signed_distance = true; distance_request.type = collision_detection::DistanceRequestType::GLOBAL; distance_request.distance_threshold = 10; // distance_request.enableGroup(); if (nullptr == distance_request.active_components_only) RCLCPP_INFO(LOGGER, "active_components_only is not NULL"); else RCLCPP_INFO_STREAM(LOGGER, "active_components_only is " << distance_request.active_components_only); collision_detection::DistanceResult distance_result; collision_detection::DistanceResultsData min_distance = distance_result.minimum_distance; auto min_dis_link_names = min_distance.link_names; double min_distance_min_distance = min_distance.distance; collision_detection::DistanceMap distance_map = distance_result.distances; distance_result.clear(); current_state.setToDefaultValues(); RCLCPP_INFO(LOGGER, " Default Positions >>>"); collision_env.distanceRobot(distance_request, distance_result, current_state); RCLCPP_INFO_STREAM(LOGGER, "\tMinimum distance between: " << min_dis_link_names[0] << " and " << min_dis_link_names[1]); RCLCPP_INFO_STREAM(LOGGER, "\tMinimum distance is : " << distance_result.minimum_distance.distance); RCLCPP_INFO_STREAM(LOGGER, "\tdistance_result.minimum_distance.distance : " << min_distance_min_distance); RCLCPP_INFO_STREAM(LOGGER, "\tdistance_map is " << (distance_map.empty() ? "" : "not") << " empty"); distance_result.clear(); current_state.setToRandomPositions(); RCLCPP_INFO_STREAM(LOGGER, " Random Positions >>>"); collision_env.distanceRobot(distance_request, distance_result, current_state); RCLCPP_INFO_STREAM(LOGGER, "\tMinimum distance between: " << min_dis_link_names[0] << " and " << min_dis_link_names[1]); // both are empty RCLCPP_INFO_STREAM(LOGGER, "\tMinimum distance is : " << distance_result.minimum_distance.distance); // 1.79769e+308 RCLCPP_INFO_STREAM(LOGGER, "\tdistance_result.minimum_distance.distance : " << min_distance_min_distance); // 1.79769e+308 RCLCPP_INFO_STREAM(LOGGER, "\tdistance_map is " << (distance_map.empty() ? "" : "not") << "empty"); // empty RCLCPP_INFO_STREAM(LOGGER, "===== END : 02:use CollisionEnvFCL -> distanceRobot() =====" << std::endl); } */ // ----- 02:use CollisionEnv -> distanceSelf() ----- // /* { RCLCPP_INFO_STREAM(LOGGER, "----- 02:use CollisionEnvFCL -> distanceSelf() -----"); collision_detection::CollisionEnvFCL collision_env(robot_model, 0.0, 1.0); collision_detection::DistanceRequest distance_request; distance_request.enable_nearest_points = true; distance_request.enable_signed_distance = true; distance_request.type = collision_detection::DistanceRequestType::GLOBAL; distance_request.distance_threshold = 10; if (nullptr == distance_request.active_components_only) RCLCPP_INFO(LOGGER, "active_components_only is not NULL"); else RCLCPP_INFO_STREAM(LOGGER, "active_components_only is " << distance_request.active_components_only); collision_detection::DistanceResult distance_result; collision_detection::DistanceResultsData min_distance = distance_result.minimum_distance; auto min_dis_link_names = min_distance.link_names; double min_distance_min_distance = min_distance.distance; collision_detection::DistanceMap distance_map = distance_result.distances; distance_result.clear(); current_state.setToDefaultValues(); RCLCPP_INFO(LOGGER, " Default Positions >>>"); collision_env.distanceSelf(distance_request, distance_result, current_state); RCLCPP_INFO_STREAM(LOGGER, "\tMinimum distance between: " << min_dis_link_names[0] << " and " << min_dis_link_names[1]); RCLCPP_INFO_STREAM(LOGGER, "\tMinimum distance is : " << distance_result.minimum_distance.distance); RCLCPP_INFO_STREAM(LOGGER, "\tdistance_result.minimum_distance.distance : " << min_distance_min_distance); RCLCPP_INFO_STREAM(LOGGER, "\tdistance_map is " << (distance_map.empty() ? "" : "not") << " empty"); distance_result.clear(); current_state.setToRandomPositions(); RCLCPP_INFO_STREAM(LOGGER, " Random Positions >>>"); collision_env.distanceSelf(distance_request, distance_result, current_state); RCLCPP_INFO_STREAM(LOGGER, "\tMinimum distance between: " << min_dis_link_names[0] << " and " << min_dis_link_names[1]); // both are empty RCLCPP_INFO_STREAM(LOGGER, "\tMinimum distance is : " << distance_result.minimum_distance.distance); // 1.79769e+308 RCLCPP_INFO_STREAM(LOGGER, "\tdistance_result.minimum_distance.distance : " << min_distance_min_distance); // 1.79769e+308 RCLCPP_INFO_STREAM(LOGGER, "\tdistance_map is " << (distance_map.empty() ? "" : "not") << "empty"); // empty RCLCPP_INFO_STREAM(LOGGER, "===== END : 02:use CollisionEnvFCL -> distanceSelf() =====" << std::endl); } */ // ----- 03:use PlanningScene -> checkSelfCollision() ----- // /* { RCLCPP_INFO_STREAM(LOGGER, "----- use PlanningScene -> checkSelfCollision() -----"); collision_detection::CollisionRequest collision_request; collision_request.distance = true; collision_request.verbose = true; collision_detection::CollisionResult collision_result; double minimum_distance_distance; collision_result.clear(); current_state.setToDefaultValues(); current_state.setToRandomPositions(); RCLCPP_INFO(LOGGER, " Default Positions >>>"); planning_scene.checkSelfCollision(collision_request, collision_result); /////////////////////////////////////////////////////////////////////// collision_detection::DistanceResult distance_result = collision_result.distance_result; // Result of a distance request collision_detection::DistanceResultsData minimum_distance = distance_result.minimum_distance; // ResultsData for the two objects with the minimum distance minimum_distance_distance = minimum_distance.distance; // distance for the two objects with the minimum distance std::string* link_names = minimum_distance.link_names; // link names for the two objects with the minimum distance collision_detection::DistanceMap distances_map = distance_result.distances; // A map of distance data for each link in the req.Notice : active_components_only !!! RCLCPP_INFO_STREAM(LOGGER, "\tCurrent state is " << (collision_result.collision ? "in" : "not in") << " self collision"); // in self collision RCLCPP_INFO_STREAM(LOGGER, "\tdistance : " << collision_result.distance); RCLCPP_INFO_STREAM(LOGGER, "\tdistance_result.minimum_distance.distance : " << minimum_distance_distance); // 1.79769e+308???? RCLCPP_INFO_STREAM(LOGGER, "\tBetween " << link_names[0] << " and " << link_names[1]); // empty!!! RCLCPP_INFO_STREAM(LOGGER, "\tdistance_map.size = " << distances_map.size()); // empty!!! bool loopFlag = true; while (loopFlag) { collision_result.clear(); current_state.setToRandomPositions(); RCLCPP_INFO_STREAM(LOGGER, " Random Positions >>>"); planning_scene.checkSelfCollision(collision_request, collision_result); /////////////////////////////////////////////////////////////////////// if (collision_result.collision) loopFlag = false; collision_detection::DistanceResult distance_result = collision_result.distance_result; // Result of a distance request collision_detection::DistanceResultsData minimum_distance = distance_result.minimum_distance; // ResultsData for the two objects with the minimum distance minimum_distance_distance = minimum_distance.distance; // distance for the two objects with the minimum distance std::string* link_names = minimum_distance.link_names; // link names for the two objects with the minimum distance collision_detection::DistanceMap distances_map = distance_result.distances; // A map of distance data for each link in the req.Notice : active_components_only !!! RCLCPP_INFO_STREAM(LOGGER, "\tCurrent state is " << (collision_result.collision ? "in" : "not in") << " self collision"); // in self collision RCLCPP_INFO_STREAM(LOGGER, "\tdistance : " << collision_result.distance); RCLCPP_INFO_STREAM(LOGGER, "\tdistance_result.minimum_distance.distance : " << minimum_distance_distance); // 1.79769e+308???? RCLCPP_INFO_STREAM(LOGGER, "\tBetween " << link_names[0] << " and " << link_names[1]); // empty!!! RCLCPP_INFO_STREAM(LOGGER, "\tdistance_map.size = " << distances_map.size()); // empty!!! } RCLCPP_INFO_STREAM(LOGGER, "===== END : use PlanningScene -> checkSelfCollision() =====" << std::endl); } */ // ----- 04:use PlanningScene -> distanceToCollision() ----- // /* { RCLCPP_INFO_STREAM(LOGGER, "----- use PlanningScene -> checkSelfCollision() -----"); current_state.setToDefaultValues(); RCLCPP_INFO(LOGGER, " Default Positions >>>"); double distance_default_pos = planning_scene.distanceToCollision(current_state); RCLCPP_INFO_STREAM(LOGGER, " distance : " << distance_default_pos); // 1.79769e+308 current_state.setToRandomPositions(); RCLCPP_INFO(LOGGER, " Random Positions >>>"); double distance_random_pos = planning_scene.distanceToCollision(current_state); RCLCPP_INFO_STREAM(LOGGER, " distance : " << distance_random_pos); // 1.79769e+308 RCLCPP_INFO_STREAM(LOGGER, "===== END : use PlanningScene -> checkSelfCollision() =====" << std::endl); } */ // ----- 05:use PlanningScene -> checkCollision() ----- // /* { RCLCPP_INFO_STREAM(LOGGER, "----- use PlanningScene -> checkCollision() -----"); collision_detection::CollisionRequest collision_request; collision_request.distance = true; collision_detection::CollisionResult collision_result; double distance = collision_result.distance; collision_detection::DistanceResult distance_result = collision_result.distance_result; collision_detection::DistanceResultsData min_distance = distance_result.minimum_distance; double min_distance_min_distance = min_distance.distance; collision_detection::DistanceMap distance_map = distance_result.distances; collision_result.clear(); current_state.setToDefaultValues(); RCLCPP_INFO(LOGGER, " Default Positions >>>"); planning_scene.checkCollision(collision_request, collision_result); RCLCPP_INFO_STREAM(LOGGER, "\tCurrent state is " << (collision_result.collision ? "in" : "not in") << " self collision"); RCLCPP_INFO_STREAM(LOGGER, "\tdistance : " << distance); // 1.79769e+308 RCLCPP_INFO_STREAM(LOGGER, "\tdistance_result.minimum_distance.distance : " << min_distance_min_distance); // 1.79769e+308 RCLCPP_INFO_STREAM(LOGGER, "\tdistance_map is " << (distance_map.empty() ? "" : "not") << " empty"); // empty bool loopFlag = true; while (loopFlag) { collision_result.clear(); current_state.setToRandomPositions(); RCLCPP_INFO_STREAM(LOGGER, " Random Positions >>>"); planning_scene.checkCollision(collision_request, collision_result); // if (collision_result.collision) loopFlag = false; RCLCPP_INFO_STREAM(LOGGER, "\tCurrent state is " << (collision_result.collision ? "in" : "not in") << " self collision"); RCLCPP_INFO_STREAM(LOGGER, "\tdistance : " << distance); // 1.79769e+308 RCLCPP_INFO_STREAM(LOGGER, "\tdistance_result.minimum_distance.distance : " << min_distance_min_distance); // 1.79769e+308 RCLCPP_INFO_STREAM(LOGGER, "\tdistance_map is " << (distance_map.empty() ? "" : "not") << " empty"); // empty } RCLCPP_INFO_STREAM(LOGGER, "===== END : use PlanningScene -> checkCollision() =====" << std::endl); } */ // ----- 06:use collision_env = planning_scene.getCollisionEnv() ----- // // /* { RCLCPP_INFO_STREAM(LOGGER, "----- use collision_env = planning_scene.getCollisionEnv() -----"); // collision_detection::CollisionEnvFCL collision_env(robot_model, 0.0, 1.0); auto collision_env = planning_scene.getCollisionEnv(); collision_detection::DistanceRequest distance_request; distance_request.enable_nearest_points = true; distance_request.enable_signed_distance = true; // distance_request.type = collision_detection::DistanceRequestType::GLOBAL; distance_request.type = collision_detection::DistanceRequestType::ALL; distance_request.distance_threshold = 10; distance_request.acm = &acm; // if (nullptr == distance_request.active_components_only) // RCLCPP_INFO(LOGGER, "active_components_only is not NULL"); // else // RCLCPP_INFO_STREAM(LOGGER, "active_components_only is " << distance_request.active_components_only); // 0? collision_detection::DistanceResult distance_result; collision_detection::DistanceResultsData minimum_distance; // double min_distance_min_distance = min_distance.distance; collision_detection::DistanceMap distances_map; std::vector<double> joint_values; current_state.setToDefaultValues(); // current_state.setToRandomPositions(); current_state.copyJointGroupPositions("panda_arm", joint_values); RCLCPP_INFO(LOGGER, " Default Positions >>>"); for (auto joint_value : joint_values) RCLCPP_INFO_STREAM(LOGGER, " joint_value: " << joint_value); // collision_env->distanceRobot(distance_request, distance_result, current_state); distance_result.clear(); collision_env->distanceSelf(distance_request, distance_result, current_state); // collision_env->distanceSelf(current_state, acm); ////////////////////////////////////// // RCLCPP_INFO_STREAM(LOGGER, " distance with ACM is : " << distance); RCLCPP_INFO_STREAM(LOGGER, " Current state is " << (distance_result.collision ? "in" : "not in") << " self collision"); // in self collision minimum_distance = distance_result.minimum_distance; // RCLCPP_INFO_STREAM(LOGGER, " Minimum distance is : " << collision_env->distanceSelf(current_state, acm, true)); RCLCPP_INFO_STREAM(LOGGER, " Minimum distance is : " << minimum_distance.distance); // auto min_dis_link_names = minimum_distance.link_names; std::string *min_dis_link_names = minimum_distance.link_names; RCLCPP_INFO_STREAM(LOGGER, " Minimum distance between: " << min_dis_link_names[0] << " and " << min_dis_link_names[1]); distances_map = distance_result.distances; RCLCPP_INFO_STREAM(LOGGER, " distance_map.size = " << distances_map.size()); if(0 != distances_map.size()) { for(auto distance_pair : distances_map) { RCLCPP_INFO_STREAM(LOGGER, " distance between " << distance_pair.first.first << " and " << distance_pair.first.second << " : " << distance_pair.second.at(0).distance); } } // int loop_times = 3; // while (loop_times--) // { // distance_result.clear(); // RCLCPP_INFO_STREAM(LOGGER, " distance after clear: " << distance_result.minimum_distance.distance); // // current_state.setToRandomPositions(); // RCLCPP_INFO_STREAM(LOGGER, " Random Positions >>>"); // // current_state.copyJointGroupPositions("panda_arm", joint_values); // for (auto joint_value : joint_values) // RCLCPP_INFO_STREAM(LOGGER, " joint_value: " << joint_value); // // collision_env->distanceRobot(distance_request, distance_result, current_state); // collision_env->distanceSelf(distance_request, distance_result, current_state); // // auto = distance_result.minimum_distance.link_names; // // RCLCPP_INFO_STREAM(LOGGER, "\tMinimum distance between: " << min_dis_link_names[0] << " and " << min_dis_link_names[1]); // both are empty // RCLCPP_INFO_STREAM(LOGGER, "\t Minimum distance is : " << distance_result.minimum_distance.distance); // // RCLCPP_INFO_STREAM(LOGGER, "\tdistance_map is " << (distance_map.empty() ? "" : "not") << "empty"); // empty // } RCLCPP_INFO_STREAM(LOGGER, "===== END : use collision_env = planning_scene.getCollisionEnv() =====" << std::endl); } // */ rclcpp::shutdown(); return 0; }