Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Require velocity and acceleration limits in TOTG #1794

Merged
merged 3 commits into from
Dec 20, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -924,7 +924,6 @@ bool TimeOptimalTrajectoryGeneration::computeTimeStamps(robot_trajectory::RobotT
const moveit::core::VariableBounds& bounds = rmodel.getVariableBounds(vars[j]);

// Limits need to be non-zero, otherwise we never exit
max_velocity[j] = 1.0;
if (bounds.velocity_bounded_)
{
if (bounds.max_velocity_ <= 0.0)
Expand All @@ -938,12 +937,12 @@ bool TimeOptimalTrajectoryGeneration::computeTimeStamps(robot_trajectory::RobotT
}
else
{
RCLCPP_WARN_STREAM_ONCE(
LOGGER, "Joint velocity limits are not defined. Using the default "
<< max_velocity[j] << " rad/s. You can define velocity limits in the URDF or joint_limits.yaml.");
RCLCPP_ERROR_STREAM(LOGGER, "No velocity limit was defined for joint "
<< vars[j].c_str()
<< "! You can define velocity limits in the URDF or joint_limits.yaml");
AndyZe marked this conversation as resolved.
Show resolved Hide resolved
return false;
}

max_acceleration[j] = 1.0;
if (bounds.acceleration_bounded_)
{
if (bounds.max_acceleration_ < 0.0)
Expand All @@ -957,10 +956,11 @@ bool TimeOptimalTrajectoryGeneration::computeTimeStamps(robot_trajectory::RobotT
}
else
{
RCLCPP_WARN_STREAM_ONCE(LOGGER,
"Joint acceleration limits are not defined. Using the default "
<< max_acceleration[j]
<< " rad/s^2. You can define acceleration limits in the URDF or joint_limits.yaml.");
RCLCPP_ERROR_STREAM(LOGGER, "No acceleration limit was defined for joint "
<< vars[j].c_str()
<< "! You can define acceleration limits in the URDF or "
AndyZe marked this conversation as resolved.
Show resolved Hide resolved
"joint_limits.yaml");
return false;
}
}

Expand Down Expand Up @@ -1016,10 +1016,10 @@ bool TimeOptimalTrajectoryGeneration::computeTimeStamps(

if (!set_velocity_limit)
{
max_velocity[j] = 1.0;
RCLCPP_WARN_STREAM_ONCE(
LOGGER, "Joint velocity limits are not defined. Using the default "
<< max_velocity[j] << " rad/s. You can define velocity limits in the URDF or joint_limits.yaml.");
RCLCPP_ERROR_STREAM(LOGGER, "No velocity limit was defined for joint "
<< vars[j].c_str()
<< "! You can define velocity limits in the URDF or "
AndyZe marked this conversation as resolved.
Show resolved Hide resolved
"joint_limits.yaml");
AndyZe marked this conversation as resolved.
Show resolved Hide resolved
}

// ACCELERATION LIMIT
Expand All @@ -1046,11 +1046,10 @@ bool TimeOptimalTrajectoryGeneration::computeTimeStamps(
}
if (!set_acceleration_limit)
{
max_acceleration[j] = 1.0;
RCLCPP_WARN_STREAM_ONCE(LOGGER,
"Joint acceleration limits are not defined. Using the default "
<< max_acceleration[j]
<< " rad/s^2. You can define acceleration limits in the URDF or joint_limits.yaml.");
RCLCPP_ERROR_STREAM(LOGGER, "No acceleration limit was defined for joint "
<< vars[j].c_str()
<< "! You can define acceleration limits in the URDF or "
"joint_limits.yaml");
AndyZe marked this conversation as resolved.
Show resolved Hide resolved
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,29 @@ using trajectory_processing::Path;
using trajectory_processing::TimeOptimalTrajectoryGeneration;
using trajectory_processing::Trajectory;

namespace
{
// The URDF used in moveit::core::loadTestingRobotModel() does not contain acceleration limits,
// so add them here.
// TODO(andyz): Function won't be needed once this issue has been addressed:
// https://github.com/ros/urdfdom/issues/177
void set_acceleration_limits(const moveit::core::RobotModelPtr& robot_model)
{
const std::vector<moveit::core::JointModel*> joint_models = robot_model->getActiveJointModels();
for (auto& joint_model : joint_models)
{
std::vector<moveit_msgs::msg::JointLimits> joint_bounds_msg(joint_model->getVariableBoundsMsg());
// TODO: update individual bounds
for (auto& joint_bound : joint_bounds_msg)
{
joint_bound.has_acceleration_limits = true;
joint_bound.max_acceleration = 1.0;
}
joint_model->setVariableBounds(joint_bounds_msg);
}
}
} // namespace

TEST(time_optimal_trajectory_generation, test1)
{
Eigen::VectorXd waypoint(4);
Expand Down Expand Up @@ -153,13 +176,14 @@ TEST(time_optimal_trajectory_generation, test3)
}

// Test the version of computeTimeStamps that takes custom velocity/acceleration limits
TEST(time_optimal_trajectory_generation, test_custom_limits)
TEST(time_optimal_trajectory_generation, testCustomLimits)
{
constexpr auto robot_name{ "panda" };
constexpr auto group_name{ "panda_arm" };

auto robot_model = moveit::core::loadTestingRobotModel(robot_name);
ASSERT_TRUE(robot_model) << "Failed to load robot model" << robot_name;
set_acceleration_limits(robot_model);
auto group = robot_model->getJointModelGroup(group_name);
ASSERT_TRUE(group) << "Failed to load joint model group " << group_name;
moveit::core::RobotState waypoint_state(robot_model);
Expand All @@ -174,8 +198,14 @@ TEST(time_optimal_trajectory_generation, test_custom_limits)

TimeOptimalTrajectoryGeneration totg;
// Custom velocity & acceleration limits for some joints
std::unordered_map<std::string, double> vel_limits{ { "panda_joint1", 1.3 } };
std::unordered_map<std::string, double> accel_limits{ { "panda_joint2", 2.3 }, { "panda_joint3", 3.3 } };
std::unordered_map<std::string, double> vel_limits{ { "panda_joint1", 1.3 }, { "panda_joint2", 2.3 },
{ "panda_joint3", 3.3 }, { "panda_joint4", 4.3 },
{ "panda_joint5", 5.3 }, { "panda_joint6", 6.3 },
{ "panda_joint7", 7.3 } };
std::unordered_map<std::string, double> accel_limits{ { "panda_joint1", 1.3 }, { "panda_joint2", 2.3 },
{ "panda_joint3", 3.3 }, { "panda_joint4", 4.3 },
{ "panda_joint5", 5.3 }, { "panda_joint6", 6.3 },
{ "panda_joint7", 7.3 } };
ASSERT_TRUE(totg.computeTimeStamps(trajectory, vel_limits, accel_limits)) << "Failed to compute time stamps";
}

Expand Down Expand Up @@ -256,14 +286,16 @@ TEST(time_optimal_trajectory_generation, testLargeAccel)
}
}

// Test parameterizing a trajectory would always produce a trajectory with output end waypoint same as the input end waypoint
// Test parameterizing a trajectory would always produce a trajectory with output end waypoint same as the input end
// waypoint
TEST(time_optimal_trajectory_generation, testLastWaypoint)
{
constexpr auto robot_name{ "panda" };
constexpr auto group_name{ "hand" };
constexpr auto group_name{ "panda_arm" };

auto robot_model = moveit::core::loadTestingRobotModel(robot_name);
ASSERT_TRUE(robot_model) << "Failed to load robot model" << robot_name;
set_acceleration_limits(robot_model);
auto group = robot_model->getJointModelGroup(group_name);
ASSERT_TRUE(group) << "Failed to load joint model group " << group_name;
moveit::core::RobotState waypoint_state(robot_model);
Expand All @@ -274,96 +306,14 @@ TEST(time_optimal_trajectory_generation, testLastWaypoint)
waypoint_state.setJointGroupPositions(group, waypoint);
trajectory.addSuffixWayPoint(waypoint_state, 0.1);
};
add_waypoint({ 0.000000000, 0.000000000 });
add_waypoint({ 0.000396742, 0.000396742 });
add_waypoint({ 0.000793484, 0.000793484 });
add_waypoint({ 0.001190226, 0.001190226 });
add_waypoint({ 0.001586968, 0.001586968 });
add_waypoint({ 0.001983710, 0.001983710 });
add_waypoint({ 0.002380452, 0.002380452 });
add_waypoint({ 0.002777194, 0.002777194 });
add_waypoint({ 0.003173936, 0.003173936 });
add_waypoint({ 0.003570678, 0.003570678 });
add_waypoint({ 0.003967420, 0.003967420 });
add_waypoint({ 0.004364162, 0.004364162 });
add_waypoint({ 0.004760904, 0.004760904 });
add_waypoint({ 0.005157646, 0.005157646 });
add_waypoint({ 0.005554388, 0.005554388 });
add_waypoint({ 0.005951130, 0.005951130 });
add_waypoint({ 0.006347872, 0.006347872 });
add_waypoint({ 0.006744614, 0.006744614 });
add_waypoint({ 0.007141356, 0.007141356 });
add_waypoint({ 0.007538098, 0.007538098 });
add_waypoint({ 0.007934840, 0.007934840 });
add_waypoint({ 0.008331582, 0.008331582 });
add_waypoint({ 0.008728324, 0.008728324 });
add_waypoint({ 0.009125066, 0.009125066 });
add_waypoint({ 0.009521808, 0.009521808 });
add_waypoint({ 0.009918550, 0.009918550 });
add_waypoint({ 0.010315292, 0.010315292 });
add_waypoint({ 0.010712034, 0.010712034 });
add_waypoint({ 0.011108776, 0.011108776 });
add_waypoint({ 0.011505518, 0.011505518 });
add_waypoint({ 0.011902261, 0.011902261 });
add_waypoint({ 0.012299003, 0.012299003 });
add_waypoint({ 0.012695745, 0.012695745 });
add_waypoint({ 0.013092487, 0.013092487 });
add_waypoint({ 0.013489229, 0.013489229 });
add_waypoint({ 0.013885971, 0.013885971 });
add_waypoint({ 0.014282713, 0.014282713 });
add_waypoint({ 0.014679455, 0.014679455 });
add_waypoint({ 0.015076197, 0.015076197 });
add_waypoint({ 0.015472939, 0.015472939 });
add_waypoint({ 0.015869681, 0.015869681 });
add_waypoint({ 0.016266423, 0.016266423 });
add_waypoint({ 0.016663165, 0.016663165 });
add_waypoint({ 0.017059907, 0.017059907 });
add_waypoint({ 0.017456649, 0.017456649 });
add_waypoint({ 0.017853391, 0.017853391 });
add_waypoint({ 0.018250133, 0.018250133 });
add_waypoint({ 0.018646875, 0.018646875 });
add_waypoint({ 0.019043617, 0.019043617 });
add_waypoint({ 0.019440359, 0.019440359 });
add_waypoint({ 0.019837101, 0.019837101 });
add_waypoint({ 0.020233843, 0.020233843 });
add_waypoint({ 0.020630585, 0.020630585 });
add_waypoint({ 0.021027327, 0.021027327 });
add_waypoint({ 0.021424069, 0.021424069 });
add_waypoint({ 0.021820811, 0.021820811 });
add_waypoint({ 0.022217553, 0.022217553 });
add_waypoint({ 0.022614295, 0.022614295 });
add_waypoint({ 0.023011037, 0.023011037 });
add_waypoint({ 0.023407779, 0.023407779 });
add_waypoint({ 0.023804521, 0.023804521 });
add_waypoint({ 0.024201263, 0.024201263 });
add_waypoint({ 0.024598005, 0.024598005 });
add_waypoint({ 0.024994747, 0.024994747 });
add_waypoint({ 0.025391489, 0.025391489 });
add_waypoint({ 0.025788231, 0.025788231 });
add_waypoint({ 0.026184973, 0.026184973 });
add_waypoint({ 0.026581715, 0.026581715 });
add_waypoint({ 0.026978457, 0.026978457 });
add_waypoint({ 0.027375199, 0.027375199 });
add_waypoint({ 0.027771941, 0.027771941 });
add_waypoint({ 0.028168683, 0.028168683 });
add_waypoint({ 0.028565425, 0.028565425 });
add_waypoint({ 0.028962167, 0.028962167 });
add_waypoint({ 0.029358909, 0.029358909 });
add_waypoint({ 0.029755651, 0.029755651 });
add_waypoint({ 0.030152393, 0.030152393 });
add_waypoint({ 0.030549135, 0.030549135 });
add_waypoint({ 0.030945877, 0.030945877 });
add_waypoint({ 0.031342619, 0.031342619 });
add_waypoint({ 0.031739361, 0.031739361 });
add_waypoint({ 0.032136103, 0.032136103 });
add_waypoint({ 0.032532845, 0.032532845 });
add_waypoint({ 0.032929587, 0.032929587 });
add_waypoint({ 0.033326329, 0.033326329 });
add_waypoint({ 0.033723071, 0.033723071 });
add_waypoint({ 0.034119813, 0.034119813 });
add_waypoint({ 0.034516555, 0.034516555 });

const std::vector<double> expected_last_waypoint = { 0.034913297, 0.034913297 };
add_waypoint({ 0.000000000, 0.000000000, 0, 0, 0, 0, 0 });
AndyZe marked this conversation as resolved.
Show resolved Hide resolved
add_waypoint({ 0.009521808, 0.009521808, 0, 0, 0, 0, 0 });
add_waypoint({ 0.011902261, 0.011902261, 0, 0, 0, 0, 0 });
add_waypoint({ 0.016663165, 0.016663165, 0, 0, 0, 0, 0 });
add_waypoint({ 0.026184973, 0.026184973, 0, 0, 0, 0, 0 });
add_waypoint({ 0.034516555, 0.034516555, 0, 0, 0, 0, 0 });

const std::vector<double> expected_last_waypoint = { 0.034516555, 0.034516555, 0, 0, 0, 0, 0 };
add_waypoint(expected_last_waypoint);

TimeOptimalTrajectoryGeneration totg;
Expand All @@ -384,6 +334,7 @@ TEST(time_optimal_trajectory_generation, testPluginAPI)

auto robot_model = moveit::core::loadTestingRobotModel(robot_name);
ASSERT_TRUE(robot_model) << "Failed to load robot model" << robot_name;
set_acceleration_limits(robot_model);
auto group = robot_model->getJointModelGroup(group_name);
ASSERT_TRUE(group) << "Failed to load joint model group " << group_name;
moveit::core::RobotState waypoint_state(robot_model);
Expand Down Expand Up @@ -506,6 +457,7 @@ TEST(time_optimal_trajectory_generation, testFixedNumWaypoints)

auto robot_model = moveit::core::loadTestingRobotModel(robot_name);
ASSERT_TRUE(robot_model) << "Failed to load robot model" << robot_name;
set_acceleration_limits(robot_model);
auto group = robot_model->getJointModelGroup(group_name);
ASSERT_TRUE(group) << "Failed to load joint model group " << group_name;
moveit::core::RobotState waypoint_state(robot_model);
Expand Down
6 changes: 3 additions & 3 deletions moveit_core/utils/src/robot_model_test_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,14 @@

/* Author: Bryce Willey */

#include <ament_index_cpp/get_package_share_directory.hpp>
#include <boost/algorithm/string_regex.hpp>
#include <filesystem>
#include <geometry_msgs/msg/pose.hpp>
#include <urdf_parser/urdf_parser.h>
#include <moveit/utils/robot_model_test_utils.h>
#include <ament_index_cpp/get_package_share_directory.hpp>
#include <filesystem>
#include <rclcpp/logger.hpp>
#include <rclcpp/logging.hpp>
#include <urdf_parser/urdf_parser.h>

namespace moveit
{
Expand Down