Skip to content

Commit 7384702

Browse files
authored
Allow max Cartesian link speed in PlannerInterface (#277)
1 parent ac4b92f commit 7384702

6 files changed

Lines changed: 25 additions & 1 deletion

File tree

core/include/moveit/task_constructor/solvers/planner_interface.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ class PlannerInterface
8989
void setTimeout(double timeout) { properties_.set("timeout", timeout); }
9090
void setMaxVelocityScalingFactor(double factor) { properties_.set("max_velocity_scaling_factor", factor); }
9191
void setMaxAccelerationScalingFactor(double factor) { properties_.set("max_acceleration_scaling_factor", factor); }
92+
93+
void setMaxCartesianSpeed(double max) { setProperty("max_cartesian_speed", max); }
94+
void setCartesianSpeedLimitedLink(const std::string& link) { setProperty("cartesian_speed_limited_link", link); }
95+
9296
void setTimeParameterization(const trajectory_processing::TimeParameterizationPtr& tp) {
9397
properties_.set("time_parameterization", tp);
9498
}

core/python/bindings/src/solvers.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ void export_solvers(py::module& m) {
5454
.property<double>("max_velocity_scaling_factor", "float: Reduce the maximum velocity by scaling between (0,1]")
5555
.property<double>("max_acceleration_scaling_factor",
5656
"float: Reduce the maximum acceleration by scaling between (0,1]")
57+
.property<double>("max_cartesian_speed", "float: maximum cartesian speed")
58+
.property<std::string>("cartesian_speed_limited_link", "str: link with limited cartesian speed")
5759
.def_property_readonly("properties", py::overload_cast<>(&PlannerInterface::properties),
5860
py::return_value_policy::reference_internal, "Properties of the planner");
5961

core/src/solvers/cartesian_path.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include <moveit/task_constructor/utils.h>
4141
#include <moveit/planning_scene/planning_scene.h>
4242
#include <moveit/trajectory_processing/time_parameterization.h>
43+
#include <moveit/trajectory_processing/limit_cartesian_speed.h>
4344
#include <moveit/kinematics_base/kinematics_base.h>
4445
#include <moveit/robot_state/cartesian_interpolator.h>
4546
#include <tf2_eigen/tf2_eigen.h>
@@ -121,8 +122,19 @@ PlannerInterface::Result CartesianPath::plan(const planning_scene::PlanningScene
121122
for (const auto& waypoint : trajectory)
122123
result->addSuffixWayPoint(waypoint, 0.0);
123124

125+
double max_cartesian_speed = props.get<double>("max_cartesian_speed");
124126
auto timing = props.get<TimeParameterizationPtr>("time_parameterization");
125-
if (timing)
127+
// compute timing to move the eef with constant speed
128+
if (max_cartesian_speed > 0.0) {
129+
if (trajectory_processing::limitMaxCartesianLinkSpeed(*result, max_cartesian_speed,
130+
props.get<std::string>("cartesian_speed_limited_link"))) {
131+
ROS_INFO_STREAM("successfully set max " << max_cartesian_speed << " [m/s] for link "
132+
<< props.get<std::string>("cartesian_speed_limited_link"));
133+
} else {
134+
ROS_ERROR_STREAM("failed to set max speed for link_ "
135+
<< props.get<std::string>("cartesian_speed_limited_link"));
136+
}
137+
} else if (timing)
126138
timing->computeTimeStamps(*result, props.get<double>("max_velocity_scaling_factor"),
127139
props.get<double>("max_acceleration_scaling_factor"));
128140

core/src/solvers/pipeline_planner.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ void initMotionPlanRequest(moveit_msgs::MotionPlanRequest& req, const PropertyMa
149149
req.num_planning_attempts = p.get<uint>("num_planning_attempts");
150150
req.max_velocity_scaling_factor = p.get<double>("max_velocity_scaling_factor");
151151
req.max_acceleration_scaling_factor = p.get<double>("max_acceleration_scaling_factor");
152+
req.cartesian_speed_limited_link = p.get<std::string>("cartesian_speed_limited_link");
153+
req.max_cartesian_speed = p.get<double>("max_cartesian_speed");
152154
req.workspace_parameters = p.get<moveit_msgs::WorkspaceParameters>("workspace_parameters");
153155
}
154156

core/src/solvers/planner_interface.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ PlannerInterface::PlannerInterface() {
5050
p.declare<double>("timeout", std::numeric_limits<double>::infinity(), "timeout for planner (s)");
5151
p.declare<double>("max_velocity_scaling_factor", 1.0, "scale down max velocity by this factor");
5252
p.declare<double>("max_acceleration_scaling_factor", 1.0, "scale down max acceleration by this factor");
53+
p.declare<double>("max_cartesian_speed", 0.0, "maximum cartesian speed");
54+
p.declare<std::string>("cartesian_speed_limited_link", "", "link with limited cartesian speed");
5355
p.declare<TimeParameterizationPtr>("time_parameterization", std::make_shared<TimeOptimalTrajectoryGeneration>());
5456
}
5557
} // namespace solvers

demo/scripts/cartesian.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
# [cartesianTut2]
1919
# Cartesian and joint-space interpolation planners
2020
cartesian = core.CartesianPath()
21+
cartesian.max_cartesian_speed = 0.1 # m/s
22+
cartesian.cartesian_speed_limited_link = "panda_hand"
2123
jointspace = core.JointInterpolationPlanner()
2224
# [cartesianTut2]
2325

0 commit comments

Comments
 (0)