42 #include <tf2_geometry_msgs/tf2_geometry_msgs.hpp>
53 #include <moveit_msgs/action/execute_trajectory.hpp>
54 #include <moveit_msgs/srv/query_planner_interfaces.hpp>
55 #include <moveit_msgs/srv/get_cartesian_path.hpp>
56 #include <moveit_msgs/srv/grasp_planning.hpp>
57 #include <moveit_msgs/srv/get_planner_params.hpp>
58 #include <moveit_msgs/srv/set_planner_params.hpp>
61 #include <std_msgs/msg/string.hpp>
62 #include <geometry_msgs/msg/transform_stamped.hpp>
64 #if __has_include(<tf2/utils.hpp>)
65 #include <tf2/utils.hpp>
67 #include <tf2/utils.h>
69 #include <tf2_eigen/tf2_eigen.hpp>
70 #include <tf2_ros/transform_listener.h>
80 const rclcpp::Logger
LOGGER = rclcpp::get_logger(
"move_group_interface");
99 const std::shared_ptr<tf2_ros::Buffer>& tf_buffer,
const rclcpp::Duration& wait_for_servers)
100 : opt_(
opt), node_(node), tf_buffer_(tf_buffer)
104 callback_group_ = node_->create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive,
106 callback_executor_.add_callback_group(callback_group_, node->get_node_base_interface());
107 callback_thread_ = std::thread([
this]() { callback_executor_.spin(); });
112 std::string error =
"Unable to construct robot model. Please make sure all needed information is on the "
114 RCLCPP_FATAL_STREAM(
LOGGER, error);
115 throw std::runtime_error(error);
120 std::string error =
"Group '" +
opt.group_name_ +
"' was not found.";
121 RCLCPP_FATAL_STREAM(
LOGGER, error);
122 throw std::runtime_error(error);
128 joint_state_target_ = std::make_shared<moveit::core::RobotState>(
getRobotModel());
129 joint_state_target_->setToDefaultValues();
130 active_target_ =
JOINT;
132 look_around_attempts_ = 0;
135 replan_attempts_ = 1;
136 goal_joint_tolerance_ = 1e-4;
137 goal_position_tolerance_ = 1e-4;
138 goal_orientation_tolerance_ = 1e-3;
139 allowed_planning_time_ = 5.0;
140 num_planning_attempts_ = 1;
141 node_->get_parameter_or<
double>(
"robot_description_planning.default_velocity_scaling_factor",
142 max_velocity_scaling_factor_, 0.1);
143 node_->get_parameter_or<
double>(
"robot_description_planning.default_acceleration_scaling_factor",
144 max_acceleration_scaling_factor_, 0.1);
145 initializing_constraints_ =
false;
147 if (joint_model_group_->
isChain())
151 trajectory_event_publisher_ = node_->create_publisher<std_msgs::msg::String>(
155 attached_object_publisher_ = node_->create_publisher<moveit_msgs::msg::AttachedCollisionObject>(
162 move_action_client_ = rclcpp_action::create_client<moveit_msgs::action::MoveGroup>(
164 move_action_client_->wait_for_action_server(wait_for_servers.to_chrono<std::chrono::duration<double>>());
165 execute_action_client_ = rclcpp_action::create_client<moveit_msgs::action::ExecuteTrajectory>(
167 execute_action_client_->wait_for_action_server(wait_for_servers.to_chrono<std::chrono::duration<double>>());
169 query_service_ = node_->create_client<moveit_msgs::srv::QueryPlannerInterfaces>(
171 rmw_qos_profile_services_default, callback_group_);
172 get_params_service_ = node_->create_client<moveit_msgs::srv::GetPlannerParams>(
174 rmw_qos_profile_services_default, callback_group_);
175 set_params_service_ = node_->create_client<moveit_msgs::srv::SetPlannerParams>(
177 rmw_qos_profile_services_default, callback_group_);
179 cartesian_path_service_ = node_->create_client<moveit_msgs::srv::GetCartesianPath>(
181 rmw_qos_profile_services_default, callback_group_);
185 RCLCPP_INFO_STREAM(
LOGGER,
"Ready to take commands for planning group " <<
opt.group_name_ <<
".");
190 if (constraints_init_thread_)
191 constraints_init_thread_->join();
193 if (callback_executor_.is_spinning())
194 callback_executor_.cancel();
196 if (callback_thread_.joinable())
197 callback_thread_.join();
200 const std::shared_ptr<tf2_ros::Buffer>&
getTF()
const
217 return joint_model_group_;
222 return *move_action_client_;
227 auto req = std::make_shared<moveit_msgs::srv::QueryPlannerInterfaces::Request>();
228 auto future_response = query_service_->async_send_request(req);
230 if (future_response.valid())
232 const auto& response = future_response.get();
233 if (!response->planner_interfaces.empty())
235 desc = response->planner_interfaces.front();
244 auto req = std::make_shared<moveit_msgs::srv::QueryPlannerInterfaces::Request>();
245 auto future_response = query_service_->async_send_request(req);
246 if (future_response.valid())
248 const auto& response = future_response.get();
249 if (!response->planner_interfaces.empty())
251 desc = response->planner_interfaces;
260 auto req = std::make_shared<moveit_msgs::srv::GetPlannerParams::Request>();
261 moveit_msgs::srv::GetPlannerParams::Response::SharedPtr response;
262 req->planner_config = planner_id;
264 std::map<std::string, std::string> result;
266 auto future_response = get_params_service_->async_send_request(req);
267 if (future_response.valid())
269 response = future_response.get();
270 for (
unsigned int i = 0, end = response->params.keys.size(); i < end; ++i)
271 result[response->params.keys[i]] = response->params.values[i];
277 const std::map<std::string, std::string>& params,
bool replace =
false)
279 auto req = std::make_shared<moveit_msgs::srv::SetPlannerParams::Request>();
280 req->planner_config = planner_id;
282 req->replace = replace;
283 for (
const std::pair<const std::string, std::string>& param : params)
285 req->params.keys.push_back(param.first);
286 req->params.values.push_back(param.second);
288 set_params_service_->async_send_request(req);
293 std::string default_planning_pipeline;
294 node_->get_parameter(
"move_group.default_planning_pipeline", default_planning_pipeline);
295 return default_planning_pipeline;
300 if (pipeline_id != planning_pipeline_id_)
302 planning_pipeline_id_ = pipeline_id;
311 return planning_pipeline_id_;
318 if (!planning_pipeline_id_.empty())
319 pipeline_id = planning_pipeline_id_;
321 std::stringstream param_name;
322 param_name <<
"move_group";
323 if (!pipeline_id.empty())
324 param_name <<
"/planning_pipelines/" << pipeline_id;
326 param_name <<
"." <<
group;
327 param_name <<
".default_planner_config";
329 std::string default_planner_config;
330 node_->get_parameter(param_name.str(), default_planner_config);
331 return default_planner_config;
336 planner_id_ = planner_id;
346 num_planning_attempts_ = num_planning_attempts;
356 setMaxScalingFactor(max_acceleration_scaling_factor_, value,
"acceleration_scaling_factor", 0.1);
359 void setMaxScalingFactor(
double& variable,
const double target_value,
const char* factor_name,
double fallback_value)
361 if (target_value > 1.0)
363 RCLCPP_WARN(rclcpp::get_logger(
"move_group_interface"),
"Limiting max_%s (%.2f) to 1.0.", factor_name,
367 else if (target_value <= 0.0)
369 node_->get_parameter_or<
double>(std::string(
"robot_description_planning.default_") + factor_name, variable,
371 if (target_value < 0.0)
373 RCLCPP_WARN(rclcpp::get_logger(
"move_group_interface"),
"max_%s < 0.0! Setting to default: %.2f.", factor_name,
379 variable = target_value;
385 return *joint_state_target_;
390 return *joint_state_target_;
395 considered_start_state_ = start_state;
400 considered_start_state_ = moveit_msgs::msg::RobotState();
407 considered_start_state_ = moveit_msgs::msg::RobotState();
408 considered_start_state_.is_diff =
true;
413 moveit::core::RobotStatePtr s;
420 const std::string& frame,
bool approx)
422 const std::string& eef = end_effector_link.empty() ?
getEndEffectorLink() : end_effector_link;
455 tf2::fromMsg(eef_pose,
p);
461 RCLCPP_ERROR(
LOGGER,
"Unable to transform from frame '%s' to frame '%s'", frame.c_str(),
473 end_effector_link_ = end_effector;
478 pose_targets_.erase(end_effector_link);
483 pose_targets_.clear();
488 return end_effector_link_;
493 if (!end_effector_link_.empty())
495 const std::vector<std::string>& possible_eefs =
497 for (
const std::string& possible_eef : possible_eefs)
501 static std::string empty;
505 bool setPoseTargets(
const std::vector<geometry_msgs::msg::PoseStamped>& poses,
const std::string& end_effector_link)
507 const std::string& eef = end_effector_link.empty() ? end_effector_link_ : end_effector_link;
510 RCLCPP_ERROR(
LOGGER,
"No end-effector to set the pose for");
515 pose_targets_[eef] = poses;
517 std::vector<geometry_msgs::msg::PoseStamped>& stored_poses = pose_targets_[eef];
518 for (geometry_msgs::msg::PoseStamped& stored_pose : stored_poses)
519 stored_pose.header.stamp = rclcpp::Time(0);
526 const std::string& eef = end_effector_link.empty() ? end_effector_link_ : end_effector_link;
527 return pose_targets_.find(eef) != pose_targets_.end();
530 const geometry_msgs::msg::PoseStamped&
getPoseTarget(
const std::string& end_effector_link)
const
532 const std::string& eef = end_effector_link.empty() ? end_effector_link_ : end_effector_link;
535 std::map<std::string, std::vector<geometry_msgs::msg::PoseStamped>>::const_iterator jt = pose_targets_.find(eef);
536 if (jt != pose_targets_.end())
537 if (!jt->second.empty())
538 return jt->second.at(0);
541 static const geometry_msgs::msg::PoseStamped UNKNOWN;
542 RCLCPP_ERROR(
LOGGER,
"Pose for end-effector '%s' not known.", eef.c_str());
546 const std::vector<geometry_msgs::msg::PoseStamped>&
getPoseTargets(
const std::string& end_effector_link)
const
548 const std::string& eef = end_effector_link.empty() ? end_effector_link_ : end_effector_link;
550 std::map<std::string, std::vector<geometry_msgs::msg::PoseStamped>>::const_iterator jt = pose_targets_.find(eef);
551 if (jt != pose_targets_.end())
552 if (!jt->second.empty())
556 static const std::vector<geometry_msgs::msg::PoseStamped> EMPTY;
557 RCLCPP_ERROR(
LOGGER,
"Poses for end-effector '%s' are not known.", eef.c_str());
563 pose_reference_frame_ = pose_reference_frame;
568 support_surface_ = support_surface;
573 return pose_reference_frame_;
578 active_target_ =
type;
583 return active_target_;
588 if (!current_state_monitor_)
590 RCLCPP_ERROR(
LOGGER,
"Unable to monitor current robot state");
595 if (!current_state_monitor_->isActive())
596 current_state_monitor_->startStateMonitor();
598 current_state_monitor_->waitForCompleteState(opt_.
group_name_, wait);
602 bool getCurrentState(moveit::core::RobotStatePtr& current_state,
double wait_seconds = 1.0)
604 if (!current_state_monitor_)
606 RCLCPP_ERROR(
LOGGER,
"Unable to get current robot state");
611 if (!current_state_monitor_->isActive())
612 current_state_monitor_->startStateMonitor();
614 if (!current_state_monitor_->waitForCurrentState(node_->now(), wait_seconds))
616 RCLCPP_ERROR(
LOGGER,
"Failed to fetch current robot state");
620 current_state = current_state_monitor_->getCurrentState();
748 if (!move_action_client_ || !move_action_client_->action_server_is_ready())
750 RCLCPP_INFO_STREAM(
LOGGER,
"MoveGroup action client/server not ready");
751 return moveit::core::MoveItErrorCode::FAILURE;
753 RCLCPP_INFO_STREAM(
LOGGER,
"MoveGroup action client/server ready");
755 moveit_msgs::action::MoveGroup::Goal goal;
757 goal.planning_options.plan_only =
true;
758 goal.planning_options.look_around =
false;
759 goal.planning_options.replan =
false;
760 goal.planning_options.planning_scene_diff.is_diff =
true;
761 goal.planning_options.planning_scene_diff.robot_state.is_diff =
true;
764 rclcpp_action::ResultCode code = rclcpp_action::ResultCode::UNKNOWN;
765 std::shared_ptr<moveit_msgs::action::MoveGroup::Result> res;
766 auto send_goal_opts = rclcpp_action::Client<moveit_msgs::action::MoveGroup>::SendGoalOptions();
768 send_goal_opts.goal_response_callback =
769 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::MoveGroup>::SharedPtr& goal_handle) {
773 RCLCPP_INFO(
LOGGER,
"Planning request rejected");
776 RCLCPP_INFO(
LOGGER,
"Planning request accepted");
778 send_goal_opts.result_callback =
779 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::MoveGroup>::WrappedResult& result) {
786 case rclcpp_action::ResultCode::SUCCEEDED:
787 RCLCPP_INFO(
LOGGER,
"Planning request complete!");
789 case rclcpp_action::ResultCode::ABORTED:
790 RCLCPP_INFO(
LOGGER,
"Planning request aborted");
792 case rclcpp_action::ResultCode::CANCELED:
793 RCLCPP_INFO(
LOGGER,
"Planning request canceled");
796 RCLCPP_INFO(
LOGGER,
"Planning request unknown result code");
801 auto goal_handle_future = move_action_client_->async_send_goal(goal, send_goal_opts);
806 std::this_thread::sleep_for(std::chrono::milliseconds(1));
809 if (code != rclcpp_action::ResultCode::SUCCEEDED)
811 RCLCPP_ERROR_STREAM(
LOGGER,
"MoveGroupInterface::plan() failed or timeout reached");
812 return res->error_code;
815 plan.trajectory_ = res->planned_trajectory;
816 plan.start_state_ = res->trajectory_start;
817 plan.planning_time_ = res->planning_time;
818 RCLCPP_INFO(
LOGGER,
"time taken to generate plan: %g seconds",
plan.planning_time_);
820 return res->error_code;
825 if (!move_action_client_ || !move_action_client_->action_server_is_ready())
827 RCLCPP_INFO_STREAM(
LOGGER,
"MoveGroup action client/server not ready");
828 return moveit::core::MoveItErrorCode::FAILURE;
831 moveit_msgs::action::MoveGroup::Goal goal;
833 goal.planning_options.plan_only =
false;
834 goal.planning_options.look_around = can_look_;
835 goal.planning_options.replan = can_replan_;
836 goal.planning_options.replan_delay = replan_delay_;
837 goal.planning_options.planning_scene_diff.is_diff =
true;
838 goal.planning_options.planning_scene_diff.robot_state.is_diff =
true;
841 rclcpp_action::ResultCode code = rclcpp_action::ResultCode::UNKNOWN;
842 std::shared_ptr<moveit_msgs::action::MoveGroup_Result> res;
843 auto send_goal_opts = rclcpp_action::Client<moveit_msgs::action::MoveGroup>::SendGoalOptions();
845 send_goal_opts.goal_response_callback =
846 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::MoveGroup>::SharedPtr& goal_handle) {
850 RCLCPP_INFO(
LOGGER,
"Plan and Execute request rejected");
853 RCLCPP_INFO(
LOGGER,
"Plan and Execute request accepted");
855 send_goal_opts.result_callback =
856 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::MoveGroup>::WrappedResult& result) {
863 case rclcpp_action::ResultCode::SUCCEEDED:
864 RCLCPP_INFO(
LOGGER,
"Plan and Execute request complete!");
866 case rclcpp_action::ResultCode::ABORTED:
867 RCLCPP_INFO(
LOGGER,
"Plan and Execute request aborted");
869 case rclcpp_action::ResultCode::CANCELED:
870 RCLCPP_INFO(
LOGGER,
"Plan and Execute request canceled");
873 RCLCPP_INFO(
LOGGER,
"Plan and Execute request unknown result code");
877 auto goal_handle_future = move_action_client_->async_send_goal(goal, send_goal_opts);
879 return moveit::core::MoveItErrorCode::SUCCESS;
884 std::this_thread::sleep_for(std::chrono::milliseconds(1));
887 if (code != rclcpp_action::ResultCode::SUCCEEDED)
889 RCLCPP_ERROR_STREAM(
LOGGER,
"MoveGroupInterface::move() failed or timeout reached");
891 return res->error_code;
896 if (!execute_action_client_ || !execute_action_client_->action_server_is_ready())
898 RCLCPP_INFO_STREAM(
LOGGER,
"execute_action_client_ client/server not ready");
899 return moveit::core::MoveItErrorCode::FAILURE;
903 rclcpp_action::ResultCode code = rclcpp_action::ResultCode::UNKNOWN;
904 std::shared_ptr<moveit_msgs::action::ExecuteTrajectory_Result> res;
905 auto send_goal_opts = rclcpp_action::Client<moveit_msgs::action::ExecuteTrajectory>::SendGoalOptions();
907 send_goal_opts.goal_response_callback =
908 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::ExecuteTrajectory>::SharedPtr& goal_handle) {
912 RCLCPP_INFO(
LOGGER,
"Execute request rejected");
915 RCLCPP_INFO(
LOGGER,
"Execute request accepted");
917 send_goal_opts.result_callback =
918 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::ExecuteTrajectory>::WrappedResult& result) {
925 case rclcpp_action::ResultCode::SUCCEEDED:
926 RCLCPP_INFO(
LOGGER,
"Execute request success!");
928 case rclcpp_action::ResultCode::ABORTED:
929 RCLCPP_INFO(
LOGGER,
"Execute request aborted");
931 case rclcpp_action::ResultCode::CANCELED:
932 RCLCPP_INFO(
LOGGER,
"Execute request canceled");
935 RCLCPP_INFO(
LOGGER,
"Execute request unknown result code");
940 moveit_msgs::action::ExecuteTrajectory::Goal goal;
941 goal.trajectory = trajectory;
943 auto goal_handle_future = execute_action_client_->async_send_goal(goal, send_goal_opts);
945 return moveit::core::MoveItErrorCode::SUCCESS;
950 std::this_thread::sleep_for(std::chrono::milliseconds(1));
953 if (code != rclcpp_action::ResultCode::SUCCEEDED)
955 RCLCPP_ERROR_STREAM(
LOGGER,
"MoveGroupInterface::execute() failed or timeout reached");
957 return res->error_code;
961 double jump_threshold, moveit_msgs::msg::RobotTrajectory& msg,
962 const moveit_msgs::msg::Constraints&
path_constraints,
bool avoid_collisions,
963 moveit_msgs::msg::MoveItErrorCodes& error_code)
965 auto req = std::make_shared<moveit_msgs::srv::GetCartesianPath::Request>();
966 moveit_msgs::srv::GetCartesianPath::Response::SharedPtr response;
968 req->start_state = considered_start_state_;
971 req->header.stamp =
getClock()->now();
973 req->max_step = step;
974 req->jump_threshold = jump_threshold;
976 req->avoid_collisions = avoid_collisions;
979 auto future_response = cartesian_path_service_->async_send_request(req);
980 if (future_response.valid())
982 response = future_response.get();
983 error_code = response->error_code;
984 if (response->error_code.val == moveit_msgs::msg::MoveItErrorCodes::SUCCESS)
986 msg = response->solution;
987 return response->fraction;
994 error_code.val = error_code.FAILURE;
1001 if (trajectory_event_publisher_)
1003 std_msgs::msg::String event;
1004 event.data =
"stop";
1005 trajectory_event_publisher_->publish(event);
1009 bool attachObject(
const std::string&
object,
const std::string& link,
const std::vector<std::string>& touch_links)
1014 const std::vector<std::string>& links = joint_model_group_->
getLinkModelNames();
1020 RCLCPP_ERROR(
LOGGER,
"No known link to attach object '%s' to",
object.c_str());
1023 moveit_msgs::msg::AttachedCollisionObject aco;
1024 aco.object.id = object;
1025 aco.link_name.swap(l);
1026 if (touch_links.empty())
1027 aco.touch_links.push_back(aco.link_name);
1029 aco.touch_links = touch_links;
1030 aco.object.operation = moveit_msgs::msg::CollisionObject::ADD;
1031 attached_object_publisher_->publish(aco);
1037 moveit_msgs::msg::AttachedCollisionObject aco;
1040 aco.link_name =
name;
1042 aco.object.id =
name;
1043 aco.object.operation = moveit_msgs::msg::CollisionObject::REMOVE;
1044 if (aco.link_name.empty() && aco.object.id.empty())
1047 const std::vector<std::string>& lnames = joint_model_group_->
getLinkModelNames();
1048 for (
const std::string& lname : lnames)
1050 aco.link_name = lname;
1051 attached_object_publisher_->publish(aco);
1056 attached_object_publisher_->publish(aco);
1063 return goal_position_tolerance_;
1068 return goal_orientation_tolerance_;
1073 return goal_joint_tolerance_;
1078 goal_joint_tolerance_ = tolerance;
1083 goal_position_tolerance_ = tolerance;
1088 goal_orientation_tolerance_ = tolerance;
1094 allowed_planning_time_ = seconds;
1099 return allowed_planning_time_;
1104 state = considered_start_state_;
1110 request.num_planning_attempts = num_planning_attempts_;
1111 request.max_velocity_scaling_factor = max_velocity_scaling_factor_;
1112 request.max_acceleration_scaling_factor = max_acceleration_scaling_factor_;
1113 request.allowed_planning_time = allowed_planning_time_;
1114 request.pipeline_id = planning_pipeline_id_;
1115 request.planner_id = planner_id_;
1116 request.workspace_parameters = workspace_parameters_;
1117 request.start_state = considered_start_state_;
1119 if (active_target_ ==
JOINT)
1121 request.goal_constraints.resize(1);
1125 else if (active_target_ == POSE || active_target_ ==
POSITION || active_target_ ==
ORIENTATION)
1128 std::size_t goal_count = 0;
1129 for (
const auto& pose_target : pose_targets_)
1130 goal_count = std::max(goal_count, pose_target.second.size());
1136 request.goal_constraints.resize(goal_count);
1138 for (
const auto& pose_target : pose_targets_)
1140 for (std::size_t i = 0; i < pose_target.second.size(); ++i)
1143 pose_target.first, pose_target.second[i], goal_position_tolerance_, goal_orientation_tolerance_);
1145 c.position_constraints.clear();
1147 c.orientation_constraints.clear();
1153 RCLCPP_ERROR(
LOGGER,
"Unable to construct MotionPlanRequest representation");
1155 if (path_constraints_)
1156 request.path_constraints = *path_constraints_;
1157 if (trajectory_constraints_)
1158 request.trajectory_constraints = *trajectory_constraints_;
1223 path_constraints_ = std::make_unique<moveit_msgs::msg::Constraints>(constraint);
1228 if (constraints_storage_)
1231 if (constraints_storage_->getConstraints(msg_m, constraint, robot_model_->getName(), opt_.
group_name_))
1234 std::make_unique<moveit_msgs::msg::Constraints>(
static_cast<moveit_msgs::msg::Constraints
>(*msg_m));
1246 path_constraints_.reset();
1251 trajectory_constraints_ = std::make_unique<moveit_msgs::msg::TrajectoryConstraints>(constraint);
1256 trajectory_constraints_.reset();
1261 while (initializing_constraints_)
1263 std::chrono::duration<double>
d(0.01);
1264 rclcpp::sleep_for(std::chrono::duration_cast<std::chrono::nanoseconds>(
d), rclcpp::Context::SharedPtr(
nullptr));
1267 std::vector<std::string>
c;
1268 if (constraints_storage_)
1269 constraints_storage_->getKnownConstraints(
c, robot_model_->getName(), opt_.
group_name_);
1276 if (path_constraints_)
1277 return *path_constraints_;
1279 return moveit_msgs::msg::Constraints();
1284 if (trajectory_constraints_)
1285 return *trajectory_constraints_;
1287 return moveit_msgs::msg::TrajectoryConstraints();
1292 initializing_constraints_ =
true;
1293 if (constraints_init_thread_)
1294 constraints_init_thread_->join();
1295 constraints_init_thread_ =
1296 std::make_unique<std::thread>([
this, host, port] { initializeConstraintsStorageThread(host, port); });
1299 void setWorkspace(
double minx,
double miny,
double minz,
double maxx,
double maxy,
double maxz)
1301 workspace_parameters_.header.frame_id =
getRobotModel()->getModelFrame();
1302 workspace_parameters_.header.stamp =
getClock()->now();
1303 workspace_parameters_.min_corner.x = minx;
1304 workspace_parameters_.min_corner.y = miny;
1305 workspace_parameters_.min_corner.z = minz;
1306 workspace_parameters_.max_corner.x = maxx;
1307 workspace_parameters_.max_corner.y = maxy;
1308 workspace_parameters_.max_corner.z = maxz;
1313 return node_->get_clock();
1317 void initializeConstraintsStorageThread(
const std::string& host,
unsigned int port)
1323 conn->setParams(host, port);
1324 if (conn->connect())
1326 constraints_storage_ = std::make_unique<moveit_warehouse::ConstraintsStorage>(conn);
1329 catch (std::exception& ex)
1331 RCLCPP_ERROR(
LOGGER,
"%s", ex.what());
1333 initializing_constraints_ =
false;
1337 rclcpp::Node::SharedPtr node_;
1338 rclcpp::CallbackGroup::SharedPtr callback_group_;
1339 rclcpp::executors::SingleThreadedExecutor callback_executor_;
1340 std::thread callback_thread_;
1341 std::shared_ptr<tf2_ros::Buffer> tf_buffer_;
1342 moveit::core::RobotModelConstPtr robot_model_;
1343 planning_scene_monitor::CurrentStateMonitorPtr current_state_monitor_;
1345 std::shared_ptr<rclcpp_action::Client<moveit_msgs::action::MoveGroup>> move_action_client_;
1348 std::shared_ptr<rclcpp_action::Client<moveit_msgs::action::ExecuteTrajectory>> execute_action_client_;
1351 moveit_msgs::msg::RobotState considered_start_state_;
1352 moveit_msgs::msg::WorkspaceParameters workspace_parameters_;
1353 double allowed_planning_time_;
1354 std::string planning_pipeline_id_;
1355 std::string planner_id_;
1356 unsigned int num_planning_attempts_;
1357 double max_velocity_scaling_factor_;
1358 double max_acceleration_scaling_factor_;
1359 double goal_joint_tolerance_;
1360 double goal_position_tolerance_;
1361 double goal_orientation_tolerance_;
1363 int32_t look_around_attempts_;
1365 int32_t replan_attempts_;
1366 double replan_delay_;
1369 moveit::core::RobotStatePtr joint_state_target_;
1374 std::map<std::string, std::vector<geometry_msgs::msg::PoseStamped>> pose_targets_;
1377 ActiveTargetType active_target_;
1378 std::unique_ptr<moveit_msgs::msg::Constraints> path_constraints_;
1379 std::unique_ptr<moveit_msgs::msg::TrajectoryConstraints> trajectory_constraints_;
1380 std::string end_effector_link_;
1381 std::string pose_reference_frame_;
1382 std::string support_surface_;
1385 rclcpp::Publisher<std_msgs::msg::String>::SharedPtr trajectory_event_publisher_;
1386 rclcpp::Publisher<moveit_msgs::msg::AttachedCollisionObject>::SharedPtr attached_object_publisher_;
1387 rclcpp::Client<moveit_msgs::srv::QueryPlannerInterfaces>::SharedPtr query_service_;
1388 rclcpp::Client<moveit_msgs::srv::GetPlannerParams>::SharedPtr get_params_service_;
1389 rclcpp::Client<moveit_msgs::srv::SetPlannerParams>::SharedPtr set_params_service_;
1390 rclcpp::Client<moveit_msgs::srv::GetCartesianPath>::SharedPtr cartesian_path_service_;
1392 std::unique_ptr<moveit_warehouse::ConstraintsStorage> constraints_storage_;
1393 std::unique_ptr<std::thread> constraints_init_thread_;
1394 bool initializing_constraints_;
1398 const std::shared_ptr<tf2_ros::Buffer>& tf_buffer,
1399 const rclcpp::Duration& wait_for_servers)
1402 throw std::runtime_error(
"ROS does not seem to be running");
1408 const std::shared_ptr<tf2_ros::Buffer>& tf_buffer,
1409 const rclcpp::Duration& wait_for_servers)
1420 : remembered_joint_values_(std::move(other.remembered_joint_values_)), impl_(other.impl_)
1422 other.impl_ =
nullptr;
1430 impl_ = other.impl_;
1431 remembered_joint_values_ = std::move(other.remembered_joint_values_);
1432 other.impl_ =
nullptr;
1466 const std::string&
group)
const
1472 const std::map<std::string, std::string>& params,
bool replace)
1524 return impl_->
move(
false);
1534 return impl_->
move(
true);
1544 return impl_->
execute(trajectory,
false);
1554 return impl_->
execute(trajectory,
true);
1603 double jump_threshold, moveit_msgs::msg::RobotTrajectory& trajectory,
1604 bool avoid_collisions, moveit_msgs::msg::MoveItErrorCodes* error_code)
1606 moveit_msgs::msg::Constraints path_constraints_tmp;
1612 double jump_threshold, moveit_msgs::msg::RobotTrajectory& trajectory,
1614 bool avoid_collisions, moveit_msgs::msg::MoveItErrorCodes* error_code)
1619 avoid_collisions, *error_code);
1623 moveit_msgs::msg::MoveItErrorCodes error_code_tmp;
1625 avoid_collisions, error_code_tmp);
1667 std::map<std::string, std::vector<double>>::const_iterator it = remembered_joint_values_.find(
name);
1668 std::map<std::string, double> positions;
1670 if (it != remembered_joint_values_.cend())
1673 for (
size_t x = 0;
x < names.size(); ++
x)
1675 positions[names[
x]] = it->second[
x];
1687 std::map<std::string, std::vector<double>>::const_iterator it = remembered_joint_values_.find(
name);
1688 if (it != remembered_joint_values_.end())
1699 RCLCPP_ERROR(
LOGGER,
"The requested named target '%s' does not exist",
name.c_str());
1712 if (joint_values.size() != n_group_joints)
1714 RCLCPP_DEBUG_STREAM(
LOGGER,
"Provided joint value list has length " << joint_values.size() <<
" but group "
1716 <<
" has " << n_group_joints <<
" joints");
1727 for (
const auto& pair : variable_values)
1729 if (std::find(allowed.begin(), allowed.end(), pair.first) == allowed.end())
1731 RCLCPP_ERROR_STREAM(
LOGGER,
"joint variable " << pair.first <<
" is not part of group "
1743 const std::vector<double>& variable_values)
1746 for (
const auto& variable_name : variable_names)
1748 if (std::find(allowed.begin(), allowed.end(), variable_name) == allowed.end())
1750 RCLCPP_ERROR_STREAM(
LOGGER,
"joint variable " << variable_name <<
" is not part of group "
1770 std::vector<double> values(1, value);
1784 RCLCPP_ERROR_STREAM(
LOGGER,
1795 const std::string& end_effector_link)
1801 const std::string& end_effector_link)
1803 return impl_->
setJointValueTarget(eef_pose.pose, end_effector_link, eef_pose.header.frame_id,
false);
1808 geometry_msgs::msg::Pose msg = tf2::toMsg(eef_pose);
1813 const std::string& end_effector_link)
1819 const std::string& end_effector_link)
1821 return impl_->
setJointValueTarget(eef_pose.pose, end_effector_link, eef_pose.header.frame_id,
true);
1825 const std::string& end_effector_link)
1827 geometry_msgs::msg::Pose msg = tf2::toMsg(eef_pose);
1880 std::vector<geometry_msgs::msg::PoseStamped> pose_msg(1);
1881 pose_msg[0].pose = tf2::toMsg(pose);
1883 pose_msg[0].header.stamp = impl_->
getClock()->now();
1889 std::vector<geometry_msgs::msg::PoseStamped> pose_msg(1);
1890 pose_msg[0].pose = target;
1892 pose_msg[0].header.stamp = impl_->
getClock()->now();
1897 const std::string& end_effector_link)
1899 std::vector<geometry_msgs::msg::PoseStamped> targets(1, target);
1905 std::vector<geometry_msgs::msg::PoseStamped> pose_out(target.size());
1906 rclcpp::Time tm = impl_->
getClock()->now();
1908 for (std::size_t i = 0; i < target.size(); ++i)
1910 pose_out[i].pose = tf2::toMsg(target[i]);
1911 pose_out[i].header.stamp = tm;
1912 pose_out[i].header.frame_id =
frame_id;
1918 const std::string& end_effector_link)
1920 std::vector<geometry_msgs::msg::PoseStamped> target_stamped(target.size());
1921 rclcpp::Time tm = impl_->
getClock()->now();
1923 for (std::size_t i = 0; i < target.size(); ++i)
1925 target_stamped[i].pose = target[i];
1926 target_stamped[i].header.stamp = tm;
1927 target_stamped[i].header.frame_id =
frame_id;
1933 const std::string& end_effector_link)
1937 RCLCPP_ERROR(
LOGGER,
"No pose specified as goal target");
1952 const std::vector<geometry_msgs::msg::PoseStamped>&
1960 inline void transformPose(
const tf2_ros::Buffer& tf_buffer,
const std::string& desired_frame,
1961 geometry_msgs::msg::PoseStamped& target)
1963 if (desired_frame != target.header.frame_id)
1965 geometry_msgs::msg::PoseStamped target_in(target);
1966 tf_buffer.transform(target_in, target, desired_frame);
1968 target.header.stamp = rclcpp::Time(0);
1975 geometry_msgs::msg::PoseStamped target;
1983 target.pose.orientation.x = 0.0;
1984 target.pose.orientation.y = 0.0;
1985 target.pose.orientation.z = 0.0;
1986 target.pose.orientation.w = 1.0;
1990 target.pose.position.x =
x;
1991 target.pose.position.y =
y;
1992 target.pose.position.z =
z;
2000 geometry_msgs::msg::PoseStamped target;
2008 target.pose.position.x = 0.0;
2009 target.pose.position.y = 0.0;
2010 target.pose.position.z = 0.0;
2015 target.pose.orientation = tf2::toMsg(q);
2022 const std::string& end_effector_link)
2024 geometry_msgs::msg::PoseStamped target;
2032 target.pose.position.x = 0.0;
2033 target.pose.position.y = 0.0;
2034 target.pose.position.z = 0.0;
2038 target.pose.orientation.x =
x;
2039 target.pose.orientation.y =
y;
2040 target.pose.orientation.z =
z;
2041 target.pose.orientation.w =
w;
2106 moveit::core::RobotStatePtr current_state;
2107 std::vector<double> values;
2109 current_state->copyJointGroupPositions(
getName(), values);
2115 std::vector<double>
r;
2122 const std::string& eef = end_effector_link.empty() ?
getEndEffectorLink() : end_effector_link;
2123 Eigen::Isometry3d pose;
2126 RCLCPP_ERROR(
LOGGER,
"No end-effector specified");
2129 moveit::core::RobotStatePtr current_state;
2135 pose = current_state->getGlobalLinkTransform(lm);
2138 geometry_msgs::msg::PoseStamped pose_msg;
2139 pose_msg.header.stamp = impl_->
getClock()->now();
2140 pose_msg.header.frame_id = impl_->
getRobotModel()->getModelFrame();
2141 pose_msg.pose = tf2::toMsg(pose);
2147 const std::string& eef = end_effector_link.empty() ?
getEndEffectorLink() : end_effector_link;
2148 Eigen::Isometry3d pose;
2151 RCLCPP_ERROR(
LOGGER,
"No end-effector specified");
2154 moveit::core::RobotStatePtr current_state;
2159 pose = current_state->getGlobalLinkTransform(lm);
2162 geometry_msgs::msg::PoseStamped pose_msg;
2163 pose_msg.header.stamp = impl_->
getClock()->now();
2164 pose_msg.header.frame_id = impl_->
getRobotModel()->getModelFrame();
2165 pose_msg.pose = tf2::toMsg(pose);
2171 std::vector<double> result;
2172 const std::string& eef = end_effector_link.empty() ?
getEndEffectorLink() : end_effector_link;
2174 RCLCPP_ERROR(
LOGGER,
"No end-effector specified");
2177 moveit::core::RobotStatePtr current_state;
2184 geometry_msgs::msg::TransformStamped tfs = tf2::eigenToTransform(current_state->getGlobalLinkTransform(lm));
2185 double pitch, roll, yaw;
2186 tf2::getEulerYPR<geometry_msgs::msg::Quaternion>(tfs.transform.rotation, yaw, pitch, roll);
2213 moveit::core::RobotStatePtr current_state;
2215 return current_state;
2220 remembered_joint_values_[
name] = values;
2225 remembered_joint_values_.erase(
name);
2230 impl_->can_look_ = flag;
2231 RCLCPP_DEBUG(
LOGGER,
"Looking around: %s", flag ?
"yes" :
"no");
2238 RCLCPP_ERROR(
LOGGER,
"Tried to set negative number of look-around attempts");
2242 RCLCPP_DEBUG_STREAM(
LOGGER,
"Look around attempts: " << attempts);
2243 impl_->look_around_attempts_ = attempts;
2249 impl_->can_replan_ = flag;
2250 RCLCPP_DEBUG(
LOGGER,
"Replanning: %s", flag ?
"yes" :
"no");
2257 RCLCPP_ERROR(
LOGGER,
"Tried to set negative number of replan attempts");
2261 RCLCPP_DEBUG_STREAM(
LOGGER,
"Replan Attempts: " << attempts);
2262 impl_->replan_attempts_ = attempts;
2270 RCLCPP_ERROR(
LOGGER,
"Tried to set negative replan delay");
2274 RCLCPP_DEBUG_STREAM(
LOGGER,
"Replan Delay: " << delay);
2275 impl_->replan_delay_ = delay;
2326 impl_->
setWorkspace(minx, miny, minz, maxx, maxy, maxz);
2358 return attachObject(
object, link, std::vector<std::string>());
2362 const std::vector<std::string>& touch_links)
const std::vector< std::string > & getLinkModelNames() const
Get the names of the links that are part of this joint group.
bool isChain() const
Check if this group is a linear chain.
const std::string & getName() const
Get the name of the joint group.
void getVariableRandomPositions(random_numbers::RandomNumberGenerator &rng, double *values) const
Compute random values for the state of the joint group.
const std::vector< std::string > & getJointModelNames() const
Get the names of the joints in this group. These are the names of the joints returned by getJointMode...
const std::pair< std::string, std::string > & getEndEffectorParentGroup() const
Get the name of the group this end-effector attaches to (first) and the name of the link in that grou...
const JointModel * getJointModel(const std::string &joint) const
Get a joint by its name. Throw an exception if the joint is not part of this group.
bool hasLinkModel(const std::string &link) const
Check if a link is part of this group.
unsigned int getVariableCount() const
Get the number of variables that describe this joint group. This includes variables necessary for mim...
const std::vector< std::string > & getVariableNames() const
Get the names of the variables that make up the joints included in this group. The number of returned...
bool getVariableDefaultPositions(const std::string &name, std::map< std::string, double > &values) const
Get the values that correspond to a named state as read from the URDF. Return false on failure.
const std::vector< std::string > & getDefaultStateNames() const
Get the names of the known default states (as specified in the SRDF)
const std::vector< std::string > & getActiveJointModelNames() const
Get the names of the active joints in this group. These are the names of the joints returned by getJo...
A joint from the robot. Models the transform that this joint applies in the kinematic chain....
std::size_t getVariableCount() const
Get the number of variables that describe this joint.
A link from the robot. Contains the constant transform applied to the link and its geometry.
a wrapper around moveit_msgs::MoveItErrorCodes to make it easier to return an error code message from...
Representation of a robot's state. This includes position, velocity, acceleration and effort.
void setVariablePositions(const double *position)
It is assumed positions is an array containing the new positions for all variables in this state....
void setJointGroupPositions(const std::string &joint_group_name, const double *gstate)
Given positions for the variables that make up a group, in the order found in the group (including va...
void copyJointGroupPositions(const std::string &joint_group_name, std::vector< double > &gstate) const
For a given group, copy the position values of the variables that make up the group into another loca...
const Eigen::Isometry3d & getFrameTransform(const std::string &frame_id, bool *frame_found=nullptr)
Get the transformation matrix from the model frame (root of model) to the frame identified by frame_i...
void setToRandomPositions()
Set all joints to random values. Values will be within default bounds.
bool satisfiesBounds(double margin=0.0) const
void setToDefaultValues()
Set all joints to their default positions. The default position is 0, or if that is not within bounds...
random_numbers::RandomNumberGenerator & getRandomNumberGenerator()
Return the instance of a random number generator.
bool setFromIK(const JointModelGroup *group, const geometry_msgs::msg::Pose &pose, double timeout=0.0, const GroupStateValidityCallbackFn &constraint=GroupStateValidityCallbackFn(), const kinematics::KinematicsQueryOptions &options=kinematics::KinematicsQueryOptions(), const kinematics::KinematicsBase::IKCostFn &cost_function=kinematics::KinematicsBase::IKCostFn())
If the group this state corresponds to is a chain and a solver is available, then the joint values ca...
void setJointPositions(const std::string &joint_name, const double *position)
std::vector< std::string > getKnownConstraints() const
const std::string & getEndEffectorLink() const
bool startStateMonitor(double wait)
void setPlanningPipelineId(const std::string &pipeline_id)
const std::string & getEndEffector() const
void setPoseReferenceFrame(const std::string &pose_reference_frame)
double getGoalPositionTolerance() const
std::string getDefaultPlanningPipelineId() const
~MoveGroupInterfaceImpl()
rclcpp::Clock::SharedPtr getClock()
void setEndEffectorLink(const std::string &end_effector)
const Options & getOptions() const
void constructGoal(moveit_msgs::action::MoveGroup::Goal &goal) const
double getPlanningTime() const
double computeCartesianPath(const std::vector< geometry_msgs::msg::Pose > &waypoints, double step, double jump_threshold, moveit_msgs::msg::RobotTrajectory &msg, const moveit_msgs::msg::Constraints &path_constraints, bool avoid_collisions, moveit_msgs::msg::MoveItErrorCodes &error_code)
void constructRobotState(moveit_msgs::msg::RobotState &state) const
std::string getDefaultPlannerId(const std::string &group) const
bool setPathConstraints(const std::string &constraint)
const std::string & getPlannerId() const
void setStartState(const moveit::core::RobotState &start_state)
double getGoalJointTolerance() const
void setMaxScalingFactor(double &variable, const double target_value, const char *factor_name, double fallback_value)
void setMaxAccelerationScalingFactor(double value)
void clearPathConstraints()
void setGoalOrientationTolerance(double tolerance)
void setSupportSurfaceName(const std::string &support_surface)
const moveit::core::RobotState & getTargetRobotState() const
bool getCurrentState(moveit::core::RobotStatePtr ¤t_state, double wait_seconds=1.0)
rclcpp_action::Client< moveit_msgs::action::MoveGroup > & getMoveGroupClient() const
moveit::core::MoveItErrorCode execute(const moveit_msgs::msg::RobotTrajectory &trajectory, bool wait)
void clearPoseTarget(const std::string &end_effector_link)
bool attachObject(const std::string &object, const std::string &link, const std::vector< std::string > &touch_links)
void setGoalPositionTolerance(double tolerance)
void initializeConstraintsStorage(const std::string &host, unsigned int port)
void setPlannerId(const std::string &planner_id)
const std::shared_ptr< tf2_ros::Buffer > & getTF() const
double getGoalOrientationTolerance() const
moveit_msgs::msg::Constraints getPathConstraints() const
void setTargetType(ActiveTargetType type)
void setPathConstraints(const moveit_msgs::msg::Constraints &constraint)
std::map< std::string, std::string > getPlannerParams(const std::string &planner_id, const std::string &group="")
const moveit::core::JointModelGroup * getJointModelGroup() const
ActiveTargetType getTargetType() const
void setMaxVelocityScalingFactor(double value)
void setNumPlanningAttempts(unsigned int num_planning_attempts)
const moveit::core::RobotModelConstPtr & getRobotModel() const
void setGoalJointTolerance(double tolerance)
const geometry_msgs::msg::PoseStamped & getPoseTarget(const std::string &end_effector_link) const
void setTrajectoryConstraints(const moveit_msgs::msg::TrajectoryConstraints &constraint)
moveit::core::MoveItErrorCode move(bool wait)
void constructMotionPlanRequest(moveit_msgs::msg::MotionPlanRequest &request) const
void setPlanningTime(double seconds)
moveit_msgs::msg::TrajectoryConstraints getTrajectoryConstraints() const
MoveGroupInterfaceImpl(const rclcpp::Node::SharedPtr &node, const Options &opt, const std::shared_ptr< tf2_ros::Buffer > &tf_buffer, const rclcpp::Duration &wait_for_servers)
bool setPoseTargets(const std::vector< geometry_msgs::msg::PoseStamped > &poses, const std::string &end_effector_link)
moveit::core::RobotState & getTargetRobotState()
void clearTrajectoryConstraints()
bool getInterfaceDescription(moveit_msgs::msg::PlannerInterfaceDescription &desc)
const std::string & getPlanningPipelineId() const
void setStartState(const moveit_msgs::msg::RobotState &start_state)
bool detachObject(const std::string &name)
bool setJointValueTarget(const geometry_msgs::msg::Pose &eef_pose, const std::string &end_effector_link, const std::string &frame, bool approx)
moveit::core::RobotStatePtr getStartState()
const std::vector< geometry_msgs::msg::PoseStamped > & getPoseTargets(const std::string &end_effector_link) const
bool hasPoseTarget(const std::string &end_effector_link) const
void setPlannerParams(const std::string &planner_id, const std::string &group, const std::map< std::string, std::string > ¶ms, bool replace=false)
bool getInterfaceDescriptions(std::vector< moveit_msgs::msg::PlannerInterfaceDescription > &desc)
void setStartStateToCurrentState()
moveit::core::MoveItErrorCode plan(Plan &plan)
Convert a vector of PoseStamped to a vector of PlaceLocation.
const std::string & getPoseReferenceFrame() const
void setWorkspace(double minx, double miny, double minz, double maxx, double maxy, double maxz)
Client class to conveniently use the ROS interfaces provided by the move_group node.
double computeCartesianPath(const std::vector< geometry_msgs::msg::Pose > &waypoints, double eef_step, double jump_threshold, moveit_msgs::msg::RobotTrajectory &trajectory, bool avoid_collisions=true, moveit_msgs::msg::MoveItErrorCodes *error_code=nullptr)
Compute a Cartesian path that follows specified waypoints with a step size of at most eef_step meters...
std::vector< double > getRandomJointValues() const
Get random joint values for the joints planned for by this instance (see getJoints())
void setMaxVelocityScalingFactor(double max_velocity_scaling_factor)
Set a scaling factor for optionally reducing the maximum joint velocity. Allowed values are in (0,...
const std::string & getEndEffectorLink() const
Get the current end-effector link. This returns the value set by setEndEffectorLink() (or indirectly ...
static const std::string ROBOT_DESCRIPTION
Default ROS parameter name from where to read the robot's URDF. Set to 'robot_description'.
const std::vector< std::string > & getNamedTargets() const
Get the names of the named robot states available as targets, both either remembered states or defaul...
std::map< std::string, std::string > getPlannerParams(const std::string &planner_id, const std::string &group="") const
Get the planner parameters for given group and planner_id.
void stop()
Stop any trajectory execution, if one is active.
MoveGroupInterface(const rclcpp::Node::SharedPtr &node, const Options &opt, const std::shared_ptr< tf2_ros::Buffer > &tf_buffer=std::shared_ptr< tf2_ros::Buffer >(), const rclcpp::Duration &wait_for_servers=rclcpp::Duration::from_seconds(-1))
Construct a MoveGroupInterface instance call using a specified set of options opt.
const std::string & getPlannerId() const
Get the current planner_id.
void setReplanDelay(double delay)
Sleep this duration between replanning attempts (in walltime seconds)
moveit::core::MoveItErrorCode plan(Plan &plan)
Compute a motion plan that takes the group declared in the constructor from the current state to the ...
void setGoalTolerance(double tolerance)
Set the tolerance that is used for reaching the goal. For joint state goals, this will be distance fo...
void setGoalPositionTolerance(double tolerance)
Set the position tolerance that is used for reaching the goal when moving to a pose.
const std::string & getPlanningFrame() const
Get the name of the frame in which the robot is planning.
bool setPoseTargets(const EigenSTL::vector_Isometry3d &end_effector_pose, const std::string &end_effector_link="")
Set goal poses for end_effector_link.
bool setPoseTarget(const Eigen::Isometry3d &end_effector_pose, const std::string &end_effector_link="")
Set the goal pose of the end-effector end_effector_link.
moveit::core::MoveItErrorCode asyncMove()
Plan and execute a trajectory that takes the group of joints declared in the constructor to the speci...
void setPlanningPipelineId(const std::string &pipeline_id)
Specify a planning pipeline to be used for further planning.
double getGoalJointTolerance() const
Get the tolerance that is used for reaching a joint goal. This is distance for each joint in configur...
bool setEndEffectorLink(const std::string &end_effector_link)
Specify the parent link of the end-effector. This end_effector_link will be used in calls to pose tar...
void setStartStateToCurrentState()
Set the starting state for planning to be that reported by the robot's joint state publication.
bool getInterfaceDescriptions(std::vector< moveit_msgs::msg::PlannerInterfaceDescription > &desc) const
Get the descriptions of all planning plugins loaded by the action server.
void setMaxAccelerationScalingFactor(double max_acceleration_scaling_factor)
Set a scaling factor for optionally reducing the maximum joint acceleration. Allowed values are in (0...
bool setPositionTarget(double x, double y, double z, const std::string &end_effector_link="")
Set the goal position of the end-effector end_effector_link to be (x, y, z).
void setSupportSurfaceName(const std::string &name)
For pick/place operations, the name of the support surface is used to specify the fact that attached ...
const std::string & getEndEffector() const
Get the current end-effector name. This returns the value set by setEndEffector() (or indirectly by s...
void clearPathConstraints()
Specify that no path constraints are to be used. This removes any path constraints set in previous ca...
bool attachObject(const std::string &object, const std::string &link="")
Pick up an object.
std::string getDefaultPlanningPipelineId() const
moveit_msgs::msg::Constraints getPathConstraints() const
Get the actual set of constraints in use with this MoveGroupInterface.
void setNumPlanningAttempts(unsigned int num_planning_attempts)
Set the number of times the motion plan is to be computed from scratch before the shortest solution i...
rclcpp_action::Client< moveit_msgs::action::MoveGroup > & getMoveGroupClient() const
Get the move_group action client used by the MoveGroupInterface. The client can be used for querying ...
MoveGroupInterface & operator=(const MoveGroupInterface &)=delete
std::vector< double > getCurrentJointValues() const
Get the current joint values for the joints planned for by this instance (see getJoints())
bool setNamedTarget(const std::string &name)
Set the current joint values to be ones previously remembered by rememberJointValues() or,...
const std::vector< std::string > & getJointNames() const
Get vector of names of joints available in move group.
moveit::core::MoveItErrorCode move()
Plan and execute a trajectory that takes the group of joints declared in the constructor to the speci...
void setReplanAttempts(int32_t attempts)
Maximum number of replanning attempts.
void allowReplanning(bool flag)
Specify whether the robot is allowed to replan if it detects changes in the environment.
moveit::core::RobotModelConstPtr getRobotModel() const
Get the RobotModel object.
void constructMotionPlanRequest(moveit_msgs::msg::MotionPlanRequest &request)
Build the MotionPlanRequest that would be sent to the move_group action with plan() or move() and sto...
bool setOrientationTarget(double x, double y, double z, double w, const std::string &end_effector_link="")
Set the goal orientation of the end-effector end_effector_link to be the quaternion (x,...
bool setJointValueTarget(const std::vector< double > &group_variable_values)
Set the JointValueTarget and use it for future planning requests.
void clearTrajectoryConstraints()
bool setRPYTarget(double roll, double pitch, double yaw, const std::string &end_effector_link="")
Set the goal orientation of the end-effector end_effector_link to be (roll,pitch,yaw) radians.
void setGoalOrientationTolerance(double tolerance)
Set the orientation tolerance that is used for reaching the goal when moving to a pose.
moveit::core::MoveItErrorCode execute(const Plan &plan)
Given a plan, execute it while waiting for completion.
void clearPoseTarget(const std::string &end_effector_link="")
Forget pose(s) specified for end_effector_link.
const geometry_msgs::msg::PoseStamped & getPoseTarget(const std::string &end_effector_link="") const
void setGoalJointTolerance(double tolerance)
Set the joint tolerance (for each joint) that is used for reaching the goal when moving to a joint va...
std::string getDefaultPlannerId(const std::string &group="") const
Get the default planner of the current planning pipeline for the given group (or the pipeline's defau...
void setRandomTarget()
Set the joint state goal to a random joint configuration.
moveit::core::RobotStatePtr getCurrentState(double wait=1) const
Get the current state of the robot within the duration specified by wait.
const std::vector< std::string > & getActiveJoints() const
Get only the active (actuated) joints this instance operates on.
void rememberJointValues(const std::string &name)
Remember the current joint values (of the robot being monitored) under name. These can be used by set...
void setLookAroundAttempts(int32_t attempts)
How often is the system allowed to move the camera to update environment model when looking.
bool getInterfaceDescription(moveit_msgs::msg::PlannerInterfaceDescription &desc) const
Get the description of the default planning plugin loaded by the action server.
const std::string & getName() const
Get the name of the group this instance operates on.
const std::vector< std::string > & getJoints() const
Get all the joints this instance operates on (including fixed joints)
bool detachObject(const std::string &name="")
Detach an object. name specifies the name of the object attached to this group, or the name of the li...
void setPoseReferenceFrame(const std::string &pose_reference_frame)
Specify which reference frame to assume for poses specified without a reference frame.
const std::vector< geometry_msgs::msg::PoseStamped > & getPoseTargets(const std::string &end_effector_link="") const
moveit_msgs::msg::TrajectoryConstraints getTrajectoryConstraints() const
const std::vector< std::string > & getLinkNames() const
Get vector of names of links available in move group.
void setStartState(const moveit_msgs::msg::RobotState &start_state)
If a different start state should be considered instead of the current state of the robot,...
bool setPathConstraints(const std::string &constraint)
Specify a set of path constraints to use. The constraints are looked up by name from the Mongo databa...
void clearPoseTargets()
Forget any poses specified for all end-effectors.
void setPlannerId(const std::string &planner_id)
Specify a planner to be used for further planning.
bool setEndEffector(const std::string &eef_name)
Specify the name of the end-effector to use. This is equivalent to setting the EndEffectorLink to the...
const std::string & getPoseReferenceFrame() const
Get the reference frame set by setPoseReferenceFrame(). By default this is the reference frame of the...
const std::string & getPlanningPipelineId() const
Get the current planning_pipeline_id.
void setConstraintsDatabase(const std::string &host, unsigned int port)
Specify where the database server that holds known constraints resides.
std::vector< double > getCurrentRPY(const std::string &end_effector_link="") const
Get the roll-pitch-yaw (XYZ) for the end-effector end_effector_link. If end_effector_link is empty (t...
void forgetJointValues(const std::string &name)
Forget the joint values remembered under name.
std::vector< std::string > getKnownConstraints() const
Get the names of the known constraints as read from the Mongo database, if a connection was achieved.
const moveit::core::RobotState & getJointValueTarget() const
Get the currently set joint state goal, replaced by private getTargetRobotState()
void setTrajectoryConstraints(const moveit_msgs::msg::TrajectoryConstraints &constraint)
const moveit::core::RobotState & getTargetRobotState() const
geometry_msgs::msg::PoseStamped getRandomPose(const std::string &end_effector_link="") const
Get a random reachable pose for the end-effector end_effector_link. If end_effector_link is empty (th...
double getGoalOrientationTolerance() const
Get the tolerance that is used for reaching an orientation goal. This is the tolerance for roll,...
void allowLooking(bool flag)
Specify whether the robot is allowed to look around before moving if it determines it should (default...
std::map< std::string, double > getNamedTargetValues(const std::string &name) const
Get the joint angles for targets specified by name.
geometry_msgs::msg::PoseStamped getCurrentPose(const std::string &end_effector_link="") const
Get the pose for the end-effector end_effector_link. If end_effector_link is empty (the default value...
bool startStateMonitor(double wait=1.0)
When reasoning about the current state of a robot, a CurrentStateMonitor instance is automatically co...
unsigned int getVariableCount() const
Get the number of variables used to describe the state of this group. This is larger or equal to the ...
double getGoalPositionTolerance() const
Get the tolerance that is used for reaching a position goal. This is be the radius of a sphere where ...
moveit::core::MoveItErrorCode asyncExecute(const Plan &plan)
Given a plan, execute it without waiting for completion.
double getPlanningTime() const
Get the number of seconds set by setPlanningTime()
void setPlanningTime(double seconds)
Specify the maximum amount of time to use when planning.
bool setApproximateJointValueTarget(const geometry_msgs::msg::Pose &eef_pose, const std::string &end_effector_link="")
Set the joint state goal for a particular joint by computing IK.
void setPlannerParams(const std::string &planner_id, const std::string &group, const std::map< std::string, std::string > ¶ms, bool bReplace=false)
Set the planner parameters for given group and planner_id.
void setWorkspace(double minx, double miny, double minz, double maxx, double maxy, double maxz)
Specify the workspace bounding box. The box is specified in the planning frame (i....
const std::vector< std::string > & getJointModelGroupNames() const
Get the available planning group names.
static const std::string DEFAULT_ATTACHED_COLLISION_OBJECT_TOPIC
The name of the topic used by default for attached collision objects.
static const std::string EXECUTION_EVENT_TOPIC
moveit_msgs::msg::Constraints constructGoalConstraints(const moveit::core::RobotState &state, const moveit::core::JointModelGroup *jmg, double tolerance_below, double tolerance_above)
Generates a constraint message intended to be used as a goal constraint for a joint group....
moveit_msgs::msg::Constraints mergeConstraints(const moveit_msgs::msg::Constraints &first, const moveit_msgs::msg::Constraints &second)
Merge two sets of constraints into one.
void robotStateToRobotStateMsg(const RobotState &state, moveit_msgs::msg::RobotState &robot_state, bool copy_attached_bodies=true)
Convert a MoveIt robot state to a robot state message.
std::function< bool(RobotState *robot_state, const JointModelGroup *joint_group, const double *joint_group_variable_values)> GroupStateValidityCallbackFn
Signature for functions that can verify that if the group joint_group in robot_state is set to joint_...
bool robotStateMsgToRobotState(const Transforms &tf, const moveit_msgs::msg::RobotState &robot_state, RobotState &state, bool copy_attached_bodies=true)
Convert a robot state msg (with accompanying extra transforms) to a MoveIt robot state.
moveit::core::RobotModelConstPtr getSharedRobotModel(const rclcpp::Node::SharedPtr &node, const std::string &robot_description)
std::shared_ptr< tf2_ros::Buffer > getSharedTF()
const rclcpp::Logger LOGGER
planning_scene_monitor::CurrentStateMonitorPtr getSharedStateMonitor(const rclcpp::Node::SharedPtr &node, const moveit::core::RobotModelConstPtr &robot_model, const std::shared_ptr< tf2_ros::Buffer > &tf_buffer)
getSharedStateMonitor
const std::string GRASP_PLANNING_SERVICE_NAME
warehouse_ros::DatabaseConnection::Ptr loadDatabase(const rclcpp::Node::SharedPtr &node)
Load a database connection.
warehouse_ros::MessageWithMetadata< moveit_msgs::msg::Constraints >::ConstPtr ConstraintsWithMetadata
Main namespace for MoveIt.
This namespace includes the base class for MoveIt planners.
moveit_msgs::msg::MotionPlanRequest MotionPlanRequest
std::string append(const std::string &left, const std::string &right)
A set of options for the kinematics solver.
bool return_approximate_solution
Specification of options to use when constructing the MoveGroupInterface class.
std::string group_name_
The group to construct the class instance for.
std::string move_group_namespace_
The namespace for the move group node.
The representation of a motion plan (as ROS messasges)