diff --git a/.catkin_tools/profiles/default/build.yaml b/.catkin_tools/profiles/default/build.yaml index 910ef428350b2f977ff36bed501d87b46cb53802..122835594a26db730f6f4ac3160d4daf5d186ce0 100644 --- a/.catkin_tools/profiles/default/build.yaml +++ b/.catkin_tools/profiles/default/build.yaml @@ -10,7 +10,8 @@ extends: null install: false install_space: install isolate_install: false -jobs_args: [] +jobs_args: +- -j2 licenses: - TODO log_space: logs diff --git a/.catkin_tools/profiles/default/devel_collisions.txt b/.catkin_tools/profiles/default/devel_collisions.txt index d9a9bc8c771fcb9d5dd6d9dbcdf9924cbb791b1e..78c3c1b805dec2b7496ff8f136ae97520bd8b3ec 100644 --- a/.catkin_tools/profiles/default/devel_collisions.txt +++ b/.catkin_tools/profiles/default/devel_collisions.txt @@ -1,4 +1,4 @@ /home/matteo/ws_panda/devel/./cmake.lock 42 -/home/matteo/reachability/devel/./cmake.lock 10354 +/home/matteo/reachability/devel/./cmake.lock 11015 /home/matteo/reachability/devel/lib/libmoveit_grasps.so 79 /home/matteo/reachability/devel/lib/libmoveit_grasps_filter.so 79 diff --git a/.catkin_tools/profiles/default/packages/mtc/devel_manifest.txt b/.catkin_tools/profiles/default/packages/mtc/devel_manifest.txt index 10aa091b063542d59b565e0b28acd741836a2dba..d505503fe7d34fdd0fc03488deecadb7aaf57276 100644 --- a/.catkin_tools/profiles/default/packages/mtc/devel_manifest.txt +++ b/.catkin_tools/profiles/default/packages/mtc/devel_manifest.txt @@ -3,8 +3,10 @@ mtc /home/matteo/reachability/devel/.private/mtc/share/mtc/cmake/mtcConfig-version.cmake /home/matteo/reachability/devel/share/mtc/cmake/mtcConfig-version.cmake /home/matteo/reachability/devel/.private/mtc/share/mtc/cmake/mtcConfig.cmake /home/matteo/reachability/devel/share/mtc/cmake/mtcConfig.cmake /home/matteo/reachability/devel/.private/mtc/lib/libmoveit_grasps_filter.so /home/matteo/reachability/devel/lib/libmoveit_grasps_filter.so +/home/matteo/reachability/devel/.private/mtc/lib/liblib.so /home/matteo/reachability/devel/lib/liblib.so /home/matteo/reachability/devel/.private/mtc/lib/libmoveit_grasps.so /home/matteo/reachability/devel/lib/libmoveit_grasps.so /home/matteo/reachability/devel/.private/mtc/lib/pkgconfig/mtc.pc /home/matteo/reachability/devel/lib/pkgconfig/mtc.pc /home/matteo/reachability/devel/.private/mtc/lib/mtc/mtc2taskspace /home/matteo/reachability/devel/lib/mtc/mtc2taskspace /home/matteo/reachability/devel/.private/mtc/lib/mtc/base_routine /home/matteo/reachability/devel/lib/mtc/base_routine /home/matteo/reachability/devel/.private/mtc/lib/mtc/moveit_grasps_grasp_pipeline /home/matteo/reachability/devel/lib/mtc/moveit_grasps_grasp_pipeline +/home/matteo/reachability/devel/.private/mtc/lib/mtc/cell_routine /home/matteo/reachability/devel/lib/mtc/cell_routine diff --git a/src/.vscode/c_cpp_properties.json b/src/.vscode/c_cpp_properties.json index 060596d6214c5aa77b28e1fc301552d48a0df3b1..f67badc18cf5ae6175e1331b920da00ffe2a1159 100644 --- a/src/.vscode/c_cpp_properties.json +++ b/src/.vscode/c_cpp_properties.json @@ -33,7 +33,9 @@ "/home/matteo/ws_moveit/src/srdfdom/include/**", "/home/matteo/ws_moveit/src/warehouse_ros/include/**", "/usr/include/**", - "${workspaceFolder}/mtc/include" + "${workspaceFolder}/mtc/include", + "${workspaceFolder}/mtc/include/impl", + "${workspaceFolder}/mtc/include/impl/ho" ], "name": "ROS" } diff --git a/src/ceti_double/config/kinematics.yaml b/src/ceti_double/config/kinematics.yaml index 9e26dfeeb6e641a33dae4961196235bdb965b21b..67d5a8281019b69e68c11d008f9bfeb0047aefc7 100644 --- a/src/ceti_double/config/kinematics.yaml +++ b/src/ceti_double/config/kinematics.yaml @@ -1 +1,8 @@ -{} \ No newline at end of file +panda_arm1: + kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin + kinematics_solver_search_resolution: 0.005 + kinematics_solver_timeout: 0.05 +panda_arm2: + kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin + kinematics_solver_search_resolution: 0.005 + kinematics_solver_timeout: 0.05 diff --git a/src/ceti_double/config/panda.srdf b/src/ceti_double/config/panda.srdf index 360074c6423824fe171e6a0819fd139bd13bdfc9..65e62271ee82b52b7be7922a4f27e75e7b2fd82b 100644 --- a/src/ceti_double/config/panda.srdf +++ b/src/ceti_double/config/panda.srdf @@ -48,7 +48,8 @@ <end_effector name="hand1" parent_link="panda_1_link8" group="hand_1"/> <end_effector name="hand2" parent_link="panda_2_link8" group="hand_2"/> <!--VIRTUAL JOINT: Purpose: this element defines a virtual joint between a robot link and an external frame of reference (considered fixed with respect to the robot)--> - <virtual_joint name="virtual_joint" type="fixed" parent_frame="world" child_link="world"/> + <virtual_joint name="virtual_joint1" type="fixed" parent_frame="world" child_link="base_1"/> + <virtual_joint name="virtual_joint2" type="fixed" parent_frame="world" child_link="base_2"/> <!--DISABLE COLLISIONS: By default it is assumed that any link of the robot could potentially come into collision with any other link in the robot. This tag disables collision checking between a specified pair of links. --> <disable_collisions link1="base_1" link2="base_2" reason="Adjacent"/> <disable_collisions link1="base_1" link2="panda_1_link0" reason="Adjacent"/> diff --git a/src/ceti_double/launch/demo.launch b/src/ceti_double/launch/demo.launch index ff84767aca1541eec72f92b13d4ef363f04d40ae..e9c08c838edcb5dca7cc1608e384f3a30b383ab5 100644 --- a/src/ceti_double/launch/demo.launch +++ b/src/ceti_double/launch/demo.launch @@ -24,7 +24,8 @@ <arg name="use_rviz" default="true" /> <!-- If needed, broadcast static tf for robot root --> - <node pkg="tf2_ros" type="static_transform_publisher" name="virtual_joint_broadcaster_0" args="0 0 0 0 0 0 world world" /> + <node pkg="tf2_ros" type="static_transform_publisher" name="virtual_joint_broadcaster_0" args="0 0 0 0 0 0 world base1" /> + <node pkg="tf2_ros" type="static_transform_publisher" name="virtual_joint_broadcaster_1" args="0 0 0 0 0 0 world base2" /> diff --git a/src/mtc/CMakeLists.txt b/src/mtc/CMakeLists.txt index 9ca717b8e2483cc95400708ace2f7da4e1947996..1b18ded04128a426f68dc9b5cf24d16a4cd922d1 100644 --- a/src/mtc/CMakeLists.txt +++ b/src/mtc/CMakeLists.txt @@ -51,6 +51,7 @@ catkin_package( trajectory_msgs INCLUDE_DIRS include + include/impl DEPENDS EIGEN3 ) @@ -61,11 +62,38 @@ catkin_package( include_directories( include + include/impl ${catkin_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIR} ${PCL_INCLUDE_DIR} ) +# Demo grasp pipeline +add_executable(base_routine src/base_routine.cpp +src/impl/abstract_mediator.cpp +src/impl/base_by_rotation.cpp +src/impl/field_rviz_decorator.cpp +src/impl/map_loader.cpp +src/impl/mediator.cpp +src/impl/moveit_mediator.cpp +src/impl/robot.cpp +src/impl/wing_moveit_decorator.cpp +src/impl/wing_rviz_decorator.cpp +) + +add_executable(cell_routine src/cell_routine.cpp +src/impl/abstract_mediator.cpp +src/impl/moveit_mediator.cpp +src/impl/wing_moveit_decorator.cpp +src/impl/robot.cpp + +src/impl/mediator.cpp +src/impl/wing_moveit_decorator.cpp +src/impl/wing_rviz_decorator.cpp +) + + + # Grasp Library add_library(moveit_grasps src/grasp_candidate.cpp @@ -98,13 +126,14 @@ set_target_properties(moveit_grasps_filter PROPERTIES COMPILE_FLAGS "${CMAKE_CXX set_target_properties(moveit_grasps_filter PROPERTIES LINK_FLAGS "${OpenMP_CXX_FLAGS}") -# Demo grasp pipeline -add_executable(base_routine src/base_routine.cpp) + + add_executable(mtc2taskspace src/mtc2taskspace.cpp) add_executable(moveit_grasps_grasp_pipeline src/grasp_pipeline.cpp) add_dependencies(base_routine ${base_routine_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) +add_dependencies(cell_routine ${cell_routine_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) add_dependencies(mtc2taskspace ${mtc2taskspace_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) @@ -118,6 +147,12 @@ target_link_libraries(base_routine ${PCL_LIBRARY_DIRS} yaml-cpp ) +target_link_libraries(cell_routine + ${catkin_LIBRARIES} + ${OCTOMAP_LIBRARIES} + ${PCL_LIBRARY_DIRS} + yaml-cpp +) target_link_libraries(mtc2taskspace ${catkin_LIBRARIES} diff --git a/src/mtc/include/impl/abstract_map_loader.h b/src/mtc/include/impl/abstract_map_loader.h index dfb04241392a4804a5fc003b0cdac8ff814e4f56..e98aaf6406d17ae09612977900a44b2a5d7952ef 100644 --- a/src/mtc/include/impl/abstract_map_loader.h +++ b/src/mtc/include/impl/abstract_map_loader.h @@ -11,6 +11,7 @@ #include "impl/abstract_strategy.h" +class Abstract_strategy; class Abstract_map_loader{ protected: @@ -26,8 +27,9 @@ class Abstract_map_loader{ Abstract_map_loader() = default; ~Abstract_map_loader() = default; - virtual std::vector<std::vector<pcl::PointXYZ>> base_calculation()=0; - + inline void set_strategy(Abstract_strategy* some_stratergy) {strategy_ = some_stratergy;} + inline Abstract_strategy* strategy() {return strategy_;} + inline std::vector<tf2::Transform>& inv_map() {return inv_map_;} inline std::vector<tf2::Transform>& map() {return map_;} inline void set_inv_map(std::vector<tf2::Transform>& list) {inv_map_ = list;} @@ -39,12 +41,9 @@ class Abstract_map_loader{ inline void set_target_cloud(std::vector<std::vector<pcl::PointCloud< pcl::PointXYZ >::Ptr>>& cloud) {target_cloud_ = cloud;} inline std::vector<std::vector<pcl::PointCloud< pcl::PointXYZ >::Ptr>>& target_cloud () { return target_cloud_;} - inline void set_strategy(Abstract_strategy* some_stratergy) {strategy_ = some_stratergy;} - inline Abstract_strategy* strategy() {return strategy_;} static std::vector<pcl::PointXYZ> create_pcl_box(); + virtual std::vector<std::vector<pcl::PointXYZ>> base_calculation()=0; }; - - #endif diff --git a/src/mtc/include/impl/abstract_mediator.h b/src/mtc/include/impl/abstract_mediator.h index eae099d568d03f4499689f6cd928cdee33082822..247274582b22e329e50cde91d47dbd1c6b9bcfe5 100644 --- a/src/mtc/include/impl/abstract_mediator.h +++ b/src/mtc/include/impl/abstract_mediator.h @@ -11,46 +11,49 @@ #include <pcl/octree/octree.h> #define box_size tf2::Vector3(0.0318f, 0.0636f, 0.091f) +#define R_POS tf2::Vector3(0,0.6525f,0.4425f -0.005f) +#define L_POS tf2::Vector3(0,-0.6525f,0.4425f -0.005f) +#define M_POS tf2::Vector3(0.6525f,0,0.4425f-0.005f) + +struct wing_BP { + tf2::Transform pos_; + tf2::Vector3 size_; + wing_BP(tf2::Transform pos, tf2::Vector3 size) : pos_(pos), size_(size){}; +}; + -class Abstract_mediator{ +class Abstract_mediator { protected: std::vector<Abstract_robot*> robots_; std::vector<std::vector<tf2::Transform>> objects_; std::vector<std::vector<std::vector<tf2::Transform>>> relative_bounds_; ros::Publisher* pub_; std::vector<std::vector<pcl::PointXYZ>> result_vector_; - std::vector<Abstract_robot_element*> wings_; + std::vector<wing_BP> wings_; + public: Abstract_mediator(std::vector<std::vector<tf2::Transform>> objects, ros::Publisher* pub) : objects_(objects), pub_(pub){ - wings_.push_back(new Wing(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0,0.6525f,0.4425f -0.005f)), right)); - wings_.push_back(new Wing(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0,-0.6525f,0.4425f -0.005f)), left)); - wings_.push_back(new Wing(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0.6525f,0,0.4425f-0.005f)), mid)); + wings_.push_back(wing_BP(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0,0.6525f,0.4425f -0.005f)), right)); + wings_.push_back(wing_BP(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0,-0.6525f,0.4425f -0.005f)), left)); + wings_.push_back(wing_BP(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0.6525f,0,0.4425f-0.005f)), mid)); } + inline void connect_robots(Abstract_robot* robot) {robots_.push_back(robot); ROS_INFO("%s connected...", robot->name().c_str());} inline void set_result_vector(std::vector<std::vector<pcl::PointXYZ>>& res) {result_vector_ = res;} + inline std::vector<wing_BP> wings() {return wings_;} inline std::vector<std::vector<pcl::PointXYZ>>& result_vector() {return result_vector_;} + pcl::PointCloud< pcl::PointXYZ >::Ptr vector_to_cloud(std::vector<pcl::PointXYZ>& vector); std::vector<pcl::PointXYZ> generate_Ground(const tf2::Vector3 origin, const float diameter, float resolution); - void add_wing(Robot* robot) { - if (robot->observers().size() == 0){ - Abstract_robot_element* rviz_right = new Wing_rviz_decorator(wings_[0], robot->rviz_markers()[0]); - robot->register_observers(rviz_right); - } else if (robot->observers().size() == 1){ - Abstract_robot_element* rviz_left = new Wing_rviz_decorator(wings_[1], robot->rviz_markers()[0]); - robot->register_observers(rviz_left); - } else if (robot->observers().size() == 2){ - Abstract_robot_element* rviz_mid = new Wing_rviz_decorator(wings_[2], robot->rviz_markers()[0]); - robot->register_observers(rviz_mid); - } else { - ROS_INFO("[Warning] %s got to many wings", robot->name().c_str()); - } - } + virtual bool check_collision( const int& robot)=0; virtual void mediate()=0; + virtual void build_wings(std::bitset<3>& wing,Robot* robot)=0; + }; diff --git a/src/mtc/include/impl/abstract_robot.h b/src/mtc/include/impl/abstract_robot.h index d8ab4d874fe319b91686d42ecc687dd759679e8e..9b41c207260bec0bd70b76fbf448a59cde68ab8a 100644 --- a/src/mtc/include/impl/abstract_robot.h +++ b/src/mtc/include/impl/abstract_robot.h @@ -11,6 +11,17 @@ #define left tf2::Vector3(0.7f, 0.5f, 0.01f) #define mid tf2::Vector3(0.5f, 0.7f, 0.01f) +enum wing_config{ + RML = 7, + RM_ = 6, + R_L = 5, + R__ = 4, + _ML = 3, + _M_ = 2, + __L = 1, + ___ = 0 +}; + class Abstract_robot { protected: std::string name_; @@ -18,6 +29,7 @@ class Abstract_robot { tf2::Transform root_tf_; std::vector<tf2::Transform> bounds_; std::vector<tf2::Transform> robot_root_bounds_; + std::bitset<3> observer_mask_; @@ -35,7 +47,10 @@ class Abstract_robot { robot_root_bounds_.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(-0.113f, -0.095f, 0))); robot_root_bounds_.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0.113f, -0.095f, 0))); + observer_mask_ = std::bitset<3>(0); + }; + inline std::string& name() { return name_;} inline tf2::Transform& tf() { return tf_;} inline tf2::Transform& root_tf() { return root_tf_;} @@ -43,6 +58,9 @@ class Abstract_robot { inline std::vector<tf2::Transform>& robot_root_bounds() { return robot_root_bounds_;} inline void rotate(float deg) {tf2::Quaternion rot; rot.setRPY(0,0,deg); tf2::Transform t(rot, tf2::Vector3(0,0,0)); tf_= tf_* t;} inline void translate(tf2::Vector3 t) {tf2::Transform tf(tf2::Quaternion(0,0,0,1), t); tf_*=tf;} + inline std::bitset<3> observer_mask() {return observer_mask_;} + inline void set_observer_mask(int i) {observer_mask_ = std::bitset<3>(i);} + virtual void notify()= 0; virtual bool check_single_object_collision(tf2::Transform& obj)= 0; diff --git a/src/mtc/include/impl/abstract_robot_element.h b/src/mtc/include/impl/abstract_robot_element.h index 7d77c0578e53b46026d521148a6b1fd2117dd025..b10e1c25443fdadb6cabae74647a5bff1b41c567 100644 --- a/src/mtc/include/impl/abstract_robot_element.h +++ b/src/mtc/include/impl/abstract_robot_element.h @@ -13,6 +13,7 @@ class Abstract_robot_element { public: Abstract_robot_element() = default; + inline void set_relative_tf(tf2::Transform tf) { relative_tf_= tf;} inline tf2::Transform& relative_tf(){ return relative_tf_;} inline void calc_world_tf(tf2::Transform& tf) {world_tf_= tf * relative_tf_;} diff --git a/src/mtc/include/impl/abstract_robot_element_decorator.h b/src/mtc/include/impl/abstract_robot_element_decorator.h index eb16b2b1ffc230d7d0fb37c9e1eb136cf2346bd1..e7845413efb32618c641d7a79e343e3681df7a6f 100644 --- a/src/mtc/include/impl/abstract_robot_element_decorator.h +++ b/src/mtc/include/impl/abstract_robot_element_decorator.h @@ -11,9 +11,10 @@ class Abstract_robot_element_decorator : public Abstract_robot_element{ public: Abstract_robot_element_decorator(Abstract_robot_element* next) : next_(next){}; + inline Abstract_robot_element* wing() { return next_;} - void update(tf2::Transform& tf) override {next_->update(tf);} + void update(tf2::Transform& tf) override {next_->update(tf);} virtual void input_filter(tf2::Transform& tf)=0; virtual void output_filter()=0; }; diff --git a/src/mtc/include/impl/field.h b/src/mtc/include/impl/field.h index 606ef6f80446b71e77b6a6492822e2355ebe5603..9fbec3090d7cb1465d4af68f0b72e1550f7c6074 100644 --- a/src/mtc/include/impl/field.h +++ b/src/mtc/include/impl/field.h @@ -7,6 +7,7 @@ class Field : public Abstract_robot_element{ public: Field(tf2::Transform tf){ relative_tf_ = tf;} + void update(tf2::Transform& tf) override {this->calc_world_tf(tf);} }; diff --git a/src/mtc/include/impl/field_rviz_decorator.h b/src/mtc/include/impl/field_rviz_decorator.h index ef352eeea4225c24cc435b7215bb407ea227a752..254c6cc0938f09c068da879dac6a81fa8b71b61d 100644 --- a/src/mtc/include/impl/field_rviz_decorator.h +++ b/src/mtc/include/impl/field_rviz_decorator.h @@ -13,8 +13,10 @@ class Field_rviz_decorator : public Abstract_robot_element_decorator{ public: Field_rviz_decorator(Abstract_robot_element* next, visualization_msgs::MarkerArray* markers) : Abstract_robot_element_decorator(next), markers_(markers){}; + inline void set_markers(visualization_msgs::MarkerArray* markers) { markers_= markers;} inline visualization_msgs::MarkerArray* markers() { return markers_;} + void update(tf2::Transform& tf) override; void input_filter(tf2::Transform& tf) override; void output_filter() override; diff --git a/src/mtc/include/impl/map_loader.h b/src/mtc/include/impl/map_loader.h index e73ab705b922020788a05ddd088f5e3a4690db34..2e9c208049322f55792e027130b1149ceb86c83f 100644 --- a/src/mtc/include/impl/map_loader.h +++ b/src/mtc/include/impl/map_loader.h @@ -2,7 +2,7 @@ #define MAP_LOADER_ #include "ros/ros.h" -#include "abstract_map_loader.h" +#include "impl/abstract_map_loader.h" #include <regex> diff --git a/src/mtc/include/impl/mediator.h b/src/mtc/include/impl/mediator.h index 87eacd85b74bb582049b56f373d814999c171c12..c1389289e7dc1482293d26627f8629b6d7e446f3 100644 --- a/src/mtc/include/impl/mediator.h +++ b/src/mtc/include/impl/mediator.h @@ -1,7 +1,10 @@ #ifndef MEDIATOR_ #define MEDIATOR_ -#include "ros/ros.h" +#include <ros/ros.h> +#include <ros/package.h> +#include <yaml-cpp/yaml.h> +#include <fstream> #include "impl/abstract_mediator.h" #include "impl/abstract_robot.h" #include "impl/robot.h" @@ -12,12 +15,15 @@ class Mediator : public Abstract_mediator{ public: Mediator(std::vector<std::vector<tf2::Transform>> objects, ros::Publisher* pub) : Abstract_mediator(objects, pub){}; - bool check_collision(const int& robot) override; - void mediate() override; pcl::PointCloud< pcl::PointXYZ >::Ptr vector_to_cloud(std::vector<pcl::PointXYZ>& vector); std::vector<pcl::PointXYZ> generate_Ground(const tf2::Vector3 origin, const float diameter, float resolution); - void approximation(Robot* ceti1); + void approximation(Robot* robot, int& wings, std::vector<std::pair<std::pair<tf2::Transform, int>, std::vector<std::pair<tf2::Transform, int>>>>& dict); + void write_file(std::vector<std::pair<std::pair<tf2::Transform, int>, std::vector<std::pair<tf2::Transform, int>>>>& dict); + + bool check_collision(const int& robot) override; + void mediate() override; + void build_wings(std::bitset<3>& wings, Robot* robot) override; }; diff --git a/src/mtc/include/impl/moveit_mediator.h b/src/mtc/include/impl/moveit_mediator.h new file mode 100644 index 0000000000000000000000000000000000000000..766473719a260f56b0143def624782762f42f35f --- /dev/null +++ b/src/mtc/include/impl/moveit_mediator.h @@ -0,0 +1,43 @@ +#ifndef MOVEIT_MEDIATOR_ +#define MOVEIT_MEDIATOR_ + +#include <ros/ros.h> + +#include <moveit/planning_scene_interface/planning_scene_interface.h> +#include <moveit/move_group_interface/move_group_interface.h> +#include <moveit_msgs/ApplyPlanningScene.h> +#include <moveit/planning_scene/planning_scene.h> +#include <moveit/robot_model_loader/robot_model_loader.h> +#include <moveit/kinematic_constraints/utils.h> + +#include "impl/abstract_mediator.h" +#include "impl/abstract_robot.h" +#include "impl/robot.h" +#include "impl/moveit_robot.h" + +class Moveit_mediator : public Abstract_mediator{ + protected: + ros::NodeHandle nh_; + ros::Publisher collision_object_publisher_; + ros::Publisher planning_scene_diff_publisher_; + robot_model_loader::RobotModelLoader* robot_model_loader_; + robot_model::RobotModelPtr kinematic_model_; + planning_scene::PlanningScene* ps_; + + public: + Moveit_mediator(std::vector<std::vector<tf2::Transform>> objects, ros::Publisher* pub, ros::NodeHandle nh) : Abstract_mediator(objects, pub), nh_(nh){ + collision_object_publisher_ = nh.advertise<moveit_msgs::CollisionObject>("collision_object", 1); + planning_scene_diff_publisher_ = nh.advertise<moveit_msgs::PlanningScene>("planning_scene", 1); + }; + + bool check_collision(const int& robot) override; + void mediate() override; + void build_wings(std::bitset<3>& wing,Robot* robot) override; + + void publish_tables(); + void load_robot_description(); + + +}; + +#endif \ No newline at end of file diff --git a/src/mtc/include/impl/moveit_robot.h b/src/mtc/include/impl/moveit_robot.h new file mode 100644 index 0000000000000000000000000000000000000000..2b3aa8c2cf0a7dff6587653031162e33e467ed05 --- /dev/null +++ b/src/mtc/include/impl/moveit_robot.h @@ -0,0 +1,20 @@ +#ifndef MOVEIT_ROBOT_ +#define MOVEIT_ROBOT_ + +#include <ros/ros.h> +#include "impl/robot.h" + + +class Moveit_robot : public Robot{ + private: + moveit::planning_interface::MoveGroupInterface* mgi_; + + public: + Moveit_robot(std::string name, tf2::Transform tf) : Robot(name, tf){ + mgi_ = new moveit::planning_interface::MoveGroupInterface(name); + } + + +}; + +#endif \ No newline at end of file diff --git a/src/mtc/include/impl/robot.h b/src/mtc/include/impl/robot.h index e4c347187620c820f092be3a9d2d4dfd3f34684d..1a51167293167190d195c28ebed3ad899461dbea 100644 --- a/src/mtc/include/impl/robot.h +++ b/src/mtc/include/impl/robot.h @@ -9,147 +9,43 @@ #include "impl/wing_rviz_decorator.h" #include "impl/field.h" +#include <moveit/planning_scene_interface/planning_scene_interface.h> +#include <moveit/move_group_interface/move_group_interface.h> +#include <moveit_msgs/ApplyPlanningScene.h> +#include <moveit/robot_model_loader/robot_model_loader.h> +#include <moveit/planning_scene/planning_scene.h> +#include <moveit/kinematic_constraints/utils.h> class Robot : public Abstract_robot{ protected: std::vector<Abstract_robot_element*> observers_; std::vector<Abstract_robot_element*> access_fields_; std::vector<visualization_msgs::MarkerArray*> rviz_markers_; - + std::vector<moveit_msgs::CollisionObject*> coll_markers_; public: Robot(std::string name, tf2::Transform tf) : Abstract_robot(name, tf){ generate_access_fields(); } - - void generate_access_fields(){ - for (int i = 0; i <= 2; i++){ - for (int j = 0; j <= 2; j++){ - if(i == 0 && j == 0) {continue;} - if(i == 2 && j == 2) {continue;} - if(i == 0) { - - access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0,0.8f*j,0)))); - access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0,-0.8f*j,0)))); - } else if (j == 0){ - access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0.8f*i,0,0)))); - access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(-0.8f*i,0,0)))); - } else { - access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0.8f*i,0.8f*j,0)))); - access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(-0.8f*i,0.8f*j,0)))); - access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0.8f*i,-0.8f*j,0)))); - access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(-0.8f*i,-0.8f*j,0)))); - } - - }; - }; - } - + inline void add_rviz_markers(visualization_msgs::MarkerArray* marker) {rviz_markers_.push_back(marker);} inline std::vector<visualization_msgs::MarkerArray*> rviz_markers(){return rviz_markers_;} - inline float area_calculation(tf2::Transform& A, tf2::Transform& B, tf2::Transform& C){ - return std::abs( - (B.getOrigin().getX() * A.getOrigin().getY()) - (A.getOrigin().getX() * B.getOrigin().getY()) + - (C.getOrigin().getX() * B.getOrigin().getY()) - (B.getOrigin().getX() * C.getOrigin().getY()) + - (A.getOrigin().getX() * C.getOrigin().getY()) - (C.getOrigin().getX() * A.getOrigin().getY()))*0.5f; - } - - - void notify() override {for(Abstract_robot_element* wing : observers_) wing->update(tf_); for(Abstract_robot_element* field : access_fields_) field->update(tf_);} - bool check_single_object_collision(tf2::Transform& obj) override { - - tf2::Transform A = tf_ * root_tf_ * robot_root_bounds_[0]; - tf2::Transform B = tf_ * root_tf_ * robot_root_bounds_[1]; - tf2::Transform C = tf_ * root_tf_ * robot_root_bounds_[2]; - tf2::Transform D = tf_ * root_tf_ * robot_root_bounds_[3]; - - float full_area = area_calculation(A,B,C) + area_calculation(A,D,C); - float sum = area_calculation(A,obj,D) + area_calculation(D,obj,C) + area_calculation(C,obj,B) + area_calculation(obj, B, A); - if ((std::floor(sum*100)/100.f) <= full_area) {return false; } - - - for (int i = 0; i < bounds_.size(); i++){ - tf2::Transform A = tf_ * bounds_[0]; - tf2::Transform B = tf_ * bounds_[1]; - tf2::Transform C = tf_ * bounds_[2]; - tf2::Transform D = tf_ * bounds_[3]; - - full_area = area_calculation(A,B,C) + area_calculation(A,D,C); - sum = area_calculation(A,obj,D) + area_calculation(D,obj,C) + area_calculation(C,obj,B) + area_calculation(obj, B, A); + inline std::vector<Abstract_robot_element*>& observers() { return observers_;} + inline std::vector<Abstract_robot_element*>& access_fields() { return access_fields_;} + inline void add_coll_markers(moveit_msgs::CollisionObject* marker) {coll_markers_.push_back(marker);} + inline std::vector<moveit_msgs::CollisionObject*> coll_markers(){ return coll_markers_;} - if ((std::floor(sum*100)/100.f) <= full_area) return true; - } + void register_observers(Abstract_robot_element* wd); + void reset(); + void generate_access_fields(); + float area_calculation(tf2::Transform& A, tf2::Transform& B, tf2::Transform& C); - if (!observers_.empty()){ - std::vector<Abstract_robot_element*>::const_iterator it = observers_.begin(); - while (it != observers_.end()) { - Abstract_robot_element_decorator *deco = dynamic_cast<Abstract_robot_element_decorator*>(*it); - Wing* ceti = dynamic_cast<Wing*>(deco->wing()); - tf2::Transform A = ceti->world_tf() * ceti->bounds()[0]; - tf2::Transform B = ceti->world_tf() * ceti->bounds()[1]; - tf2::Transform C = ceti->world_tf() * ceti->bounds()[2]; - tf2::Transform D = ceti->world_tf() * ceti->bounds()[3]; - - full_area = area_calculation(A,B,C) + area_calculation(A,D,C); - sum = area_calculation(A,obj,D) + area_calculation(D,obj,C) + area_calculation(C,obj,B) + area_calculation(obj, B, A); + bool check_single_object_collision(tf2::Transform& obj) override; + void notify() override; - if ((std::floor(sum*100)/100.f) <= full_area) { - return true; - } else { - ++it; - } - } - } - return false; - } - void reset(){ - observers_.clear(); - access_fields_.clear(); - generate_access_fields(); - tf_ = tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0,0,0.4425f)); - } - - - inline std::vector<Abstract_robot_element*>& observers() { return observers_;} - inline std::vector<Abstract_robot_element*>& access_fields() { return access_fields_;} - void register_observers(Abstract_robot_element* wd){ - Abstract_robot_element_decorator* decorator = dynamic_cast<Abstract_robot_element_decorator*>(wd); - observers_.push_back(wd); - std::vector<tf2::Transform> plane; - bool found = false; - int index = 0; - if (decorator->wing()->relative_tf().getOrigin().getY()>0){ - for(int i = 0; i < access_fields_.size(); i++){ - if ((access_fields_[i]->relative_tf().getOrigin().getY() > 0) && (access_fields_[i]->relative_tf().getOrigin().getX() == 0)){ - found = true; - index = i; - break; - } - } - if(found) {access_fields_.erase(access_fields_.begin() + index); return;} - } else if (decorator->wing()->relative_tf().getOrigin().getY()<0) { - for(int i = 0; i < access_fields_.size(); i++){ - if ((access_fields_[i]->relative_tf().getOrigin().getY() < 0) && (access_fields_[i]->relative_tf().getOrigin().getX() == 0)){ - found = true; - index = i; - break; - } - } - if(found) {access_fields_.erase(access_fields_.begin() + index); return;} - } else { - for(int i = 0; i < access_fields_.size(); i++){ - if (access_fields_[i]->relative_tf().getOrigin().getX() > 0){ - found = true; - index = i; - break; - } - } - if(found) {access_fields_.erase(access_fields_.begin() + index); return;} - } - }; }; diff --git a/src/mtc/include/impl/wing_moveit_decorator.h b/src/mtc/include/impl/wing_moveit_decorator.h new file mode 100644 index 0000000000000000000000000000000000000000..0db53ef50ad7b92747a87dea705277a658db2aa5 --- /dev/null +++ b/src/mtc/include/impl/wing_moveit_decorator.h @@ -0,0 +1,29 @@ +#ifndef WING_MOVEIT_DECORATOR_ +#define WING_MOVEIT_DECORATOR_ + +#include <ros/ros.h> +#include "impl/wing.h" +#include "impl/abstract_robot_element_decorator.h" + +#include <moveit/planning_scene_interface/planning_scene_interface.h> +#include <moveit/move_group_interface/move_group_interface.h> +#include <moveit_msgs/ApplyPlanningScene.h> +#include <moveit/planning_scene/planning_scene.h> + +class Wing_moveit_decorator : public Abstract_robot_element_decorator{ + private: + moveit_msgs::CollisionObject* markers_; + + + public: + Wing_moveit_decorator(Abstract_robot_element* next, moveit_msgs::CollisionObject* markers) : Abstract_robot_element_decorator(next), markers_(markers){}; + inline void set_markers(moveit_msgs::CollisionObject* markers) { markers_= markers;} + inline moveit_msgs::CollisionObject* markers() { return markers_;} + + void update(tf2::Transform& tf) override; + void input_filter(tf2::Transform& tf) override; + void output_filter() override; +}; + + +#endif \ No newline at end of file diff --git a/src/mtc/include/mtc2taskspace.h b/src/mtc/include/mtc2taskspace.h index af645f13e38a7d4bd29c52fbe38366ada9f65d9c..9a7327ded050e740b181d9bf4cabfd602f72e808 100644 --- a/src/mtc/include/mtc2taskspace.h +++ b/src/mtc/include/mtc2taskspace.h @@ -1,14 +1,16 @@ #ifndef MTC2TASKSPACE_H #define MTC2TASKSPACE_H -#include "ros/ros.h" +#include <ros/ros.h> #include <ros/package.h> +#include <yaml-cpp/yaml.h> +#include <fstream> + + #include "std_msgs/String.h" #include <tf/transform_broadcaster.h> #include <regex> -#include "yaml-cpp/yaml.h" #include <xmlrpcpp/XmlRpc.h> -#include <fstream> #endif diff --git a/src/mtc/launch/cell_routine.launch b/src/mtc/launch/cell_routine.launch new file mode 100644 index 0000000000000000000000000000000000000000..d394fd582456818ddba30e976e7927fbd34243b3 --- /dev/null +++ b/src/mtc/launch/cell_routine.launch @@ -0,0 +1,7 @@ +<launch> + <!--<include file="$(find panda_moveit_config)/launch/demo.launch"></include> --> + <include file="$(find ceti_double)/launch/demo.launch"> + </include> + + <node pkg="mtc" type="cell_routine" name="cell_routine" output="screen" required="true"/> +</launch> \ No newline at end of file diff --git a/src/mtc/src/base_routine.cpp b/src/mtc/src/base_routine.cpp index 1933442b8ecfea7adbe294fd7e27c1d8cb0d1e84..532c2c16d2aadf449f455fc18116be38ab2ca08a 100644 --- a/src/mtc/src/base_routine.cpp +++ b/src/mtc/src/base_routine.cpp @@ -14,13 +14,7 @@ #include "impl/base_by_rotation.h" #include <xmlrpcpp/XmlRpc.h> -#include "impl/abstract_mediator.cpp" -#include "impl/base_by_rotation.cpp" -#include "impl/field_rviz_decorator.cpp" -#include "impl/map_loader.cpp" -#include "impl/mediator.cpp" -#include "impl/wing_rviz_decorator.cpp" - +// cpp inputs ,,, int main(int argc, char **argv){ ros::init(argc, argv, "base_routine"); @@ -50,6 +44,7 @@ int main(int argc, char **argv){ Abstract_robot* robo = new Robot(std::string("Robot_arm1"), tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0,0,0.4425f))); Robot* ceti = dynamic_cast<Robot*>(robo); + ceti->set_observer_mask(wing_config::RML); ceti->add_rviz_markers(wings1); ceti->add_rviz_markers(fields1); diff --git a/src/mtc/src/cell_routine.cpp b/src/mtc/src/cell_routine.cpp new file mode 100644 index 0000000000000000000000000000000000000000..752f3d6d9f19cb8acf08895a703ba27345142361 --- /dev/null +++ b/src/mtc/src/cell_routine.cpp @@ -0,0 +1,54 @@ +#include "impl/abstract_robot.h" +#include "impl/abstract_robot_element.h" +#include "impl/abstract_robot_element_decorator.h" +#include "impl/abstract_mediator.h" +#include "impl/moveit_mediator.h" +#include "impl/wing_moveit_decorator.h" +#include "impl/wing.h" +#include "impl/moveit_robot.h" +#include <xmlrpcpp/XmlRpc.h> + +int main(int argc, char **argv){ + ros::init(argc, argv, "cell_routine"); + ros::NodeHandle nh; + ros::AsyncSpinner spinner(1); + spinner.start(); + + std::vector<std::vector<tf2::Transform>> objects; //in progress + ros::Publisher* pub = new ros::Publisher(nh.advertise< visualization_msgs::MarkerArray >("visualization_marker_array", 1)); //refractor + + Abstract_mediator* mediator = new Moveit_mediator(objects, pub, nh); + Moveit_mediator* moveit_mediator = dynamic_cast<Moveit_mediator*>(mediator); + + moveit_mediator->load_robot_description(); + + Abstract_robot* robo1 = new Moveit_robot(std::string("panda_arm1"), tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(1,0,0.4425f))); + Abstract_robot* robo2 = new Moveit_robot(std::string("panda_arm2"), tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(-1,0,0.4425f))); + robo1->set_observer_mask(wing_config::RML); + robo2->set_observer_mask(wing_config::RML); + + + + mediator->connect_robots(robo1); + mediator->connect_robots(robo2); + + + + Moveit_robot* ceti1 = dynamic_cast<Moveit_robot*>(robo1); + Moveit_robot* ceti2 = dynamic_cast<Moveit_robot*>(robo2); + + + std::bitset<3> i = 7; + moveit_mediator->build_wings(i, ceti1); + moveit_mediator->build_wings(i, ceti2); + + ceti1->notify(); + ceti2->notify(); + moveit_mediator->publish_tables(); + + + + while (ros::ok()){ + ros::spinOnce(); + } +} \ No newline at end of file diff --git a/src/mtc/src/impl/abstract_mediator.cpp b/src/mtc/src/impl/abstract_mediator.cpp index fc6b6c21a5c92da41d4378c5da7f9f6c4a3b67e0..1b169411b60a4f69f6a49a210a13303b90eb01c8 100644 --- a/src/mtc/src/impl/abstract_mediator.cpp +++ b/src/mtc/src/impl/abstract_mediator.cpp @@ -19,4 +19,4 @@ pcl::PointCloud< pcl::PointXYZ >::Ptr Abstract_mediator::vector_to_cloud(std::ve task_voxel->push_back(point); return task_voxel; -} \ No newline at end of file +} diff --git a/src/mtc/src/impl/map_loader.cpp b/src/mtc/src/impl/map_loader.cpp index 268208bbbce9cf81fb03af505c95bcc16eedaced..785247636fb9e9b7ad21923a4523f5c5c6a589a8 100644 --- a/src/mtc/src/impl/map_loader.cpp +++ b/src/mtc/src/impl/map_loader.cpp @@ -1,5 +1,3 @@ -#include <ros/ros.h> -#include "impl/abstract_map_loader.h" #include "impl/map_loader.h" diff --git a/src/mtc/src/impl/mediator.cpp b/src/mtc/src/impl/mediator.cpp index 90a54184effe09e1a3a50b1575dea952d72b2ac4..60f09ad52946e5ef95eaeade84120384afb49f00 100644 --- a/src/mtc/src/impl/mediator.cpp +++ b/src/mtc/src/impl/mediator.cpp @@ -1,5 +1,6 @@ #include "impl/mediator.h" -#include "impl/abstract_mediator.h" + +#include "impl/wing_rviz_decorator.h" @@ -64,54 +65,16 @@ void Mediator::mediate(){ if(objects_[0][i].getOrigin().distance(objects_[1].back().getOrigin()) == 0) objects_[1].pop_back(); } - /* - for (int i = 0; i < result_vector_.size();i++){ - result_clouds.push_back(pcl::octree::OctreePointCloudSearch< pcl::PointXYZ >(0.4f)); - result_clouds[i].setInputCloud(Abstract_mediator::vector_to_cloud(result_vector_[i])); - result_clouds[i].addPointsFromInputCloud(); - std::vector<tf2::Transform> ground_per_robot; - for(pcl::PointXYZ& p : grCenter){ - double min_x, min_y, min_z, max_x, max_y, max_z; - result_clouds[i].getBoundingBox(min_x, min_y, min_z, max_x, max_y, max_z); - bool isInBox = (p.x >= min_x && p.x <= max_x) && (p.y >= min_y && p.y <= max_y) && (p.z >= min_z && p.z <= max_z); - if (isInBox && result_clouds[i].isVoxelOccupiedAtPoint(p)) { - std::vector< int > pointIdxVec; - if (result_clouds[i].voxelSearch(p, pointIdxVec)) ground_per_robot.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(p.x, p.y, p.z))); - } - } - filter_per_robot.push_back(ground_per_robot); - } + std::vector<std::pair<std::pair<tf2::Transform, int>, std::vector<std::pair<tf2::Transform, int>>>> dict; ros::Rate loop_rate(10); - for (int x = 0; x < robots_.size(); x++){ - Robot* ceti = dynamic_cast<Robot*>(robots_[x]); - for (int i = 0; i < filter_per_robot[x].size(); i++){ - robots_[x]->set_tf(filter_per_robot[x][i]); - for ( float p = 0; p < 2*M_PI; p += 0.0872665f){ - for (visualization_msgs::MarkerArray* markers : ceti->rviz_markers()) markers->markers.clear(); - rviz_markers_->markers.clear(); - ceti->rotate(0.0872665f); - ceti->notify(); - if (check_collision(x)) { - ROS_INFO("robot %i found its position", x); - - } else { - continue; - } - for (visualization_msgs::MarkerArray* markers : ceti->rviz_markers())pub_->publish(*markers); - pub_->publish(*rviz_markers_); - loop_rate.sleep(); - } + Robot* ceti1 = dynamic_cast<Robot*>(robots_[0]); - } - } - */ + for(int j = 0; j <= 7; j++){ + std::bitset<3> wing_config(j); + build_wings(wing_config, ceti1); - - ros::Rate loop_rate(10); - Robot* ceti1 = dynamic_cast<Robot*>(robots_[0]); - for(int j = 0; j <= 3; j++){ for (int i = 0; i < ground_per_robot.size(); i++){ robots_[0]->set_tf(ground_per_robot[i]); for ( float p = 0; p < 2*M_PI; p += 0.0872665f){ @@ -119,20 +82,32 @@ void Mediator::mediate(){ rviz_markers_->markers.clear(); ceti1->rotate(0.0872665f); ceti1->notify(); + bool temp = check_collision(0); + /* if (check_collision(0)){ - approximation(ceti1); + approximation(ceti1, j, dict); } else { continue; } + */ for (visualization_msgs::MarkerArray* markers : ceti1->rviz_markers())pub_->publish(*markers); pub_->publish(*rviz_markers_); } } - add_wing(ceti1); + ceti1->reset(); + } + + if (dict.empty()){ + ROS_INFO("unfortunately, no result is found..."); + return; + } else { + ROS_INFO("write data to file..."); + } + } -void Mediator::approximation(Robot* robot){ +void Mediator::approximation(Robot* robot, int& wings, std::vector<std::pair<std::pair<tf2::Transform, int>, std::vector<std::pair<tf2::Transform, int>>>>& dict){ ros::Rate loop_rate(1); std::vector<pcl::PointXYZ> relative_ground; pcl::octree::OctreePointCloudSearch< pcl::PointXYZ > cloud(0.4f); @@ -140,7 +115,12 @@ void Mediator::approximation(Robot* robot){ cloud.addPointsFromInputCloud(); Robot* ceti = dynamic_cast<Robot*>(robots_[1]); - for (int i = 0; i <= 3; i++){ + std::vector<std::pair<tf2::Transform, int>> second_robot_data; + + for (int i = 0; i <= 7; i++){ + std::bitset<3> wing_config(i); + build_wings(wing_config, ceti); + for (Abstract_robot_element* fields : robot->access_fields()) { ceti->set_tf(fields->world_tf()); for ( float p = 0; p < 2*M_PI; p += M_PI/2){ @@ -148,6 +128,7 @@ void Mediator::approximation(Robot* robot){ ceti->notify(); if (check_collision(1)) { ROS_INFO("should work"); + second_robot_data.push_back(std::pair<tf2::Transform, int>(ceti->tf(), i)); } else { continue; } @@ -155,9 +136,49 @@ void Mediator::approximation(Robot* robot){ } //relative_ground.push_back(pcl::PointXYZ(fields->world_tf().getOrigin().getX(), fields->world_tf().getOrigin().getY(), fields->world_tf().getOrigin().getZ())); } - add_wing(ceti); + ceti->reset(); } + std::pair<tf2::Transform, int> ceti1(robot->tf(), wings); + dict.push_back(std::pair<std::pair<tf2::Transform, int>, std::vector<std::pair<tf2::Transform, int>>>(ceti1, second_robot_data)); ceti->reset(); } +void Mediator::write_file(std::vector<std::pair<std::pair<tf2::Transform, int>, std::vector<std::pair<tf2::Transform, int>>>>& dict){ + /* + + std::ofstream o(ros::package::getPath("mtc") + "/results/dummy.yaml"); + YAML::Node node; + + + + + for(tf2::Vector3& vec : robot_1){ + node["task"]["groups"]["robot_x"].push_back(std::to_string((float)vec.getX())+ " " + std::to_string((float) vec.getY()) + " " + std::to_string((float)vec.getZ())); + } + + ROS_INFO("writing items for robot2..."); + for(tf2::Vector3& vec : robot_2){ + node["task"]["groups"]["robot_y"].push_back(std::to_string((float)vec.getX())+ " " + std::to_string((float) vec.getY()) + " " + std::to_string((float)vec.getZ())); + } + + ROS_INFO("writing intersection..."); + for(tf2::Vector3& vec : robot_middle){ + node["task"]["groups"]["robot_x"].push_back(std::to_string((float)vec.getX())+ " " + std::to_string((float) vec.getY()) + " " + std::to_string((float)vec.getZ()));; + node["task"]["groups"]["robot_y"].push_back(std::to_string((float)vec.getX())+ " " + std::to_string((float) vec.getY()) + " " + std::to_string((float)vec.getZ()));; + } + o << node; + */ +} + +void Mediator::build_wings(std::bitset<3>& wing, Robot* robot){ + + std::bitset<3> result = robot->observer_mask() & wing; + for (int i = 0; i < result.size(); i++){ + ROS_INFO( "%i", i); + if (result[i]){ + Abstract_robot_element* moveit_right = new Wing_rviz_decorator(new Wing(wings_[i].pos_, wings_[i].size_), robot->rviz_markers()[0]); + robot->register_observers(moveit_right); + } + } +} diff --git a/src/mtc/src/impl/moveit_mediator.cpp b/src/mtc/src/impl/moveit_mediator.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5e344327d44739c22b40a54d927c474771ffcc80 --- /dev/null +++ b/src/mtc/src/impl/moveit_mediator.cpp @@ -0,0 +1,43 @@ +#include "impl/moveit_mediator.h" +#include "impl/wing_moveit_decorator.h" + + +void Moveit_mediator::publish_tables(){ + ros::WallDuration sleep_time(1.0); + + moveit_msgs::PlanningScene planning_scene; + planning_scene.is_diff = true; + + for(int i = 0; i < robots_.size();i++){ + Moveit_robot* ceti = dynamic_cast<Moveit_robot*>(robots_[i]); + for (moveit_msgs::CollisionObject* markers : ceti->coll_markers()) { + planning_scene.world.collision_objects.push_back(*markers); + sleep_time.sleep(); + } + } + + + planning_scene_diff_publisher_.publish(planning_scene); + +} + +void Moveit_mediator::load_robot_description(){ + robot_model_loader_ = new robot_model_loader::RobotModelLoader("robot_description"); + kinematic_model_ = robot_model_loader_->getModel(); + ps_ = new planning_scene::PlanningScene(kinematic_model_); +} + +bool Moveit_mediator::check_collision(const int& robot){return true;}; +void Moveit_mediator::mediate(){}; + +void Moveit_mediator::build_wings(std::bitset<3>& wing, Robot* robot){ + std::bitset<3> result = robot->observer_mask() & wing; + for (int i = 0; i < result.size(); i++){ + if (result[i]){ + moveit_msgs::CollisionObject* marker = new moveit_msgs::CollisionObject(); + robot->add_coll_markers(marker); + Abstract_robot_element* moveit_right = new Wing_moveit_decorator(new Wing(wings_[i].pos_, wings_[i].size_), marker); + robot->register_observers(moveit_right); + } + } +} \ No newline at end of file diff --git a/src/mtc/src/impl/robot.cpp b/src/mtc/src/impl/robot.cpp new file mode 100644 index 0000000000000000000000000000000000000000..409862028cbb68ddc6bd5493028f237526a070f3 --- /dev/null +++ b/src/mtc/src/impl/robot.cpp @@ -0,0 +1,129 @@ +#include "impl/robot.h" + +void Robot::generate_access_fields(){ + for (int i = 0; i <= 2; i++){ + for (int j = 0; j <= 2; j++){ + if(i == 0 && j == 0) {continue;} + if(i == 2 && j == 2) {continue;} + if(i == 0) { + + access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0,0.8f*j,0)))); + access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0,-0.8f*j,0)))); + } else if (j == 0){ + access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0.8f*i,0,0)))); + access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(-0.8f*i,0,0)))); + } else { + access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0.8f*i,0.8f*j,0)))); + access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(-0.8f*i,0.8f*j,0)))); + access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0.8f*i,-0.8f*j,0)))); + access_fields_.push_back(new Field(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(-0.8f*i,-0.8f*j,0)))); + } + + }; + }; +} + +float Robot::area_calculation(tf2::Transform& A, tf2::Transform& B, tf2::Transform& C){ + return std::abs( + (B.getOrigin().getX() * A.getOrigin().getY()) - (A.getOrigin().getX() * B.getOrigin().getY()) + + (C.getOrigin().getX() * B.getOrigin().getY()) - (B.getOrigin().getX() * C.getOrigin().getY()) + + (A.getOrigin().getX() * C.getOrigin().getY()) - (C.getOrigin().getX() * A.getOrigin().getY()))*0.5f; +} + +bool Robot::check_single_object_collision(tf2::Transform& obj){ + + tf2::Transform A = tf_ * root_tf_ * robot_root_bounds_[0]; + tf2::Transform B = tf_ * root_tf_ * robot_root_bounds_[1]; + tf2::Transform C = tf_ * root_tf_ * robot_root_bounds_[2]; + tf2::Transform D = tf_ * root_tf_ * robot_root_bounds_[3]; + + float full_area = area_calculation(A,B,C) + area_calculation(A,D,C); + float sum = area_calculation(A,obj,D) + area_calculation(D,obj,C) + area_calculation(C,obj,B) + area_calculation(obj, B, A); + if ((std::floor(sum*100)/100.f) <= full_area) {return false; } + + + for (int i = 0; i < bounds_.size(); i++){ + tf2::Transform A = tf_ * bounds_[0]; + tf2::Transform B = tf_ * bounds_[1]; + tf2::Transform C = tf_ * bounds_[2]; + tf2::Transform D = tf_ * bounds_[3]; + + full_area = area_calculation(A,B,C) + area_calculation(A,D,C); + sum = area_calculation(A,obj,D) + area_calculation(D,obj,C) + area_calculation(C,obj,B) + area_calculation(obj, B, A); + + + if ((std::floor(sum*100)/100.f) <= full_area) return true; + } + + if (!observers_.empty()){ + std::vector<Abstract_robot_element*>::const_iterator it = observers_.begin(); + while (it != observers_.end()) { + Abstract_robot_element_decorator *deco = dynamic_cast<Abstract_robot_element_decorator*>(*it); + Wing* ceti = dynamic_cast<Wing*>(deco->wing()); + tf2::Transform A = ceti->world_tf() * ceti->bounds()[0]; + tf2::Transform B = ceti->world_tf() * ceti->bounds()[1]; + tf2::Transform C = ceti->world_tf() * ceti->bounds()[2]; + tf2::Transform D = ceti->world_tf() * ceti->bounds()[3]; + + full_area = area_calculation(A,B,C) + area_calculation(A,D,C); + sum = area_calculation(A,obj,D) + area_calculation(D,obj,C) + area_calculation(C,obj,B) + area_calculation(obj, B, A); + + if ((std::floor(sum*100)/100.f) <= full_area) { + return true; + } else { + ++it; + } + } + } + return false; +} + +void Robot::reset(){ + observers_.clear(); + access_fields_.clear(); + + generate_access_fields(); + tf_ = tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0,0,0.4425f)); +} + +void Robot::notify(){ + for(Abstract_robot_element* wing : observers_) wing->update(tf_); for(Abstract_robot_element* field : access_fields_) field->update(tf_); +} + + +void Robot::register_observers(Abstract_robot_element* wd){ + Abstract_robot_element_decorator* decorator = dynamic_cast<Abstract_robot_element_decorator*>(wd); + observers_.push_back(wd); + std::vector<tf2::Transform> plane; + bool found = false; + int index = 0; + + if (decorator->wing()->relative_tf().getOrigin().getY()>0){ + for(int i = 0; i < access_fields_.size(); i++){ + if ((access_fields_[i]->relative_tf().getOrigin().getY() > 0) && (access_fields_[i]->relative_tf().getOrigin().getX() == 0)){ + found = true; + index = i; + break; + } + } + if(found) {access_fields_.erase(access_fields_.begin() + index); return;} + } else if (decorator->wing()->relative_tf().getOrigin().getY()<0) { + for(int i = 0; i < access_fields_.size(); i++){ + if ((access_fields_[i]->relative_tf().getOrigin().getY() < 0) && (access_fields_[i]->relative_tf().getOrigin().getX() == 0)){ + found = true; + index = i; + break; + } + } + if(found) {access_fields_.erase(access_fields_.begin() + index); return;} + } else { + for(int i = 0; i < access_fields_.size(); i++){ + if (access_fields_[i]->relative_tf().getOrigin().getX() > 0){ + found = true; + index = i; + break; + } + } + if(found) {access_fields_.erase(access_fields_.begin() + index); return;} + } +}; diff --git a/src/mtc/src/impl/wing_moveit_decorator.cpp b/src/mtc/src/impl/wing_moveit_decorator.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6943b43df32ac3ff4ac9053742f4ed3edac9df0a --- /dev/null +++ b/src/mtc/src/impl/wing_moveit_decorator.cpp @@ -0,0 +1,37 @@ +#include "impl/wing_moveit_decorator.h" + +void Wing_moveit_decorator::update(tf2::Transform& tf) { + Abstract_robot_element_decorator::update(tf); + output_filter(); +} + +void Wing_moveit_decorator::input_filter(tf2::Transform& tf) {} + +void Wing_moveit_decorator::output_filter() { + Wing* wing = dynamic_cast<Wing*> (next_); + tf2::Vector3 world_origin = wing->world_tf().getOrigin(); + tf2::Quaternion world_quat = wing->world_tf().getRotation().normalized(); + + + markers_->id = std::to_string(*((int*)(&next_))); + markers_->header.frame_id = "world"; + + markers_->primitives.resize(1); + markers_->primitives[0].type = markers_->primitives[0].BOX; + markers_->primitives[0].dimensions.resize(3); + markers_->primitives[0].dimensions[0] = wing->size().getX(); + markers_->primitives[0].dimensions[1] = wing->size().getY(); + markers_->primitives[0].dimensions[2] = wing->size().getZ(); + + + markers_->primitive_poses.resize(1); + markers_->primitive_poses[0].position.x = world_origin.getX(); + markers_->primitive_poses[0].position.y = world_origin.getY(); + markers_->primitive_poses[0].position.z = world_origin.getZ(); + markers_->primitive_poses[0].orientation.x = world_quat.getX(); + markers_->primitive_poses[0].orientation.y = world_quat.getY(); + markers_->primitive_poses[0].orientation.z = world_quat.getZ(); + markers_->primitive_poses[0].orientation.w = world_quat.getW(); + + markers_->operation = markers_->ADD; +} \ No newline at end of file