Skip to content

Commit 5c5509e

Browse files
committed
Add tolerances to joint/cartesian waypoints
1 parent 4ae3374 commit 5c5509e

File tree

8 files changed

+100
-12
lines changed

8 files changed

+100
-12
lines changed

tesseract/tesseract_planning/tesseract_command_language/include/tesseract_command_language/cartesian_waypoint.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,25 @@ class CartesianWaypoint
257257

258258
/** @brief The Cartesian Waypoint */
259259
Eigen::Isometry3d waypoint;
260+
/** @brief Distance below waypoint that is allowed. Should be size = 6. First 3 elements are dx, dy, dz. The last 3 elements are angle axis error allowed (Eigen::AngleAxisd.axis() * Eigen::AngleAxisd.angle()) */
261+
Eigen::VectorXd lower_tolerance;
262+
/** @brief Distance above waypoint that is allowed. Should be size = 6. First 3 elements are dx, dy, dz. The last 3 elements are angle axis error allowed (Eigen::AngleAxisd.axis() * Eigen::AngleAxisd.angle())*/
263+
Eigen::VectorXd upper_tolerance;
264+
265+
bool isToleranced() const
266+
{
267+
// Check if they are empty
268+
if (lower_tolerance.size() == 0 || upper_tolerance.size() == 0)
269+
return false;
270+
271+
// Check if they are close to 0
272+
Eigen::VectorXd range = upper_tolerance - lower_tolerance;
273+
double sum = range.sum();
274+
if (sum < 1e-5)
275+
return false;
276+
277+
return true;
278+
}
260279
};
261280

262281
} // namespace tesseract_planning

tesseract/tesseract_planning/tesseract_command_language/include/tesseract_command_language/joint_waypoint.h

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,11 +258,30 @@ class JointWaypoint
258258
inline operator Eigen::Ref<Eigen::VectorXd>() { return Eigen::Ref<Eigen::VectorXd>(waypoint); }
259259

260260
//////////////////////////////////
261-
// Cartesian Waypoint Container //
261+
// Joint Waypoint Container //
262262
//////////////////////////////////
263263

264264
Eigen::VectorXd waypoint;
265265
std::vector<std::string> joint_names;
266+
/** @brief Joint distance below waypoint that is allowed. Each element should be <= 0 */
267+
Eigen::VectorXd lower_tolerance;
268+
/** @brief Joint distance above waypoint that is allowed. Each element should be >= 0 */
269+
Eigen::VectorXd upper_tolerance;
270+
271+
bool isToleranced() const
272+
{
273+
// Check if they are empty
274+
if (lower_tolerance.size() == 0 || upper_tolerance.size() == 0)
275+
return false;
276+
277+
// Check if they are close to 0
278+
Eigen::VectorXd range = upper_tolerance - lower_tolerance;
279+
double sum = range.sum();
280+
if (sum < 1e-5)
281+
return false;
282+
283+
return true;
284+
}
266285
};
267286
} // namespace tesseract_planning
268287

tesseract/tesseract_planning/tesseract_motion_planners/include/tesseract_motion_planners/trajopt/profile/trajopt_default_plan_profile.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
3333
#include <Eigen/Geometry>
3434
TESSERACT_COMMON_IGNORE_WARNINGS_POP
3535

36+
#include <tesseract_command_language/cartesian_waypoint.h>
37+
#include <tesseract_command_language/joint_waypoint.h>
3638
#include <tesseract_motion_planners/trajopt/profile/trajopt_profile.h>
3739

3840
namespace tesseract_planning
@@ -72,14 +74,14 @@ class TrajOptDefaultPlanProfile : public TrajOptPlanProfile
7274
constraint_error_functions;
7375

7476
void apply(trajopt::ProblemConstructionInfo& pci,
75-
const Eigen::Isometry3d& cartesian_waypoint,
77+
const CartesianWaypoint& cartesian_waypoint,
7678
const Instruction& parent_instruction,
7779
const ManipulatorInfo& manip_info,
7880
const std::vector<std::string>& active_links,
7981
int index) override;
8082

