diff --git a/include/impl/moveit_grasp_mediator.h b/include/impl/moveit_grasp_mediator.h index aee350051ac2602c0a944bafee42d8a20243e1d6..b3f3856cd48507220e3f9b1bc314ff8666ed586f 100644 --- a/include/impl/moveit_grasp_mediator.h +++ b/include/impl/moveit_grasp_mediator.h @@ -11,6 +11,7 @@ #include "impl/abstract_robot.h" #include "impl/robot.h" #include <gb_grasp/VoxelManager.h> +#include <gb_grasp/GraspMap.h> #include "reader/abstract_param_reader.h" #include "reader/robot_reader.h" #include "reader/cuboid_reader.h" @@ -22,6 +23,9 @@ class Moveit_grasp_mediator : public Moveit_mediator{ std::shared_ptr<planning_pipeline::PlanningPipeline> planning_pipeline_; std::shared_ptr<VoxelManager> voxel_manager_; std::string grasp_ns_; + boost::dynamic_bitset<> voxel_environment_; + std::vector<GraspMap> grasp_maps_; + // Readers std::unique_ptr<Abstract_param_reader> robot_reader_; @@ -29,53 +33,7 @@ class Moveit_grasp_mediator : public Moveit_mediator{ std::unique_ptr<Abstract_param_reader> cuboid_reader_; public: - Moveit_grasp_mediator(std::vector<std::vector<tf2::Transform>> objects, ros::Publisher* pub, std::shared_ptr<ros::NodeHandle> const& nh) - : Moveit_mediator(objects, pub, nh) - , robot_reader_(std::make_unique<Robot_reader>(nh)) - , wing_reader_(std::make_unique<Wing_reader>(nh)) - , cuboid_reader_(std::make_unique<Cuboid_reader>(nh)) { - - visual_tools_ = std::make_shared<moveit_visual_tools::MoveItVisualTools>( - robot_model_->getModelFrame(), "/rviz_visual_tools", planning_scene_monitor_); - visual_tools_->loadMarkerPub(); - visual_tools_->loadRemoteControl(); - visual_tools_->setPlanningSceneMonitor(planning_scene_monitor_); - - visual_tools_->loadRobotStatePub("/display_robot_state"); - visual_tools_->setRobotStateTopic("/robot_state_publisher"); - visual_tools_->loadTrajectoryPub("/display_planned_path"); - - visual_tools_->loadSharedRobotState(); - visual_tools_->enableBatchPublishing(); - visual_tools_->deleteAllMarkers(); - visual_tools_->removeAllCollisionObjects(); - visual_tools_->trigger(); - - nh_->getParam("/grasps_ns", grasp_ns_); - - planning_pipeline_ = std::make_shared<planning_pipeline::PlanningPipeline>(robot_model_, *nh_, "planning_plugin", "request_adapter"); - voxel_manager_ = std::make_shared<VoxelManager>(*nh_, grasp_ns_.c_str() ,visual_tools_,planning_scene_monitor_); - - auto rd = static_cast<Robot_reader*>(robot_reader_.get())->robot_data(); - for (int i = 0; i < rd.size() ;i++) connect_robots(new Moveit_robot(rd[i].name_, rd[i].pose_, rd[i].size_)); - - auto wd = static_cast<Wing_reader*>(wing_reader_.get())->wing_data(); - for (int i = 0; i < robots_.size(); i++){ - for(object_data& w : wd[i].first){ - w.pose_ = robots_[i]->tf().inverse() * w.pose_; - } - robots_[i]->set_observer_mask(static_cast<wing_config>(wd[i].second)); - } - - set_wings(wd); - - for (int i = 0; i < robots_.size(); i++){ - std::bitset<3> bs = wd[i].second; - build_wings(bs, i); - } - - scene_setup(); - }; + Moveit_grasp_mediator(std::vector<std::vector<tf2::Transform>> objects, ros::Publisher* pub, std::shared_ptr<ros::NodeHandle> const& nh); void mediate() override; @@ -83,6 +41,21 @@ class Moveit_grasp_mediator : public Moveit_mediator{ void manipulate_grasp_data(Moveit_robot* robot); void scene_setup(); + void manipulate_mapspace(); + bool generateRandomCuboid(std::string& object_name, geometry_msgs::Pose& object_pose, double& x_depth, double& y_width, double& z_height); + bool getIKSolution(const moveit::core::JointModelGroup* arm_jmg, const Eigen::Isometry3d& target_pose, robot_state::RobotState& solution, const std::string& link_name); + bool planFullGrasp(std::vector<moveit_grasps::GraspCandidatePtr>& grasp_candidates, + moveit_grasps::GraspCandidatePtr& valid_grasp_candidate, + moveit_msgs::MotionPlanResponse& pre_approach_plan, const std::string& object_name); + void visualizePick(const moveit_grasps::GraspCandidatePtr& valid_grasp_candidate, + const moveit_msgs::MotionPlanResponse& pre_approach_plan); + void waitForNextStep(const moveit_visual_tools::MoveItVisualToolsPtr& visual_tools, const std::string& prompt); + bool planPreApproach(const robot_state::RobotState& goal_state, moveit_msgs::MotionPlanResponse& pre_approach_plan); + bool isStateValid(const planning_scene::PlanningScene* planning_scene, + const moveit_visual_tools::MoveItVisualToolsPtr& visual_tools, robot_state::RobotState* robot_state, + const robot_model::JointModelGroup* group, const double* ik_solution); + + }; diff --git a/include/impl/moveit_mediator.h b/include/impl/moveit_mediator.h index b6eeccd8abc8991869355b074cdf5ece6e7f96e9..e551a84d2050defb744ab4faca4ab3be8a96ff17 100644 --- a/include/impl/moveit_mediator.h +++ b/include/impl/moveit_mediator.h @@ -68,29 +68,7 @@ class Moveit_mediator : public Abstract_mediator{ public: - Moveit_mediator(std::vector<std::vector<tf2::Transform>> objects, ros::Publisher* pub, std::shared_ptr<ros::NodeHandle> const& nh) - : Abstract_mediator(objects, pub), nh_(nh) - , sampling_planner_(std::make_unique<moveit::task_constructor::solvers::PipelinePlanner>()) - , cartesian_planner_(std::make_unique<moveit::task_constructor::solvers::CartesianPath>()) - , psi_(std::make_unique<moveit::planning_interface::PlanningSceneInterface>()) - , mgi_(std::make_shared<moveit::planning_interface::MoveGroupInterface>("panda_arms")) - , planning_scene_diff_publisher_(std::make_shared<ros::Publisher>(nh_->advertise<moveit_msgs::PlanningScene>("planning_scene", 1))) - , planning_scene_monitor_(std::make_shared<planning_scene_monitor::PlanningSceneMonitor>("robot_description")){ - - robot_model_loader::RobotModelLoaderPtr robot_model_loader; - robot_model_loader = std::make_shared<robot_model_loader::RobotModelLoader>("robot_description"); - robot_model_ = robot_model_loader->getModel(); - ps_ = std::make_shared<planning_scene::PlanningScene>(robot_model_); - - // planner - sampling_planner_->setProperty("goal_joint_tolerance", 1e-5); - - // cartesian - cartesian_planner_->setMaxVelocityScaling(1.0); - cartesian_planner_->setMaxAccelerationScaling(1.0); - cartesian_planner_->setStepSize(.01); - - }; + Moveit_mediator(std::vector<std::vector<tf2::Transform>> objects, ros::Publisher* pub, std::shared_ptr<ros::NodeHandle> const& nh); void setup_task(); inline std::shared_ptr<moveit::planning_interface::MoveGroupInterface> mgi() {return mgi_;}; diff --git a/include/impl/moveit_robot.h b/include/impl/moveit_robot.h index 258632e7613022b74d2a05e79602852aa32502d3..ca49cc751d7330c98fb8fec078bc3b819713195d 100644 --- a/include/impl/moveit_robot.h +++ b/include/impl/moveit_robot.h @@ -39,6 +39,8 @@ class Moveit_robot : public Robot{ inline std::shared_ptr<moveit::planning_interface::MoveGroupInterface> mgi() {return mgi_;} inline std::shared_ptr<moveit::planning_interface::MoveGroupInterface> mgi_hand() {return mgi_hand_;} + inline std::shared_ptr<MapGenerator> grasp_map_generator() {return grasp_map_generator_;} + inline std::map<std::string, std::string>& map(){return map_;} inline void set_grasp_map_generator(std::shared_ptr<MapGenerator>const& d ){ grasp_map_generator_ = d;} diff --git a/include/reader/cuboid_reader.h b/include/reader/cuboid_reader.h index f142d902857ec3ef99cdeed2a0e86259e0f400b0..7959ddbb543e04ee1534fb8082bda5353418e111 100644 --- a/include/reader/cuboid_reader.h +++ b/include/reader/cuboid_reader.h @@ -12,16 +12,16 @@ class Cuboid_reader : public Abstract_param_reader{ protected: - std::vector<Cuboid> cuboid_bin_; + std::vector<Cuboid> cuboid_box_; std::vector<Cuboid> cuboid_obstacle_; public: Cuboid_reader(std::shared_ptr<ros::NodeHandle> const& d) : Abstract_param_reader(d){read();} - inline void set_cuboid_bin_data(std::vector<Cuboid>& cuboid_data) {cuboid_bin_ = cuboid_data;} + inline void set_cuboid_bin_data(std::vector<Cuboid>& cuboid_data) {cuboid_box_ = cuboid_data;} inline void set_cuboid_obstacle_data(std::vector<Cuboid>& cuboid_data) {cuboid_obstacle_ = cuboid_data;} - inline std::vector<Cuboid> cuboid_bin() {return cuboid_bin_;} + inline std::vector<Cuboid> cuboid_bin() {return cuboid_box_;} inline std::vector<Cuboid> cuboid_obstacle() {return cuboid_obstacle_;} void read() override; diff --git a/launch/mtc_auerswald.launch b/launch/mtc_auerswald.launch index fb65cad9226fda15814ae4e53f0b336fdad55bda..7573c9c205fb52d81f0479a2a36562c98397cede 100644 --- a/launch/mtc_auerswald.launch +++ b/launch/mtc_auerswald.launch @@ -2,57 +2,64 @@ <!-- Launch rviz.launch before running this demo to see visalizations --> <arg name="result" default="dummy/-562289182.yaml"/> <arg name="grasps_ns" default="grasps" /> - + <arg name="gripper" default="two_finger" doc="must be one of 'suction' or 'two_finger'" /> + <arg name="planner" default="ompl" /> <arg name="moveit_controller_manager" default="fake" /> <arg name="fake_execution_type" default="interpolate" /> <arg name="use_gui" default="false" /> <arg name="use_rviz" default="true" /> + <!-- GDB Debug Arguments --> + <arg name="debug" default="false" /> + <arg unless="$(arg debug)" name="launch_prefix" value="" /> + <arg if="$(arg debug)" name="launch_prefix" + value="gdb -x $(find moveit_grasps)/launch/gdb_settings.gdb --ex run --args" /> + <!-- Verbose mode --> + <arg name="verbose" default="false" /> + <arg unless="$(arg verbose)" name="command_args" value="" /> + <arg if="$(arg verbose)" name="command_args" value="--verbose" /> - <!-- PANDA --> - <include file="$(find ceti_double)/launch/planning_context.launch"> - <arg name="load_robot_description" value="true"/> - <arg name="scene" value="$(arg result)" /> - </include> + <!-- Callgrind Arguments --> + <arg name="callgrind" default="false" /> + <arg unless="$(arg callgrind)" name="launch_prefix2" value="" /> + <arg if="$(arg callgrind)" name="launch_prefix2" value="valgrind --tool=callgrind --collect-atstart=no" /> - <!-- this is needed because moveit grasps uses an additional joint --> - <arg name="robot_description" default="robot_description"/> - <param name="$(arg robot_description)" command="$(find xacro)/xacro '$(find moveit_grasps)/robots/double_panda_arm_two_finger_hand.urdf.xacro' 'scene:=$(arg result)'"/> + <!-- Valgrind Arguments --> + <arg name="valgrind" default="false" /> + <arg unless="$(arg valgrind)" name="launch_prefix3" value="" /> + <arg if="$(arg valgrind)" name="launch_prefix3" value="valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --track-origins=yes -v" /> + <!-- Publish world frame --> + <node pkg="tf2_ros" type="static_transform_publisher" name="virtual_joint_broadcaster_1" args="0 0 0 0 0 0 world base_1" /> + <node pkg="tf2_ros" type="static_transform_publisher" name="virtual_joint_broadcaster_2" args="0 0 0 0 0 0 world base_2" /> - <node pkg="tf2_ros" type="static_transform_publisher" name="virtual_joint_broadcaster_0" args="0 0 0 0 0 0 world base_1" /> - <node pkg="tf2_ros" type="static_transform_publisher" name="virtual_joint_broadcaster_1" args="0 0 0 0 0 0 world base_2" /> + <!-- PANDA --> + <include file="$(find moveit_grasps)/launch/panda_planning_context.launch"> + <arg name="load_robot_description" value="true"/> + <arg name="gripper" value="$(arg gripper)"/> + <arg name="scene" value="$(arg result)"/> + </include> - <!-- Load Rviz --> - <node name="$(anon rviz)" pkg="rviz" type="rviz" respawn="false" - args="-d $(find moveit_grasps)/launch/rviz/grasps.rviz" output="screen"> - <rosparam command="load" file="$(find ceti_double)/config/kinematics.yaml"/> - </node> + <!-- PANDA --> + <include file="$(find moveit_grasps)/launch/load_panda.launch"> + <arg name="gripper" value="$(arg gripper)"/> + <arg name="scene" value="$(arg result)" /> + </include> - <!-- Run the main MoveIt executable without trajectory execution (we do not have controllers configured by default) --> <include file="$(find ceti_double)/launch/move_group.launch"> <arg name="allow_trajectory_execution" value="true"/> <arg name="moveit_controller_manager" value="$(arg moveit_controller_manager)" /> <arg name="fake_execution_type" value="$(arg fake_execution_type)"/> <arg name="info" value="true"/> - <arg name="debug" value="true"/> - <arg name="pipeline" value="ompl" /> + <arg name="debug" value="$(arg debug)"/> + <arg name="pipeline" value="$(arg planner)"/> + <arg name="load_robot_description" value="false"/> <arg name="scene" value="$(arg result)" /> </include> - <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" unless="$(arg use_gui)"> - <rosparam param="source_list">[move_group/fake_controller_joint_states]</rosparam> - </node> - - <node name="joint_state_publisher" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" if="$(arg use_gui)"> - <rosparam param="source_list">[move_group/fake_controller_joint_states]</rosparam> - </node> - - <node name="joint_state_desired_publisher" pkg="topic_tools" type="relay" args="joint_states joint_states_desired" /> - <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" respawn="true" output="screen" /> <rosparam command="load" file="$(find multi_cell_builder)/results/$(arg result)"/> <rosparam command="load" file="$(find multi_cell_builder)/mtc_templates/dummy.yaml" /> @@ -66,8 +73,14 @@ <rosparam command="load" file="$(find gb_grasp)/config/moveit_grasps_config.yaml"/> </node> + + <!-- Load Rviz --> + <node name="$(anon rviz)" pkg="rviz" type="rviz" respawn="false" + args="-d $(find moveit_grasps)/launch/rviz/grasps.rviz" output="screen"> + </node> + + <!-- Planning Functionality --> - <arg name="planner" default="ompl" /> <include ns="grasp_cell_routine" file="$(find ceti_double)/launch/planning_pipeline.launch.xml"> <arg name="pipeline" value="$(arg planner)" /> </include> diff --git a/launch/rviz/cell_routine.rviz b/launch/rviz/cell_routine.rviz index 02da6ef90bb6f74f21e5a7e92e620aed1a032e96..7ddb5d03657fe433c1b32652c1d1284d409a513d 100644 --- a/launch/rviz/cell_routine.rviz +++ b/launch/rviz/cell_routine.rviz @@ -45,6 +45,336 @@ Toolbars: Visualization Manager: Class: "" Displays: + - Class: rviz/MarkerArray + Enabled: true + Marker Topic: /rviz_visual_tools + Name: MarkerArray + Namespaces: + Axis: true + Cuboid: true + Queue Size: 100 + Value: true + - Class: moveit_rviz_plugin/Trajectory + Color Enabled: false + Enabled: true + Interrupt Display: false + Links: + All Links Enabled: true + Expand Joint Details: false + Expand Link Details: false + Expand Tree: false + Link Tree Style: Links in Alphabetic Order + base_1: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + base_2: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_hand: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_leftfinger: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link0: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link1: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link2: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link3: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link4: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link5: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link6: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link7: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link8: + Alpha: 1 + Show Axes: false + Show Trail: false + panda_1_rightfinger: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_tool_center_point: + Alpha: 1 + Show Axes: false + Show Trail: false + panda_2_hand: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_hand_leftfinger: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link0: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link1: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link2: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link3: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link4: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link5: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link6: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link7: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link8: + Alpha: 1 + Show Axes: false + Show Trail: false + panda_2_rightfinger: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_tool_center_point: + Alpha: 1 + Show Axes: false + Show Trail: false + world: + Alpha: 1 + Show Axes: false + Show Trail: false + Loop Animation: false + Name: Trajectory + Robot Alpha: 0.5 + Robot Color: 150; 50; 150 + Robot Description: robot_description + Show Robot Collision: false + Show Robot Visual: true + Show Trail: false + State Display Time: 0.05 s + Trail Step Size: 1 + Trajectory Topic: /display_planned_path + Use Sim Time: false + Value: true + - Attached Body Color: 150; 50; 150 + Class: moveit_rviz_plugin/RobotState + Collision Enabled: false + Enabled: true + Links: + All Links Enabled: true + Expand Joint Details: false + Expand Link Details: false + Expand Tree: false + Link Tree Style: Links in Alphabetic Order + base_1: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + base_2: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_hand: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_leftfinger: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link0: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link1: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link2: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link3: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link4: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link5: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link6: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link7: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_link8: + Alpha: 1 + Show Axes: false + Show Trail: false + panda_1_rightfinger: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_1_tool_center_point: + Alpha: 1 + Show Axes: false + Show Trail: false + panda_2_hand: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_hand_leftfinger: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link0: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link1: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link2: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link3: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link4: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link5: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link6: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link7: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_link8: + Alpha: 1 + Show Axes: false + Show Trail: false + panda_2_rightfinger: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + panda_2_tool_center_point: + Alpha: 1 + Show Axes: false + Show Trail: false + world: + Alpha: 1 + Show Axes: false + Show Trail: false + Name: RobotState + Robot Alpha: 1 + Robot Description: robot_description + Robot State Topic: /display_robot_state + Show All Links: true + Show Highlights: true + Value: true + Visual Enabled: true - Alpha: 0.5 Cell Size: 1 Class: rviz/Grid diff --git a/results/dummy/-2642749.yaml b/results/dummy/-2642749.yaml index cb62992cd4b5c4bd51f66897923e42b77d02c4b4..89be48e96023a389f31ea575add6333744ab1807 100644 --- a/results/dummy/-2642749.yaml +++ b/results/dummy/-2642749.yaml @@ -21,5 +21,12 @@ { 'id': 'table1_left_panel' , 'pos': { 'x': -0.000000 , 'y': -0.852502 , 'z': 0.885000 } , 'size': { 'length': 0.700000 , 'width': 0.500000 , 'height': 0.010000 } , 'orientation': { 'x': 0.000000 , 'y': 0.000000 , 'z': 0.000001 , 'w': 1.000000 } , 'color': { 'r': 0.15 , 'g': 0.15 , 'b': 0.15 } }, { 'id': 'table2_right_panel', 'pos': { 'x': -0.000007, 'y': 1.757498 , 'z': 0.885000 },'size': { 'length': 0.700000,'width': 0.500000,'height': 0.010000 },'orientation': { 'x': 0.000000, 'y': 0.000000, 'z': 0.000001, 'w': 1.000000 },'color': { 'r': 0.15,'g': 0.15,'b': 0.15 } }, { 'id': 'arm1','type': 'ARM','pos': { 'x': -0.220002, 'y': -0.200003, 'z': 0.89 },'size': { },'orientation': { 'x': 0.000000, 'y': 0.000000, 'z': 0.000001, 'w': 1.000000 },'color': { 'r': 1.00,'g': 1.00,'b': 1.00 } }, -{ 'id': 'arm2','type': 'ARM','pos': { 'x': -0.220005, 'y': 1.104997, 'z': 0.89 },'size': { },'orientation': { 'x': 0.000000, 'y': 0.000000, 'z': 0.000001, 'w': 1.000000 },'color': { 'r': 1.00,'g': 1.00,'b': 1.00 } } +{ 'id': 'arm2','type': 'ARM','pos': { 'x': -0.220005, 'y': 1.104997, 'z': 0.89 },'size': { },'orientation': { 'x': 0.000000, 'y': 0.000000, 'z': 0.000001, 'w': 1.000000 },'color': { 'r': 1.00,'g': 1.00,'b': 1.00 } }, + { 'id': 'blue1', 'type': 'BOX', 'pos': { 'x': .1, 'y': -.7, 'z': 0.935500 },'size': { 'length': .0318, 'width': .0636, 'height': 0.091000 },'orientation': { 'w': 1 },'color': { 'b': 1 } }, # target B + { 'id': 'blue2', 'type': 'BOX', 'pos': { 'x': .2, 'y': .3, 'z': 0.935500 },'size': { 'length': .0318, 'width': .0636, 'height': 0.091000 },'orientation': { 'w': 1 },'color': { 'b': 1 } }, # target B + { 'id': 'blue3', 'type': 'BOX', 'pos': { 'x': .2, 'y': -.1, 'z': 0.935500 },'size': { 'length': .0318, 'width': .0636, 'height': 0.091000 },'orientation': { 'w': 1 },'color': { 'b': 1 } }, # impossible for the target B + { 'id': 'green1', 'type': 'BOX', 'pos': { 'x': .2, 'y': -.3, 'z': 0.935500 },'size': { 'length': .0318, 'width': .0636, 'height': 0.091000 },'orientation': { 'w': 1 },'color': { 'g': 1 } }, + { 'id': 'green2', 'type': 'BOX', 'pos': { 'x': .1, 'y': 1.91, 'z': 0.935500 },'size': { 'length': .0318, 'width': .0636, 'height': 0.091000 },'orientation': { 'w': 1 },'color': { 'g': 1 } }, + { 'id': 'red1', 'type': 'BOX', 'pos': { 'x': -.3, 'y': -.6, 'z': 0.935500 },'size': { 'length': .0318, 'width': .0636, 'height': 0.091000 },'orientation': { 'w': 1 },'color': { 'r': 1 } }, + { 'id': 'red2', 'type': 'BOX', 'pos': { 'x': .3, 'y': 1.41, 'z': 0.935500 },'size': { 'length': .0318, 'width': .0636, 'height': 0.091000 },'orientation': { 'w': 1 },'color': { 'r': 1 } } ]} \ No newline at end of file diff --git a/results/dummy/-562289182.yaml b/results/dummy/-562289182.yaml index 3b44962e51121df05778c0bbe94e2dd2bdcb38fd..3e97a90bb8b87af55c962bce4357605093a705b5 100644 --- a/results/dummy/-562289182.yaml +++ b/results/dummy/-562289182.yaml @@ -21,5 +21,12 @@ { 'id': 'table1_left_panel' , 'pos': { 'x': -0.100000 , 'y': -0.552502 , 'z': 0.885000 } , 'size': { 'length': 0.700000 , 'width': 0.500000 , 'height': 0.010000 } , 'orientation': { 'x': 0.000000 , 'y': 0.000000 , 'z': 0.000001 , 'w': 1.000000 } , 'color': { 'r': 0.15 , 'g': 0.15 , 'b': 0.15 } }, { 'id': 'table2_right_panel', 'pos': { 'x': -0.100007, 'y': 2.057498 , 'z': 0.885000 },'size': { 'length': 0.700000,'width': 0.500000,'height': 0.010000 },'orientation': { 'x': 0.000000, 'y': 0.000000, 'z': 0.000001, 'w': 1.000000 },'color': { 'r': 0.15,'g': 0.15,'b': 0.15 } }, { 'id': 'arm1','type': 'ARM','pos': { 'x': -0.320002, 'y': 0.099997, 'z': 0.89 },'size': { },'orientation': { 'x': 0.000000, 'y': 0.000000, 'z': 0.000001, 'w': 1.000000 },'color': { 'r': 1.00,'g': 1.00,'b': 1.00 } }, -{ 'id': 'arm2','type': 'ARM','pos': { 'x': -0.320005, 'y': 1.404997, 'z': 0.89 },'size': { },'orientation': { 'x': 0.000000, 'y': 0.000000, 'z': 0.000001, 'w': 1.000000 },'color': { 'r': 1.00,'g': 1.00,'b': 1.00 } } +{ 'id': 'arm2','type': 'ARM','pos': { 'x': -0.320005, 'y': 1.404997, 'z': 0.89 },'size': { },'orientation': { 'x': 0.000000, 'y': 0.000000, 'z': 0.000001, 'w': 1.000000 },'color': { 'r': 1.00,'g': 1.00,'b': 1.00 } }, + { 'id': 'blue1', 'type': 'BOX', 'pos': { 'x': .1, 'y': -.7, 'z': 0.935500 },'size': { 'length': .0318, 'width': .0636, 'height': 0.091000 },'orientation': { 'w': 1 },'color': { 'b': 1 } }, # target B + { 'id': 'blue2', 'type': 'BOX', 'pos': { 'x': .2, 'y': .3, 'z': 0.935500 },'size': { 'length': .0318, 'width': .0636, 'height': 0.091000 },'orientation': { 'w': 1 },'color': { 'b': 1 } }, # target B + { 'id': 'blue3', 'type': 'BOX', 'pos': { 'x': .2, 'y': -.1, 'z': 0.935500 },'size': { 'length': .0318, 'width': .0636, 'height': 0.091000 },'orientation': { 'w': 1 },'color': { 'b': 1 } }, # impossible for the target B + { 'id': 'green1', 'type': 'BOX', 'pos': { 'x': .2, 'y': -.3, 'z': 0.935500 },'size': { 'length': .0318, 'width': .0636, 'height': 0.091000 },'orientation': { 'w': 1 },'color': { 'g': 1 } }, + { 'id': 'green2', 'type': 'BOX', 'pos': { 'x': .1, 'y': 1.91, 'z': 0.935500 },'size': { 'length': .0318, 'width': .0636, 'height': 0.091000 },'orientation': { 'w': 1 },'color': { 'g': 1 } }, + { 'id': 'red1', 'type': 'BOX', 'pos': { 'x': -.3, 'y': -.6, 'z': 0.935500 },'size': { 'length': .0318, 'width': .0636, 'height': 0.091000 },'orientation': { 'w': 1 },'color': { 'r': 1 } }, + { 'id': 'red2', 'type': 'BOX', 'pos': { 'x': .3, 'y': 1.41, 'z': 0.935500 },'size': { 'length': .0318, 'width': .0636, 'height': 0.091000 },'orientation': { 'w': 1 },'color': { 'r': 1 } } ]} \ No newline at end of file diff --git a/src/cell_routine.cpp b/src/cell_routine.cpp index 8cb09aafd295a1edf0c8abe8cb931e31601878e8..ea4be5c4476160dfb556129061137e95b1c61776 100644 --- a/src/cell_routine.cpp +++ b/src/cell_routine.cpp @@ -43,16 +43,13 @@ int main(int argc, char **argv){ Moveit_mediator* moveit_mediator = dynamic_cast<Moveit_mediator*>(mediator); std::unique_ptr<Abstract_param_reader> robot_reader(new Robot_reader(nh)); - robot_reader->read(); auto rd = static_cast<Robot_reader*>(robot_reader.get())->robot_data(); for (int i = 0; i < rd.size() ;i++) mediator->connect_robots(new Moveit_robot(rd[i].name_, rd[i].pose_, rd[i].size_)); std::unique_ptr<Abstract_param_reader> wing_reader(new Wing_reader(nh)); - wing_reader->read(); auto wd = static_cast<Wing_reader*>(wing_reader.get())->wing_data(); std::unique_ptr<Abstract_param_reader> cuboid_reader(new Cuboid_reader(nh)); - cuboid_reader->read(); auto cbd = static_cast<Cuboid_reader*>(cuboid_reader.get())->cuboid_bin(); auto cod = static_cast<Cuboid_reader*>(cuboid_reader.get())->cuboid_obstacle(); @@ -79,6 +76,7 @@ int main(int argc, char **argv){ //moveit::planning_interface::PlanningSceneInterface::applyCollisionObject() ceti1->notify(); ceti2->notify(); + moveit_mediator->mediate(); diff --git a/src/impl/moveit_grasp_mediator.cpp b/src/impl/moveit_grasp_mediator.cpp index 463b09f44fefd90e82864036cd1e7e2f51e48eb1..a933e6b2f0f34dcae5fab341bdfa1c58cf9cc9a2 100644 --- a/src/impl/moveit_grasp_mediator.cpp +++ b/src/impl/moveit_grasp_mediator.cpp @@ -1,5 +1,8 @@ #include "impl/moveit_grasp_mediator.h" #include <regex> +#include <gb_grasp/MapConfigLoader.h> +#include <moveit/robot_state/conversions.h> + void Moveit_grasp_mediator::connect_robots(Abstract_robot* robot) { robots_.push_back(robot); @@ -7,29 +10,36 @@ void Moveit_grasp_mediator::connect_robots(Abstract_robot* robot) { auto mr = dynamic_cast<Moveit_robot*>(robot); manipulate_grasp_data(mr); - - ROS_INFO("1"); + manipulate_mapspace(); auto map_gen = std::make_shared<MapGenerator>(*nh_, visual_tools_, planning_scene_monitor_, mr->map().at("eef_name"), mr->name().c_str(), robot_model_->getJointModelGroup(mr->name().c_str()), mgi().get()->getCurrentState(), voxel_manager_); double min_quality, max_candidates; bool top_only; - ROS_INFO("2"); rosparam_shortcuts::get(grasp_ns_.c_str(),*nh_,"min_quality",min_quality); rosparam_shortcuts::get(grasp_ns_.c_str(),*nh_,"max_candidate_count",max_candidates); rosparam_shortcuts::get(grasp_ns_.c_str(),*nh_,"top_grasps_only",top_only); - ROS_INFO("3"); map_gen->SetQuality(min_quality); map_gen->SetMaxGrasp(max_candidates); map_gen->SetZGraspOnly(top_only); mr->set_grasp_map_generator(map_gen); - ROS_INFO("4"); } +void Moveit_grasp_mediator::manipulate_mapspace(){ + std::vector<float> pos_voxel_space; + std::vector<float> pos_mapspace; + nh_->getParam("/voxel_space/pos", pos_voxel_space); + nh_->getParam("/mapspace/pos", pos_mapspace); + pos_mapspace[2]= 0.91f; + pos_voxel_space[2]= 0.91f; + nh_->setParam("/voxel_space/pos", pos_voxel_space); + nh_->setParam("/mapspace/pos", pos_mapspace); +} + void Moveit_grasp_mediator::manipulate_grasp_data(Moveit_robot* robot) { XmlRpc::XmlRpcValue data; nh_->getParam("/", data); @@ -58,8 +68,14 @@ void Moveit_grasp_mediator::manipulate_grasp_data(Moveit_robot* robot) { std::stringstream ss; ss << "panda_" << match[1] << "_tool_center_point"; - data[robot->map().at("eef_name").c_str()]["define_tcp_by_name"] = true; + data[robot->map().at("eef_name").c_str()]["define_tcp_by_name"] = false; data[robot->map().at("eef_name").c_str()]["tcp_name"] = ss.str().c_str(); + data[robot->map().at("eef_name").c_str()]["tcp_to_eef_mount_transform"][0] = 0; + data[robot->map().at("eef_name").c_str()]["tcp_to_eef_mount_transform"][1] = 0; + data[robot->map().at("eef_name").c_str()]["tcp_to_eef_mount_transform"][2] = -0.105; + data[robot->map().at("eef_name").c_str()]["tcp_to_eef_mount_transform"][3] = 0; + data[robot->map().at("eef_name").c_str()]["tcp_to_eef_mount_transform"][4] = 0; + data[robot->map().at("eef_name").c_str()]["tcp_to_eef_mount_transform"][5] = -0.7853; data[robot->map().at("eef_name").c_str()]["pregrasp_time_from_start"] = 0; data[robot->map().at("eef_name").c_str()]["grasp_time_from_start"] = 0; @@ -83,7 +99,346 @@ void Moveit_grasp_mediator::manipulate_grasp_data(Moveit_robot* robot) { nh_->setParam("/", data); } -void Moveit_grasp_mediator::mediate(){} +bool Moveit_grasp_mediator::generateRandomCuboid(std::string& object_name, geometry_msgs::Pose& object_pose, double& x_depth, + double& y_width, double& z_height) + { + // Generate random cuboid + double xmin = 0.5; + double xmax = 0.7; + double ymin = -0.25; + double ymax = 0.25; + double zmin = 0.89; + double zmax = 1.2; + rviz_visual_tools::RandomPoseBounds pose_bounds(xmin, xmax, ymin, ymax, zmin, zmax); + + double cuboid_size_min = 0.01; + double cuboid_size_max = 0.03; + rviz_visual_tools::RandomCuboidBounds cuboid_bounds(cuboid_size_min, cuboid_size_max); + + object_name = "pick_target"; + visual_tools_->generateRandomCuboid(object_pose, x_depth, y_width, z_height, pose_bounds, cuboid_bounds); + visual_tools_->publishCollisionCuboid(object_pose, x_depth, y_width, z_height, object_name, rviz_visual_tools::RED); + visual_tools_->publishAxis(object_pose, rviz_visual_tools::MEDIUM); + visual_tools_->trigger(); + + bool success = true; + double timeout = 5; // seconds + ros::Rate rate(100); + while (success && !planning_scene_monitor_->getPlanningScene()->knowsFrameTransform(object_name)) + { + rate.sleep(); + success = rate.cycleTime().toSec() < timeout; + } + return success; +} + +void Moveit_grasp_mediator::mediate(){ + visual_tools_->deleteAllMarkers(); + /* + MapConfigLoader map_config(*nh_, grasp_ns_); + auto cbd = static_cast<Cuboid_reader*>(cuboid_reader_.get())->cuboid_bin(); + + map_config.SetObjects(cbd); + map_config.Create(grasp_maps_); + ROS_INFO_STREAM("number of maps: "<< grasp_maps_.size()); + { + ROS_INFO("creating map ..."); + auto start_time = ros::Time::now(); + for (auto* r : robots_){ + auto mr = dynamic_cast<Moveit_robot*>(r); + for (GraspMap &m: grasp_maps_) { mr->grasp_map_generator()->SampleMap(m); } + double durration = (start_time - ros::Time::now()).toSec(); + ROS_INFO_STREAM(grasp_maps_.size() << " GraspMaps created in " << durration << " seconds"); + } + } + + + visual_tools_->setAlpha(0.1); + voxel_manager_->Voxelize(); + + auto cod = static_cast<Cuboid_reader*>(cuboid_reader_.get())->cuboid_obstacle(); + for(auto&o:cod){ + voxel_manager_->GetCuboidCollisions(o,voxel_environment_); + } + voxel_manager_->Voxelize(true); + */ + + // ----------------------------------- + // Generate random object to grasp + geometry_msgs::Pose object_pose; + double object_x_depth; + double object_y_width; + double object_z_height; + std::string object_name; + if (!generateRandomCuboid(object_name, object_pose, object_x_depth, object_y_width, object_z_height)) + { + ROS_INFO("Failed to add random cuboid ot planning scene"); + } + + // ----------------------------------- + // Generate grasp candidates + std::vector<moveit_grasps::GraspCandidatePtr> grasp_candidates; + + // Configure the desired types of grasps + moveit_grasps::TwoFingerGraspCandidateConfig grasp_generator_config = + moveit_grasps::TwoFingerGraspCandidateConfig(); + grasp_generator_config.disableAll(); + grasp_generator_config.enable_face_grasps_ = true; + grasp_generator_config.generate_y_axis_grasps_ = true; + grasp_generator_config.generate_x_axis_grasps_ = true; + grasp_generator_config.generate_z_axis_grasps_ = true; + + auto grasp_generator_ =std::make_shared<moveit_grasps::TwoFingerGraspGenerator>(visual_tools_); + + // Set the ideal grasp orientation for scoring + std::vector<double> ideal_grasp_rpy = { 3.14, 0.0, 0.0 }; + grasp_generator_->setIdealTCPGraspPoseRPY(ideal_grasp_rpy); + + // Set custom grasp score weights + auto grasp_score_weights = std::make_shared<moveit_grasps::TwoFingerGraspScoreWeights>(); + grasp_score_weights->orientation_x_score_weight_ = 2.0; + grasp_score_weights->orientation_y_score_weight_ = 2.0; + grasp_score_weights->orientation_z_score_weight_ = 2.0; + grasp_score_weights->translation_x_score_weight_ = 1.0; + grasp_score_weights->translation_y_score_weight_ = 1.0; + grasp_score_weights->translation_z_score_weight_ = 1.0; + // Finger gripper specific weights. + grasp_score_weights->depth_score_weight_ = 2.0; + grasp_score_weights->width_score_weight_ = 2.0; + // Assign the grasp score weights in the grasp_generator + grasp_generator_->setGraspScoreWeights(grasp_score_weights); + auto grasp_data_ = std::make_shared<moveit_grasps::TwoFingerGraspData>(*nh_, "hand_1", visual_tools_->getRobotModel()); + if (!grasp_data_->loadGraspData(*nh_, "hand_1")) + { + ROS_INFO("Failed to load Grasp Data parameters."); + exit(-1); + } + + grasp_generator_->setGraspCandidateConfig(grasp_generator_config); + if (!grasp_generator_->generateGrasps(visual_tools_->convertPose(object_pose), object_x_depth, object_y_width, + object_z_height, grasp_data_, grasp_candidates)) + { + ROS_INFO("Grasp generator failed to generate any valid grasps"); + } + + // -------------------------------------------- + // Generating a seed state for filtering grasps + auto seed_state = std::make_shared<robot_state::RobotState>(*visual_tools_->getSharedRobotState()); + Eigen::Isometry3d eef_mount_grasp_pose = + visual_tools_->convertPose(object_pose) * grasp_data_->tcp_to_eef_mount_.inverse(); + if (!getIKSolution(robot_model_->getJointModelGroup("panda_arm1"), eef_mount_grasp_pose, *seed_state, grasp_data_->parent_link_->getName())) + { + ROS_INFO("The ideal seed state is not reachable. Using start state as seed."); + } + + // -------------------------------------------- + // Filtering grasps + // Note: This step also solves for the grasp and pre-grasp states and stores them in grasp candidates) + bool filter_pregrasps = true; + auto grasp_filter_ = std::make_shared<moveit_grasps::TwoFingerGraspFilter>(visual_tools_->getSharedRobotState(), visual_tools_); + if (!grasp_filter_->filterGrasps(grasp_candidates, planning_scene_monitor_, robot_model_->getJointModelGroup("panda_arm1"), seed_state, filter_pregrasps, + object_name)) + { + ROS_INFO("Filter grasps failed"); + } + if (!grasp_filter_->removeInvalidAndFilter(grasp_candidates)) + { + ROS_INFO("Grasp filtering removed all grasps"); + } + + // Plan free-space approach, cartesian approach, lift and retreat trajectories + moveit_grasps::GraspCandidatePtr selected_grasp_candidate; + moveit_msgs::MotionPlanResponse pre_approach_plan; + if (!planFullGrasp(grasp_candidates, selected_grasp_candidate, pre_approach_plan, object_name)) + { + ROS_INFO("Failed to plan grasp motions"); + } + + visualizePick(selected_grasp_candidate, pre_approach_plan); +} + + void Moveit_grasp_mediator::visualizePick(const moveit_grasps::GraspCandidatePtr& valid_grasp_candidate, + const moveit_msgs::MotionPlanResponse& pre_approach_plan) + { + EigenSTL::vector_Isometry3d waypoints; + moveit_grasps::GraspGenerator::getGraspWaypoints(valid_grasp_candidate, waypoints); + + // Visualize waypoints + visual_tools_->publishAxisLabeled(waypoints[0], "pregrasp"); + visual_tools_->publishAxisLabeled(waypoints[1], "grasp"); + visual_tools_->publishAxisLabeled(waypoints[2], "lifted"); + visual_tools_->publishAxisLabeled(waypoints[3], "retreat"); + visual_tools_->trigger(); + + // Get the pre and post grasp states + visual_tools_->prompt("pre_grasp"); + robot_state::RobotStatePtr pre_grasp_state = + std::make_shared<robot_state::RobotState>(*visual_tools_->getSharedRobotState()); + valid_grasp_candidate->getPreGraspState(pre_grasp_state); + visual_tools_->publishRobotState(pre_grasp_state, rviz_visual_tools::ORANGE); + robot_state::RobotStatePtr grasp_state = + std::make_shared<robot_state::RobotState>(*visual_tools_->getSharedRobotState()); + if (valid_grasp_candidate->getGraspStateClosed(grasp_state)) + { + visual_tools_->prompt("grasp"); + visual_tools_->publishRobotState(grasp_state, rviz_visual_tools::YELLOW); + } + if (valid_grasp_candidate->segmented_cartesian_traj_.size() > 1 && + valid_grasp_candidate->segmented_cartesian_traj_[1].size()) + { + visual_tools_->prompt("lift"); + visual_tools_->publishRobotState(valid_grasp_candidate->segmented_cartesian_traj_[1].back(), + rviz_visual_tools::BLUE); + } + if (valid_grasp_candidate->segmented_cartesian_traj_.size() > 2 && + valid_grasp_candidate->segmented_cartesian_traj_[2].size()) + { + visual_tools_->prompt("retreat"); + visual_tools_->publishRobotState(valid_grasp_candidate->segmented_cartesian_traj_[2].back(), + rviz_visual_tools::PURPLE); + } + + visual_tools_->prompt("show free space approach"); + visual_tools_->hideRobot(); + visual_tools_->trigger(); + + bool wait_for_animation = true; + visual_tools_->publishTrajectoryPath(pre_approach_plan.trajectory, pre_grasp_state, wait_for_animation); + ros::Duration(0.25).sleep(); + if (valid_grasp_candidate->segmented_cartesian_traj_.size() > moveit_grasps::APPROACH) + visual_tools_->publishTrajectoryPath(valid_grasp_candidate->segmented_cartesian_traj_[moveit_grasps::APPROACH], + valid_grasp_candidate->grasp_data_->arm_jmg_, wait_for_animation); + ros::Duration(0.25).sleep(); + + if (valid_grasp_candidate->segmented_cartesian_traj_.size() > moveit_grasps::LIFT) + visual_tools_->publishTrajectoryPath(valid_grasp_candidate->segmented_cartesian_traj_[moveit_grasps::LIFT], + valid_grasp_candidate->grasp_data_->arm_jmg_, wait_for_animation); + ros::Duration(0.25).sleep(); + + if (valid_grasp_candidate->segmented_cartesian_traj_.size() > moveit_grasps::RETREAT) + visual_tools_->publishTrajectoryPath(valid_grasp_candidate->segmented_cartesian_traj_[moveit_grasps::RETREAT], + valid_grasp_candidate->grasp_data_->arm_jmg_, wait_for_animation); + ros::Duration(0.25).sleep(); +} + +bool Moveit_grasp_mediator::planFullGrasp(std::vector<moveit_grasps::GraspCandidatePtr>& grasp_candidates, + moveit_grasps::GraspCandidatePtr& valid_grasp_candidate, + moveit_msgs::MotionPlanResponse& pre_approach_plan, const std::string& object_name) + { + moveit::core::RobotStatePtr current_state; + { + boost::scoped_ptr<planning_scene_monitor::LockedPlanningSceneRW> ls( + new planning_scene_monitor::LockedPlanningSceneRW(planning_scene_monitor_)); + current_state = std::make_shared<robot_state::RobotState>((*ls)->getCurrentState()); + } + + std::shared_ptr<moveit_grasps::GraspPlanner>grasp_planner_ = std::make_shared<moveit_grasps::GraspPlanner>(visual_tools_); + + // MoveIt Grasps allows for a manual breakpoint debugging tool to be optionally passed in + grasp_planner_->setWaitForNextStepCallback(boost::bind(&Moveit_grasp_mediator::waitForNextStep, this, visual_tools_, _1)); + + bool success = false; + for (; !grasp_candidates.empty(); grasp_candidates.erase(grasp_candidates.begin())) + { + valid_grasp_candidate = grasp_candidates.front(); + valid_grasp_candidate->getPreGraspState(current_state); + if (!grasp_planner_->planApproachLiftRetreat(valid_grasp_candidate, current_state, planning_scene_monitor_, false, + object_name)) + { + ROS_INFO("failed to plan approach lift retreat"); + continue; + } + + robot_state::RobotStatePtr pre_grasp_state = + valid_grasp_candidate->segmented_cartesian_traj_[moveit_grasps::APPROACH].front(); + if (!planPreApproach(*pre_grasp_state, pre_approach_plan)) + { + ROS_INFO("failed to plan to pregrasp_state"); + continue; + } + + success = true; + break; + } + return success; +} + +void Moveit_grasp_mediator::waitForNextStep(const moveit_visual_tools::MoveItVisualToolsPtr& visual_tools, const std::string& prompt) +{ + visual_tools->prompt(prompt); +} + +bool Moveit_grasp_mediator::planPreApproach(const robot_state::RobotState& goal_state, moveit_msgs::MotionPlanResponse& pre_approach_plan) + { + planning_interface::MotionPlanRequest req; + planning_interface::MotionPlanResponse res; + + double tolerance_above = 0.01; + double tolerance_below = 0.01; + // req.planner_id = "RRTConnectkConfigDefault"; + req.group_name = "panda_arm1"; + req.num_planning_attempts = 5; + req.allowed_planning_time = 1.5; + moveit_msgs::Constraints goal = + kinematic_constraints::constructGoalConstraints(goal_state, robot_model_->getJointModelGroup("panda_arm1"), tolerance_below, tolerance_above); + + req.goal_constraints.push_back(goal); + boost::scoped_ptr<planning_scene_monitor::LockedPlanningSceneRW> ls( + new planning_scene_monitor::LockedPlanningSceneRW(planning_scene_monitor_)); + + // --------------------------------- + // Change the robot current state + // NOTE: We have to do this since Panda start configuration is in self collision. + robot_state::RobotState rs = (*ls)->getCurrentState(); + std::vector<double> starting_joint_values = { 0.0, -0.785, 0.0, -2.356, 0.0, 1.571, 0.785 }; + std::vector<std::string> joint_names = { "panda_1_joint1", "panda_1_joint2", "panda_1_joint3", "panda_1_joint4", + "panda_1_joint5", "panda_1_joint6", "panda_1_joint7" }; + // arm_jmg_->getActiveJointModelNames(); + for (std::size_t i = 0; i < joint_names.size(); ++i) + { + rs.setJointPositions(joint_names[i], &starting_joint_values[i]); + } + rs.update(); + robot_state::robotStateToRobotStateMsg(rs, req.start_state); + // --------------------------- + + planning_pipeline_->generatePlan(*ls, req, res); + if (res.error_code_.val != res.error_code_.SUCCESS) + { + ROS_INFO( "Failed to plan approach successfully"); + return false; + } + + res.getMessage(pre_approach_plan); + return true; +} + +bool Moveit_grasp_mediator::isStateValid(const planning_scene::PlanningScene* planning_scene, + const moveit_visual_tools::MoveItVisualToolsPtr& visual_tools, robot_state::RobotState* robot_state, + const robot_model::JointModelGroup* group, const double* ik_solution) +{ + robot_state->setJointGroupPositions(group, ik_solution); + robot_state->update(); + return !planning_scene->isStateColliding(*robot_state, group->getName()); +} + +bool Moveit_grasp_mediator::getIKSolution(const moveit::core::JointModelGroup* arm_jmg, const Eigen::Isometry3d& target_pose, + robot_state::RobotState& solution, const std::string& link_name) + { + boost::scoped_ptr<planning_scene_monitor::LockedPlanningSceneRW> ls( + new planning_scene_monitor::LockedPlanningSceneRW(planning_scene_monitor_)); + + moveit::core::GroupStateValidityCallbackFn constraint_fn = boost::bind( + &Moveit_grasp_mediator::isStateValid,this, static_cast<const planning_scene::PlanningSceneConstPtr&>(*ls).get(), visual_tools_, _1, _2, _3); + + // seed IK call with current state + solution = (*ls)->getCurrentState(); + + // Solve IK problem for arm + // disable explicit restarts to guarantee close solution if one exists + const double timeout = 0.1; + return solution.setFromIK(arm_jmg, target_pose, link_name, timeout, constraint_fn); +} void Moveit_grasp_mediator::scene_setup(){ for(Abstract_robot* ar: robots_) ar->notify(); @@ -91,16 +446,71 @@ void Moveit_grasp_mediator::scene_setup(){ auto cbd = static_cast<Cuboid_reader*>(cuboid_reader_.get())->cuboid_bin(); auto cod = static_cast<Cuboid_reader*>(cuboid_reader_.get())->cuboid_obstacle(); + ROS_INFO("%i die cuboids", cbd.size()); + ROS_INFO("%i cuboids", cod.size()); + for(auto&o:cod){ o.publishCOwait(visual_tools_,planning_scene_monitor_,rviz_visual_tools::GREY); psi_->addCollisionObjects({o.getCoMsg()}); } for(auto&o:cbd){ - o.publish(visual_tools_,rviz_visual_tools::GREEN); - //planning_scene_interface_->addCollisionObjects({o.getCoMsg()}); + //o.publish(visual_tools_,rviz_visual_tools::GREEN); + psi_->addCollisionObjects({o.getCoMsg()}); } + visual_tools_->publishRobotState(mgi_->getCurrentState()); visual_tools_->trigger(); -} \ No newline at end of file +} + +Moveit_grasp_mediator::Moveit_grasp_mediator(std::vector<std::vector<tf2::Transform>> objects, ros::Publisher* pub, std::shared_ptr<ros::NodeHandle> const& nh) + : Moveit_mediator(objects, pub, nh) + , robot_reader_(std::make_unique<Robot_reader>(nh)) + , wing_reader_(std::make_unique<Wing_reader>(nh)) + , cuboid_reader_(std::make_unique<Cuboid_reader>(nh)) { + + visual_tools_ = std::make_shared<moveit_visual_tools::MoveItVisualTools>( + robot_model_->getModelFrame(), "/rviz_visual_tools", planning_scene_monitor_); + visual_tools_->loadMarkerPub(); + visual_tools_->loadRemoteControl(); + visual_tools_->setPlanningSceneMonitor(planning_scene_monitor_); + + visual_tools_->loadRobotStatePub("/display_robot_state"); + visual_tools_->setRobotStateTopic("/robot_state_publisher"); + visual_tools_->loadTrajectoryPub("/display_planned_path"); + + visual_tools_->loadSharedRobotState(); + visual_tools_->enableBatchPublishing(); + visual_tools_->deleteAllMarkers(); + visual_tools_->removeAllCollisionObjects(); + visual_tools_->trigger(); + + nh_->getParam("/grasps_ns", grasp_ns_); + + planning_pipeline_ = std::make_shared<planning_pipeline::PlanningPipeline>(robot_model_, *nh_, "planning_plugin", "request_adapter"); + voxel_manager_ = std::make_shared<VoxelManager>(*nh_, grasp_ns_.c_str() ,visual_tools_,planning_scene_monitor_); + + auto rd = static_cast<Robot_reader*>(robot_reader_.get())->robot_data(); + for (int i = 0; i < rd.size() ;i++) connect_robots(new Moveit_robot(rd[i].name_, rd[i].pose_, rd[i].size_)); + + auto wd = static_cast<Wing_reader*>(wing_reader_.get())->wing_data(); + for (int i = 0; i < robots_.size(); i++){ + for(object_data& w : wd[i].first){ + w.pose_ = robots_[i]->tf().inverse() * w.pose_; + } + robots_[i]->set_observer_mask(static_cast<wing_config>(wd[i].second)); + } + + set_wings(wd); + + for (int i = 0; i < robots_.size(); i++){ + std::bitset<3> bs = wd[i].second; + build_wings(bs, i); + } + + for (auto* r : robots_)r->notify(); + + publish_tables(); + scene_setup(); + }; \ No newline at end of file diff --git a/src/impl/moveit_mediator.cpp b/src/impl/moveit_mediator.cpp index c194e912138c47337edc9032ba431bfb29f9b16d..98fa329f2795583483bf9d34169cbbd70d775c4b 100644 --- a/src/impl/moveit_mediator.cpp +++ b/src/impl/moveit_mediator.cpp @@ -883,3 +883,36 @@ void Moveit_mediator::rewrite_task_template(Abstract_robot* r, moveit_msgs::Coll } +Moveit_mediator::Moveit_mediator(std::vector<std::vector<tf2::Transform>> objects, ros::Publisher* pub, std::shared_ptr<ros::NodeHandle> const& nh) + : Abstract_mediator(objects, pub), nh_(nh) + , sampling_planner_(std::make_unique<moveit::task_constructor::solvers::PipelinePlanner>()) + , cartesian_planner_(std::make_unique<moveit::task_constructor::solvers::CartesianPath>()) + , psi_(std::make_unique<moveit::planning_interface::PlanningSceneInterface>()) + , mgi_(std::make_shared<moveit::planning_interface::MoveGroupInterface>("panda_arms")) + , planning_scene_diff_publisher_(std::make_shared<ros::Publisher>(nh_->advertise<moveit_msgs::PlanningScene>("planning_scene", 1))) + , planning_scene_monitor_(std::make_shared<planning_scene_monitor::PlanningSceneMonitor>("robot_description")){ + + if (planning_scene_monitor_->getPlanningScene()){ + planning_scene_monitor_->startPublishingPlanningScene(planning_scene_monitor::PlanningSceneMonitor::UPDATE_SCENE, + "planning_scene"); + planning_scene_monitor_->getPlanningScene()->setName("planning_scene"); + } else { + ROS_ERROR_STREAM_NAMED("test", "Planning scene not configured"); + return; + } + + robot_model_loader::RobotModelLoaderPtr robot_model_loader; + robot_model_loader = std::make_shared<robot_model_loader::RobotModelLoader>("robot_description"); + robot_model_ = robot_model_loader->getModel(); + ps_ = std::make_shared<planning_scene::PlanningScene>(robot_model_); + + // planner + sampling_planner_->setProperty("goal_joint_tolerance", 1e-5); + + // cartesian + cartesian_planner_->setMaxVelocityScaling(1.0); + cartesian_planner_->setMaxAccelerationScaling(1.0); + cartesian_planner_->setStepSize(.01); + + }; + diff --git a/src/reader/cuboid_reader.cpp b/src/reader/cuboid_reader.cpp index 8842cceb7fc4437ab8c4820d50f98cdf13d5fe15..e95a8c33652633346fd6b715e31a15cf3bdf7285 100644 --- a/src/reader/cuboid_reader.cpp +++ b/src/reader/cuboid_reader.cpp @@ -38,7 +38,7 @@ void Cuboid_reader::read(){ o.z_heigth = size.getZ(); - cuboid_bin_.push_back(o); + cuboid_box_.push_back(o); ROS_INFO("--- Object: %s --- Type: BOX ---", o.Name.c_str()); ROS_INFO("=> Object: pos('%f', '%f', '%f')", pos.getX(), pos.getY(), pos.getZ()); ROS_INFO("=> Object: orientation('%f', '%f', '%f', '%f')", rot.getX(), rot.getY(), rot.getZ(), rot.getW());