Skip to content

Commit 79fb57a

Browse files
Update due to changes in TrajOpt CollisionTerm supporting longest valid segment length
1 parent 29d0143 commit 79fb57a

File tree

13 files changed

+74
-17
lines changed

13 files changed

+74
-17
lines changed

tesseract/tesseract_planning/tesseract_motion_planners/include/tesseract_motion_planners/trajopt/config/trajopt_planner_default_config.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ struct TrajOptPlannerDefaultConfig : public TrajOptPlannerConfig
8888
* singularities */
8989
JointWaypoint::ConstPtr configuration = nullptr;
9090

91+
/** @brief The type of contact test to perform: FIRST, CLOSEST, ALL */
92+
tesseract_collision::ContactTestType contact_test_type = tesseract_collision::ContactTestType::ALL;
9193
/** @brief If true, collision checking will be enabled. Default: true*/
9294
bool collision_check = true;
9395
/** @brief If true, use continuous collision checking */

tesseract/tesseract_planning/tesseract_motion_planners/include/tesseract_motion_planners/trajopt/config/utils.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,14 @@ trajopt::TermInfo::Ptr createConfigurationTermInfo(const JointWaypoint::ConstPtr
7777
double coeff = 1.0,
7878
const std::string& name = "configuration_cost");
7979

80-
trajopt::TermInfo::Ptr createCollisionTermInfo(int n_steps,
81-
double collision_safety_margin,
82-
bool collision_continuous = true,
83-
double coeff = 20.0,
84-
const std::string& name = "collision_cost");
80+
trajopt::TermInfo::Ptr createCollisionTermInfo(
81+
int n_steps,
82+
double collision_safety_margin,
83+
bool collision_continuous = true,
84+
double coeff = 20.0,
85+
tesseract_collision::ContactTestType contact_test_type = tesseract_collision::ContactTestType::ALL,
86+
double longest_valid_segment_length = 0.5,
87+
const std::string& name = "collision_cost");
8588

8689
trajopt::TermInfo::Ptr
8790
createSmoothVelocityTermInfo(int n_steps, int n_joints, double coeff = 5.0, const std::string& name = "joint_vel_cost");

tesseract/tesseract_planning/tesseract_motion_planners/src/trajopt/config/trajopt_planner_default_config.cpp

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
#include <tesseract_motion_planners/trajopt/config/trajopt_planner_default_config.h>
2727
#include <tesseract_motion_planners/trajopt/config/utils.h>
2828