8183
void apply(trajopt::ProblemConstructionInfo& pci,
82-
const Eigen::VectorXd& joint_waypoint,
84+
const JointWaypoint& joint_waypoint,
8385
const Instruction& parent_instruction,
8486
const ManipulatorInfo& manip_info,
8587
const std::vector<std::string>& active_links,

tesseract/tesseract_planning/tesseract_motion_planners/include/tesseract_motion_planners/trajopt/profile/trajopt_profile.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
3434
TESSERACT_COMMON_IGNORE_WARNINGS_POP
3535

3636
#include <tesseract_command_language/core/instruction.h>
37+
#include <tesseract_command_language/cartesian_waypoint.h>
38+
#include <tesseract_command_language/joint_waypoint.h>
3739
#include <tesseract_command_language/manipulator_info.h>
3840

3941
namespace tesseract_planning
@@ -45,14 +47,14 @@ class TrajOptPlanProfile
4547
using ConstPtr = std::shared_ptr<const TrajOptPlanProfile>;
4648

4749
virtual void apply(trajopt::ProblemConstructionInfo& pci,
48-
const Eigen::Isometry3d& cartesian_waypoint,
50+
const CartesianWaypoint& cartesian_waypoint,
4951
const Instruction& parent_instruction,
5052
const ManipulatorInfo& manip_info,
5153
const std::vector<std::string>& active_links,
5254
int index) = 0;
5355

5456
virtual void apply(trajopt::ProblemConstructionInfo& pci,
55-
const Eigen::VectorXd& joint_waypoint,
57+
const JointWaypoint& joint_waypoint,
5658
const Instruction& parent_instruction,
5759
const ManipulatorInfo& manip_info,
5860
const std::vector<std::string>& active_links,

tesseract/tesseract_planning/tesseract_motion_planners/include/tesseract_motion_planners/trajopt/trajopt_utils.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ trajopt::TermInfo::Ptr createJointWaypointTermInfo(const Eigen::VectorXd& j_wp,
6363
const Eigen::VectorXd& coeffs,
6464
trajopt::TermType type);
6565

66+
trajopt::TermInfo::Ptr createTolerancedJointWaypointTermInfo(const Eigen::VectorXd& j_wp,
67+
const Eigen::VectorXd& lower_tol,
68+
const Eigen::VectorXd& upper_tol,
69+
int index,
70+
const Eigen::VectorXd& coeffs,
71+
trajopt::TermType type);
72+
73+
6674
trajopt::TermInfo::Ptr createCollisionTermInfo(
6775
int start_index,
6876
int end_index,

tesseract/tesseract_planning/tesseract_motion_planners/src/trajopt/problem_generators/default_problem_generator.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,9 @@ trajopt::TrajOptProb::Ptr DefaultTrajoptProblemGenerator(const std::string& name
126126
}
127127
else if (isJointWaypoint(start_waypoint) || isStateWaypoint(start_waypoint))
128128
{
129-
const Eigen::VectorXd& position = getJointPosition(start_waypoint);
130-
start_plan_profile->apply(*pci, position, *start_instruction, composite_mi, active_links, index);
129+
JointWaypoint position_wp;
130+
position_wp.waypoint = getJointPosition(start_waypoint);
131+
start_plan_profile->apply(*pci, position_wp, *start_instruction, composite_mi, active_links, index);
131132
}
132133
else
133134
{
@@ -213,7 +214,8 @@ trajopt::TrajOptProb::Ptr DefaultTrajoptProblemGenerator(const std::string& name
213214
}
214215
else if (isJointWaypoint(plan_instruction->getWaypoint()) || isStateWaypoint(plan_instruction->getWaypoint()))
215216
{
216-
const Eigen::VectorXd& cur_position = getJointPosition(plan_instruction->getWaypoint());
217+
JointWaypoint cur_position;
218+
cur_position.waypoint = getJointPosition(plan_instruction->getWaypoint());
217219
Eigen::Isometry3d cur_pose = Eigen::Isometry3d::Identity();
218220
if (!pci->kin->calcFwdKin(cur_pose, cur_position))
219221
throw std::runtime_error("TrajOptPlannerUniversalConfig: failed to solve forward kinematics!");
@@ -271,7 +273,8 @@ trajopt::TrajOptProb::Ptr DefaultTrajoptProblemGenerator(const std::string& name
271273
{
272274
if (isJointWaypoint(plan_instruction->getWaypoint()) || isStateWaypoint(plan_instruction->getWaypoint()))
273275
{
274-
const Eigen::VectorXd& cur_position = getJointPosition(plan_instruction->getWaypoint());
276+
JointWaypoint cur_position;
277+
cur_position.waypoint = getJointPosition(plan_instruction->getWaypoint());
275278

276279
// Add intermediate points with path costs and constraints
277280
for (std::size_t s = 0; s < seed_composite->size() - 1; ++s)

tesseract/tesseract_planning/tesseract_motion_planners/src/trajopt/profile/trajopt_default_plan_profile.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ TrajOptDefaultPlanProfile::TrajOptDefaultPlanProfile(const tinyxml2::XMLElement&
9999
}
100100
}
101101
void TrajOptDefaultPlanProfile::apply(trajopt::ProblemConstructionInfo& pci,
102-
const Eigen::Isometry3d& cartesian_waypoint,
102+
const CartesianWaypoint& cartesian_waypoint,
103103
const Instruction& parent_instruction,
104104
const ManipulatorInfo& manip_info,
105105
const std::vector<std::string>& active_links,
@@ -119,11 +119,17 @@ void TrajOptDefaultPlanProfile::apply(trajopt::ProblemConstructionInfo& pci,
119119
auto it = std::find(active_links.begin(), active_links.end(), mi.working_frame);
120120
if (it != active_links.end())
121121
{
122+
if (cartesian_waypoint.isToleranced())
123+
CONSOLE_BRIDGE_logWarn("Toleranced cartesian waypoints are not supported in this version of TrajOpt.");
124+
122125
ti = createDynamicCartesianWaypointTermInfo(
123126
cartesian_waypoint, index, mi.working_frame, tcp, cartesian_coeff, pci.kin->getTipLinkName(), term_type);
124127
}
125128
else
126129
{
130+
if (cartesian_waypoint.isToleranced())
131+
CONSOLE_BRIDGE_logWarn("Toleranced cartesian waypoints are not supported in this version of TrajOpt.");
132+
127133
ti = createCartesianWaypointTermInfo(
128134
cartesian_waypoint, index, mi.working_frame, tcp, cartesian_coeff, pci.kin->getTipLinkName(), term_type);
129135
}
@@ -138,13 +144,17 @@ void TrajOptDefaultPlanProfile::apply(trajopt::ProblemConstructionInfo& pci,
138144
}
139145

140146
void TrajOptDefaultPlanProfile::apply(trajopt::ProblemConstructionInfo& pci,
141-
const Eigen::VectorXd& joint_waypoint,
147+
const JointWaypoint& joint_waypoint,
142148
const Instruction& /*parent_instruction*/,
143149
const ManipulatorInfo& /*manip_info*/,
144150
const std::vector<std::string>& /*active_links*/,
145151
int index)
146152
{
147-
auto ti = createJointWaypointTermInfo(joint_waypoint, index, joint_coeff, term_type);
153+
trajopt::TermInfo::Ptr ti;
154+
if (joint_waypoint.isToleranced())
155+
ti = createTolerancedJointWaypointTermInfo(joint_waypoint, joint_waypoint.lower_tolerance, joint_waypoint.upper_tolerance, index, joint_coeff, term_type);
156+
else
157+
ti = createJointWaypointTermInfo(joint_waypoint, index, joint_coeff, term_type);
148158

149159
if (term_type == trajopt::TermType::TT_CNT)
150160
pci.cnt_infos.push_back(ti);

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,31 @@ trajopt::TermInfo::Ptr createJointWaypointTermInfo(const Eigen::VectorXd& j_wp,
138138
return joint_info;
139139
}
140140

141+
trajopt::TermInfo::Ptr createTolerancedJointWaypointTermInfo(const Eigen::VectorXd& j_wp,
142+
const Eigen::VectorXd& lower_tol,
143+
const Eigen::VectorXd& upper_tol,
144+
int index,
145+
const Eigen::VectorXd& coeffs,
146+
trajopt::TermType type)
147+
{
148+
auto joint_info = std::make_shared<trajopt::JointPosTermInfo>();
149+
if (coeffs.size() == 1)
150+
joint_info->coeffs = std::vector<double>(static_cast<std::size_t>(j_wp.size()), coeffs(0));
151+
else if (coeffs.size() == j_wp.size())
152+
joint_info->coeffs = std::vector<double>(coeffs.data(), coeffs.data() + coeffs.rows() * coeffs.cols());
153+
154+
joint_info->targets = std::vector<double>(j_wp.data(), j_wp.data() + j_wp.rows() * j_wp.cols());
155+
joint_info->lower_tols = std::vector<double>(lower_tol.data(), lower_tol.data() + lower_tol.rows() * lower_tol.cols());
156+
joint_info->upper_tols = std::vector<double>(upper_tol.data(), upper_tol.data() + upper_tol.rows() * upper_tol.cols());
157+
joint_info->first_step = index;
158+
joint_info->last_step = index;
159+
joint_info->name = "joint_waypoint_" + std::to_string(index);
160+
joint_info->term_type = type;
161+
162+
return joint_info;
163+
}
164+
165+
141166
trajopt::TermInfo::Ptr createCollisionTermInfo(int start_index,
142167
int end_index,
143168
double collision_safety_margin,

0 commit comments

Comments
 (0)