Skip to content
Snippets Groups Projects
Commit 45366ecd authored by KingMaZito's avatar KingMaZito
Browse files

...

parent 0ea4a6c6
Branches
No related tags found
No related merge requests found
......@@ -11,35 +11,50 @@ void MGMediator::mergeACM(){
moveit_msgs::PlanningScene::_allowed_collision_matrix_type acmt;
acmt.entry_values.resize(acm_.size());
ROS_INFO("mergeACM step 1");
int i = 0;
for (auto& a : acm_){
acmt.entry_names.push_back(a.first);
acmt.entry_values[i].enabled = a.second;
i++;
}
ROS_INFO("mergeACM step 2");
ps_->allowed_collision_matrix = acmt;
ROS_INFO("mergeACM step 3");
}
void MGMediator::parallelExec(moveit_task_constructor_msgs::SubTrajectory st, const std::string& robotId){
{
ROS_INFO("parallelExec step 1");
std::unique_lock<std::mutex> lock(shared_mutex);
manipulateACM(st.scene_diff, robotId);
mergePS(st.scene_diff, robotId);
ROS_INFO("parallelExec step 2");
}
AbstractRobotDecorator* mr = nullptr;
{
std::unique_lock<std::mutex> lock(shared_mutex);
mr= robots_.at(robotId).get();
ROS_INFO("parallelExec step 3");
}
mr->mgi()->execute(st.trajectory);
ROS_INFO("parallelExec step 4");
}
void MGMediator::mergePS(const moveit_msgs::PlanningScene& in, const std::string& robotId){
// get full mr link list
ROS_INFO("mergePS step 1");
if (!ps_){
ps_ = std::make_shared<moveit_msgs::PlanningScene>(in);
ROS_INFO("mergePS step 2");
return;
}
......@@ -48,6 +63,7 @@ void MGMediator::mergePS(const moveit_msgs::PlanningScene& in, const std::string
std::unique_lock<std::mutex> lock(shared_mutex);
mr= robots_.at(robotId).get();
}
ROS_INFO("mergePS step 3");
for (auto ao : in.robot_state.attached_collision_objects) ps_->robot_state.attached_collision_objects.push_back(ao);
ps_->robot_state.is_diff |= in.robot_state.is_diff;
......@@ -55,6 +71,7 @@ void MGMediator::mergePS(const moveit_msgs::PlanningScene& in, const std::string
ps_->robot_state.joint_state.header = in.robot_state.joint_state.header;
ps_->robot_model_name = "panda";
ROS_INFO("mergePS step 4");
std::vector<std::string> links;
for (auto link : mr->mgi()->getLinkNames()) links.push_back(link);
links.push_back(mr->map()["left_finger"]);
......@@ -62,6 +79,7 @@ void MGMediator::mergePS(const moveit_msgs::PlanningScene& in, const std::string
links.push_back(mr->map()["hand_link"]);
links.push_back(mr->map()["base"]);
ROS_INFO("mergePS step 5");
for (auto link : links) {
for(int i = 0; i < in.robot_state.joint_state.name.size(); i++){
if(link == in.robot_state.joint_state.name[i]){
......@@ -70,6 +88,7 @@ void MGMediator::mergePS(const moveit_msgs::PlanningScene& in, const std::string
ps_->robot_state.joint_state.velocity.push_back(in.robot_state.joint_state.velocity[i]);
}
}
ROS_INFO("mergePS step 6");
for(int i = 0; i < in.link_padding.size(); i++){
if(link == in.link_padding[i].link_name){
......@@ -77,24 +96,30 @@ void MGMediator::mergePS(const moveit_msgs::PlanningScene& in, const std::string
}
}
ROS_INFO("mergePS step 7");
for(int i = 0; i < in.link_scale.size(); i++){
if(link == in.link_scale[i].link_name){
ps_->link_scale.push_back(in.link_scale[i]);
}
}
}
ROS_INFO("mergePS step 8");
}
void MGMediator::processSharedStructure() {
while (ros::ok()) {
std::vector<std::pair<std::string, moveit_task_constructor_msgs::SubTrajectory>> peak;
ROS_INFO("processSharedStructure step 1");
{
std::unique_lock<std::mutex> lock(shared_mutex);
// Wait until the shared structure is not empty
cv.wait(lock, []{ return !shared_structure.empty(); });
ROS_INFO("processSharedStructure step 2");
// Iterate over the vectors in shared_structure
for (auto it = shared_structure.begin(); it != shared_structure.end(); ++it) {
......@@ -102,6 +127,7 @@ void MGMediator::processSharedStructure() {
// Get the first entry of the vector and add it to peak
peak.push_back(std::make_pair(it->first, it->second.solution.sub_trajectory.front()));
it->second.solution.sub_trajectory.erase(it->second.solution.sub_trajectory.begin());
ROS_INFO("processSharedStructure step 3");
}
if (it->second.solution.sub_trajectory.empty()) {
......@@ -110,7 +136,7 @@ void MGMediator::processSharedStructure() {
But I want to publish only vanished objects
TODO: Implement your own stage, so you don't have to do this embarrassing loops
*/
ROS_INFO("processSharedStructure step 4");
std::string temp;
try{
for (const auto& c : cuboid_reader_->cuboidBox()){
......@@ -143,18 +169,25 @@ void MGMediator::processSharedStructure() {
}
ROS_INFO("processSharedStructure step 5");
std::vector<std::thread> th;
for (const auto& exec : peak){
th.push_back(std::thread(&MGMediator::parallelExec, this, exec.second, std::ref(exec.first)));
}
ROS_INFO("processSharedStructure step 6");
for(auto& t : th){
t.join();
}
ROS_INFO("processSharedStructure step 7");
mergeACM();
planning_scene_diff_publisher_->publish(*ps_);
ROS_INFO("processSharedStructure step 8");
planning_scene_diff_publisher_->publish(ps_.get());
// The lock is automatically released here when `lock` goes out of scope
......@@ -166,7 +199,7 @@ void MGMediator::processSharedStructure() {
// }
// }
ROS_INFO("Do something");
ROS_INFO("processSharedStructure step 9");
peak.clear();
......@@ -333,7 +366,8 @@ void MGMediator::mediate(){
// //mgt.introspection().publishSolution(*mgt.solutions().front());
// mgt1.execute(*mgt1.solutions().front());
// }
// Setup shared ACM
for(auto& a: acm_) a.second.resize(acm_.size(), 0);
std::thread processThread(&MGMediator::processSharedStructure, this);
// Spin ROS node
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment