Skip to content

Commit a3ca1ab

Browse files
Levi ArmstrongLevi-Armstrong
authored andcommitted
Add external tool center point support
1 parent 60d2ff2 commit a3ca1ab

File tree

9 files changed

+180
-100
lines changed

9 files changed

+180
-100
lines changed

tesseract/tesseract/src/tesseract.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,13 @@ Eigen::Isometry3d Tesseract::findTCP(const tesseract_planning::ManipulatorInfo&
384384
tesseract_environment::EnvState::ConstPtr env_state = environment_->getCurrentState();
385385
auto link_it = env_state->link_transforms.find(tcp_name);
386386
if (link_it != env_state->link_transforms.end())
387-
return env_state->link_transforms.at(tip_link).inverse() * link_it->second;
387+
{
388+
// If it is external then the tcp is not attached to the robot
389+
if (manip_info.tcp.isExternal())
390+
return link_it->second;
391+
else
392+
return env_state->link_transforms.at(tip_link).inverse() * link_it->second;
393+
}
388394

389395
// Check callbacks for TCP
390396
for (const auto& fn : find_tcp_cb_)

tesseract/tesseract_planning/tesseract_command_language/include/tesseract_command_language/manipulator_info.h

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,16 @@ class ToolCenterPoint
5050
/**
5151
* @brief Tool Center Point Defined by name
5252
* @param name The tool center point name
53+
* @param external The external TCP is used when the robot is holding the part verus the tool.
5354
*/
54-
ToolCenterPoint(const std::string& name);
55+
ToolCenterPoint(const std::string& name, bool external = false);
5556

5657
/**
5758
* @brief Tool Center Point Defined by transform
5859
* @param transform The tool center point transform
60+
* @param external The external TCP is used when the robot is holding the part verus the tool.
5961
*/
60-
ToolCenterPoint(const Eigen::Isometry3d& transform);
62+
ToolCenterPoint(const Eigen::Isometry3d& transform, bool external = false);
6163

6264
/**
6365
* @brief The Tool Center Point is empty
@@ -77,6 +79,19 @@ class ToolCenterPoint
7779
*/
7880
bool isTransform() const;
7981

82+
/**
83+
* @brief Check if tool center point is and external tcp which mean it is not defined
84+
* @details The external TCP is used when the robot is holding the part verus the tool.
85+
* @return True if and external TCP, otherwise the false
86+
*/
87+
bool isExternal() const;
88+
89+
/**
90+
* @brief Set the external property
91+
* @param value True if external tool center point, otherwise false
92+
*/
93+
void setExternal(bool value);
94+
8095
/**
8196
* @brief Get the tool center point name
8297
* @return Name
@@ -95,13 +110,17 @@ class ToolCenterPoint
95110
ret_val &= (type_ == other.type_);
96111
ret_val &= (name_ == other.name_);
97112
ret_val &= (transform_.isApprox(transform_, 1e-5));
113+
ret_val &= (external_ == other.external_);
98114
return ret_val;
99115
}
100116

101117
protected:
102118
int type_{ 0 };
103119
std::string name_;
104120
Eigen::Isometry3d transform_;
121+
122+
/** @brief The external TCP is used when the robot is holding the part verus the tool. */
123+
bool external_{ false };
105124
};
106125

107126
/**

tesseract/tesseract_planning/tesseract_command_language/src/manipulator_info.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,18 @@ TESSERACT_COMMON_IGNORE_WARNINGS_POP
3636

3737
namespace tesseract_planning
3838
{
39-
ToolCenterPoint::ToolCenterPoint(const std::string& name) : type_(1), name_(name) {}
39+
ToolCenterPoint::ToolCenterPoint(const std::string& name, bool external) : type_(1), name_(name), external_(external) {}
4040

41-
ToolCenterPoint::ToolCenterPoint(const Eigen::Isometry3d& transform) : type_(2), transform_(transform) {}
41+
ToolCenterPoint::ToolCenterPoint(const Eigen::Isometry3d& transform, bool external)
42+
: type_(2), transform_(transform), external_(external)
43+
{
44+
}
4245

4346
bool ToolCenterPoint::empty() const { return (type_ == 0); }
4447
bool ToolCenterPoint::isString() const { return (type_ == 1); }
4548
bool ToolCenterPoint::isTransform() const { return (type_ == 2); }
49+
bool ToolCenterPoint::isExternal() const { return external_; }
50+
void ToolCenterPoint::setExternal(bool value) { external_ = value; }
4651

4752
const std::string& ToolCenterPoint::getString() const
4853
{
@@ -179,6 +184,17 @@ ManipulatorInfo::ManipulatorInfo(const tinyxml2::XMLElement& xml_element)
179184

180185
tcp = tcp_name;
181186
}
187+
188+
if (tcp_element->Attribute("external") != nullptr)
189+
{
190+
bool external = false;
191+
tinyxml2::XMLError status = tcp_element->QueryBoolAttribute("external", &external);
192+
193+
if (status != tinyxml2::XML_SUCCESS)
194+
throw std::runtime_error("ManipulatorInfo: Error parsing TCP attribute external.");
195+
196+
tcp.setExternal(external);
197+
}
182198
}
183199
}
184200

@@ -239,6 +255,7 @@ tinyxml2::XMLElement* ManipulatorInfo::toXML(tinyxml2::XMLDocument& doc) const
239255
{
240256
tinyxml2::XMLElement* xml_tcp = doc.NewElement("TCP");
241257
xml_tcp->SetAttribute("name", tcp.getString().c_str());
258+
xml_tcp->SetAttribute("external", tcp.isExternal());
242259
xml_manip_info->InsertEndChild(xml_tcp);
243260
}
244261
else if (tcp.isTransform())
@@ -254,6 +271,7 @@ tinyxml2::XMLElement* ManipulatorInfo::toXML(tinyxml2::XMLDocument& doc) const
254271
wxyz_string << Eigen::Vector4d(q.w(), q.x(), q.y(), q.z()).format(eigen_format);
255272

256273
xml_tcp->SetAttribute("wxyz", wxyz_string.str().c_str());
274+
xml_tcp->SetAttribute("external", tcp.isExternal());
257275
xml_manip_info->InsertEndChild(xml_tcp);
258276
}
259277

tesseract/tesseract_planning/tesseract_motion_planners/include/tesseract_motion_planners/trajopt/problem_generators/default_problem_generator.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,12 @@ TESSERACT_COMMON_IGNORE_WARNINGS_POP
3636

3737
namespace tesseract_planning
3838
{
39-
trajopt::TrajOptProb::Ptr DefaultTrajoptProblemGenerator(const std::string& name,
40-
const PlannerRequest& request,
41-
const TrajOptPlanProfileMap& plan_profiles,
42-
const TrajOptCompositeProfileMap& composite_profiles,
43-
const TrajOptSolverProfileMap& solver_profiles);
39+
std::shared_ptr<trajopt::ProblemConstructionInfo>
40+
DefaultTrajoptProblemGenerator(const std::string& name,
41+
const PlannerRequest& request,
42+
const TrajOptPlanProfileMap& plan_profiles,
43+
const TrajOptCompositeProfileMap& composite_profiles,
44+
const TrajOptSolverProfileMap& solver_profiles);
4445

4546
} // namespace tesseract_planning
4647
#endif

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,12 @@ namespace tesseract_planning
3838
{
3939
class TrajOptMotionPlannerStatusCategory;
4040

41-
using TrajOptProblemGeneratorFn = std::function<trajopt::TrajOptProb::Ptr(const std::string&,
42-
const PlannerRequest&,
43-
const TrajOptPlanProfileMap&,
44-
const TrajOptCompositeProfileMap&,
45-
const TrajOptSolverProfileMap&)>;
41+
using TrajOptProblemGeneratorFn =
42+
std::function<std::shared_ptr<trajopt::ProblemConstructionInfo>(const std::string&,
43+
const PlannerRequest&,
44+
const TrajOptPlanProfileMap&,
45+
const TrajOptCompositeProfileMap&,
46+
const TrajOptSolverProfileMap&)>;
4647

4748
class TrajOptMotionPlanner : public MotionPlanner
4849
{
@@ -81,9 +82,6 @@ class TrajOptMotionPlanner : public MotionPlanner
8182
*/
8283
TrajOptPlanProfileMap plan_profiles;
8384

