1313#include < moveit/robot_model/robot_model.h>
1414#include < moveit/robot_state/robot_state.h>
1515
16+ namespace {
17+ constexpr double kUnboundedVariableHalfSpan = M_PI;
18+ constexpr double kUnboundedJointSampleSpread = M_PI;
19+ } // namespace
20+
1621namespace pick_ik {
1722
23+ auto Robot::Variable::generate_valid_value (double init_val /* = 0.0*/ ) const -> double {
24+ if (bounded) {
25+ return rsl::uniform_real (min, max);
26+ } else {
27+ return rsl::uniform_real (init_val - kUnboundedJointSampleSpread ,
28+ init_val + kUnboundedJointSampleSpread );
29+ }
30+ }
31+
32+ auto Robot::Variable::is_valid (double val) const -> bool {
33+ return (!bounded) || (val <= max && val >= min);
34+ }
35+
36+ auto Robot::Variable::clamp_to_limits (double val) const -> double {
37+ if (bounded) {
38+ return std::clamp (val, min, max);
39+ } else {
40+ return std::clamp (val, val - half_span, val + half_span);
41+ }
42+ }
43+
1844auto Robot::from (std::shared_ptr<moveit::core::RobotModel const > const & model,
1945 moveit::core::JointModelGroup const * jmg,
2046 std::vector<size_t > tip_link_indices) -> Robot {
@@ -33,17 +59,11 @@ auto Robot::from(std::shared_ptr<moveit::core::RobotModel const> const& model,
3359
3460 auto var = Variable{};
3561
36- bool bounded = bounds.position_bounded_ ;
37-
62+ var.bounded = bounds.position_bounded_ ;
3863 var.min = bounds.min_position_ ;
3964 var.max = bounds.max_position_ ;
40-
41- var.clip_min = bounded ? var.min : std::numeric_limits<double >::lowest ();
42- var.clip_max = bounded ? var.max : std::numeric_limits<double >::max ();
43-
44- var.span = var.max - var.min ;
45-
46- if (!(var.span >= 0 && var.span < std::numeric_limits<double >::max ())) var.span = 1 ;
65+ var.mid = 0.5 * (var.min + var.max );
66+ var.half_span = var.bounded ? (var.max - var.min ) / 2.0 : kUnboundedVariableHalfSpan ;
4767
4868 auto const max_velocity = bounds.max_velocity_ ;
4969 var.max_velocity_rcp = max_velocity > 0.0 ? 1.0 / max_velocity : 0.0 ;
@@ -64,22 +84,20 @@ auto Robot::from(std::shared_ptr<moveit::core::RobotModel const> const& model,
6484 return robot;
6585}
6686
67- auto Robot::get_random_valid_configuration () const -> std::vector<double> {
68- std::vector<double > config;
87+ auto Robot::set_random_valid_configuration (std::vector<double >& config) const -> void {
6988 auto const num_vars = variables.size ();
70- config.reserve (num_vars);
89+ if (config.size () != num_vars) {
90+ config.resize (num_vars);
91+ }
7192 for (size_t idx = 0 ; idx < num_vars; ++idx) {
72- auto const var = variables[idx];
73- config.push_back (rsl::uniform_real (var.clip_min , var.clip_max ));
93+ config[idx] = variables[idx].generate_valid_value (config[idx]);
7494 }
75- return config;
7695}
7796
7897auto Robot::is_valid_configuration (std::vector<double > const & config) const -> bool {
7998 auto const num_vars = variables.size ();
8099 for (size_t idx = 0 ; idx < num_vars; ++idx) {
81- auto const var = variables[idx];
82- if (config[idx] > var.clip_max || config[idx] < var.clip_min ) {
100+ if (!variables[idx].is_valid (config[idx])) {
83101 return false ;
84102 }
85103 }
0 commit comments