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>
63 #include <tf2/utils.h>
64 #include <tf2_eigen/tf2_eigen.hpp>
65 #include <tf2_ros/transform_listener.h>
75 const rclcpp::Logger
LOGGER = rclcpp::get_logger(
"move_group_interface");
94 const std::shared_ptr<tf2_ros::Buffer>& tf_buffer,
const rclcpp::Duration& wait_for_servers)
95 : opt_(
opt), node_(node), tf_buffer_(tf_buffer)
99 callback_group_ = node_->create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive,
101 callback_executor_.add_callback_group(callback_group_, node->get_node_base_interface());
102 callback_thread_ = std::thread([
this]() { callback_executor_.spin(); });
107 std::string error =
"Unable to construct robot model. Please make sure all needed information is on the "
109 RCLCPP_FATAL_STREAM(
LOGGER, error);
110 throw std::runtime_error(error);
115 std::string error =
"Group '" +
opt.group_name_ +
"' was not found.";
116 RCLCPP_FATAL_STREAM(
LOGGER, error);
117 throw std::runtime_error(error);
123 joint_state_target_ = std::make_shared<moveit::core::RobotState>(
getRobotModel());
124 joint_state_target_->setToDefaultValues();
125 active_target_ =
JOINT;
127 look_around_attempts_ = 0;
130 replan_attempts_ = 1;
131 goal_joint_tolerance_ = 1e-4;
132 goal_position_tolerance_ = 1e-4;
133 goal_orientation_tolerance_ = 1e-3;
134 allowed_planning_time_ = 5.0;
135 num_planning_attempts_ = 1;
136 node_->get_parameter_or<
double>(
"robot_description_planning.default_velocity_scaling_factor",
137 max_velocity_scaling_factor_, 0.1);
138 node_->get_parameter_or<
double>(
"robot_description_planning.default_acceleration_scaling_factor",
139 max_acceleration_scaling_factor_, 0.1);
140 initializing_constraints_ =
false;
142 if (joint_model_group_->
isChain())
146 trajectory_event_publisher_ = node_->create_publisher<std_msgs::msg::String>(
150 attached_object_publisher_ = node_->create_publisher<moveit_msgs::msg::AttachedCollisionObject>(
157 move_action_client_ = rclcpp_action::create_client<moveit_msgs::action::MoveGroup>(
159 move_action_client_->wait_for_action_server(wait_for_servers.to_chrono<std::chrono::duration<double>>());
160 execute_action_client_ = rclcpp_action::create_client<moveit_msgs::action::ExecuteTrajectory>(
162 execute_action_client_->wait_for_action_server(wait_for_servers.to_chrono<std::chrono::duration<double>>());
164 query_service_ = node_->create_client<moveit_msgs::srv::QueryPlannerInterfaces>(
166 rmw_qos_profile_services_default, callback_group_);
167 get_params_service_ = node_->create_client<moveit_msgs::srv::GetPlannerParams>(
169 rmw_qos_profile_services_default, callback_group_);
170 set_params_service_ = node_->create_client<moveit_msgs::srv::SetPlannerParams>(
172 rmw_qos_profile_services_default, callback_group_);
174 cartesian_path_service_ = node_->create_client<moveit_msgs::srv::GetCartesianPath>(
176 rmw_qos_profile_services_default, callback_group_);
180 RCLCPP_INFO_STREAM(
LOGGER,
"Ready to take commands for planning group " <<
opt.group_name_ <<
".");
185 if (constraints_init_thread_)
186 constraints_init_thread_->join();
188 if (callback_executor_.is_spinning())
189 callback_executor_.cancel();
191 if (callback_thread_.joinable())
192 callback_thread_.join();
195 const std::shared_ptr<tf2_ros::Buffer>&
getTF()
const
212 return joint_model_group_;
217 return *move_action_client_;
222 auto req = std::make_shared<moveit_msgs::srv::QueryPlannerInterfaces::Request>();
223 auto future_response = query_service_->async_send_request(req);
225 if (future_response.valid())
227 const auto& response = future_response.get();
228 if (!response->planner_interfaces.empty())
230 desc = response->planner_interfaces.front();
239 auto req = std::make_shared<moveit_msgs::srv::QueryPlannerInterfaces::Request>();
240 auto future_response = query_service_->async_send_request(req);
241 if (future_response.valid())
243 const auto& response = future_response.get();
244 if (!response->planner_interfaces.empty())
246 desc = response->planner_interfaces;
255 auto req = std::make_shared<moveit_msgs::srv::GetPlannerParams::Request>();
256 moveit_msgs::srv::GetPlannerParams::Response::SharedPtr response;
257 req->planner_config = planner_id;
259 std::map<std::string, std::string> result;
261 auto future_response = get_params_service_->async_send_request(req);
262 if (future_response.valid())
264 response = future_response.get();
265 for (
unsigned int i = 0, end = response->params.keys.size(); i < end; ++i)
266 result[response->params.keys[i]] = response->params.values[i];
272 const std::map<std::string, std::string>& params,
bool replace =
false)
274 auto req = std::make_shared<moveit_msgs::srv::SetPlannerParams::Request>();
275 req->planner_config = planner_id;
277 req->replace = replace;
278 for (
const std::pair<const std::string, std::string>& param : params)
280 req->params.keys.push_back(param.first);
281 req->params.values.push_back(param.second);
283 set_params_service_->async_send_request(req);
288 std::string default_planning_pipeline;
289 node_->get_parameter(
"move_group.default_planning_pipeline", default_planning_pipeline);
290 return default_planning_pipeline;
295 if (pipeline_id != planning_pipeline_id_)
297 planning_pipeline_id_ = pipeline_id;
306 return planning_pipeline_id_;
313 if (!planning_pipeline_id_.empty())
314 pipeline_id = planning_pipeline_id_;
316 std::stringstream param_name;
317 param_name <<
"move_group";
318 if (!pipeline_id.empty())
319 param_name <<
"/planning_pipelines/" << pipeline_id;
321 param_name <<
"." <<
group;
322 param_name <<
".default_planner_config";
324 std::string default_planner_config;
325 node_->get_parameter(param_name.str(), default_planner_config);
326 return default_planner_config;
331 planner_id_ = planner_id;
341 num_planning_attempts_ = num_planning_attempts;
351 setMaxScalingFactor(max_acceleration_scaling_factor_, value,
"acceleration_scaling_factor", 0.1);
354 void setMaxScalingFactor(
double& variable,
const double target_value,
const char* factor_name,
double fallback_value)
356 if (target_value > 1.0)
358 RCLCPP_WARN(rclcpp::get_logger(
"move_group_interface"),
"Limiting max_%s (%.2f) to 1.0.", factor_name,
362 else if (target_value <= 0.0)
364 node_->get_parameter_or<
double>(std::string(
"robot_description_planning.default_") + factor_name, variable,
366 if (target_value < 0.0)
368 RCLCPP_WARN(rclcpp::get_logger(
"move_group_interface"),
"max_%s < 0.0! Setting to default: %.2f.", factor_name,
374 variable = target_value;
380 return *joint_state_target_;
385 return *joint_state_target_;
390 considered_start_state_ = start_state;
395 considered_start_state_ = moveit_msgs::msg::RobotState();
402 considered_start_state_ = moveit_msgs::msg::RobotState();
403 considered_start_state_.is_diff =
true;
408 moveit::core::RobotStatePtr s;
415 const std::string& frame,
bool approx)
417 const std::string& eef = end_effector_link.empty() ?
getEndEffectorLink() : end_effector_link;
450 tf2::fromMsg(eef_pose,
p);
456 RCLCPP_ERROR(
LOGGER,
"Unable to transform from frame '%s' to frame '%s'", frame.c_str(),
468 end_effector_link_ = end_effector;
473 pose_targets_.erase(end_effector_link);
478 pose_targets_.clear();
483 return end_effector_link_;
488 if (!end_effector_link_.empty())
490 const std::vector<std::string>& possible_eefs =
492 for (
const std::string& possible_eef : possible_eefs)
496 static std::string empty;
500 bool setPoseTargets(
const std::vector<geometry_msgs::msg::PoseStamped>& poses,
const std::string& end_effector_link)
502 const std::string& eef = end_effector_link.empty() ? end_effector_link_ : end_effector_link;
505 RCLCPP_ERROR(
LOGGER,
"No end-effector to set the pose for");
510 pose_targets_[eef] = poses;
512 std::vector<geometry_msgs::msg::PoseStamped>& stored_poses = pose_targets_[eef];
513 for (geometry_msgs::msg::PoseStamped& stored_pose : stored_poses)
514 stored_pose.header.stamp = rclcpp::Time(0);
521 const std::string& eef = end_effector_link.empty() ? end_effector_link_ : end_effector_link;
522 return pose_targets_.find(eef) != pose_targets_.end();
525 const geometry_msgs::msg::PoseStamped&
getPoseTarget(
const std::string& end_effector_link)
const
527 const std::string& eef = end_effector_link.empty() ? end_effector_link_ : end_effector_link;
530 std::map<std::string, std::vector<geometry_msgs::msg::PoseStamped>>::const_iterator jt = pose_targets_.find(eef);
531 if (jt != pose_targets_.end())
532 if (!jt->second.empty())
533 return jt->second.at(0);
536 static const geometry_msgs::msg::PoseStamped UNKNOWN;
537 RCLCPP_ERROR(
LOGGER,
"Pose for end-effector '%s' not known.", eef.c_str());
541 const std::vector<geometry_msgs::msg::PoseStamped>&
getPoseTargets(
const std::string& end_effector_link)
const
543 const std::string& eef = end_effector_link.empty() ? end_effector_link_ : end_effector_link;
545 std::map<std::string, std::vector<geometry_msgs::msg::PoseStamped>>::const_iterator jt = pose_targets_.find(eef);
546 if (jt != pose_targets_.end())
547 if (!jt->second.empty())
551 static const std::vector<geometry_msgs::msg::PoseStamped> EMPTY;
552 RCLCPP_ERROR(
LOGGER,
"Poses for end-effector '%s' are not known.", eef.c_str());
558 pose_reference_frame_ = pose_reference_frame;
563 support_surface_ = support_surface;
568 return pose_reference_frame_;
573 active_target_ =
type;
578 return active_target_;
583 if (!current_state_monitor_)
585 RCLCPP_ERROR(
LOGGER,
"Unable to monitor current robot state");
590 if (!current_state_monitor_->isActive())
591 current_state_monitor_->startStateMonitor();
593 current_state_monitor_->waitForCompleteState(opt_.
group_name_, wait);
597 bool getCurrentState(moveit::core::RobotStatePtr& current_state,
double wait_seconds = 1.0)
599 if (!current_state_monitor_)
601 RCLCPP_ERROR(
LOGGER,
"Unable to get current robot state");
606 if (!current_state_monitor_->isActive())
607 current_state_monitor_->startStateMonitor();
609 if (!current_state_monitor_->waitForCurrentState(node_->now(), wait_seconds))
611 RCLCPP_ERROR(
LOGGER,
"Failed to fetch current robot state");
615 current_state = current_state_monitor_->getCurrentState();
743 if (!move_action_client_ || !move_action_client_->action_server_is_ready())
745 RCLCPP_INFO_STREAM(
LOGGER,
"MoveGroup action client/server not ready");
746 return moveit::core::MoveItErrorCode::FAILURE;
748 RCLCPP_INFO_STREAM(
LOGGER,
"MoveGroup action client/server ready");
750 moveit_msgs::action::MoveGroup::Goal goal;
752 goal.planning_options.plan_only =
true;
753 goal.planning_options.look_around =
false;
754 goal.planning_options.replan =
false;
755 goal.planning_options.planning_scene_diff.is_diff =
true;
756 goal.planning_options.planning_scene_diff.robot_state.is_diff =
true;
759 rclcpp_action::ResultCode code = rclcpp_action::ResultCode::UNKNOWN;
760 std::shared_ptr<moveit_msgs::action::MoveGroup::Result> res;
761 auto send_goal_opts = rclcpp_action::Client<moveit_msgs::action::MoveGroup>::SendGoalOptions();
763 send_goal_opts.goal_response_callback =
764 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::MoveGroup>::SharedPtr& goal_handle) {
768 RCLCPP_INFO(
LOGGER,
"Planning request rejected");
771 RCLCPP_INFO(
LOGGER,
"Planning request accepted");
773 send_goal_opts.result_callback =
774 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::MoveGroup>::WrappedResult& result) {
781 case rclcpp_action::ResultCode::SUCCEEDED:
782 RCLCPP_INFO(
LOGGER,
"Planning request complete!");
784 case rclcpp_action::ResultCode::ABORTED:
785 RCLCPP_INFO(
LOGGER,
"Planning request aborted");
787 case rclcpp_action::ResultCode::CANCELED:
788 RCLCPP_INFO(
LOGGER,
"Planning request canceled");
791 RCLCPP_INFO(
LOGGER,
"Planning request unknown result code");
796 auto goal_handle_future = move_action_client_->async_send_goal(goal, send_goal_opts);
801 std::this_thread::sleep_for(std::chrono::milliseconds(1));
804 if (code != rclcpp_action::ResultCode::SUCCEEDED)
806 RCLCPP_ERROR_STREAM(
LOGGER,
"MoveGroupInterface::plan() failed or timeout reached");
807 return res->error_code;
810 plan.trajectory_ = res->planned_trajectory;
811 plan.start_state_ = res->trajectory_start;
812 plan.planning_time_ = res->planning_time;
813 RCLCPP_INFO(
LOGGER,
"time taken to generate plan: %g seconds",
plan.planning_time_);
815 return res->error_code;
820 if (!move_action_client_ || !move_action_client_->action_server_is_ready())
822 RCLCPP_INFO_STREAM(
LOGGER,
"MoveGroup action client/server not ready");
823 return moveit::core::MoveItErrorCode::FAILURE;
826 moveit_msgs::action::MoveGroup::Goal goal;
828 goal.planning_options.plan_only =
false;
829 goal.planning_options.look_around = can_look_;
830 goal.planning_options.replan = can_replan_;
831 goal.planning_options.replan_delay = replan_delay_;
832 goal.planning_options.planning_scene_diff.is_diff =
true;
833 goal.planning_options.planning_scene_diff.robot_state.is_diff =
true;
836 rclcpp_action::ResultCode code = rclcpp_action::ResultCode::UNKNOWN;
837 std::shared_ptr<moveit_msgs::action::MoveGroup_Result> res;
838 auto send_goal_opts = rclcpp_action::Client<moveit_msgs::action::MoveGroup>::SendGoalOptions();
840 send_goal_opts.goal_response_callback =
841 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::MoveGroup>::SharedPtr& goal_handle) {
845 RCLCPP_INFO(
LOGGER,
"Plan and Execute request rejected");
848 RCLCPP_INFO(
LOGGER,
"Plan and Execute request accepted");
850 send_goal_opts.result_callback =
851 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::MoveGroup>::WrappedResult& result) {
858 case rclcpp_action::ResultCode::SUCCEEDED:
859 RCLCPP_INFO(
LOGGER,
"Plan and Execute request complete!");
861 case rclcpp_action::ResultCode::ABORTED:
862 RCLCPP_INFO(
LOGGER,
"Plan and Execute request aborted");
864 case rclcpp_action::ResultCode::CANCELED:
865 RCLCPP_INFO(
LOGGER,
"Plan and Execute request canceled");
868 RCLCPP_INFO(
LOGGER,
"Plan and Execute request unknown result code");
872 auto goal_handle_future = move_action_client_->async_send_goal(goal, send_goal_opts);
874 return moveit::core::MoveItErrorCode::SUCCESS;
879 std::this_thread::sleep_for(std::chrono::milliseconds(1));
882 if (code != rclcpp_action::ResultCode::SUCCEEDED)
884 RCLCPP_ERROR_STREAM(
LOGGER,
"MoveGroupInterface::move() failed or timeout reached");
886 return res->error_code;
891 if (!execute_action_client_ || !execute_action_client_->action_server_is_ready())
893 RCLCPP_INFO_STREAM(
LOGGER,
"execute_action_client_ client/server not ready");
894 return moveit::core::MoveItErrorCode::FAILURE;
898 rclcpp_action::ResultCode code = rclcpp_action::ResultCode::UNKNOWN;
899 std::shared_ptr<moveit_msgs::action::ExecuteTrajectory_Result> res;
900 auto send_goal_opts = rclcpp_action::Client<moveit_msgs::action::ExecuteTrajectory>::SendGoalOptions();
902 send_goal_opts.goal_response_callback =
903 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::ExecuteTrajectory>::SharedPtr& goal_handle) {
907 RCLCPP_INFO(
LOGGER,
"Execute request rejected");
910 RCLCPP_INFO(
LOGGER,
"Execute request accepted");
912 send_goal_opts.result_callback =
913 [&](
const rclcpp_action::ClientGoalHandle<moveit_msgs::action::ExecuteTrajectory>::WrappedResult& result) {
920 case rclcpp_action::ResultCode::SUCCEEDED:
921 RCLCPP_INFO(
LOGGER,
"Execute request success!");
923 case rclcpp_action::ResultCode::ABORTED:
924 RCLCPP_INFO(
LOGGER,
"Execute request aborted");
926 case rclcpp_action::ResultCode::CANCELED:
927 RCLCPP_INFO(
LOGGER,
"Execute request canceled");
930 RCLCPP_INFO(
LOGGER,
"Execute request unknown result code");
935 moveit_msgs::action::ExecuteTrajectory::Goal goal;
936 goal.trajectory = trajectory;
938 auto goal_handle_future = execute_action_client_->async_send_goal(goal, send_goal_opts);
940 return moveit::core::MoveItErrorCode::SUCCESS;
945 std::this_thread::sleep_for(std::chrono::milliseconds(1));
948 if (code != rclcpp_action::ResultCode::SUCCEEDED)
950 RCLCPP_ERROR_STREAM(
LOGGER,
"MoveGroupInterface::execute() failed or timeout reached");
952 return res->error_code;
956 double jump_threshold, moveit_msgs::msg::RobotTrajectory& msg,
957 const moveit_msgs::msg::Constraints&
path_constraints,
bool avoid_collisions,
958 moveit_msgs::msg::MoveItErrorCodes& error_code)
960 auto req = std::make_shared<moveit_msgs::srv::GetCartesianPath::Request>();
961 moveit_msgs::srv::GetCartesianPath::Response::SharedPtr response;
963 req->start_state = considered_start_state_;
966 req->header.stamp =
getClock()->now();
968 req->max_step = step;
969 req->jump_threshold = jump_threshold;
971 req->avoid_collisions = avoid_collisions;
974 auto future_response = cartesian_path_service_->async_send_request(req);
975 if (future_response.valid())
977 response = future_response.get();
978 error_code = response->error_code;
979 if (response->error_code.val == moveit_msgs::msg::MoveItErrorCodes::SUCCESS)
981 msg = response->solution;
982 return response->fraction;
989 error_code.val = error_code.FAILURE;
996 if (trajectory_event_publisher_)
998 std_msgs::msg::String event;
1000 trajectory_event_publisher_->publish(event);
1004 bool attachObject(
const std::string&
object,
const std::string& link,
const std::vector<std::string>& touch_links)
1009 const std::vector<std::string>& links = joint_model_group_->
getLinkModelNames();
1015 RCLCPP_ERROR(
LOGGER,
"No known link to attach object '%s' to",
object.c_str());
1018 moveit_msgs::msg::AttachedCollisionObject aco;
1019 aco.object.id = object;
1020 aco.link_name.swap(l);
1021 if (touch_links.empty())
1022 aco.touch_links.push_back(aco.link_name);
1024 aco.touch_links = touch_links;
1025 aco.object.operation = moveit_msgs::msg::CollisionObject::ADD;
1026 attached_object_publisher_->publish(aco);
1032 moveit_msgs::msg::AttachedCollisionObject aco;
1035 aco.link_name =
name;
1037 aco.object.id =
name;
1038 aco.object.operation = moveit_msgs::msg::CollisionObject::REMOVE;
1039 if (aco.link_name.empty() && aco.object.id.empty())
1042 const std::vector<std::string>& lnames = joint_model_group_->
getLinkModelNames();
1043 for (
const std::string& lname : lnames)
1045 aco.link_name = lname;
1046 attached_object_publisher_->publish(aco);
1051 attached_object_publisher_->publish(aco);
1058 return goal_position_tolerance_;
1063 return goal_orientation_tolerance_;
1068 return goal_joint_tolerance_;
1073 goal_joint_tolerance_ = tolerance;
1078 goal_position_tolerance_ = tolerance;
1083 goal_orientation_tolerance_ = tolerance;
1089 allowed_planning_time_ = seconds;
1094 return allowed_planning_time_;
1099 state = considered_start_state_;
1105 request.num_planning_attempts = num_planning_attempts_;
1106 request.max_velocity_scaling_factor = max_velocity_scaling_factor_;
1107 request.max_acceleration_scaling_factor = max_acceleration_scaling_factor_;
1108 request.allowed_planning_time = allowed_planning_time_;
1109 request.pipeline_id = planning_pipeline_id_;
1110 request.planner_id = planner_id_;
1111 request.workspace_parameters = workspace_parameters_;
1112 request.start_state = considered_start_state_;
1114 if (active_target_ ==
JOINT)
1116 request.goal_constraints.resize(1);
1120 else if (active_target_ == POSE || active_target_ ==
POSITION || active_target_ ==
ORIENTATION)
1123 std::size_t goal_count = 0;
1124 for (
const auto& pose_target : pose_targets_)
1125 goal_count = std::max(goal_count, pose_target.second.size());
1131 request.goal_constraints.resize(goal_count);
1133 for (
const auto& pose_target : pose_targets_)
1135 for (std::size_t i = 0; i < pose_target.second.size(); ++i)
1138 pose_target.first, pose_target.second[i], goal_position_tolerance_, goal_orientation_tolerance_);
1140 c.position_constraints.clear();
1142 c.orientation_constraints.clear();
1148 RCLCPP_ERROR(
LOGGER,
"Unable to construct MotionPlanRequest representation");
1150 if (path_constraints_)
1151 request.path_constraints = *path_constraints_;
1152 if (trajectory_constraints_)
1153 request.trajectory_constraints = *trajectory_constraints_;
1218 path_constraints_ = std::make_unique<moveit_msgs::msg::Constraints>(constraint);
1223 if (constraints_storage_)
1226 if (constraints_storage_->getConstraints(msg_m, constraint, robot_model_->getName(), opt_.
group_name_))
1229 std::make_unique<moveit_msgs::msg::Constraints>(
static_cast<moveit_msgs::msg::Constraints
>(*msg_m));
1241 path_constraints_.reset();
1246 trajectory_constraints_ = std::make_unique<moveit_msgs::msg::TrajectoryConstraints>(constraint);
1251 trajectory_constraints_.reset();
1256 while (initializing_constraints_)
1258 std::chrono::duration<double>
d(0.01);
1259 rclcpp::sleep_for(std::chrono::duration_cast<std::chrono::nanoseconds>(
d), rclcpp::Context::SharedPtr(
nullptr));
1262 std::vector<std::string>
c;
1263 if (constraints_storage_)
1264 constraints_storage_->getKnownConstraints(
c, robot_model_->getName(), opt_.
group_name_);
1271 if (path_constraints_)
1272 return *path_constraints_;
1274 return moveit_msgs::msg::Constraints();
1279 if (trajectory_constraints_)
1280 return *trajectory_constraints_;
1282 return moveit_msgs::msg::TrajectoryConstraints();
1287 initializing_constraints_ =
true;
1288 if (constraints_init_thread_)
1289 constraints_init_thread_->join();
1290 constraints_init_thread_ =
1291 std::make_unique<std::thread>([
this, host, port] { initializeConstraintsStorageThread(host, port); });
1294 void setWorkspace(
double minx,
double miny,
double minz,
double maxx,
double maxy,
double maxz)
1296 workspace_parameters_.header.frame_id =
getRobotModel()->getModelFrame();
1297 workspace_parameters_.header.stamp =
getClock()->now();
1298 workspace_parameters_.min_corner.x = minx;
1299 workspace_parameters_.min_corner.y = miny;
1300 workspace_parameters_.min_corner.z = minz;
1301 workspace_parameters_.max_corner.x = maxx;
1302 workspace_parameters_.max_corner.y = maxy;
1303 workspace_parameters_.max_corner.z = maxz;
1308 return node_->get_clock();
1312 void initializeConstraintsStorageThread(
const std::string& host,
unsigned int port)
1318 conn->setParams(host, port);
1319 if (conn->connect())
1321 constraints_storage_ = std::make_unique<moveit_warehouse::ConstraintsStorage>(conn);
1324 catch (std::exception& ex)
1326 RCLCPP_ERROR(
LOGGER,
"%s", ex.what());
1328 initializing_constraints_ =
false;
1332 rclcpp::Node::SharedPtr node_;
1333 rclcpp::CallbackGroup::SharedPtr callback_group_;
1334 rclcpp::executors::SingleThreadedExecutor callback_executor_;
1335 std::thread callback_thread_;
1336 std::shared_ptr<tf2_ros::Buffer> tf_buffer_;
1337 moveit::core::RobotModelConstPtr robot_model_;
1338 planning_scene_monitor::CurrentStateMonitorPtr current_state_monitor_;
1340 std::shared_ptr<rclcpp_action::Client<moveit_msgs::action::MoveGroup>> move_action_client_;
1343 std::shared_ptr<rclcpp_action::Client<moveit_msgs::action::ExecuteTrajectory>> execute_action_client_;
1346 moveit_msgs::msg::RobotState considered_start_state_;
1347 moveit_msgs::msg::WorkspaceParameters workspace_parameters_;
1348 double allowed_planning_time_;
1349 std::string planning_pipeline_id_;
1350 std::string planner_id_;
1351 unsigned int num_planning_attempts_;
1352 double max_velocity_scaling_factor_;
1353 double max_acceleration_scaling_factor_;
1354 double goal_joint_tolerance_;
1355 double goal_position_tolerance_;
1356 double goal_orientation_tolerance_;
1358 int32_t look_around_attempts_;
1360 int32_t replan_attempts_;
1361 double replan_delay_;
1364 moveit::core::RobotStatePtr joint_state_target_;
1369 std::map<std::string, std::vector<geometry_msgs::msg::PoseStamped>> pose_targets_;
1372 ActiveTargetType active_target_;
1373 std::unique_ptr<moveit_msgs::msg::Constraints> path_constraints_;
1374 std::unique_ptr<moveit_msgs::msg::TrajectoryConstraints> trajectory_constraints_;
1375 std::string end_effector_link_;
1376 std::string pose_reference_frame_;
1377 std::string support_surface_;
1380 rclcpp::Publisher<std_msgs::msg::String>::SharedPtr trajectory_event_publisher_;
1381 rclcpp::Publisher<moveit_msgs::msg::AttachedCollisionObject>::SharedPtr attached_object_publisher_;
1382 rclcpp::Client<moveit_msgs::srv::QueryPlannerInterfaces>::SharedPtr query_service_;
1383 rclcpp::Client<moveit_msgs::srv::GetPlannerParams>::SharedPtr get_params_service_;
1384 rclcpp::Client<moveit_msgs::srv::SetPlannerParams>::SharedPtr set_params_service_;
1385 rclcpp::Client<moveit_msgs::srv::GetCartesianPath>::SharedPtr cartesian_path_service_;
1387 std::unique_ptr<moveit_warehouse::ConstraintsStorage> constraints_storage_;
1388 std::unique_ptr<std::thread> constraints_init_thread_;
1389 bool initializing_constraints_;
1393 const std::shared_ptr<tf2_ros::Buffer>& tf_buffer,
1394 const rclcpp::Duration& wait_for_servers)
1397 throw std::runtime_error(
"ROS does not seem to be running");
1403 const std::shared_ptr<tf2_ros::Buffer>& tf_buffer,
1404 const rclcpp::Duration& wait_for_servers)
1415 : remembered_joint_values_(std::move(other.remembered_joint_values_)), impl_(other.impl_)
1417 other.impl_ =
nullptr;
1425 impl_ = other.impl_;
1426 remembered_joint_values_ = std::move(other.remembered_joint_values_);
1427 other.impl_ =
nullptr;
1461 const std::string&
group)
const
1467 const std::map<std::string, std::string>& params,
bool replace)
1519 return impl_->
move(
false);
1529 return impl_->
move(
true);
1539 return impl_->
execute(trajectory,
false);
1549 return impl_->
execute(trajectory,
true);
1598 double jump_threshold, moveit_msgs::msg::RobotTrajectory& trajectory,
1599 bool avoid_collisions, moveit_msgs::msg::MoveItErrorCodes* error_code)
1601 moveit_msgs::msg::Constraints path_constraints_tmp;
1607 double jump_threshold, moveit_msgs::msg::RobotTrajectory& trajectory,
1609 bool avoid_collisions, moveit_msgs::msg::MoveItErrorCodes* error_code)
1614 avoid_collisions, *error_code);
1618 moveit_msgs::msg::MoveItErrorCodes error_code_tmp;
1620 avoid_collisions, error_code_tmp);
1662 std::map<std::string, std::vector<double>>::const_iterator it = remembered_joint_values_.find(
name);
1663 std::map<std::string, double> positions;
1665 if (it != remembered_joint_values_.cend())
1668 for (
size_t x = 0;
x < names.size(); ++
x)
1670 positions[names[
x]] = it->second[
x];
1682 std::map<std::string, std::vector<double>>::const_iterator it = remembered_joint_values_.find(
name);
1683 if (it != remembered_joint_values_.end())
1694 RCLCPP_ERROR(
LOGGER,
"The requested named target '%s' does not exist",
name.c_str());
1707 if (joint_values.size() != n_group_joints)
1709 RCLCPP_DEBUG_STREAM(
LOGGER,
"Provided joint value list has length " << joint_values.size() <<
" but group "
1711 <<
" has " << n_group_joints <<
" joints");
1722 for (
const auto& pair : variable_values)
1724 if (std::find(allowed.begin(), allowed.end(), pair.first) == allowed.end())
1726 RCLCPP_ERROR_STREAM(
LOGGER,
"joint variable " << pair.first <<
" is not part of group "
1738 const std::vector<double>& variable_values)
1741 for (
const auto& variable_name : variable_names)
1743 if (std::find(allowed.begin(), allowed.end(), variable_name) == allowed.end())
1745 RCLCPP_ERROR_STREAM(
LOGGER,
"joint variable " << variable_name <<
" is not part of group "
1765 std::vector<double> values(1, value);
1779 RCLCPP_ERROR_STREAM(
LOGGER,
1790 const std::string& end_effector_link)
1796 const std::string& end_effector_link)
1798 return impl_->
setJointValueTarget(eef_pose.pose, end_effector_link, eef_pose.header.frame_id,
false);
1803 geometry_msgs::msg::Pose msg = tf2::toMsg(eef_pose);
1808 const std::string& end_effector_link)
1814 const std::string& end_effector_link)
1816 return impl_->
setJointValueTarget(eef_pose.pose, end_effector_link, eef_pose.header.frame_id,
true);
1820 const std::string& end_effector_link)
1822 geometry_msgs::msg::Pose msg = tf2::toMsg(eef_pose);
1875 std::vector<geometry_msgs::msg::PoseStamped> pose_msg(1);
1876 pose_msg[0].pose = tf2::toMsg(pose);
1878 pose_msg[0].header.stamp = impl_->
getClock()->now();
1884 std::vector<geometry_msgs::msg::PoseStamped> pose_msg(1);
1885 pose_msg[0].pose = target;
1887 pose_msg[0].header.stamp = impl_->
getClock()->now();
1892 const std::string& end_effector_link)
1894 std::vector<geometry_msgs::msg::PoseStamped> targets(1, target);
1900 std::vector<geometry_msgs::msg::PoseStamped> pose_out(target.size());
1901 rclcpp::Time tm = impl_->
getClock()->now();
1903 for (std::size_t i = 0; i < target.size(); ++i)
1905 pose_out[i].pose = tf2::toMsg(target[i]);
1906 pose_out[i].header.stamp = tm;
1907 pose_out[i].header.frame_id =
frame_id;
1913 const std::string& end_effector_link)
1915 std::vector<geometry_msgs::msg::PoseStamped> target_stamped(target.size());
1916 rclcpp::Time tm = impl_->
getClock()->now();
1918 for (std::size_t i = 0; i < target.size(); ++i)
1920 target_stamped[i].pose = target[i];
1921 target_stamped[i].header.stamp = tm;
1922 target_stamped[i].header.frame_id =
frame_id;
1928 const std::string& end_effector_link)
1932 RCLCPP_ERROR(
LOGGER,
"No pose specified as goal target");
1947 const std::vector<geometry_msgs::msg::PoseStamped>&
1955 inline void transformPose(
const tf2_ros::Buffer& tf_buffer,
const std::string& desired_frame,
1956 geometry_msgs::msg::PoseStamped& target)
1958 if (desired_frame != target.header.frame_id)
1960 geometry_msgs::msg::PoseStamped target_in(target);
1961 tf_buffer.transform(target_in, target, desired_frame);
1963 target.header.stamp = rclcpp::Time(0);
1970 geometry_msgs::msg::PoseStamped target;
1978 target.pose.orientation.x = 0.0;
1979 target.pose.orientation.y = 0.0;
1980 target.pose.orientation.z = 0.0;
1981 target.pose.orientation.w = 1.0;
1985 target.pose.position.x =
x;
1986 target.pose.position.y =
y;
1987 target.pose.position.z =
z;
1995 geometry_msgs::msg::PoseStamped target;
2003 target.pose.position.x = 0.0;
2004 target.pose.position.y = 0.0;
2005 target.pose.position.z = 0.0;
2010 target.pose.orientation = tf2::toMsg(q);
2017 const std::string& end_effector_link)
2019 geometry_msgs::msg::PoseStamped target;
2027 target.pose.position.x = 0.0;
2028 target.pose.position.y = 0.0;
2029 target.pose.position.z = 0.0;
2033 target.pose.orientation.x =
x;
2034 target.pose.orientation.y =
y;
2035 target.pose.orientation.z =
z;
2036 target.pose.orientation.w =
w;
2101 moveit::core::RobotStatePtr current_state;
2102 std::vector<double> values;
2104 current_state->copyJointGroupPositions(
getName(), values);
2110 std::vector<double>
r;
2117 const std::string& eef = end_effector_link.empty() ?
getEndEffectorLink() : end_effector_link;
2118 Eigen::Isometry3d pose;
2121 RCLCPP_ERROR(
LOGGER,
"No end-effector specified");
2124 moveit::core::RobotStatePtr current_state;
2130 pose = current_state->getGlobalLinkTransform(lm);
2133 geometry_msgs::msg::PoseStamped pose_msg;
2134 pose_msg.header.stamp = impl_->
getClock()->now();
2135 pose_msg.header.frame_id = impl_->
getRobotModel()->getModelFrame();
2136 pose_msg.pose = tf2::toMsg(pose);
2142 const std::string& eef = end_effector_link.empty() ?
getEndEffectorLink() : end_effector_link;
2143 Eigen::Isometry3d pose;
2146 RCLCPP_ERROR(
LOGGER,
"No end-effector specified");
2149 moveit::core::RobotStatePtr current_state;
2154 pose = current_state->getGlobalLinkTransform(lm);
2157 geometry_msgs::msg::PoseStamped pose_msg;
2158 pose_msg.header.stamp = impl_->
getClock()->now();
2159 pose_msg.header.frame_id = impl_->
getRobotModel()->getModelFrame();
2160 pose_msg.pose = tf2::toMsg(pose);
2166 std::vector<double> result;
2167 const std::string& eef = end_effector_link.empty() ?
getEndEffectorLink() : end_effector_link;
2169 RCLCPP_ERROR(
LOGGER,
"No end-effector specified");
2172 moveit::core::RobotStatePtr current_state;
2179 geometry_msgs::msg::TransformStamped tfs = tf2::eigenToTransform(current_state->getGlobalLinkTransform(lm));
2180 double pitch, roll, yaw;
2181 tf2::getEulerYPR<geometry_msgs::msg::Quaternion>(tfs.transform.rotation, yaw, pitch, roll);
2208 moveit::core::RobotStatePtr current_state;
2210 return current_state;
2215 remembered_joint_values_[
name] = values;
2220 remembered_joint_values_.erase(
name);
2225 impl_->can_look_ = flag;
2226 RCLCPP_DEBUG(
LOGGER,
"Looking around: %s", flag ?
"yes" :
"no");
2233 RCLCPP_ERROR(
LOGGER,
"Tried to set negative number of look-around attempts");
2237 RCLCPP_DEBUG_STREAM(
LOGGER,
"Look around attempts: " << attempts);
2238 impl_->look_around_attempts_ = attempts;
2244 impl_->can_replan_ = flag;
2245 RCLCPP_DEBUG(
LOGGER,
"Replanning: %s", flag ?
"yes" :
"no");
2252 RCLCPP_ERROR(
LOGGER,
"Tried to set negative number of replan attempts");
2256 RCLCPP_DEBUG_STREAM(
LOGGER,
"Replan Attempts: " << attempts);
2257 impl_->replan_attempts_ = attempts;
2265 RCLCPP_ERROR(
LOGGER,
"Tried to set negative replan delay");
2269 RCLCPP_DEBUG_STREAM(
LOGGER,
"Replan Delay: " << delay);
2270 impl_->replan_delay_ = delay;
2321 impl_->
setWorkspace(minx, miny, minz, maxx, maxy, maxz);
2353 return attachObject(
object, link, std::vector<std::string>());
2357 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)