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>
62#include <std_msgs/msg/string.hpp>
63#include <geometry_msgs/msg/transform_stamped.hpp>
65#include <tf2_eigen/tf2_eigen.hpp>
66#include <tf2_ros/transform_listener.h>
67#include <rclcpp/rclcpp.hpp>
68#include <rclcpp/version.h>
92#if RCLCPP_VERSION_GTE(17, 0, 0)
95 return rclcpp::SystemDefaultsQoS();
100 return rmw_qos_profile_services_default;
112 const std::shared_ptr<tf2_ros::Buffer>& tf_buffer,
const rclcpp::Duration& wait_for_servers)
113 : opt_(opt), node_(node), logger_(
moveit::getLogger(
"moveit.ros.move_group_interface")), tf_buffer_(tf_buffer)
117 callback_group_ = node_->create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive,
119 callback_executor_.add_callback_group(callback_group_, node->get_node_base_interface());
120 callback_thread_ = std::thread([
this]() { callback_executor_.spin(); });
125 std::string error =
"Unable to construct robot model. Please make sure all needed information is on the "
127 RCLCPP_FATAL_STREAM(logger_, error);
128 throw std::runtime_error(error);
133 std::string error =
"Group '" + opt.
group_name +
"' was not found.";
134 RCLCPP_FATAL_STREAM(logger_, error);
135 throw std::runtime_error(error);
141 joint_state_target_ = std::make_shared<moveit::core::RobotState>(
getRobotModel());
142 joint_state_target_->setToDefaultValues();
143 active_target_ = JOINT;
145 look_around_attempts_ = 0;
148 replan_attempts_ = 1;
149 goal_joint_tolerance_ = 1e-4;
150 goal_position_tolerance_ = 1e-4;
151 goal_orientation_tolerance_ = 1e-3;
152 allowed_planning_time_ = 5.0;
153 num_planning_attempts_ = 1;
154 node_->get_parameter_or<
double>(
"robot_description_planning.default_velocity_scaling_factor",
155 max_velocity_scaling_factor_, 0.1);
156 node_->get_parameter_or<
double>(
"robot_description_planning.default_acceleration_scaling_factor",
157 max_acceleration_scaling_factor_, 0.1);
158 initializing_constraints_ =
false;
160 if (joint_model_group_->
isChain())
164 trajectory_event_publisher_ = node_->create_publisher<std_msgs::msg::String>(
168 attached_object_publisher_ = node_->create_publisher<moveit_msgs::msg::AttachedCollisionObject>(
175 move_action_client_ = rclcpp_action::create_client<moveit_msgs::action::MoveGroup>(
177 move_action_client_->wait_for_action_server(wait_for_servers.to_chrono<std::chrono::duration<double>>());
178 execute_action_client_ = rclcpp_action::create_client<moveit_msgs::action::ExecuteTrajectory>(
180 execute_action_client_->wait_for_action_server(wait_for_servers.to_chrono<std::chrono::duration<double>>());
182 query_service_ = node_->create_client<moveit_msgs::srv::QueryPlannerInterfaces>(
185 get_params_service_ = node_->create_client<moveit_msgs::srv::GetPlannerParams>(
188 set_params_service_ = node_->create_client<moveit_msgs::srv::SetPlannerParams>(
191 cartesian_path_service_ = node_->create_client<moveit_msgs::srv::GetCartesianPath>(
195 RCLCPP_INFO_STREAM(logger_,
"Ready to take commands for planning group " << opt.
group_name <<
'.');
200 if (constraints_init_thread_)
201 constraints_init_thread_->join();
203 callback_executor_.cancel();
205 if (callback_thread_.joinable())
206 callback_thread_.join();
209 const std::shared_ptr<tf2_ros::Buffer>&
getTF()
const
226 return joint_model_group_;
231 return *move_action_client_;
236 auto req = std::make_shared<moveit_msgs::srv::QueryPlannerInterfaces::Request>();
237 auto future_response = query_service_->async_send_request(req);
239 if (future_response.valid())
241 const auto& response = future_response.get();
242 if (!response->planner_interfaces.empty())
244 desc = response->planner_interfaces.front();
253 auto req = std::make_shared<moveit_msgs::srv::QueryPlannerInterfaces::Request>();
254 auto future_response = query_service_->async_send_request(req);
255 if (future_response.valid())
257 const auto& response = future_response.get();
258 if (!response->planner_interfaces.empty())
260 desc = response->planner_interfaces;
267 std::map<std::string, std::string>
getPlannerParams(
const std::string& planner_id,
const std::string& group =
"")
269 auto req = std::make_shared<moveit_msgs::srv::GetPlannerParams::Request>();
270 moveit_msgs::srv::GetPlannerParams::Response::SharedPtr response;
271 req->planner_config = planner_id;
273 std::map<std::string, std::string> result;
275 auto future_response = get_params_service_->async_send_request(req);
276 if (future_response.valid())
278 response = future_response.get();
279 for (
unsigned int i = 0, end = response->params.keys.size(); i < end; ++i)
280 result[response->params.keys[i]] = response->params.values[i];
286 const std::map<std::string, std::string>& params,
bool replace =
false)
288 auto req = std::make_shared<moveit_msgs::srv::SetPlannerParams::Request>();
289 req->planner_config = planner_id;
291 req->replace = replace;
292 for (
const std::pair<const std::string, std::string>& param : params)
294 req->params.keys.push_back(param.first);
295 req->params.values.push_back(param.second);
297 set_params_service_->async_send_request(req);
302 std::string default_planning_pipeline;
303 node_->get_parameter(
"move_group.default_planning_pipeline", default_planning_pipeline);
304 return default_planning_pipeline;
309 if (pipeline_id != planning_pipeline_id_)
311 planning_pipeline_id_ = pipeline_id;
320 return planning_pipeline_id_;
327 if (!planning_pipeline_id_.empty())
328 pipeline_id = planning_pipeline_id_;
330 std::stringstream param_name;
331 param_name <<
"move_group";
332 if (!pipeline_id.empty())
333 param_name <<
"/planning_pipelines/" << pipeline_id;
335 param_name <<
'.' << group;
336 param_name <<
".default_planner_config";
338 std::string default_planner_config;
339 node_->get_parameter(param_name.str(), default_planner_config);
340 return default_planner_config;
345 planner_id_ = planner_id;
355 num_planning_attempts_ = num_planning_attempts;
365 return max_velocity_scaling_factor_;
370 setMaxScalingFactor(max_acceleration_scaling_factor_, value,
"acceleration_scaling_factor", 0.1);
375 return max_acceleration_scaling_factor_;
378 void setMaxScalingFactor(
double& variable,
const double target_value,
const char* factor_name,
double fallback_value)
380 if (target_value > 1.0)
382 RCLCPP_WARN(logger_,
"Limiting max_%s (%.2f) to 1.0.", factor_name, target_value);
385 else if (target_value <= 0.0)
387 node_->get_parameter_or<
double>(std::string(
"robot_description_planning.default_") + factor_name, variable,
389 if (target_value < 0.0)
391 RCLCPP_WARN(logger_,
"max_%s < 0.0! Setting to default: %.2f.", factor_name, variable);
396 variable = target_value;
402 return *joint_state_target_;
407 return *joint_state_target_;
412 considered_start_state_ = start_state;
417 considered_start_state_ = moveit_msgs::msg::RobotState();
424 considered_start_state_ = moveit_msgs::msg::RobotState();
425 considered_start_state_.is_diff =
true;
430 moveit::core::RobotStatePtr s;
437 const std::string& frame,
bool approx)
439 const std::string& eef = end_effector_link.empty() ?
getEndEffectorLink() : end_effector_link;
474 tf2::fromMsg(eef_pose, p);
480 RCLCPP_ERROR(logger_,
"Unable to transform from frame '%s' to frame '%s'", frame.c_str(),
492 end_effector_link_ = end_effector;
497 pose_targets_.erase(end_effector_link);
502 pose_targets_.clear();
507 return end_effector_link_;
512 if (!end_effector_link_.empty())
514 const std::vector<std::string>& possible_eefs =
516 for (
const std::string& possible_eef : possible_eefs)
518 if (
getRobotModel()->getEndEffector(possible_eef)->hasLinkModel(end_effector_link_))
522 static std::string empty;
526 bool setPoseTargets(
const std::vector<geometry_msgs::msg::PoseStamped>& poses,
const std::string& end_effector_link)
528 const std::string& eef = end_effector_link.empty() ? end_effector_link_ : end_effector_link;
531 RCLCPP_ERROR(logger_,
"No end-effector to set the pose for");
536 pose_targets_[eef] = poses;
538 std::vector<geometry_msgs::msg::PoseStamped>& stored_poses = pose_targets_[eef];
539 for (geometry_msgs::msg::PoseStamped& stored_pose : stored_poses)
540 stored_pose.header.stamp = rclcpp::Time(0);
547 const std::string& eef = end_effector_link.empty() ? end_effector_link_ : end_effector_link;
548 return pose_targets_.find(eef) != pose_targets_.end();
551 const geometry_msgs::msg::PoseStamped&
getPoseTarget(
const std::string& end_effector_link)
const
553 const std::string& eef = end_effector_link.empty() ? end_effector_link_ : end_effector_link;
556 std::map<std::string, std::vector<geometry_msgs::msg::PoseStamped>>::const_iterator jt = pose_targets_.find(eef);
557 if (jt != pose_targets_.end())
559 if (!jt->second.empty())
560 return jt->second.at(0);
564 static const geometry_msgs::msg::PoseStamped UNKNOWN;
565 RCLCPP_ERROR(logger_,
"Pose for end-effector '%s' not known.", eef.c_str());
569 const std::vector<geometry_msgs::msg::PoseStamped>&
getPoseTargets(
const std::string& end_effector_link)
const
571 const std::string& eef = end_effector_link.empty() ? end_effector_link_ : end_effector_link;
573 std::map<std::string, std::vector<geometry_msgs::msg::PoseStamped>>::const_iterator jt = pose_targets_.find(eef);
574 if (jt != pose_targets_.end())
576 if (!jt->second.empty())
581 static const std::vector<geometry_msgs::msg::PoseStamped> EMPTY;
582 RCLCPP_ERROR(logger_,
"Poses for end-effector '%s' are not known.", eef.c_str());
588 pose_reference_frame_ = pose_reference_frame;
593 return pose_reference_frame_;
598 active_target_ = type;
603 return active_target_;
608 if (!current_state_monitor_)
610 RCLCPP_ERROR(logger_,
"Unable to monitor current robot state");
615 if (!current_state_monitor_->isActive())
616 current_state_monitor_->startStateMonitor();
618 current_state_monitor_->waitForCompleteState(opt_.
group_name, wait);
622 bool getCurrentState(moveit::core::RobotStatePtr& current_state,
double wait_seconds = 1.0)
624 if (!current_state_monitor_)
626 RCLCPP_ERROR(logger_,
"Unable to get current robot state");
631 if (!current_state_monitor_->isActive())
632 current_state_monitor_->startStateMonitor();
634 if (!current_state_monitor_->waitForCurrentState(node_->now(), wait_seconds))
636 RCLCPP_ERROR(logger_,
"Failed to fetch current robot state");
640 current_state = current_state_monitor_->getCurrentState();
646 if (!move_action_client_ || !move_action_client_->action_server_is_ready())
648 RCLCPP_INFO_STREAM(logger_,
"MoveGroup action client/server not ready");
649 return moveit::core::MoveItErrorCode::FAILURE;
651 RCLCPP_INFO_STREAM(logger_,
"MoveGroup action client/server ready");
653 moveit_msgs::action::MoveGroup::Goal goal;
655 goal.planning_options.plan_only =
true;
656 goal.planning_options.look_around =
false;
657 goal.planning_options.replan =
false;
658 goal.planning_options.planning_scene_diff.is_diff =
true;
659 goal.planning_options.planning_scene_diff.robot_state.is_diff =
true;
662 rclcpp_action::ResultCode code = rclcpp_action::ResultCode::UNKNOWN;
663 std::shared_ptr<moveit_msgs::action::MoveGroup::Result> res;
664 auto send_goal_opts = rclcpp_action::Client<moveit_msgs::action::MoveGroup>::SendGoalOptions();
666 send_goal_opts.goal_response_callback =
667 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::MoveGroup>::SharedPtr& goal_handle) {
671 RCLCPP_INFO(logger_,
"Planning request rejected");
674 RCLCPP_INFO(logger_,
"Planning request accepted");
676 send_goal_opts.result_callback =
677 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::MoveGroup>::WrappedResult& result) {
684 case rclcpp_action::ResultCode::SUCCEEDED:
685 RCLCPP_INFO(logger_,
"Planning request complete!");
687 case rclcpp_action::ResultCode::ABORTED:
688 RCLCPP_INFO(logger_,
"Planning request aborted");
690 case rclcpp_action::ResultCode::CANCELED:
691 RCLCPP_INFO(logger_,
"Planning request canceled");
694 RCLCPP_INFO(logger_,
"Planning request unknown result code");
699 auto goal_handle_future = move_action_client_->async_send_goal(goal, send_goal_opts);
704 std::this_thread::sleep_for(std::chrono::milliseconds(1));
707 if (code != rclcpp_action::ResultCode::SUCCEEDED)
709 RCLCPP_ERROR_STREAM(logger_,
"MoveGroupInterface::plan() failed or timeout reached");
710 return res->error_code;
713 plan.trajectory = res->planned_trajectory;
714 plan.start_state = res->trajectory_start;
715 plan.planning_time = res->planning_time;
716 RCLCPP_INFO(logger_,
"time taken to generate plan: %g seconds",
plan.planning_time);
718 return res->error_code;
723 if (!move_action_client_ || !move_action_client_->action_server_is_ready())
725 RCLCPP_INFO_STREAM(logger_,
"MoveGroup action client/server not ready");
726 return moveit::core::MoveItErrorCode::FAILURE;
729 moveit_msgs::action::MoveGroup::Goal goal;
731 goal.planning_options.plan_only =
false;
732 goal.planning_options.look_around = can_look_;
733 goal.planning_options.replan = can_replan_;
734 goal.planning_options.replan_delay = replan_delay_;
735 goal.planning_options.planning_scene_diff.is_diff =
true;
736 goal.planning_options.planning_scene_diff.robot_state.is_diff =
true;
739 rclcpp_action::ResultCode code = rclcpp_action::ResultCode::UNKNOWN;
740 std::shared_ptr<moveit_msgs::action::MoveGroup_Result> res;
741 auto send_goal_opts = rclcpp_action::Client<moveit_msgs::action::MoveGroup>::SendGoalOptions();
743 send_goal_opts.goal_response_callback =
744 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::MoveGroup>::SharedPtr& goal_handle) {
748 RCLCPP_INFO(logger_,
"Plan and Execute request rejected");
751 RCLCPP_INFO(logger_,
"Plan and Execute request accepted");
753 send_goal_opts.result_callback =
754 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::MoveGroup>::WrappedResult& result) {
761 case rclcpp_action::ResultCode::SUCCEEDED:
762 RCLCPP_INFO(logger_,
"Plan and Execute request complete!");
764 case rclcpp_action::ResultCode::ABORTED:
765 RCLCPP_INFO(logger_,
"Plan and Execute request aborted");
767 case rclcpp_action::ResultCode::CANCELED:
768 RCLCPP_INFO(logger_,
"Plan and Execute request canceled");
771 RCLCPP_INFO(logger_,
"Plan and Execute request unknown result code");
775 auto goal_handle_future = move_action_client_->async_send_goal(goal, send_goal_opts);
777 return moveit::core::MoveItErrorCode::SUCCESS;
782 std::this_thread::sleep_for(std::chrono::milliseconds(1));
785 if (code != rclcpp_action::ResultCode::SUCCEEDED)
787 RCLCPP_ERROR_STREAM(logger_,
"MoveGroupInterface::move() failed or timeout reached");
789 return res->error_code;
793 const std::vector<std::string>& controllers = std::vector<std::string>())
795 if (!execute_action_client_ || !execute_action_client_->action_server_is_ready())
797 RCLCPP_INFO_STREAM(logger_,
"execute_action_client_ client/server not ready");
798 return moveit::core::MoveItErrorCode::FAILURE;
802 rclcpp_action::ResultCode code = rclcpp_action::ResultCode::UNKNOWN;
803 std::shared_ptr<moveit_msgs::action::ExecuteTrajectory_Result> res;
804 auto send_goal_opts = rclcpp_action::Client<moveit_msgs::action::ExecuteTrajectory>::SendGoalOptions();
806 send_goal_opts.goal_response_callback =
807 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::ExecuteTrajectory>::SharedPtr& goal_handle) {
811 RCLCPP_INFO(logger_,
"Execute request rejected");
814 RCLCPP_INFO(logger_,
"Execute request accepted");
816 send_goal_opts.result_callback =
817 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::ExecuteTrajectory>::WrappedResult& result) {
824 case rclcpp_action::ResultCode::SUCCEEDED:
825 RCLCPP_INFO(logger_,
"Execute request success!");
827 case rclcpp_action::ResultCode::ABORTED:
828 RCLCPP_INFO(logger_,
"Execute request aborted");
830 case rclcpp_action::ResultCode::CANCELED:
831 RCLCPP_INFO(logger_,
"Execute request canceled");
834 RCLCPP_INFO(logger_,
"Execute request unknown result code");
839 moveit_msgs::action::ExecuteTrajectory::Goal goal;
840 goal.trajectory = trajectory;
841 goal.controller_names = controllers;
843 auto goal_handle_future = execute_action_client_->async_send_goal(goal, send_goal_opts);
845 return moveit::core::MoveItErrorCode::SUCCESS;
850 std::this_thread::sleep_for(std::chrono::milliseconds(1));
853 if (code != rclcpp_action::ResultCode::SUCCEEDED)
855 RCLCPP_ERROR_STREAM(logger_,
"MoveGroupInterface::execute() failed or timeout reached");
857 return res->error_code;
861 moveit_msgs::msg::RobotTrajectory& msg,
862 const moveit_msgs::msg::Constraints& path_constraints,
bool avoid_collisions,
863 moveit_msgs::msg::MoveItErrorCodes& error_code)
865 auto req = std::make_shared<moveit_msgs::srv::GetCartesianPath::Request>();
866 moveit_msgs::srv::GetCartesianPath::Response::SharedPtr response;
868 req->start_state = considered_start_state_;
871 req->header.stamp =
getClock()->now();
872 req->waypoints = waypoints;
873 req->max_step = step;
874 req->path_constraints = path_constraints;
875 req->avoid_collisions = avoid_collisions;
877 req->max_velocity_scaling_factor = max_velocity_scaling_factor_;
878 req->max_acceleration_scaling_factor = max_acceleration_scaling_factor_;
880 auto future_response = cartesian_path_service_->async_send_request(req);
881 if (future_response.valid())
883 response = future_response.get();
884 error_code = response->error_code;
885 if (response->error_code.val == moveit_msgs::msg::MoveItErrorCodes::SUCCESS)
887 msg = response->solution;
888 return response->fraction;
895 error_code.val = error_code.FAILURE;
902 if (trajectory_event_publisher_)
904 std_msgs::msg::String event;
906 trajectory_event_publisher_->publish(event);
910 bool attachObject(
const std::string&
object,
const std::string& link,
const std::vector<std::string>& touch_links)
921 RCLCPP_ERROR(logger_,
"No known link to attach object '%s' to",
object.c_str());
924 moveit_msgs::msg::AttachedCollisionObject aco;
925 aco.object.id = object;
926 aco.link_name.swap(l);
927 if (touch_links.empty())
929 aco.touch_links.push_back(aco.link_name);
933 aco.touch_links = touch_links;
935 aco.object.operation = moveit_msgs::msg::CollisionObject::ADD;
936 attached_object_publisher_->publish(aco);
942 moveit_msgs::msg::AttachedCollisionObject aco;
944 if (!name.empty() && joint_model_group_->
hasLinkModel(name))
946 aco.link_name = name;
950 aco.object.id = name;
952 aco.object.operation = moveit_msgs::msg::CollisionObject::REMOVE;
953 if (aco.link_name.empty() && aco.object.id.empty())
956 const std::vector<std::string>& lnames = joint_model_group_->
getLinkModelNames();
957 for (
const std::string& lname : lnames)
959 aco.link_name = lname;
960 attached_object_publisher_->publish(aco);
965 attached_object_publisher_->publish(aco);
972 return goal_position_tolerance_;
977 return goal_orientation_tolerance_;
982 return goal_joint_tolerance_;
987 goal_joint_tolerance_ = tolerance;
992 goal_position_tolerance_ = tolerance;
997 goal_orientation_tolerance_ = tolerance;
1003 allowed_planning_time_ = seconds;
1008 return allowed_planning_time_;
1013 state = considered_start_state_;
1019 request.num_planning_attempts = num_planning_attempts_;
1020 request.max_velocity_scaling_factor = max_velocity_scaling_factor_;
1021 request.max_acceleration_scaling_factor = max_acceleration_scaling_factor_;
1022 request.allowed_planning_time = allowed_planning_time_;
1023 request.pipeline_id = planning_pipeline_id_;
1024 request.planner_id = planner_id_;
1025 request.workspace_parameters = workspace_parameters_;
1026 request.start_state = considered_start_state_;
1028 if (active_target_ == JOINT)
1030 request.goal_constraints.resize(1);
1034 else if (active_target_ == POSE || active_target_ == POSITION || active_target_ == ORIENTATION)
1037 std::size_t goal_count = 0;
1038 for (
const auto& pose_target : pose_targets_)
1039 goal_count = std::max(goal_count, pose_target.second.size());
1045 request.goal_constraints.resize(goal_count);
1047 for (
const auto& pose_target : pose_targets_)
1049 for (std::size_t i = 0; i < pose_target.second.size(); ++i)
1052 pose_target.first, pose_target.second[i], goal_position_tolerance_, goal_orientation_tolerance_);
1053 if (active_target_ == ORIENTATION)
1054 c.position_constraints.clear();
1055 if (active_target_ == POSITION)
1056 c.orientation_constraints.clear();
1062 RCLCPP_ERROR(logger_,
"Unable to construct MotionPlanRequest representation");
1064 if (path_constraints_)
1065 request.path_constraints = *path_constraints_;
1066 if (trajectory_constraints_)
1067 request.trajectory_constraints = *trajectory_constraints_;
1077 path_constraints_ = std::make_unique<moveit_msgs::msg::Constraints>(constraint);
1082 if (constraints_storage_)
1085 if (constraints_storage_->getConstraints(msg_m, constraint, robot_model_->getName(), opt_.
group_name))
1088 std::make_unique<moveit_msgs::msg::Constraints>(
static_cast<moveit_msgs::msg::Constraints
>(*msg_m));
1100 path_constraints_.reset();
1105 trajectory_constraints_ = std::make_unique<moveit_msgs::msg::TrajectoryConstraints>(constraint);
1110 trajectory_constraints_.reset();
1115 while (initializing_constraints_)
1117 std::chrono::duration<double> d(0.01);
1118 rclcpp::sleep_for(std::chrono::duration_cast<std::chrono::nanoseconds>(d), rclcpp::Context::SharedPtr(
nullptr));
1121 std::vector<std::string> c;
1122 if (constraints_storage_)
1123 constraints_storage_->getKnownConstraints(c, robot_model_->getName(), opt_.
group_name);
1130 if (path_constraints_)
1132 return *path_constraints_;
1136 return moveit_msgs::msg::Constraints();
1142 if (trajectory_constraints_)
1144 return *trajectory_constraints_;
1148 return moveit_msgs::msg::TrajectoryConstraints();
1154 initializing_constraints_ =
true;
1155 if (constraints_init_thread_)
1156 constraints_init_thread_->join();
1157 constraints_init_thread_ =
1158 std::make_unique<std::thread>([
this, host, port] { initializeConstraintsStorageThread(host, port); });
1161 void setWorkspace(
double minx,
double miny,
double minz,
double maxx,
double maxy,
double maxz)
1163 workspace_parameters_.header.frame_id =
getRobotModel()->getModelFrame();
1164 workspace_parameters_.header.stamp =
getClock()->now();
1165 workspace_parameters_.min_corner.x = minx;
1166 workspace_parameters_.min_corner.y = miny;
1167 workspace_parameters_.min_corner.z = minz;
1168 workspace_parameters_.max_corner.x = maxx;
1169 workspace_parameters_.max_corner.y = maxy;
1170 workspace_parameters_.max_corner.z = maxz;
1175 return node_->get_clock();
1179 void initializeConstraintsStorageThread(
const std::string& host,
unsigned int port)
1185 conn->setParams(host, port);
1186 if (conn->connect())
1188 constraints_storage_ = std::make_unique<moveit_warehouse::ConstraintsStorage>(conn);
1191 catch (std::exception& ex)
1193 RCLCPP_ERROR(logger_,
"%s", ex.what());
1195 initializing_constraints_ =
false;
1199 rclcpp::Node::SharedPtr node_;
1200 rclcpp::Logger logger_;
1201 rclcpp::CallbackGroup::SharedPtr callback_group_;
1202 rclcpp::executors::SingleThreadedExecutor callback_executor_;
1203 std::thread callback_thread_;
1204 std::shared_ptr<tf2_ros::Buffer> tf_buffer_;
1205 moveit::core::RobotModelConstPtr robot_model_;
1206 planning_scene_monitor::CurrentStateMonitorPtr current_state_monitor_;
1208 std::shared_ptr<rclcpp_action::Client<moveit_msgs::action::MoveGroup>> move_action_client_;
1211 std::shared_ptr<rclcpp_action::Client<moveit_msgs::action::ExecuteTrajectory>> execute_action_client_;
1214 moveit_msgs::msg::RobotState considered_start_state_;
1215 moveit_msgs::msg::WorkspaceParameters workspace_parameters_;
1216 double allowed_planning_time_;
1217 std::string planning_pipeline_id_;
1218 std::string planner_id_;
1219 unsigned int num_planning_attempts_;
1220 double max_velocity_scaling_factor_;
1221 double max_acceleration_scaling_factor_;
1222 double goal_joint_tolerance_;
1223 double goal_position_tolerance_;
1224 double goal_orientation_tolerance_;
1226 int32_t look_around_attempts_;
1228 int32_t replan_attempts_;
1229 double replan_delay_;
1232 moveit::core::RobotStatePtr joint_state_target_;
1237 std::map<std::string, std::vector<geometry_msgs::msg::PoseStamped>> pose_targets_;
1240 ActiveTargetType active_target_;
1241 std::unique_ptr<moveit_msgs::msg::Constraints> path_constraints_;
1242 std::unique_ptr<moveit_msgs::msg::TrajectoryConstraints> trajectory_constraints_;
1243 std::string end_effector_link_;
1244 std::string pose_reference_frame_;
1247 rclcpp::Publisher<std_msgs::msg::String>::SharedPtr trajectory_event_publisher_;
1248 rclcpp::Publisher<moveit_msgs::msg::AttachedCollisionObject>::SharedPtr attached_object_publisher_;
1249 rclcpp::Client<moveit_msgs::srv::QueryPlannerInterfaces>::SharedPtr query_service_;
1250 rclcpp::Client<moveit_msgs::srv::GetPlannerParams>::SharedPtr get_params_service_;
1251 rclcpp::Client<moveit_msgs::srv::SetPlannerParams>::SharedPtr set_params_service_;
1252 rclcpp::Client<moveit_msgs::srv::GetCartesianPath>::SharedPtr cartesian_path_service_;
1254 std::unique_ptr<moveit_warehouse::ConstraintsStorage> constraints_storage_;
1255 std::unique_ptr<std::thread> constraints_init_thread_;
1256 bool initializing_constraints_;
1260 const std::shared_ptr<tf2_ros::Buffer>& tf_buffer,
1261 const rclcpp::Duration& wait_for_servers)
1262 : logger_(
moveit::getLogger(
"moveit.ros.move_group_interface"))
1265 throw std::runtime_error(
"ROS does not seem to be running");
1271 const std::shared_ptr<tf2_ros::Buffer>& tf_buffer,
1272 const rclcpp::Duration& wait_for_servers)
1273 : logger_(
moveit::getLogger(
"moveit.ros.move_group_interface"))
1284 : remembered_joint_values_(std::move(other.remembered_joint_values_))
1285 , impl_(other.impl_)
1286 , logger_(std::move(other.logger_))
1288 other.impl_ =
nullptr;
1296 impl_ = other.impl_;
1297 logger_ = other.logger_;
1298 remembered_joint_values_ = std::move(other.remembered_joint_values_);
1299 other.impl_ =
nullptr;
1319 return impl_->
getTF();
1338 const std::string& group)
const
1344 const std::map<std::string, std::string>& params,
bool replace)
1406 return impl_->
move(
false);
1416 return impl_->
move(
true);
1420 const std::vector<std::string>& controllers)
1422 return impl_->
execute(
plan.trajectory,
false, controllers);
1426 const std::vector<std::string>& controllers)
1428 return impl_->
execute(trajectory,
false, controllers);
1433 return impl_->
execute(
plan.trajectory,
true, controllers);
1437 const std::vector<std::string>& controllers)
1439 return impl_->
execute(trajectory,
true, controllers);
1448 moveit_msgs::msg::RobotTrajectory& trajectory,
bool avoid_collisions,
1449 moveit_msgs::msg::MoveItErrorCodes* error_code)
1451 moveit_msgs::msg::Constraints path_constraints_tmp;
1452 return computeCartesianPath(waypoints, eef_step, trajectory, moveit_msgs::msg::Constraints(), avoid_collisions,
1457 moveit_msgs::msg::RobotTrajectory& trajectory,
1458 const moveit_msgs::msg::Constraints& path_constraints,
1459 bool avoid_collisions, moveit_msgs::msg::MoveItErrorCodes* error_code)
1463 return impl_->
computeCartesianPath(waypoints, eef_step, trajectory, path_constraints, avoid_collisions, *error_code);
1467 moveit_msgs::msg::MoveItErrorCodes err_tmp;
1468 err_tmp.val = moveit_msgs::msg::MoveItErrorCodes::SUCCESS;
1469 moveit_msgs::msg::MoveItErrorCodes& err = error_code ? *error_code : err_tmp;
1470 return impl_->
computeCartesianPath(waypoints, eef_step, trajectory, path_constraints, avoid_collisions, err);
1512 std::map<std::string, std::vector<double>>::const_iterator it = remembered_joint_values_.find(name);
1513 std::map<std::string, double> positions;
1515 if (it != remembered_joint_values_.cend())
1518 for (
size_t x = 0; x < names.size(); ++x)
1520 positions[names[x]] = it->second[x];
1527 RCLCPP_ERROR(logger_,
"The requested named target '%s' does not exist, returning empty positions.", name.c_str());
1535 std::map<std::string, std::vector<double>>::const_iterator it = remembered_joint_values_.find(name);
1536 if (it != remembered_joint_values_.end())
1547 RCLCPP_ERROR(logger_,
"The requested named target '%s' does not exist", name.c_str());
1560 if (joint_values.size() != n_group_joints)
1562 RCLCPP_DEBUG_STREAM(logger_,
"Provided joint value list has length " << joint_values.size() <<
" but group "
1564 <<
" has " << n_group_joints <<
" joints");
1575 for (
const auto& pair : variable_values)
1577 if (std::find(allowed.begin(), allowed.end(), pair.first) == allowed.end())
1579 RCLCPP_ERROR_STREAM(logger_,
"joint variable " << pair.first <<
" is not part of group "
1591 const std::vector<double>& variable_values)
1593 if (variable_names.size() != variable_values.size())
1595 RCLCPP_ERROR_STREAM(logger_,
"sizes of name and position arrays do not match");
1599 for (
const auto& variable_name : variable_names)
1601 if (std::find(allowed.begin(), allowed.end(), variable_name) == allowed.end())
1603 RCLCPP_ERROR_STREAM(logger_,
"joint variable " << variable_name <<
" is not part of group "
1623 std::vector<double> values(1, value);
1637 RCLCPP_ERROR_STREAM(logger_,
1648 const std::string& end_effector_link)
1654 const std::string& end_effector_link)
1656 return impl_->
setJointValueTarget(eef_pose.pose, end_effector_link, eef_pose.header.frame_id,
false);
1661 geometry_msgs::msg::Pose msg = tf2::toMsg(eef_pose);
1666 const std::string& end_effector_link)
1672 const std::string& end_effector_link)
1674 return impl_->
setJointValueTarget(eef_pose.pose, end_effector_link, eef_pose.header.frame_id,
true);
1678 const std::string& end_effector_link)
1680 geometry_msgs::msg::Pose msg = tf2::toMsg(eef_pose);
1728 std::vector<geometry_msgs::msg::PoseStamped> pose_msg(1);
1729 pose_msg[0].pose = tf2::toMsg(pose);
1731 pose_msg[0].header.stamp = impl_->
getClock()->now();
1737 std::vector<geometry_msgs::msg::PoseStamped> pose_msg(1);
1738 pose_msg[0].pose = target;
1740 pose_msg[0].header.stamp = impl_->
getClock()->now();
1745 const std::string& end_effector_link)
1747 std::vector<geometry_msgs::msg::PoseStamped> targets(1, target);
1753 std::vector<geometry_msgs::msg::PoseStamped> pose_out(target.size());
1754 rclcpp::Time tm = impl_->
getClock()->now();
1756 for (std::size_t i = 0; i < target.size(); ++i)
1758 pose_out[i].pose = tf2::toMsg(target[i]);
1759 pose_out[i].header.stamp = tm;
1760 pose_out[i].header.frame_id = frame_id;
1766 const std::string& end_effector_link)
1768 std::vector<geometry_msgs::msg::PoseStamped> target_stamped(target.size());
1769 rclcpp::Time tm = impl_->
getClock()->now();
1771 for (std::size_t i = 0; i < target.size(); ++i)
1773 target_stamped[i].pose = target[i];
1774 target_stamped[i].header.stamp = tm;
1775 target_stamped[i].header.frame_id = frame_id;
1781 const std::string& end_effector_link)
1785 RCLCPP_ERROR(logger_,
"No pose specified as goal target");
1800const std::vector<geometry_msgs::msg::PoseStamped>&
1808inline void transformPose(
const tf2_ros::Buffer& tf_buffer,
const std::string& desired_frame,
1809 geometry_msgs::msg::PoseStamped& target)
1811 if (desired_frame != target.header.frame_id)
1813 geometry_msgs::msg::PoseStamped target_in(target);
1814 tf_buffer.transform(target_in, target, desired_frame);
1816 target.header.stamp = rclcpp::Time(0);
1823 geometry_msgs::msg::PoseStamped target;
1831 target.pose.orientation.x = 0.0;
1832 target.pose.orientation.y = 0.0;
1833 target.pose.orientation.z = 0.0;
1834 target.pose.orientation.w = 1.0;
1838 target.pose.position.x = x;
1839 target.pose.position.y = y;
1840 target.pose.position.z = z;
1848 geometry_msgs::msg::PoseStamped target;
1856 target.pose.position.x = 0.0;
1857 target.pose.position.y = 0.0;
1858 target.pose.position.z = 0.0;
1863 target.pose.orientation = tf2::toMsg(q);
1870 const std::string& end_effector_link)
1872 geometry_msgs::msg::PoseStamped target;
1880 target.pose.position.x = 0.0;
1881 target.pose.position.y = 0.0;
1882 target.pose.position.z = 0.0;
1886 target.pose.orientation.x = x;
1887 target.pose.orientation.y = y;
1888 target.pose.orientation.z = z;
1889 target.pose.orientation.w = w;
1954 moveit::core::RobotStatePtr current_state;
1955 std::vector<double> values;
1957 current_state->copyJointGroupPositions(
getName(), values);
1963 std::vector<double> r;
1970 const std::string& eef = end_effector_link.empty() ?
getEndEffectorLink() : end_effector_link;
1971 Eigen::Isometry3d pose;
1975 RCLCPP_ERROR(logger_,
"No end-effector specified");
1979 moveit::core::RobotStatePtr current_state;
1985 pose = current_state->getGlobalLinkTransform(lm);
1988 geometry_msgs::msg::PoseStamped pose_msg;
1989 pose_msg.header.stamp = impl_->
getClock()->now();
1990 pose_msg.header.frame_id = impl_->
getRobotModel()->getModelFrame();
1991 pose_msg.pose = tf2::toMsg(pose);
1997 const std::string& eef = end_effector_link.empty() ?
getEndEffectorLink() : end_effector_link;
1998 Eigen::Isometry3d pose;
2002 RCLCPP_ERROR(logger_,
"No end-effector specified");
2006 moveit::core::RobotStatePtr current_state;
2011 pose = current_state->getGlobalLinkTransform(lm);
2014 geometry_msgs::msg::PoseStamped pose_msg;
2015 pose_msg.header.stamp = impl_->
getClock()->now();
2016 pose_msg.header.frame_id = impl_->
getRobotModel()->getModelFrame();
2017 pose_msg.pose = tf2::toMsg(pose);
2023 std::vector<double> result;
2024 const std::string& eef = end_effector_link.empty() ?
getEndEffectorLink() : end_effector_link;
2027 RCLCPP_ERROR(logger_,
"No end-effector specified");
2031 moveit::core::RobotStatePtr current_state;
2038 geometry_msgs::msg::TransformStamped tfs = tf2::eigenToTransform(current_state->getGlobalLinkTransform(lm));
2039 double pitch, roll, yaw;
2040 tf2::getEulerYPR<geometry_msgs::msg::Quaternion>(tfs.transform.rotation, yaw, pitch, roll);
2067 moveit::core::RobotStatePtr current_state;
2069 return current_state;
2074 remembered_joint_values_[name] = values;
2079 remembered_joint_values_.erase(name);
2084 impl_->can_look_ = flag;
2085 RCLCPP_DEBUG(logger_,
"Looking around: %s", flag ?
"yes" :
"no");
2092 RCLCPP_ERROR(logger_,
"Tried to set negative number of look-around attempts");
2096 RCLCPP_DEBUG_STREAM(logger_,
"Look around attempts: " << attempts);
2097 impl_->look_around_attempts_ = attempts;
2103 impl_->can_replan_ = flag;
2104 RCLCPP_DEBUG(logger_,
"Replanning: %s", flag ?
"yes" :
"no");
2111 RCLCPP_ERROR(logger_,
"Tried to set negative number of replan attempts");
2115 RCLCPP_DEBUG_STREAM(logger_,
"Replan Attempts: " << attempts);
2116 impl_->replan_attempts_ = attempts;
2124 RCLCPP_ERROR(logger_,
"Tried to set negative replan delay");
2128 RCLCPP_DEBUG_STREAM(logger_,
"Replan Delay: " << delay);
2129 impl_->replan_delay_ = delay;
2180 impl_->
setWorkspace(minx, miny, minz, maxx, maxy, maxz);
2197 return impl_->node_;
2212 return attachObject(
object, link, std::vector<std::string>());
2216 const std::vector<std::string>& touch_links)
bool isChain() const
Check if this group is a linear chain.
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...
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...
void getVariableRandomPositions(random_numbers::RandomNumberGenerator &rng, double *values) const
Compute random values for the state of the joint group.
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 std::string & getName() const
Get the name of the joint group.
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...
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 > & getLinkModelNames() const
Get the names of the links that are part of this joint group.
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)
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)
rclcpp_action::Client< moveit_msgs::action::MoveGroup > & getMoveGroupClient() const
bool startStateMonitor(double wait)
void setPlanningPipelineId(const std::string &pipeline_id)
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)
void constructGoal(moveit_msgs::action::MoveGroup::Goal &goal) const
double getPlanningTime() const
void constructRobotState(moveit_msgs::msg::RobotState &state) const
std::string getDefaultPlannerId(const std::string &group) const
bool setPathConstraints(const std::string &constraint)
void setStartState(const moveit::core::RobotState &start_state)
const std::string & getEndEffector() const
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)
bool getCurrentState(moveit::core::RobotStatePtr ¤t_state, double wait_seconds=1.0)
const std::string & getPoseReferenceFrame() const
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)
const std::string & getEndEffectorLink() const
std::map< std::string, std::string > getPlannerParams(const std::string &planner_id, const std::string &group="")
void initializeConstraintsStorage(const std::string &host, unsigned int port)
void setPlannerId(const std::string &planner_id)
double getGoalOrientationTolerance() const
moveit_msgs::msg::Constraints getPathConstraints() const
void setTargetType(ActiveTargetType type)
void setPathConstraints(const moveit_msgs::msg::Constraints &constraint)
ActiveTargetType getTargetType() const
double computeCartesianPath(const std::vector< geometry_msgs::msg::Pose > &waypoints, double step, moveit_msgs::msg::RobotTrajectory &msg, const moveit_msgs::msg::Constraints &path_constraints, bool avoid_collisions, moveit_msgs::msg::MoveItErrorCodes &error_code)
void setMaxVelocityScalingFactor(double value)
const moveit::core::RobotState & getTargetRobotState() const
void setNumPlanningAttempts(unsigned int num_planning_attempts)
const std::string & getPlannerId() const
double getMaxVelocityScalingFactor() const
std::vector< std::string > getKnownConstraints() const
void setGoalJointTolerance(double tolerance)
void setTrajectoryConstraints(const moveit_msgs::msg::TrajectoryConstraints &constraint)
const std::shared_ptr< tf2_ros::Buffer > & getTF() const
moveit::core::MoveItErrorCode move(bool wait)
void constructMotionPlanRequest(moveit_msgs::msg::MotionPlanRequest &request) const
void setPlanningTime(double seconds)
moveit_msgs::msg::TrajectoryConstraints getTrajectoryConstraints() const
const moveit::core::JointModelGroup * getJointModelGroup() const
double getMaxAccelerationScalingFactor() 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)
const geometry_msgs::msg::PoseStamped & getPoseTarget(const std::string &end_effector_link) const
void clearTrajectoryConstraints()
moveit::core::MoveItErrorCode execute(const moveit_msgs::msg::RobotTrajectory &trajectory, bool wait, const std::vector< std::string > &controllers=std::vector< std::string >())
bool getInterfaceDescription(moveit_msgs::msg::PlannerInterfaceDescription &desc)
const Options & getOptions() const
void setStartState(const moveit_msgs::msg::RobotState &start_state)
const moveit::core::RobotModelConstPtr & getRobotModel() const
const std::vector< geometry_msgs::msg::PoseStamped > & getPoseTargets(const std::string &end_effector_link) const
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()
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::RobotState & getTargetRobotState()
moveit::core::MoveItErrorCode plan(Plan &plan)
const std::string & getPlanningPipelineId() 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.
std::vector< double > getRandomJointValues() const
Get random joint values for the joints planned for by this instance (see getJoints())
double computeCartesianPath(const std::vector< geometry_msgs::msg::Pose > &waypoints, double eef_step, double, 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...
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)
MoveGroupInterface & operator=(const MoveGroupInterface &)=delete
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).
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="")
Given the name of an object in the planning scene, make the object attached to a link of the robot....
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 ...
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.
moveit::core::MoveItErrorCode execute(const Plan &plan, const std::vector< std::string > &controllers=std::vector< std::string >())
Given a plan, execute it while waiting for completion.
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()
const rclcpp::Node::SharedPtr & getNode() const
Get the ROS node handle of this instance operates on.
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.
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.
void getJointValueTarget(std::vector< double > &group_variable_values) const
Get the current joint state goal in a form compatible to setJointValueTarget()
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.
moveit::core::MoveItErrorCode asyncExecute(const Plan &plan, const std::vector< std::string > &controllers=std::vector< std::string >())
Given a plan, execute it without waiting for completion.
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::shared_ptr< tf2_ros::Buffer > & getTF() const
Get the tf2_ros::Buffer.
const std::vector< geometry_msgs::msg::PoseStamped > & getPoseTargets(const std::string &end_effector_link="") const
double getMaxVelocityScalingFactor() const
Get the max velocity scaling factor set by setMaxVelocityScalingFactor().
moveit_msgs::msg::TrajectoryConstraints getTrajectoryConstraints() const
const std::vector< std::string > & getLinkNames() const
Get vector of names of links available in move group.
double getMaxAccelerationScalingFactor() const
Get the max acceleration scaling factor set by setMaxAccelerationScalingFactor().
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.
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 ...
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 constructRobotState(moveit_msgs::msg::RobotState &state)
Build a RobotState message for use with plan() or computeCartesianPath() If the move_group has a cust...
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()
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.
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 move_group_namespace
The namespace for the move group node.
std::string robot_description
The robot description parameter name (if different from default)
moveit::core::RobotModelConstPtr robot_model
Optionally, an instance of the RobotModel to use can be also specified.
std::string group_name
The group to construct the class instance for.
The representation of a motion plan (as ROS messages)