diff --git a/src/bt/execution.cpp b/src/bt/execution.cpp index aa2434ec7b7a6ee32fab8e6a3eb19ed7c8577a36..040baa46a063db388d907c8fc65b286c6b1cb4f4 100644 --- a/src/bt/execution.cpp +++ b/src/bt/execution.cpp @@ -23,14 +23,9 @@ BT::NodeStatus Execution::tick() { BT::NodeStatus Execution::onStart(){ if (it_ != ets_.solution.sub_trajectory.end()){ std::pair<moveit_msgs::RobotTrajectory, moveit_msgs::PlanningScene> pair(it_->trajectory, it_->scene_diff); - for (auto& e : it_->scene_diff.allowed_collision_matrix.entry_names) ROS_INFO("%s", e.c_str()); - for (auto& e : it_->scene_diff.allowed_collision_matrix.entry_values) { - for (auto en: e.enabled){ - ROS_INFO("%f", en); - } - } executions_->insert_or_assign(mr_reference_->name(), pair); it_++; + ROS_INFO("oihinin"); return BT::NodeStatus::RUNNING; } else { return BT::NodeStatus::SUCCESS; @@ -42,14 +37,10 @@ BT::NodeStatus Execution::onStart(){ BT::NodeStatus Execution::onRunning(){ if (it_ != ets_.solution.sub_trajectory.end()){ std::pair<moveit_msgs::RobotTrajectory, moveit_msgs::PlanningScene> pair(it_->trajectory, it_->scene_diff); - for (auto& e : it_->scene_diff.allowed_collision_matrix.entry_names) ROS_INFO("%s", e.c_str()); - for (auto& e : it_->scene_diff.allowed_collision_matrix.entry_values) { - for (auto en: e.enabled){ - ROS_INFO("%f", en); - } - } executions_->insert_or_assign(mr_reference_->name(), pair); it_++; + ROS_INFO("oihinin"); + return BT::NodeStatus::RUNNING; } else { return BT::NodeStatus::SUCCESS; diff --git a/src/impl/moveit_mediator.cpp b/src/impl/moveit_mediator.cpp index 8e466ff91de188fa7048a3600452e1c27cd47941..d9ce639e755bef284a2496017c0d396a80957178 100644 --- a/src/impl/moveit_mediator.cpp +++ b/src/impl/moveit_mediator.cpp @@ -15,6 +15,7 @@ #include "bt/position_condition.h" #include "bt/parallel_robot.h" #include <actionlib_msgs/GoalStatusArray.h> +#include <chrono> @@ -119,448 +120,6 @@ void Moveit_mediator::set_wings(std::vector<std::pair<std::vector<object_data>, void Moveit_mediator::setup_task(){ ROS_INFO("=> write Task Constructor Objects"); for(auto& a: acm_) a.second.resize(acm_.size(), 0); - /* - - bool coop = false; - - for(int i = 0; i < objects_.size(); i++){ - if (i+1 < objects_.size()){ - for (long unsigned int j = objects_[i].size()-1; j > 0; j--){ - if(objects_[i][j].getOrigin().distance(objects_[i+1].back().getOrigin()) == 0) { - objects_[i+1].pop_back(); - coop= true; - } - } - } - } - - if(coop){ - moveit_msgs::CollisionObject bottle; - bottle.id = "bottle"; - bottle.header.frame_id = "world"; - bottle.header.stamp = ros::Time::now(); - bottle.primitives.resize(1); - bottle.primitives[0].type = bottle.primitives[0].BOX; - bottle.primitives[0].dimensions.resize(3); - bottle.primitives[0].dimensions[0] = box_size.getX(); - bottle.primitives[0].dimensions[1] = box_size.getY(); - bottle.primitives[0].dimensions[2] = box_size.getZ(); - - bottle.primitive_poses.resize(1); - bottle.primitive_poses[0].position.x = -0.3f; - bottle.primitive_poses[0].position.y = -0.6f; - bottle.primitive_poses[0].position.z = 0.9355f; - bottle.primitive_poses[0].orientation.x = 0; - bottle.primitive_poses[0].orientation.y = 0; - bottle.primitive_poses[0].orientation.z = 0; - bottle.primitive_poses[0].orientation.w = 1; - bottle.operation = bottle.ADD; - - psi_->applyCollisionObject(bottle); - - - for( int i = 0; i < objects_.size();i++){ - for(int j =0; j < objects_[i].size();j++){ - Moveit_robot* mr = dynamic_cast<Moveit_robot*>(robots_[i]); - moveit::task_constructor::Task task = create_Task(mr, psi_->getObjects().at("bottle"), objects_[i][j]); - if (task.plan(1)){ - task.execute(*task.solutions().front()); - } - - } - } - } else { - acm_.insert(std::pair<std::string, std::vector<uint8_t>>("bottle0", std::vector<uint8_t>())); - acm_.insert(std::pair<std::string, std::vector<uint8_t>>("bottle1", std::vector<uint8_t>())); - - moveit_msgs::CollisionObject bottle1; - bottle1.id = "bottle0"; - bottle1.header.frame_id = "world"; - bottle1.header.stamp = ros::Time::now(); - bottle1.primitives.resize(1); - bottle1.primitives[0].type = bottle1.primitives[0].BOX; - bottle1.primitives[0].dimensions.resize(3); - bottle1.primitives[0].dimensions[0] = box_size.getX(); - bottle1.primitives[0].dimensions[1] = box_size.getY(); - bottle1.primitives[0].dimensions[2] = box_size.getZ(); - - bottle1.primitive_poses.resize(1); - bottle1.primitive_poses[0].position.x = objects_[0][0].getOrigin().getX(); - bottle1.primitive_poses[0].position.y = objects_[0][0].getOrigin().getY(); - bottle1.primitive_poses[0].position.z = 0.9355f; - bottle1.primitive_poses[0].orientation.x = 0; - bottle1.primitive_poses[0].orientation.y = 0; - bottle1.primitive_poses[0].orientation.z = 0; - bottle1.primitive_poses[0].orientation.w = 1; - bottle1.operation = bottle1.ADD; - - moveit_msgs::CollisionObject bottle2; - bottle2.id = "bottle1"; - bottle2.header.frame_id = "world"; - bottle2.header.stamp = ros::Time::now(); - bottle2.primitives.resize(1); - bottle2.primitives[0].type = bottle2.primitives[0].BOX; - bottle2.primitives[0].dimensions.resize(3); - bottle2.primitives[0].dimensions[0] = box_size.getX(); - bottle2.primitives[0].dimensions[1] = box_size.getY(); - bottle2.primitives[0].dimensions[2] = box_size.getZ(); - - bottle2.primitive_poses.resize(1); - bottle2.primitive_poses[0].position.x = objects_[1][0].getOrigin().getX(); - bottle2.primitive_poses[0].position.y = objects_[1][0].getOrigin().getY(); - bottle2.primitive_poses[0].position.z = 0.9355f; - bottle2.primitive_poses[0].orientation.x = 0; - bottle2.primitive_poses[0].orientation.y = 0; - bottle2.primitive_poses[0].orientation.z = 0; - bottle2.primitive_poses[0].orientation.w = 1; - bottle2.operation = bottle2.ADD; - - psi_->applyCollisionObject(bottle1); - psi_->applyCollisionObject(bottle2); - - std::vector<std::thread> ths; - std::vector<std::queue<moveit_task_constructor_msgs::ExecuteTaskSolutionGoal>> tasks; - - for (int i = 0 ; i < objects_.size(); i++){ - std::stringstream ss; - ss << "bottle" << std::to_string(i); - Moveit_robot* mr = dynamic_cast<Moveit_robot*>(robots_[i]); - std::queue<moveit_task_constructor_msgs::ExecuteTaskSolutionGoal> tasks_per_robot; - for (int j = 1; j < objects_[i].size(); j++){ - moveit::task_constructor::Task mgt = create_Task(mr, psi_->getObjects().at(ss.str()), objects_[i][j]); - if(mgt.plan(1)) { - moveit_task_constructor_msgs::ExecuteTaskSolutionGoal e; - mgt.solutions().front()->fillMessage(e.solution, &mgt.introspection()); - tasks_per_robot.push(e); - - moveit_msgs::CollisionObject temp = psi_->getObjects().at(ss.str()); - temp.operation = temp.MOVE; - temp.pose.position.x = objects_[i][j].getOrigin().getX(); - temp.pose.position.y = objects_[i][j].getOrigin().getY(); - psi_->applyCollisionObject(temp); - } - } - - moveit_msgs::CollisionObject temp = psi_->getObjects().at(ss.str()); - temp.operation = temp.MOVE; - temp.pose.position.x = objects_[i][0].getOrigin().getX(); - temp.pose.position.y = objects_[i][0].getOrigin().getY(); - psi_->applyCollisionObject(temp); - tasks.push_back(tasks_per_robot); - //ths.push_back(std::thread(&Moveit_mediator::parallel_exec, this, std::ref(*mr), psi_->getObjects().at(ss.str()), objects_[i])); - } - - for(auto& a: acm_) a.second.resize(acm_.size(), 0); - - while (!tasks[0].empty() && !tasks[1].empty()){ - for (int i =0; i < std::max(tasks[0].front().solution.sub_trajectory.size(), tasks[1].front().solution.sub_trajectory.size()); i++){ - moveit_msgs::RobotTrajectory* t1 = nullptr; - moveit_msgs::RobotTrajectory* t2 = nullptr; - moveit_msgs::PlanningScene* ps1 = nullptr; - moveit_msgs::PlanningScene* ps2 = nullptr; - moveit_msgs::PlanningScene ps_m; - std::vector<moveit_msgs::PlanningScene::_allowed_collision_matrix_type> acm_m; - - //for(auto entry: acm_) ROS_INFO("%s", entry.first.c_str()); - - if (i < tasks[0].front().solution.sub_trajectory.size()){ - t1 = &tasks[0].front().solution.sub_trajectory[i].trajectory; - ps1 = &tasks[0].front().solution.sub_trajectory[i].scene_diff; - } - - if (i < tasks[1].front().solution.sub_trajectory.size()){ - t2 = &tasks[1].front().solution.sub_trajectory[i].trajectory; - ps2 = &tasks[1].front().solution.sub_trajectory[i].scene_diff; - } - - std::vector<std::thread> th; - - if (t1){ - Moveit_robot* mr = dynamic_cast<Moveit_robot*>(robots_[0]); - th.push_back(std::thread(&Moveit_mediator::parallel_exec, this, std::ref(*mr), *t1, *ps1)); - - // First find ID from panda to start with - std::regex rx_panda("panda_arm([0-9]+)"); - std::smatch match; - std::regex_match(mr->name(), match, rx_panda); - - // build panda link regex - std::stringstream ss; - ss << "panda_" << match[1] << "_.*"; - std::regex rx_panda_links(ss.str()); - std::regex rx_box("bottle.*"); - std::regex rx_table("table.*"); - - // Iterate task collsion matrix - for(int j = 0; j < ps1->allowed_collision_matrix.entry_names.size(); j++ ){ - if( mr->map().at("base") == ps1->allowed_collision_matrix.entry_names[j]){ - In case an entry matches an robot spezific link - ROS_INFO("entry matches link %s at index %i", mr->map().at("base").c_str(), j); - for(int k = 0; k < ps1->allowed_collision_matrix.entry_values[j].enabled.size(); k++){ - For that specific entry, loop over values - int distance = std::distance(acm_.begin(),acm_.find(ps1->allowed_collision_matrix.entry_names[k])); - - if (std::regex_match(ps1->allowed_collision_matrix.entry_names[k], match, rx_panda_links)){ - ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps1->allowed_collision_matrix.entry_names[k], match, rx_box)){ - ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps1->allowed_collision_matrix.entry_names[k], match, rx_table)){ - ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (mr->map().at("base")== ps1->allowed_collision_matrix.entry_names[k]){ - ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - } - } - - if(std::regex_match(ps1->allowed_collision_matrix.entry_names[j], match, rx_panda_links)){ - In case an entry matches an robot spezific link - ROS_INFO("entry matches link %s at index %i", ps1->allowed_collision_matrix.entry_names[j].c_str(), j); - for(int k = 0; k < ps1->allowed_collision_matrix.entry_values[j].enabled.size(); k++){ - For that specific entry, loop over values - int distance = std::distance(acm_.begin(),acm_.find(ps1->allowed_collision_matrix.entry_names[k])); - - if (std::regex_match(ps1->allowed_collision_matrix.entry_names[k], match, rx_panda_links)){ - ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps1->allowed_collision_matrix.entry_names[k], match, rx_box)){ - ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps1->allowed_collision_matrix.entry_names[k], match, rx_table)){ - ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (mr->map().at("base")== ps1->allowed_collision_matrix.entry_names[k]){ - ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - } - } - - if(std::regex_match(ps1->allowed_collision_matrix.entry_names[j], match, rx_box)){ - In case an entry matches an robot spezific link - ROS_INFO("entry matches link %s at index %i", ps1->allowed_collision_matrix.entry_names[j].c_str(), j); - for(int k = 0; k < ps1->allowed_collision_matrix.entry_values[j].enabled.size(); k++){ - For that specific entry, loop over values - int distance = std::distance(acm_.begin(),acm_.find(ps1->allowed_collision_matrix.entry_names[k])); - - if (std::regex_match(ps1->allowed_collision_matrix.entry_names[k], match, rx_panda_links)){ - ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps1->allowed_collision_matrix.entry_names[k], match, rx_box)){ - ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps1->allowed_collision_matrix.entry_names[k], match, rx_table)){ - ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (mr->map().at("base")== ps1->allowed_collision_matrix.entry_names[k]){ - ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - } - } - - if(std::regex_match(ps1->allowed_collision_matrix.entry_names[j], match, rx_table)){ - In case an entry matches an robot spezific link - ROS_INFO("entry matches link %s at index %i", ps1->allowed_collision_matrix.entry_names[j], j); - for(int k = 0; k < ps1->allowed_collision_matrix.entry_values[j].enabled.size(); k++){ - For that specific entry, loop over values - int distance = std::distance(acm_.begin(),acm_.find(ps1->allowed_collision_matrix.entry_names[k])); - - if (std::regex_match(ps1->allowed_collision_matrix.entry_names[k], match, rx_panda_links)){ - ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps1->allowed_collision_matrix.entry_names[k], match, rx_box)){ - ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps1->allowed_collision_matrix.entry_names[k], match, rx_table)){ - ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (mr->map().at("base")== ps1->allowed_collision_matrix.entry_names[k]){ - ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str()); - acm_.at(ps1->allowed_collision_matrix.entry_names[k])[distance] = ps1->allowed_collision_matrix.entry_values[j].enabled[k]; - } - } - } - } - merge_ps(ps_m, ps1, mr); - } - - if (t2){ - Moveit_robot* mr = dynamic_cast<Moveit_robot*>(robots_[1]); - th.push_back(std::thread(&Moveit_mediator::parallel_exec, this, std::ref(*mr), *t2, *ps2)); - - std::regex rx_panda("panda_arm([0-9]+)"); - std::smatch match; - std::regex_match(mr->name(), match, rx_panda); - - // build panda link regex - std::stringstream ss; - ss << "panda_" << match[1] << "_.*"; - std::regex rx_panda_links(ss.str()); - std::regex rx_box("bottle.*"); - std::regex rx_table("table.*"); - - // Iterate task collsion matrix - for(int j = 0; j < ps2->allowed_collision_matrix.entry_names.size(); j++ ){ - if( mr->map().at("base") == ps2->allowed_collision_matrix.entry_names[j]){ - In case an entry matches an robot spezific link - ROS_INFO("entry matches link %s at index %i", mr->map().at("base").c_str(), j); - for(int k = 0; k < ps2->allowed_collision_matrix.entry_values[j].enabled.size(); k++){ - For that specific entry, loop over values - int distance = std::distance(acm_.begin(),acm_.find(ps2->allowed_collision_matrix.entry_names[k])); - - if (std::regex_match(ps2->allowed_collision_matrix.entry_names[k], match, rx_panda_links)){ - ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps2->allowed_collision_matrix.entry_names[k], match, rx_box)){ - ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps2->allowed_collision_matrix.entry_names[k], match, rx_table)){ - ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (mr->map().at("base")== ps2->allowed_collision_matrix.entry_names[k]){ - ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - } - } - - if(std::regex_match(ps2->allowed_collision_matrix.entry_names[j], match, rx_panda_links)){ - In case an entry matches an robot spezific link - ROS_INFO("entry matches link %s at index %i", ps2->allowed_collision_matrix.entry_names[j].c_str(), j); - for(int k = 0; k < ps2->allowed_collision_matrix.entry_values[j].enabled.size(); k++){ - For that specific entry, loop over values - int distance = std::distance(acm_.begin(),acm_.find(ps2->allowed_collision_matrix.entry_names[k])); - - if (std::regex_match(ps2->allowed_collision_matrix.entry_names[k], match, rx_panda_links)){ - ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps2->allowed_collision_matrix.entry_names[k], match, rx_box)){ - ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps2->allowed_collision_matrix.entry_names[k], match, rx_table)){ - ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (mr->map().at("base")== ps2->allowed_collision_matrix.entry_names[k]){ - ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - } - } - - if(std::regex_match(ps2->allowed_collision_matrix.entry_names[j], match, rx_box)){ - In case an entry matches an robot spezific link - ROS_INFO("entry matches link %s at index %i", ps2->allowed_collision_matrix.entry_names[j].c_str(), j); - for(int k = 0; k < ps2->allowed_collision_matrix.entry_values[j].enabled.size(); k++){ - For that specific entry, loop over values - int distance = std::distance(acm_.begin(),acm_.find(ps2->allowed_collision_matrix.entry_names[k])); - - if (std::regex_match(ps2->allowed_collision_matrix.entry_names[k], match, rx_panda_links)){ - ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps2->allowed_collision_matrix.entry_names[k], match, rx_box)){ - ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps2->allowed_collision_matrix.entry_names[k], match, rx_table)){ - ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (mr->map().at("base")== ps2->allowed_collision_matrix.entry_names[k]){ - ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - } - } - - if(std::regex_match(ps2->allowed_collision_matrix.entry_names[j], match, rx_table)){ - In case an entry matches an robot spezific link - ROS_INFO("entry matches link %s at index %i", ps2->allowed_collision_matrix.entry_names[j], j); - for(int k = 0; k < ps2->allowed_collision_matrix.entry_values[j].enabled.size(); k++){ - For that specific entry, loop over values - int distance = std::distance(acm_.begin(),acm_.find(ps2->allowed_collision_matrix.entry_names[k])); - - if (std::regex_match(ps2->allowed_collision_matrix.entry_names[k], match, rx_panda_links)){ - ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps2->allowed_collision_matrix.entry_names[k], match, rx_box)){ - ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (std::regex_match(ps2->allowed_collision_matrix.entry_names[k], match, rx_table)){ - ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - - if (mr->map().at("base")== ps2->allowed_collision_matrix.entry_names[k]){ - ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str()); - acm_.at(ps2->allowed_collision_matrix.entry_names[k])[distance] = ps2->allowed_collision_matrix.entry_values[j].enabled[k]; - } - } - } - } - merge_ps(ps_m, ps2, mr); - } - - - for(int i = 0; i < th.size(); i++){ - th[i].join(); - } - merge_acm(ps_m); - planning_scene_diff_publisher_->publish(ps_m); - - } - tasks[0].pop(); - tasks[1].pop(); - } - } - */ } @@ -570,22 +129,14 @@ void Moveit_mediator::manipulate_acm(Moveit_robot* mr, moveit_msgs::PlanningScen std::smatch match; std::regex_match(mr->name(), match, rx_panda); - ROS_INFO("manipulate_acm"); - for (auto& e : ps.allowed_collision_matrix.entry_names) ROS_INFO("%s", e.c_str()); - for (auto& e : ps.allowed_collision_matrix.entry_values) { - for (auto en: e.enabled){ - ROS_INFO("%f", en); - } - } - - // build panda link regex std::stringstream ss; ss << "panda_" << match[1] << "_.*"; std::regex rx_panda_links(ss.str()); - std::regex rx_box("box.*"); + std::regex rx_box("box_.*"); std::regex rx_table("table.*"); + // Iterate task collsion matrix for(int j = 0; j < ps.allowed_collision_matrix.entry_names.size(); j++ ){ if( mr->map().at("base") == ps.allowed_collision_matrix.entry_names[j]){ @@ -598,22 +149,26 @@ void Moveit_mediator::manipulate_acm(Moveit_robot* mr, moveit_msgs::PlanningScen if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_panda_links)){ ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(mr->map().at("base"))[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_box)){ ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(mr->map().at("base"))[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_table)){ ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(mr->map().at("base"))[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } if (mr->map().at("base")== ps.allowed_collision_matrix.entry_names[k]){ ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(mr->map().at("base"))[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } } } @@ -627,22 +182,26 @@ void Moveit_mediator::manipulate_acm(Moveit_robot* mr, moveit_msgs::PlanningScen if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_panda_links)){ ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(ps.allowed_collision_matrix.entry_names[j])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_box)){ ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(ps.allowed_collision_matrix.entry_names[j])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_table)){ ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(ps.allowed_collision_matrix.entry_names[j])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } if (mr->map().at("base")== ps.allowed_collision_matrix.entry_names[k]){ ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(ps.allowed_collision_matrix.entry_names[j])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } } } @@ -656,22 +215,26 @@ void Moveit_mediator::manipulate_acm(Moveit_robot* mr, moveit_msgs::PlanningScen if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_panda_links)){ ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(ps.allowed_collision_matrix.entry_names[j])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_box)){ ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(ps.allowed_collision_matrix.entry_names[j])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_table)){ ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(ps.allowed_collision_matrix.entry_names[j])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } if (mr->map().at("base")== ps.allowed_collision_matrix.entry_names[k]){ ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(ps.allowed_collision_matrix.entry_names[j])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } } } @@ -685,26 +248,38 @@ void Moveit_mediator::manipulate_acm(Moveit_robot* mr, moveit_msgs::PlanningScen if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_panda_links)){ ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(ps.allowed_collision_matrix.entry_names[j])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_box)){ ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(ps.allowed_collision_matrix.entry_names[j])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_table)){ ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(ps.allowed_collision_matrix.entry_names[j])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } if (mr->map().at("base")== ps.allowed_collision_matrix.entry_names[k]){ ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str()); - acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; + ROS_INFO("Changing at %s at position %i to %i", ps.allowed_collision_matrix.entry_names[k].c_str(), distance, ps.allowed_collision_matrix.entry_values[j].enabled[k]); + acm_.at(ps.allowed_collision_matrix.entry_names[j])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k]; } } } } + + ROS_INFO("after run"); + for(auto& entry : acm_){ + ROS_INFO("%s", entry.first.c_str()); + for (auto& enable : entry.second) std::cout << +enable << " "; + std::cout<< "\n"; + } + } @@ -785,6 +360,7 @@ void Moveit_mediator::task_planner(){ for (int k = 1; k < temp.second.jobs_.size(); k++){ moveit::task_constructor::Task mgt = create_Task(mr, psi_->getObjects().at(s_co.first), temp.second.jobs_[k]); if(mgt.plan(1)) { + moveit_task_constructor_msgs::ExecuteTaskSolutionGoal e; mgt.solutions().front()->fillMessage(e.solution, &mgt.introspection()); bt_list.push_back(e); @@ -876,8 +452,6 @@ void Moveit_mediator::task_planner(){ auto tree = factory.createTreeFromText(ss.str()); auto node_it = tree.nodes.begin(); - - for(int i =0; i < robots_.size();i++){ try{ for (auto& p_obj: task_but_different.at(robots_[i]->name())){ @@ -904,38 +478,56 @@ void Moveit_mediator::task_planner(){ BT::NodeStatus status = BT::NodeStatus::RUNNING; while( status == BT::NodeStatus::RUNNING){ status = tree.tickRoot(); + + // std::this_thread::sleep_for(std::chrono::milliseconds(100)); + std::vector<std::thread> th; moveit_msgs::PlanningScene ps_m; + bool is_executing = !(executions_.empty()); + + + for (int i = 0; i < robots_.size(); i++){ + try{ + auto temp = executions_.at(robots_[i]->name()); + auto mr = dynamic_cast<Moveit_robot*>(robots_[i]); + th.push_back(std::thread(&Moveit_mediator::parallel_exec, this, std::ref(*mr), temp.first)); + //mr->mgi()->execute(temp.first); + // ROS_INFO("acm in msg"); + // for(int k = 0; k < temp.second.allowed_collision_matrix.entry_names.size(); k++){ + // ROS_INFO("%s", temp.second.allowed_collision_matrix.entry_names[k].c_str()); + // for (auto& enable : temp.second.allowed_collision_matrix.entry_values[k].enabled) std::cout << +enable << " "; + // std::cout<< "\n"; + // } + + manipulate_acm(mr, temp.second); + merge_ps(ps_m, temp.second, mr); + executions_.erase(robots_[i]->name()); + } catch (std::out_of_range& oor){} - for(auto& exec : executions_){ - for (int i = 0; i < robots_.size(); i++){ - if (exec.first == robots_[i]->name()){ - auto mr = dynamic_cast<Moveit_robot*>(robots_[i]); - th.push_back(std::thread(&Moveit_mediator::parallel_exec, this, std::ref(*mr), exec.second.first)); - //mr->mgi()->execute(exec.second.first); - //manipulate_acm(mr, exec.second.second); - //merge_ps(ps_m, exec.second.second, mr); - } - } } for(auto& t : th){ t.join(); } - - for(auto& exec : executions_){ - for (int i = 0; i < robots_.size(); i++){ - if (exec.first == robots_[i]->name()){ - auto mr = dynamic_cast<Moveit_robot*>(robots_[i]); - manipulate_acm(mr, exec.second.second); - merge_ps(ps_m, exec.second.second, mr); - } - } + if (is_executing){ + merge_acm(ps_m); + planning_scene_diff_publisher_->publish(ps_m); } + + + // for(auto& exec : executions_){ + // for (int i = 0; i < robots_.size(); i++){ + // if (exec.first == robots_[i]->name()){ + // auto mr = dynamic_cast<Moveit_robot*>(robots_[i]); + // manipulate_acm(mr, exec.second.second); + // merge_ps(ps_m, exec.second.second, mr); - merge_acm(ps_m); - planning_scene_diff_publisher_->publish(ps_m); + // } + // } + // } + + } @@ -982,14 +574,15 @@ void Moveit_mediator::merge_acm(moveit_msgs::PlanningScene& ps_m){ i++; } - - ROS_INFO("Merge ACM"); - for (auto& e : acmt.entry_names) ROS_INFO("%s", e.c_str()); - for (auto& e : acmt.entry_values) { - for (auto en: e.enabled){ - ROS_INFO("%f", en); - } - } + // ROS_INFO("merge_acm"); + // for(int k = 0; k < acmt.entry_names.size(); k++){ + // ROS_INFO("%s", acmt.entry_names[k].c_str()); + // for (auto& enable : acmt.entry_values[k].enabled){ + // std::cout << +enable << " "; + // } + // std::cout<< "\n"; + // } + ps_m.allowed_collision_matrix = acmt; } @@ -1035,8 +628,7 @@ void Moveit_mediator::merge_ps(moveit_msgs::PlanningScene& out, moveit_msgs::Pla out.link_scale.push_back(in.link_scale[i]); } } - } - + } }