29+
static const double LONGEST_VALID_SEGMENT_FRACTION_DEFAULT = 0.01;
30+
2931
namespace tesseract_motion_planners
3032
{
3133
TrajOptPlannerDefaultConfig::TrajOptPlannerDefaultConfig(tesseract::Tesseract::ConstPtr tesseract_,
@@ -163,9 +165,34 @@ std::shared_ptr<trajopt::ProblemConstructionInfo> TrajOptPlannerDefaultConfig::g
163165
// Set costs for the rest of the points
164166
if (collision_check)
165167
{
168+
// Calculate longest valid segment length
169+
const Eigen::MatrixX2d& limits = kin->getLimits();
170+
double length = 0;
171+
double extent = (limits.col(1) - limits.col(0)).norm();
172+
if (longest_valid_segment_fraction > 0 && longest_valid_segment_length > 0)
173+
{
174+
length = std::min(longest_valid_segment_fraction * extent, longest_valid_segment_length);
175+
}
176+
else if (longest_valid_segment_fraction > 0)
177+
{
178+
length = longest_valid_segment_fraction * extent;
179+
}
180+
else if (longest_valid_segment_length > 0)
181+
{
182+
length = longest_valid_segment_length;
183+
}
184+
else
185+
{
186+
length = LONGEST_VALID_SEGMENT_FRACTION_DEFAULT * extent;
187+
}
188+
166189
// Create a default collision term info
167-
trajopt::TermInfo::Ptr ti =
168-
createCollisionTermInfo(pci.basic_info.n_steps, collision_safety_margin, collision_continuous, collision_coeff);
190+
trajopt::TermInfo::Ptr ti = createCollisionTermInfo(pci.basic_info.n_steps,
191+
collision_safety_margin,
192+
collision_continuous,
193+
collision_coeff,
194+
contact_test_type,
195+
length);
169196

170197
// Update the term info with the (possibly) new start and end state indices for which to apply this cost
171198
std::shared_ptr<trajopt::CollisionTermInfo> ct = std::static_pointer_cast<trajopt::CollisionTermInfo>(ti);

tesseract/tesseract_planning/tesseract_motion_planners/src/trajopt/config/trajopt_planner_freespace_config.cpp

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
#include <tesseract_motion_planners/trajopt/config/trajopt_planner_freespace_config.h>
2727
#include <tesseract_motion_planners/trajopt/config/utils.h>
2828

29+
static const double LONGEST_VALID_SEGMENT_FRACTION_DEFAULT = 0.01;
30+
2931
namespace tesseract_motion_planners
3032
{
3133
std::shared_ptr<trajopt::ProblemConstructionInfo> TrajOptPlannerFreespaceConfig::generatePCI() const
@@ -159,9 +161,34 @@ std::shared_ptr<trajopt::ProblemConstructionInfo> TrajOptPlannerFreespaceConfig:
159161
// Set costs for the rest of the points
160162
if (collision_check)
161163
{
164+
// Calculate longest valid segment length
165+
const Eigen::MatrixX2d& limits = kin->getLimits();
166+
double length = 0;
167+
double extent = (limits.col(1) - limits.col(0)).norm();
168+
if (longest_valid_segment_fraction > 0 && longest_valid_segment_length > 0)
169+
{
170+
length = std::min(longest_valid_segment_fraction * extent, longest_valid_segment_length);
171+
}
172+
else if (longest_valid_segment_fraction > 0)
173+
{
174+
length = longest_valid_segment_fraction * extent;
175+
}
176+
else if (longest_valid_segment_length > 0)
177+
{
178+
length = longest_valid_segment_length;
179+
}
180+
else
181+
{
182+
length = LONGEST_VALID_SEGMENT_FRACTION_DEFAULT * extent;
183+
}
184+
162185
// Create a default collision term info
163-
trajopt::TermInfo::Ptr ti =
164-
createCollisionTermInfo(pci.basic_info.n_steps, collision_safety_margin, collision_continuous, collision_coeff);
186+
trajopt::TermInfo::Ptr ti = createCollisionTermInfo(pci.basic_info.n_steps,
187+
collision_safety_margin,
188+
collision_continuous,
189+
collision_coeff,
190+
contact_test_type,
191+
length);
165192

166193
// Update the term info with the (possibly) new start and end state indices for which to apply this cost
167194
std::shared_ptr<trajopt::CollisionTermInfo> ct = std::static_pointer_cast<trajopt::CollisionTermInfo>(ti);

tesseract/tesseract_planning/tesseract_motion_planners/src/trajopt/config/utils.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,8 @@ trajopt::TermInfo::Ptr createCollisionTermInfo(int n_steps,
218218
double collision_safety_margin,
219219
bool collision_continuous,
220220
double coeff,
221+
tesseract_collision::ContactTestType contact_test_type,
222+
double longest_valid_segment_length,
221223
const std::string& name)
222224
{
223225
std::shared_ptr<trajopt::CollisionTermInfo> collision = std::make_shared<trajopt::CollisionTermInfo>();
@@ -226,7 +228,8 @@ trajopt::TermInfo::Ptr createCollisionTermInfo(int n_steps,
226228
collision->continuous = collision_continuous;
227229
collision->first_step = 0;
228230
collision->last_step = n_steps - 1;
229-
collision->gap = 1;
231+
collision->contact_test_type = contact_test_type;
232+
collision->longest_valid_segment_length = longest_valid_segment_length;
230233
collision->info = trajopt::createSafetyMarginDataVector(n_steps, collision_safety_margin, coeff);
231234
return collision;
232235
}

tesseract/tesseract_planning/tesseract_motion_planners/src/trajopt/trajopt_motion_planner.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ tesseract_common::StatusCode TrajOptMotionPlanner::solve(PlannerResponse& respon
153153
{
154154
length = LONGEST_VALID_SEGMENT_FRACTION_DEFAULT * extent;
155155
}
156+
156157
std::vector<tesseract_collision::ContactResultMap> collisions;
157158
tesseract_environment::StateSolver::Ptr state_solver = config_->prob->GetEnv()->getStateSolver();
158159
tesseract_collision::ContinuousContactManager::Ptr continuous_manager =

tesseract_ros/tesseract_examples/tesseract_ros_examples/config/glass_up_right_plan.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"coeffs" : [20],
2323
"dist_pen" : [0.025],
2424
"continuous" : true,
25+
"longest_valid_segment_length" : 0.1,
2526
"pairs" :
2627
[
2728
{

tesseract_ros/tesseract_examples/tesseract_ros_examples/src/basic_cartesian_example.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,6 @@ TrajOptProb::Ptr BasicCartesianExample::cppMethod()
165165
collision->continuous = false;
166166
collision->first_step = 0;
167167
collision->last_step = pci.basic_info.n_steps - 1;
168-
collision->gap = 1;
169168
collision->info = createSafetyMarginDataVector(pci.basic_info.n_steps, 0.025, 20);
170169

171170
// Populate Constraints

tesseract_ros/tesseract_examples/tesseract_ros_examples/src/car_seat_example.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,6 @@ std::shared_ptr<ProblemConstructionInfo> CarSeatExample::cppMethod(const std::st
295295
collision->continuous = true;
296296
collision->first_step = 0;
297297
collision->last_step = pci->basic_info.n_steps - 2;
298-
collision->gap = 1;
299298
collision->info = createSafetyMarginDataVector(pci->basic_info.n_steps, 0.0001, 40);
300299
pci->cnt_infos.push_back(collision);
301300

tesseract_ros/tesseract_examples/tesseract_ros_examples/src/glass_up_right_example.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ TrajOptProb::Ptr GlassUpRightExample::cppMethod()
125125
collision->continuous = false;
126126
collision->first_step = 0;
127127
collision->last_step = pci.basic_info.n_steps - 1;
128-
collision->gap = 1;
129128
collision->info = createSafetyMarginDataVector(pci.basic_info.n_steps, 0.025, 20);
130129
for (auto& info : collision->info)
131130
{

0 commit comments

Comments
 (0)