39 #define _ENABLE_EXTENDED_ALIGNED_STORAGE // https://devblogs.microsoft.com/cppblog/stl-features-and-fixes-in-vs-2017-15-8/ 58 const std::string& imarker_name, std::vector<ArmData> arm_datas,
62 , arm_datas_(
std::move(arm_datas))
63 , psm_(
std::move(psm))
65 , package_path_(package_path)
68 visual_tools_ = std::make_shared<moveit_visual_tools::MoveItVisualTools>(
79 const std::string imarker_topic =
nh_.
getNamespace() +
"/" + imarker_name +
"_imarker";
80 imarker_server_ = std::make_shared<interactive_markers::InteractiveMarkerServer>(imarker_topic,
"",
false);
95 for (std::size_t i = 0; i <
arm_datas_.size(); ++i)
99 eef_name = imarker_name +
"_right";
101 eef_name = imarker_name +
"_left";
117 if (!boost::filesystem::exists(file_name))
122 std::ifstream input_file(file_name);
126 if (!std::getline(input_file, line))
150 ee->setIMarkerCallback(callback);
160 ee->setPoseFromRobotState();
167 (*imarker_state_) = scene->getCurrentState();
170 for (std::size_t i = 0; i <
arm_datas_.size(); ++i)
179 static const std::size_t MAX_ATTEMPTS = 1000;
180 for (std::size_t attempt = 0; attempt < MAX_ATTEMPTS; ++attempt)
183 for (std::size_t i = 0; i <
arm_datas_.size(); ++i)
194 static const bool verbose =
false;
201 if (planning_scene->distanceToCollision(*
imarker_state_) < clearance)
210 for (std::size_t i = 0; i <
arm_datas_.size(); ++i)
214 for (std::size_t i = 0; i <
arm_datas_.size(); ++i)
238 return planning_scene->isStateValid(*
imarker_state_,
"", verbose);
252 const std::string& subdirectory)
const 255 namespace fs = boost::filesystem;
259 rootPath = rootPath / fs::path(subdirectory);
261 boost::system::error_code returnedError;
262 fs::create_directories(rootPath, returnedError);
267 ROS_ERROR(
"Unable to create directory %s", subdirectory.c_str());
272 rootPath = rootPath / fs::path(file_name);
273 file_path = rootPath.string();
282 std::vector<std::string> tips;
283 for (std::size_t i = 0; i <
arm_datas_.size(); ++i)
284 tips.push_back(
arm_datas_[i].ee_link_->getName());
288 const double timeout = 1.0 / 30.0;
293 bool collision_checking_verbose_ =
false;
294 bool only_check_self_collision_ =
false;
298 boost::scoped_ptr<planning_scene_monitor::LockedPlanningSceneRO> ls;
300 constraint_fn = boost::bind(&isIKStateValid, static_cast<const planning_scene::PlanningSceneConstPtr&>(*ls).get(),
301 collision_checking_verbose_, only_check_self_collision_,
visual_tools_, _1, _2, _3);
305 std::size_t outer_attempts = 20;
306 for (std::size_t i = 0; i < outer_attempts; ++i)
308 if (!
imarker_state_->setFromIK(group, poses, tips, timeout, constraint_fn))
324 ee->setPoseFromRobotState();
341 const double* ik_solution)
347 #if 0 // Ensure there are objects in the planning scene 348 const std::size_t num_collision_objects = planning_scene->
getCollisionWorld()->getWorld()->size();
349 if (num_collision_objects == 0)
351 ROS_ERROR_STREAM_NAMED(
"imarker_robot_state",
"No collision objects exist in world, you need at least a table " 352 "modeled for the controller to work");
353 ROS_ERROR_STREAM_NAMED(
"imarker_robot_state",
"To fix this, relaunch the teleop/head tracking/whatever MoveIt " 354 "node to publish the collision objects");
364 if (only_check_self_collision)
384 visual_tools->publishContactPoints(*robot_state, planning_scene);
#define ROS_DEBUG_STREAM_NAMED(name, args)
#define ROS_ERROR_STREAM_NAMED(name, args)
void robotStateToStream(const RobotState &state, std::ostream &out, bool include_header=true, const std::string &separator=",")
void checkSelfCollision(const collision_detection::CollisionRequest &req, collision_detection::CollisionResult &res)
#define ROS_INFO_STREAM_NAMED(name, args)
void update(bool force=false)
#define ROS_WARN_STREAM_THROTTLE_NAMED(period, name, args)
const std::string & getName() const
const std::string & getNamespace() const
void setJointGroupPositions(const std::string &joint_group_name, const double *gstate)
std::vector< Eigen::Isometry3d, Eigen::aligned_allocator< Eigen::Isometry3d > > vector_Isometry3d
void streamToRobotState(RobotState &state, const std::string &line, const std::string &separator=",")
boost::function< bool(RobotState *robot_state, const JointModelGroup *joint_group, const double *joint_group_variable_values)> GroupStateValidityCallbackFn
const collision_detection::CollisionWorldConstPtr & getCollisionWorld() const
bool isStateColliding(const std::string &group="", bool verbose=false)
#define ROS_WARN_STREAM_NAMED(name, args)