84-
/** @brief Optimization parameters to be used (Optional) */
85-
sco::BasicTrustRegionSQPParameters params;
86-
8785
/** @brief Callback functions called on each iteration of the optimization (Optional) */
8886
std::vector<sco::Optimizer::Callback> callbacks;
8987

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

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,12 @@
3434
namespace tesseract_planning
3535
{
3636
/// @todo: Restructure this into several smaller functions that are testable and easier to understand
37-
trajopt::TrajOptProb::Ptr DefaultTrajoptProblemGenerator(const std::string& name,
38-
const PlannerRequest& request,
39-
const TrajOptPlanProfileMap& plan_profiles,
40-
const TrajOptCompositeProfileMap& composite_profiles,
41-
const TrajOptSolverProfileMap& solver_profiles)
37+
std::shared_ptr<trajopt::ProblemConstructionInfo>
38+
DefaultTrajoptProblemGenerator(const std::string& name,
39+
const PlannerRequest& request,
40+
const TrajOptPlanProfileMap& plan_profiles,
41+
const TrajOptCompositeProfileMap& composite_profiles,
42+
const TrajOptSolverProfileMap& solver_profiles)
4243
{
4344
auto pci = std::make_shared<trajopt::ProblemConstructionInfo>(request.tesseract);
4445

@@ -359,7 +360,6 @@ trajopt::TrajOptProb::Ptr DefaultTrajoptProblemGenerator(const std::string& name
359360
pci->basic_info.manip = composite_mi.manipulator;
360361
pci->basic_info.start_fixed = false;
361362
pci->basic_info.use_time = false;
362-
// pci->basic_info.convex_solver = optimizer; // TODO: Fix this when port to trajopt_ifopt
363363

364364
// Set trajopt seed
365365
assert(static_cast<long>(seed_states.size()) == pci->basic_info.n_steps);
@@ -376,10 +376,7 @@ trajopt::TrajOptProb::Ptr DefaultTrajoptProblemGenerator(const std::string& name
376376

377377
cur_composite_profile->apply(*pci, 0, pci->basic_info.n_steps - 1, composite_mi, active_links, fixed_steps);
378378

379-
// Construct Problem
380-
trajopt::TrajOptProb::Ptr problem = trajopt::ConstructProblem(*pci);
381-
382-
return problem;
379+
return pci;
383380
}
384381

385382
} // namespace tesseract_planning

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +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-
ti = createDynamicCartesianWaypointTermInfo(
123-
cartesian_waypoint, index, mi.working_frame, tcp, cartesian_coeff, pci.kin->getTipLinkName(), term_type);
122+
if (mi.tcp.isExternal())
123+
{
124+
// If external, the part is attached to the robot so working frame is passed as link instead of target frame
125+
ti = createCartesianWaypointTermInfo(
126+
tcp, index, "", cartesian_waypoint, cartesian_coeff, mi.working_frame, term_type);
127+
}
128+
else
129+
{
130+
ti = createDynamicCartesianWaypointTermInfo(
131+
cartesian_waypoint, index, mi.working_frame, tcp, cartesian_coeff, pci.kin->getTipLinkName(), term_type);
132+
}
124133
}
125134
else
126135
{

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,7 @@ bool TrajOptMotionPlanner::terminate()
8888
return false;
8989
}
9090

91-
void TrajOptMotionPlanner::clear()
92-
{
93-
params = sco::BasicTrustRegionSQPParameters();
94-
callbacks.clear();
95-
}
91+
void TrajOptMotionPlanner::clear() { callbacks.clear(); }
9692

9793
MotionPlanner::Ptr TrajOptMotionPlanner::clone() const { return std::make_shared<TrajOptMotionPlanner>(); }
9894

@@ -106,10 +102,11 @@ tesseract_common::StatusCode TrajOptMotionPlanner::solve(const PlannerRequest& r
106102
tesseract_common::StatusCode(TrajOptMotionPlannerStatusCategory::ErrorInvalidInput, status_category_);
107103
return response.status;
108104
}
109-
trajopt::TrajOptProb::Ptr problem;
105+
106+
std::shared_ptr<trajopt::ProblemConstructionInfo> pci;
110107
if (request.data)
111108
{
112-
problem = std::static_pointer_cast<trajopt::TrajOptProb>(request.data);
109+
pci = std::static_pointer_cast<trajopt::ProblemConstructionInfo>(request.data);
113110
}
114111
else
115112
{
@@ -123,7 +120,7 @@ tesseract_common::StatusCode TrajOptMotionPlanner::solve(const PlannerRequest& r
123120

124121
try
125122
{
126-
problem = problem_generator(name_, request, plan_profiles, composite_profiles, solver_profiles);
123+
pci = problem_generator(name_, request, plan_profiles, composite_profiles, solver_profiles);
127124
}
128125
catch (std::exception& e)
129126
{
@@ -133,9 +130,12 @@ tesseract_common::StatusCode TrajOptMotionPlanner::solve(const PlannerRequest& r
133130
return response.status;
134131
}
135132

136-
response.data = problem;
133+
response.data = pci;
137134
}
138135

136+
// Construct Problem
137+
trajopt::TrajOptProb::Ptr problem = trajopt::ConstructProblem(*pci);
138+
139139
// Set Log Level
140140
if (verbose)
141141
util::gLogLevel = util::LevelInfo;
@@ -144,7 +144,7 @@ tesseract_common::StatusCode TrajOptMotionPlanner::solve(const PlannerRequest& r
144144

145145
// Create optimizer
146146
sco::BasicTrustRegionSQP opt(problem);
147-
opt.setParameters(params);
147+
opt.setParameters(pci->opt_info);
148148
opt.initialize(trajToDblVec(problem->GetInitTraj()));
149149

150150
// Add all callbacks

0 commit comments

Comments
 (0)