48 for (
const auto& d :
data_) {
51 index -=
d.trajectory_->getWayPointCount();
54 assert(part <
data_.size());
55 assert(index <
data_[part].trajectory_->getWayPointCount());
56 return std::make_pair(part, index);
60 : start_scene_(sub == 0 ? master.start_scene_ : master.data_[sub - 1].scene_), data_({ master.data_[sub] }) {
61 steps_ = data_.front().trajectory_->getWayPointCount();
64 float DisplaySolution::getWayPointDurationFromPrevious(
const IndexPair& idx_pair)
const {
65 return data_[idx_pair.first].trajectory_->getWayPointDurationFromPrevious(idx_pair.second);
68 const moveit::core::RobotStatePtr& DisplaySolution::getWayPointPtr(
const IndexPair& idx_pair)
const {
69 return data_[idx_pair.first].trajectory_->getWayPointPtr(idx_pair.second);
72 const planning_scene::PlanningSceneConstPtr& DisplaySolution::scene(
const IndexPair& idx_pair)
const {
74 return data_[idx_pair.first].scene_->getParent();
77 const std::string& DisplaySolution::comment(
const IndexPair& idx_pair)
const {
78 return data_[idx_pair.first].comment_;
82 return data_[idx_pair.first].creator_id_;
85 const MarkerVisualizationPtr DisplaySolution::markers(
const DisplaySolution::IndexPair& idx_pair)
const {
86 return data_[idx_pair.first].markers_;
89 void DisplaySolution::setFromMessage(
const planning_scene::PlanningScenePtr& start_scene,
90 const moveit_task_constructor_msgs::Solution& msg) {
91 if (msg.start_scene.robot_model_name != start_scene->getRobotModel()->getName())
92 throw std::invalid_argument(fmt::format(
"Solution for model '{}' but model '{}' was expected",
93 msg.start_scene.robot_model_name,
94 start_scene->getRobotModel()->getName()));
97 start_scene->setPlanningSceneMsg(msg.start_scene);
98 start_scene_ = start_scene;
99 planning_scene::PlanningScenePtr ref_scene = start_scene_->diff();
101 data_.resize(msg.sub_trajectory.size());
105 for (
const auto& sub : msg.sub_trajectory) {
107 data_[i].trajectory_->setRobotTrajectoryMsg(ref_scene->getCurrentState(), sub.trajectory);
108 data_[i].joints_ = sub.trajectory.joint_trajectory.joint_names;
109 data_[i].joints_.insert(data_[i].joints_.end(), sub.trajectory.multi_dof_joint_trajectory.joint_names.begin(),
110 sub.trajectory.multi_dof_joint_trajectory.joint_names.end());
111 data_[i].comment_ = sub.info.comment;
112 data_[i].creator_id_ = sub.info.stage_id;
113 steps_ += data_[i].trajectory_->getWayPointCount();
115 ref_scene->setPlanningSceneDiffMsg(sub.scene_diff);
116 data_[i].scene_ = ref_scene;
119 ref_scene = ref_scene->diff();
121 if (!sub.info.markers.empty())
124 data_[i].markers_.reset();
129 void DisplaySolution::fillMessage(moveit_task_constructor_msgs::Solution& msg)
const {
130 start_scene_->getPlanningSceneMsg(msg.start_scene);
131 msg.sub_trajectory.resize(data_.size());
132 auto traj_it = msg.sub_trajectory.begin();
133 for (
const auto& sub : data_) {
134 sub.scene_->getPlanningSceneDiffMsg(traj_it->scene_diff);
135 sub.trajectory_->getRobotTrajectoryMsg(traj_it->trajectory, sub.joints_);