$search
00001 #include <ros/ros.h> 00002 00003 #include <iostream> 00004 #include <fstream> 00005 using namespace std; 00006 00007 #include <ias_drawer_executive/Approach.h> 00008 #include <ias_drawer_executive/RobotDriver.h> 00009 #include <ias_drawer_executive/Gripper.h> 00010 #include <ias_drawer_executive/Geometry.h> 00011 #include <ias_drawer_executive/Pressure.h> 00012 #include <ias_drawer_executive/RobotArm.h> 00013 #include <ias_drawer_executive/Torso.h> 00014 #include <ias_drawer_executive/Head.h> 00015 #include <ias_drawer_executive/OperateHandleController.h> 00016 #include <ias_drawer_executive/Geometry.h> 00017 00018 #include <ias_drawer_executive/Current.h> 00019 00020 #include <ias_drawer_executive/ObjectLocalizer.h> 00021 00022 #include <pcl/common/common.h> 00023 #include <pcl/filters/extract_indices.h> 00024 #include <pcl/ModelCoefficients.h> 00025 #include <pcl/point_types.h> 00026 #include <pcl/sample_consensus/method_types.h> 00027 #include <pcl/sample_consensus/model_types.h> 00028 #include <pcl/segmentation/sac_segmentation.h> 00029 #include <pcl/features/boundary.h> 00030 #include <pcl/features/normal_3d.h> 00031 00032 #include <pcl/ros/conversions.h> 00033 #include <pcl_ros/point_cloud.h> 00034 #include <pcl_ros/transforms.h> 00035 00036 #include <boost/thread.hpp> 00037 00038 #include <visualization_msgs/Marker.h> 00039 00040 00041 #include "rosbag/bag.h" 00042 #include "rosbag/query.h" 00043 #include "rosbag/view.h" 00044 00045 #include <ias_drawer_executive/Kinect.h> 00046 00047 00048 ros::Publisher perc_announcer; // perception announcer, sends a marker whenever something is perceived 00049 bool perc_init = false; 00050 int marker_id = 1; 00051 00052 00053 00054 void announce(const std::string text, const tf::Stamped<tf::Pose> &poseStamped) 00055 { 00056 if (!perc_init) 00057 { 00058 perc_init = true; 00059 ros::NodeHandle node_handle; 00060 perc_announcer = node_handle.advertise<visualization_msgs::Marker>( "/perception_announcer", 0 , true); 00061 } 00062 00063 tf::Pose pose; 00064 pose.setOrigin(poseStamped.getOrigin()); 00065 pose.setRotation(poseStamped.getRotation()); 00066 00067 visualization_msgs::Marker marker; 00068 marker.header.frame_id = poseStamped.frame_id_; 00069 marker.header.stamp = ros::Time::now(); 00070 marker.ns = "perception_announcer"; 00071 marker.id = marker_id++; 00072 marker.text = text; 00073 00074 marker.type = visualization_msgs::Marker::CUBE; 00075 marker.action = visualization_msgs::Marker::ADD; 00076 00077 marker.pose.orientation.x = pose.getRotation().x(); 00078 marker.pose.orientation.y = pose.getRotation().y(); 00079 marker.pose.orientation.z = pose.getRotation().z(); 00080 marker.pose.orientation.w = pose.getRotation().w(); 00081 marker.pose.position.x = pose.getOrigin().x(); 00082 marker.pose.position.y = pose.getOrigin().y(); 00083 marker.pose.position.z = pose.getOrigin().z(); 00084 marker.scale.x = 0.05; 00085 marker.scale.y = 0.05; 00086 marker.scale.z = 0.05; 00087 marker.color.r = 0.0; 00088 marker.color.g = 1.0; 00089 marker.color.b = 0.0; 00090 marker.color.a = 0.4; 00091 00092 ROS_INFO("PUBLISH MARKER %i", marker.id); 00093 00094 perc_announcer.publish( marker ); 00095 ros::Duration(0.001).sleep(); 00096 00097 marker.id = marker_id++; 00098 marker.type = visualization_msgs::Marker::TEXT_VIEW_FACING; 00099 marker.text = text; 00100 00101 marker.color.r = 0.0; 00102 marker.color.g = 0.5; 00103 marker.color.b = 0.0; 00104 marker.color.a = 1.0; 00105 marker.scale.x = 0.1; 00106 marker.scale.y = 0.1; 00107 marker.scale.z = 0.1; 00108 //marker.pose.position.z = pose.getOrigin().z() + 0.05; 00109 00110 perc_announcer.publish( marker ); 00111 ros::Duration(0.001).sleep(); 00112 } 00113 00114 00115 void announce_box(const std::string text, const btVector3 min, const btVector3 max) 00116 { 00117 if (!perc_init) 00118 { 00119 perc_init = true; 00120 ros::NodeHandle node_handle; 00121 perc_announcer = node_handle.advertise<visualization_msgs::Marker>( "/perception_announcer", 0 , true); 00122 } 00123 00124 visualization_msgs::Marker marker; 00125 marker.header.frame_id = "/map"; 00126 marker.header.stamp = ros::Time::now(); 00127 marker.ns = "perception_announcer"; 00128 marker.id = marker_id++; 00129 marker.text = text; 00130 00131 marker.type = visualization_msgs::Marker::CUBE; 00132 marker.action = visualization_msgs::Marker::ADD; 00133 00134 marker.pose.orientation.x = 0; 00135 marker.pose.orientation.y = 0; 00136 marker.pose.orientation.z = 0; 00137 marker.pose.orientation.w = 1; 00138 marker.pose.position.x = 0.5 * (max.x() + min.x()); 00139 marker.pose.position.y = 0.5 * (max.y() + min.y()); 00140 marker.pose.position.z = 0.5 * (max.z() + min.z()); 00141 marker.scale.x = max.x() - min.x(); 00142 marker.scale.y = max.y() - min.y(); 00143 marker.scale.z = max.z() - min.z(); 00144 marker.color.r = 0.0; 00145 marker.color.g = 0.0; 00146 marker.color.b = 0.4; 00147 marker.color.a = 0.2; 00148 00149 ROS_INFO("PUBLISH MARKER %i", marker.id); 00150 00151 perc_announcer.publish( marker ); 00152 ros::Duration(0.001).sleep(); 00153 00154 marker.id = marker_id++; 00155 marker.type = visualization_msgs::Marker::TEXT_VIEW_FACING; 00156 marker.text = text; 00157 00158 marker.color.r = 0.0; 00159 marker.color.g = 0.0; 00160 marker.color.b = 0.4; 00161 marker.color.a = 0.2; 00162 marker.scale.x = 0.1; 00163 marker.scale.y = 0.1; 00164 marker.scale.z = 0.1; 00165 marker.pose.position.z = marker.pose.position.z + 0.05; 00166 00167 perc_announcer.publish( marker ); 00168 ros::Duration(0.001).sleep(); 00169 } 00170 00171 bool cloud_pub_initialized = false; 00172 ros::Publisher cloud_pub; 00173 00174 void pubCloud(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud) 00175 { 00176 00177 //ROS_INFO("start pub"); 00178 00179 if (!cloud_pub_initialized) 00180 { 00181 ros::NodeHandle node_handle; 00182 cloud_pub = node_handle.advertise<sensor_msgs::PointCloud2>("/debug_cloud",0,true); 00183 cloud_pub_initialized=true; 00184 } 00185 00186 sensor_msgs::PointCloud2 out; //in map frame 00187 00188 pcl::toROSMsg(*cloud,out); 00189 out.header.frame_id = "/map"; 00190 cloud_pub.publish(out); 00191 00192 ROS_INFO("published %i x %i points", out.height, out.width); 00193 ros::Duration(0.001).sleep(); 00194 00195 } 00196 00197 00198 00199 void printPose(const char title[], tf::Stamped<tf::Pose> pose) 00200 { 00201 ROS_INFO("rosrun tf static_transform_publisher %f %f %f %f %f %f %f %s %s 100", pose.getOrigin().x(), pose.getOrigin().y(), pose.getOrigin().z() 00202 , pose.getRotation().x(), pose.getRotation().y(), pose.getRotation().z(), pose.getRotation().w(), pose.frame_id_.c_str(), title); 00203 } 00204 00205 void printPoseSimple(tf::Stamped<tf::Pose> pose) 00206 { 00207 ROS_INFO("{%f,%f,%f,%f,%f,%f,%f},", pose.getOrigin().x(), pose.getOrigin().y(), pose.getOrigin().z(), 00208 pose.getRotation().x(), pose.getRotation().y(), pose.getRotation().z(), pose.getRotation().w()); 00209 } 00210 00211 00212 int development_tools(int argc, char** argv) 00213 { 00214 00215 00216 if (atoi(argv[1]) == -901) 00217 { 00218 tf::Stamped<tf::Pose> lid; 00219 lid.frame_id_ = argv[4]; 00220 lid.setOrigin(btVector3(0 ,0,0)); 00221 lid.setRotation(btQuaternion(0,0,0,1)); 00222 00223 lid = Geometry::getPoseIn(argv[3], lid); 00224 00225 printf("\ntf::Stamped<tf::Pose> %s;\n",argv[2]); 00226 printf("%s.frame_id_ = \"%s\";\n",argv[2],argv[3]); 00227 printf("%s.setOrigin(btVector3(%f, %f, %f));\n",argv[2], lid.getOrigin().x(), lid.getOrigin().y(), lid.getOrigin().z()); 00228 printf("%s.setRotation(btQuaternion(%f, %f, %f, %f));\n",argv[2], lid.getRotation().x(), lid.getRotation().y(), lid.getRotation().z(), lid.getRotation().w()); 00229 00230 printf("\nRobotArm::getInstance(%s)->universal_move_toolframe_ik_pose(%s);\n",argv[5],argv[2]); 00231 00232 printf("\nbin/ias_drawer_executive -3 %s %f %f %f %f %f %f %f\n", argv[5] ,lid.getOrigin().x(), lid.getOrigin().y(), lid.getOrigin().z(), lid.getRotation().x(), lid.getRotation().y(), lid.getRotation().z(), lid.getRotation().w()); 00233 } 00234 00235 00236 if (atoi(argv[1]) == -911) 00237 { 00238 { 00239 tf::Stamped<tf::Pose> lid; 00240 lid.frame_id_ = "r_gripper_tool_frame"; 00241 lid.setOrigin(btVector3(0 ,0,0)); 00242 lid.setRotation(btQuaternion(0,0,0,1)); 00243 00244 lid = Geometry::getPoseIn("/map", lid); 00245 00246 printf("\ntf::Stamped<tf::Pose> r%s;\n",argv[2]); 00247 printf("r%s.frame_id_ = \"%s\";\n",argv[2],"/map"); 00248 printf("r%s.setOrigin(btVector3(%f, %f, %f));\n",argv[2], lid.getOrigin().x(), lid.getOrigin().y(), lid.getOrigin().z()); 00249 printf("r%s.setRotation(btQuaternion(%f, %f, %f, %f));\n",argv[2], lid.getRotation().x(), lid.getRotation().y(), lid.getRotation().z(), lid.getRotation().w()); 00250 00251 printf("\nRobotArm::getInstance(0)->universal_move_toolframe_ik_pose(r%s);\n",argv[2]); 00252 } 00253 00254 { 00255 tf::Stamped<tf::Pose> lid; 00256 lid.frame_id_ = "l_gripper_tool_frame"; 00257 lid.setOrigin(btVector3(0 ,0,0)); 00258 lid.setRotation(btQuaternion(0,0,0,1)); 00259 00260 lid = Geometry::getPoseIn("/map", lid); 00261 00262 printf("\ntf::Stamped<tf::Pose> l%s;\n",argv[2]); 00263 printf("l%s.frame_id_ = \"%s\";\n",argv[2],"/map"); 00264 printf("l%s.setOrigin(btVector3(%f, %f, %f));\n",argv[2], lid.getOrigin().x(), lid.getOrigin().y(), lid.getOrigin().z()); 00265 printf("l%s.setRotation(btQuaternion(%f, %f, %f, %f));\n",argv[2], lid.getRotation().x(), lid.getRotation().y(), lid.getRotation().z(), lid.getRotation().w()); 00266 00267 printf("\nRobotArm::getInstance(1)->universal_move_toolframe_ik_pose(l%s);\n",argv[2]); 00268 } 00269 printf("\nRobotArm::moveBothArms(l%s,r%s);\n",argv[2],argv[2]); 00270 00271 } 00272 00273 if (atoi(argv[1]) == -912) 00274 { 00275 { 00276 tf::Stamped<tf::Pose> lid; 00277 lid.frame_id_ = "r_gripper_tool_frame"; 00278 lid.setOrigin(btVector3(0 ,0,0)); 00279 lid.setRotation(btQuaternion(0,0,0,1)); 00280 00281 lid = Geometry::getPoseIn("base_link", lid); 00282 00283 printf("\ntf::Stamped<tf::Pose> r%s;\n",argv[2]); 00284 printf("r%s.frame_id_ = \"%s\";\n",argv[2],"base_link"); 00285 printf("r%s.setOrigin(btVector3(%f, %f, %f));\n",argv[2], lid.getOrigin().x(), lid.getOrigin().y(), lid.getOrigin().z()); 00286 printf("r%s.setRotation(btQuaternion(%f, %f, %f, %f));\n",argv[2], lid.getRotation().x(), lid.getRotation().y(), lid.getRotation().z(), lid.getRotation().w()); 00287 00288 printf("\nRobotArm::getInstance(0)->universal_move_toolframe_ik_pose(r%s);\n",argv[2]); 00289 } 00290 00291 { 00292 tf::Stamped<tf::Pose> lid; 00293 lid.frame_id_ = "l_gripper_tool_frame"; 00294 lid.setOrigin(btVector3(0 ,0,0)); 00295 lid.setRotation(btQuaternion(0,0,0,1)); 00296 00297 lid = Geometry::getPoseIn("base_link", lid); 00298 00299 printf("\ntf::Stamped<tf::Pose> l%s;\n",argv[2]); 00300 printf("l%s.frame_id_ = \"%s\";\n",argv[2],"base_link"); 00301 printf("l%s.setOrigin(btVector3(%f, %f, %f));\n",argv[2], lid.getOrigin().x(), lid.getOrigin().y(), lid.getOrigin().z()); 00302 printf("l%s.setRotation(btQuaternion(%f, %f, %f, %f));\n",argv[2], lid.getRotation().x(), lid.getRotation().y(), lid.getRotation().z(), lid.getRotation().w()); 00303 00304 printf("\nRobotArm::getInstance(1)->universal_move_toolframe_ik_pose(l%s);\n",argv[2]); 00305 } 00306 printf("\nRobotArm::moveBothArms(l%s,r%s);\n",argv[2],argv[2]); 00307 00308 } 00309 00310 00311 if (atoi(argv[1]) == -910) 00312 { 00313 tf::Stamped<tf::Pose> lid; 00314 lid.frame_id_ = argv[4]; 00315 lid.setOrigin(btVector3(atof(argv[6]),atof(argv[7]),atof(argv[8]))); 00316 lid.setRotation(btQuaternion(0,0,0,1)); 00317 00318 lid = Geometry::getPoseIn(argv[3], lid); 00319 00320 printf("\ntf::Stamped<tf::Pose> %s;\n",argv[2]); 00321 printf("%s.frame_id_ = \"%s\";\n",argv[2],argv[3]); 00322 printf("%s.setOrigin(btVector3(%f, %f, %f));\n",argv[2], lid.getOrigin().x(), lid.getOrigin().y(), lid.getOrigin().z()); 00323 printf("%s.setRotation(btQuaternion(%f, %f, %f, %f));\n",argv[2], lid.getRotation().x(), lid.getRotation().y(), lid.getRotation().z(), lid.getRotation().w()); 00324 00325 printf("\nRobotArm::getInstance(%s)->universal_move_toolframe_ik_pose(%s);\n",argv[5],argv[2]); 00326 00327 printf("\nbin/ias_drawer_executive -3 %s %f %f %f %f %f %f %f\n", argv[5] ,lid.getOrigin().x(), lid.getOrigin().y(), lid.getOrigin().z(), lid.getRotation().x(), lid.getRotation().y(), lid.getRotation().z(), lid.getRotation().w()); 00328 } 00329 00330 if (atoi(argv[1]) == -940) 00331 { 00332 tf::Stamped<tf::Pose> lid; 00333 lid.frame_id_ = "base_link"; 00334 lid.setOrigin(btVector3(0 ,0,0)); 00335 lid.setRotation(btQuaternion(0,0,0,1)); 00336 00337 lid = Geometry::getPoseIn("/map", lid); 00338 00339 printf("\nRobotDriver::moveBase4(%f, %f, %f, %f);\n",lid.getOrigin().x(), lid.getOrigin().y(), lid.getRotation().z(), lid.getRotation().w()); 00340 00341 } 00342 return 0; 00343 } 00344 00345 /* 00346 tf::Stamped<tf::Pose> getPotPose() 00347 { 00348 00349 //if (atoi(argv[1]) == -617) 00350 { 00351 ros::NodeHandle node_handle; 00352 ros::Publisher pose_pub = node_handle.advertise<geometry_msgs::PoseStamped>( "/cop_detection", 0 , true); 00353 ros::Publisher best_pose_pub = node_handle.advertise<geometry_msgs::PoseStamped>( "/cop_detection_best", 0, true ); 00354 00355 std::vector<tf::Stamped<tf::Pose> > poses; 00356 std::vector<double > votes; 00357 00358 while (ros::ok()) 00359 { 00360 tf::Stamped<tf::Pose> pose; 00361 pose = OperateHandleController::getCopPose("PotWW", "/openni_rgb_optical_frame"); 00362 ros::Duration(0.05).sleep(); 00363 if (pose.frame_id_ == "NO_ID_STAMPED_DEFAULT_CONSTRUCTION") 00364 { 00365 ROS_ERROR("dropped %s", pose.frame_id_.c_str()); 00366 continue; 00367 } 00368 00369 if (pose.getOrigin().length() < 0.1) 00370 continue; 00371 pose = Geometry::getPoseIn("/map", pose); 00372 00373 geometry_msgs::PoseStamped pose_stamped, best_pose_stamped; 00374 00375 tf::poseStampedTFToMsg(pose,pose_stamped); 00376 pose_pub.publish(pose_stamped); 00377 ros::Duration(0.05).sleep(); 00378 00379 if ((btVector3(-1.836059, 2.612557, 1.016513) - pose.getOrigin()).length() > 0.5) 00380 continue; 00381 00382 { 00383 poses.push_back(pose); 00384 votes.push_back(.0); 00385 00386 ROS_INFO("tick"); 00387 00388 if (poses.size() > 1) 00389 { 00390 for (size_t k = 0; k < poses.size(); ++k) 00391 { 00392 votes[k] = 0; 00393 } 00394 double max_score = 0; 00395 for (size_t k = 0; k < poses.size(); ++k) 00396 { 00397 for (size_t j = 0; j < poses.size(); ++j) 00398 { 00399 btTransform a,b,c; 00400 a.setOrigin(poses[k].getOrigin()); 00401 a.setRotation(poses[k].getRotation()); 00402 b.setOrigin(poses[j].getOrigin()); 00403 b.setRotation(poses[j].getRotation()); 00404 c = b.inverseTimes(a); 00405 double score = c.getOrigin().length() + c.getRotation().getAngle() * .001; 00406 votes[j] += score; 00407 votes[k] += score; 00408 if (votes[k] > max_score) 00409 max_score = votes[k]; 00410 if (votes[j] > max_score) 00411 max_score = votes[j]; 00412 } 00413 } 00414 double minscore = 1000000; 00415 tf::Stamped<tf::Pose> best; 00416 for (size_t k = 0; k < poses.size(); ++k) 00417 { 00418 double act = votes[k] / max_score; 00419 ROS_INFO("%zu score %f: %f", k, votes[k], act); 00420 if (act < minscore) 00421 { 00422 minscore = act; 00423 best = poses[k]; 00424 } 00425 } 00426 tf::poseStampedTFToMsg(best,best_pose_stamped); 00427 ROS_INFO("min score = %f", minscore); 00428 best_pose_pub.publish(best_pose_stamped); 00429 if (poses.size() > 3) 00430 return best; 00431 ros::Duration(0.05).sleep(); 00432 } 00433 } 00434 } 00435 00436 } 00437 00438 tf::Stamped<tf::Pose> t; 00439 return t; 00440 00441 } 00442 */ 00443 00444 00445 void pubMarker(tf::Stamped<tf::Pose> pose, double radius) 00446 { 00447 ros::NodeHandle node_handle; 00448 ros::Publisher vis_pub = node_handle.advertise<visualization_msgs::Marker>( "/robot_arm_marker", 0 ); 00449 00450 visualization_msgs::Marker marker; 00451 marker.header.frame_id = "/map"; 00452 marker.header.stamp = ros::Time::now(); 00453 marker.ns = "goalpoints"; 00454 marker.id = 10000; 00455 marker.type = visualization_msgs::Marker::CYLINDER; 00456 marker.action = visualization_msgs::Marker::ADD; 00457 00458 marker.pose.orientation.x = pose.getRotation().x(); 00459 marker.pose.orientation.y = pose.getRotation().y(); 00460 marker.pose.orientation.z = pose.getRotation().z(); 00461 marker.pose.orientation.w = pose.getRotation().w(); 00462 marker.pose.position.x = pose.getOrigin().x(); 00463 marker.pose.position.y = pose.getOrigin().y(); 00464 marker.pose.position.z = pose.getOrigin().z(); 00465 marker.scale.x = radius; 00466 marker.scale.y = radius; 00467 marker.scale.z = 0.3; 00468 marker.color.r = 1.0; 00469 marker.color.g = 0.0; 00470 marker.color.b = 0.0; 00471 marker.color.a = 0.5; 00472 00473 ROS_INFO("PUBLISH MARKER %i", marker.id); 00474 00475 ros::Rate rate(10.0); 00476 int k = 0; 00477 while (k < 10) 00478 { 00479 marker.id = ++marker.id; 00480 vis_pub.publish( marker ); 00481 ros::spinOnce(); 00482 rate.sleep(); 00483 } 00484 } 00485 00486 00487 /*void getKinectCloud(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud, ros::Time after = ros::Time(0,0)) 00488 { 00489 00490 sensor_msgs::PointCloud2 pc;// = *(ros::topic::waitForMessage<sensor_msgs::PointCloud2>("/kinect/cloud_throttled")); 00491 bool found = false; 00492 while (!found) 00493 { 00494 //pc = *(ros::topic::waitForMessage<sensor_msgs::PointCloud2>("/kinect/cloud_throttled")); 00495 pc = *(ros::topic::waitForMessage<sensor_msgs::PointCloud2>("/camera/rgb/points")); 00496 if ((after == ros::Time(0,0)) || (pc.header.stamp > after)) 00497 found = true; 00498 else 00499 { 00500 ROS_ERROR("getKinectCloudXYZ cloud too old : stamp %f , target time %f",pc.header.stamp.toSec(), after.toSec()); 00501 } 00502 } 00503 tf::Stamped<tf::Pose> net_stamped = RobotArm::getPose("/map","/openni_rgb_optical_frame"); 00504 tf::Transform net_transform; 00505 net_transform.setOrigin(net_stamped.getOrigin()); 00506 net_transform.setRotation(net_stamped.getRotation()); 00507 00508 sensor_msgs::PointCloud2 pct; //in map frame 00509 00510 pcl_ros::transformPointCloud("/map",net_transform,pc,pct); 00511 pct.header.frame_id = "/map"; 00512 00513 pcl::fromROSMsg(pct, *cloud); 00514 } 00515 00516 void getKinectCloudXYZ(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, ros::Time after = ros::Time(0,0)) 00517 { 00518 00519 sensor_msgs::PointCloud2 pc; 00520 bool found = false; 00521 while (!found) 00522 { 00523 //pc = *(ros::topic::waitForMessage<sensor_msgs::PointCloud2>("/kinect/cloud_throttled")); 00524 pc = *(ros::topic::waitForMessage<sensor_msgs::PointCloud2>("/camera/rgb/points")); 00525 if ((after == ros::Time(0,0)) || (pc.header.stamp > after)) 00526 found = true; 00527 else 00528 { 00529 ROS_ERROR("getKinectCloudXYZ cloud too old : stamp %f , target time %f",pc.header.stamp.toSec(), after.toSec()); 00530 } 00531 } 00532 tf::Stamped<tf::Pose> net_stamped = RobotArm::getPose("/map","/openni_rgb_optical_frame"); 00533 tf::Transform net_transform; 00534 net_transform.setOrigin(net_stamped.getOrigin()); 00535 net_transform.setRotation(net_stamped.getRotation()); 00536 00537 sensor_msgs::PointCloud2 pct; //in map frame 00538 00539 pcl_ros::transformPointCloud("/map",net_transform,pc,pct); 00540 pct.header.frame_id = "/map"; 00541 00542 pcl::fromROSMsg(pct, *cloud); 00543 } 00544 */ 00545 00546 void discardKinectFrame() 00547 { 00548 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>); 00549 Kinect::getInstance()->getCloud(cloud,"/map"); 00550 } 00551 00552 00553 00554 void getPointsInBox(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud, btVector3 min, btVector3 max, pcl::PointCloud<pcl::PointXYZRGB>::Ptr inBox) 00555 { 00556 00557 Eigen::Vector4f min_pt, max_pt; 00558 00559 min_pt = Eigen::Vector4f(min.x(),min.y(),min.z(), 1); 00560 max_pt = Eigen::Vector4f(max.x(),max.y(),max.z(), 1); 00561 00562 //{ 00563 00564 //btVector3 roi_min(min_pt[0],min_pt[1],min_pt[2]); 00565 //btVector3 roi_max(max_pt[0],max_pt[1],max_pt[2]); 00566 00567 //announce_box("roi", roi_min, roi_max); 00568 00569 //} 00570 00571 00572 ROS_INFO("min %f %f %f" ,min_pt[0],min_pt[1],min_pt[2]); 00573 ROS_INFO("max %f %f %f" ,max_pt[0],max_pt[1],max_pt[2]); 00574 00575 ROS_INFO("cloud size : %zu", cloud->points.size()); 00576 00577 boost::shared_ptr<std::vector<int> > indices( new std::vector<int> ); 00578 pcl::getPointsInBox(*cloud,min_pt,max_pt,*indices); 00579 00580 pcl::ExtractIndices<pcl::PointXYZRGB> ei; 00581 ei.setInputCloud(cloud); 00582 ei.setIndices(indices); 00583 ei.filter(*inBox); 00584 00585 pubCloud(inBox); 00586 00587 ROS_INFO("cloud size after box filtering: %zu", inBox->points.size()); 00588 } 00589 00590 00591 //get circle2d in xy plane within searchspace min->max, takin pointcloud on its own 00592 bool getCircle(const btVector3 min, const btVector3 max, btVector3 ¢er, double &radius) 00593 { 00594 00595 ros::NodeHandle node_handle; 00596 ros::Publisher pose_pub = node_handle.advertise<geometry_msgs::PoseStamped>( "/cop_detection", 0 , true); 00597 ros::Publisher pose_pubr = node_handle.advertise<geometry_msgs::PoseStamped>( "/cop_detectionr", 0 , true); 00598 ros::Publisher pose_publ = node_handle.advertise<geometry_msgs::PoseStamped>( "/cop_detectionl", 0 , true); 00599 00600 sensor_msgs::PointCloud2 pc = *(ros::topic::waitForMessage<sensor_msgs::PointCloud2>("/kinect/cloud_throttled")); 00601 00602 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); 00603 pcl::PointCloud<pcl::PointXYZ>::Ptr pot_cyl_cloud(new pcl::PointCloud<pcl::PointXYZ>); 00604 00605 tf::Stamped<tf::Pose> net_stamped = Geometry::getPose("/map","/openni_rgb_optical_frame"); 00606 tf::Transform net_transform; 00607 net_transform.setOrigin(net_stamped.getOrigin()); 00608 net_transform.setRotation(net_stamped.getRotation()); 00609 00610 sensor_msgs::PointCloud2 pct; //in map frame 00611 00612 pcl_ros::transformPointCloud("/map",net_transform,pc,pct); 00613 pct.header.frame_id = "/map"; 00614 00615 pcl::fromROSMsg(pct, *cloud); 00616 00617 Eigen::Vector4f min_pt, max_pt; 00618 00619 min_pt = Eigen::Vector4f(min.x(),min.y(),min.z(), 1); 00620 max_pt = Eigen::Vector4f(max.x(),max.y(),max.z(), 1); 00621 { 00622 tf::Stamped<tf::Pose> res; 00623 res.setOrigin(min); 00624 res.setRotation(btQuaternion(0,0,0,1)); 00625 res.frame_id_ = "/map"; 00626 00627 geometry_msgs::PoseStamped res_msg; 00628 tf::poseStampedTFToMsg(res,res_msg); 00629 00630 pose_pubr.publish(res_msg); 00631 } 00632 00633 { 00634 tf::Stamped<tf::Pose> res; 00635 res.setOrigin(max); 00636 res.setRotation(btQuaternion(0,0,0,1)); 00637 res.frame_id_ = "/map"; 00638 00639 geometry_msgs::PoseStamped res_msg; 00640 tf::poseStampedTFToMsg(res,res_msg); 00641 00642 pose_publ.publish(res_msg); 00643 } 00644 00645 00646 00647 ROS_INFO("min %f %f %f" ,min.x(),min.y(),min.z()); 00648 ROS_INFO("max %f %f %f" ,max.x(),max.y(),max.z()); 00649 00650 ROS_INFO("cloud size : %zu", cloud->points.size()); 00651 00652 boost::shared_ptr<std::vector<int> > indices( new std::vector<int> ); 00653 pcl::getPointsInBox(*cloud,min_pt,max_pt,*indices); 00654 00655 pcl::ExtractIndices<pcl::PointXYZ> ei; 00656 ei.setInputCloud(cloud); 00657 ei.setIndices(indices); 00658 ei.filter(*pot_cyl_cloud); 00659 00660 ROS_INFO("cloud size : %zu", pot_cyl_cloud->points.size()); 00661 00662 pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients); 00663 pcl::PointIndices::Ptr inliers (new pcl::PointIndices); 00664 // Create the segmentation object 00665 pcl::SACSegmentation<pcl::PointXYZ> seg; 00666 // Optional 00667 seg.setOptimizeCoefficients (true); 00668 // Mandatory 00669 seg.setModelType (pcl::SACMODEL_CIRCLE2D); 00670 seg.setMethodType (pcl::SAC_RANSAC); 00671 seg.setDistanceThreshold (0.01); 00672 00673 seg.setInputCloud (pot_cyl_cloud); 00674 seg.segment (*inliers, *coefficients); 00675 00676 if (inliers->indices.size () == 0) 00677 { 00678 PCL_ERROR ("Could not estimate a planar model for the given dataset."); 00679 return false; 00680 } 00681 else 00682 { 00683 ROS_INFO("MODEL :"); 00684 //coefficients.get() 00685 ROS_INFO("%f %f %f %f", coefficients->values[0], coefficients->values[1], coefficients->values[2], coefficients->values[3]); 00686 center = btVector3(coefficients->values[0], coefficients->values[1],0.5*(min.z() + max.z())); 00687 radius = coefficients->values[2]; 00688 00689 00690 tf::Stamped<tf::Pose> res; 00691 res.setOrigin(center); 00692 res.setRotation(btQuaternion(0,0,0,1)); 00693 res.frame_id_ = "/map"; 00694 00695 geometry_msgs::PoseStamped res_msg; 00696 tf::poseStampedTFToMsg(res,res_msg); 00697 00698 pose_pub.publish(res_msg); 00699 00700 //ros::Duration(1.0).sleep(); 00701 00702 return true; 00703 } 00704 } 00705 00707 bool getCircleFromCloud(pcl::PointCloud<pcl::PointXYZRGB> &pot_cyl_cloud, btVector3 ¢er, double &radius) 00708 { 00709 00710 ros::NodeHandle node_handle; 00711 ros::Publisher pose_pub = node_handle.advertise<geometry_msgs::PoseStamped>( "/cop_detection", 0 , true); 00712 00713 pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients); 00714 pcl::PointIndices::Ptr inliers (new pcl::PointIndices); 00715 // Create the segmentation object 00716 pcl::SACSegmentation<pcl::PointXYZRGB> seg; 00717 // Optional 00718 seg.setOptimizeCoefficients (true); 00719 // Mandatory 00720 seg.setModelType (pcl::SACMODEL_CIRCLE2D); 00721 seg.setMethodType (pcl::SAC_RANSAC); 00722 seg.setDistanceThreshold (0.01); 00723 00724 seg.setInputCloud (pot_cyl_cloud.makeShared()); 00725 seg.segment (*inliers, *coefficients); 00726 00727 seg.setRadiusLimits(radius - .01, radius + .01); 00728 00729 if (inliers->indices.size () == 0) 00730 { 00731 PCL_ERROR ("Could not estimate a planar model for the given dataset."); 00732 return false; 00733 } 00734 else 00735 { 00736 00737 double z = 0; 00738 for (size_t k=0; k < inliers->indices.size(); ++k) 00739 { 00740 z += pot_cyl_cloud.points[inliers->indices[k]].z; 00741 } 00742 z /= inliers->indices.size(); 00743 ROS_INFO("MODEL :"); 00744 //coefficients.get() 00745 ROS_INFO("%f %f %f %f SIZE : %zu", coefficients->values[0], coefficients->values[1], coefficients->values[2], coefficients->values[3], inliers->indices.size()); 00746 center = btVector3(coefficients->values[0], coefficients->values[1],z); 00747 radius = coefficients->values[2]; 00748 00749 tf::Stamped<tf::Pose> res; 00750 res.setOrigin(center); 00751 res.setRotation(btQuaternion(0,0,0,1)); 00752 res.frame_id_ = "/map"; 00753 00754 geometry_msgs::PoseStamped res_msg; 00755 tf::poseStampedTFToMsg(res,res_msg); 00756 00757 pose_pub.publish(res_msg); 00758 00759 //ros::Duration(1.0).sleep(); 00760 00761 return true; 00762 } 00763 } 00764 00765 00766 00767 00768 bool getCirclesFromCloud(pcl::PointCloud<pcl::PointXYZRGB> &pot_cyl_cloud, double radius_goal, double radius_tolerance, 00769 std::vector<btVector3> ¢er, 00770 std::vector<double> &radius, 00771 std::vector<int> &numinliers, 00772 size_t iterations = 5) 00773 { 00774 00775 00776 ros::NodeHandle node_handle; 00777 00778 //ros::Publisher cloud_pub = node_handle.advertise<sensor_msgs::PointCloud2>("/debug_cloud",0,true); 00779 00780 center.clear(); 00781 radius.clear(); 00782 numinliers.clear(); 00783 00784 center.resize(iterations); 00785 radius.resize(iterations); 00786 numinliers.resize(iterations); 00787 00788 pcl::PointCloud<pcl::PointXYZRGB> act = pot_cyl_cloud; 00789 pcl::PointCloud<pcl::PointXYZRGB> flip; 00790 00791 for (size_t k = 0; k < iterations; k++) 00792 { 00793 00794 //sensor_msgs::PointCloud2 out; //in map frame 00795 //pcl::toROSMsg(act,out); 00796 //out.header.frame_id = "/map"; 00797 //cloud_pub.publish(out); 00798 pubCloud(act.makeShared()); 00799 00800 ros::NodeHandle node_handle; 00801 ros::Publisher pose_pub = node_handle.advertise<geometry_msgs::PoseStamped>( "/cop_detection", 0 , true); 00802 00803 pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients); 00804 pcl::PointIndices::Ptr inliers (new pcl::PointIndices); 00805 // Create the segmentation object 00806 pcl::SACSegmentation<pcl::PointXYZRGB> seg; 00807 // Optional 00808 seg.setOptimizeCoefficients (true); 00809 // Mandatory 00810 seg.setModelType (pcl::SACMODEL_CIRCLE2D); 00811 seg.setMethodType (pcl::SAC_RANSAC); 00812 seg.setDistanceThreshold (0.01); 00813 00814 seg.setInputCloud (act.makeShared()); 00815 seg.segment (*inliers, *coefficients); 00816 00817 seg.setRadiusLimits(radius_goal - radius_tolerance, radius_goal + radius_tolerance); 00818 00819 if (inliers->indices.size () == 0) 00820 { 00821 PCL_ERROR ("Could not estimate a planar model for the given dataset."); 00822 return false; 00823 } 00824 else 00825 { 00826 double z = 0; 00827 for (size_t g=0; g < inliers->indices.size(); ++g) 00828 { 00829 z += act.points[inliers->indices[g]].z; 00830 } 00831 z /= inliers->indices.size(); 00832 ROS_INFO("MODEL :"); 00833 //coefficients.get() 00834 ROS_INFO("%f %f %f %f SIZE : %zu", coefficients->values[0], coefficients->values[1], coefficients->values[2], coefficients->values[3], inliers->indices.size()); 00835 center[k] = btVector3(coefficients->values[0], coefficients->values[1],z); 00836 radius[k] = coefficients->values[2]; 00837 numinliers[k] = inliers->indices.size(); 00838 00839 tf::Stamped<tf::Pose> res; 00840 res.setOrigin(center[k]); 00841 res.setRotation(btQuaternion(0,0,0,1)); 00842 res.frame_id_ = "/map"; 00843 00844 geometry_msgs::PoseStamped res_msg; 00845 tf::poseStampedTFToMsg(res,res_msg); 00846 00847 pose_pub.publish(res_msg); 00848 00849 } 00850 flip = act; 00851 pcl::ExtractIndices<pcl::PointXYZRGB> ei; 00852 ei.setInputCloud(flip.makeShared()); 00853 ei.setIndices(inliers); 00854 ei.setNegative(true); 00855 ei.filter(act); 00856 00857 ROS_INFO("BLIP"); 00858 //ros::Duration(1).sleep(); 00859 } 00860 return true; 00861 } 00862 00863 bool getLidPose(tf::Stamped<tf::Pose> &lid, btVector3 min = btVector3(-2.134, 2.625,0.955), btVector3 max = btVector3(-1.663, 3.215,0.972)) 00864 { 00865 00866 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>); 00867 00868 Kinect::getInstance()->getCloud(cloud); 00869 00870 //btVector3 min(-2.134, 2.625,0.953); 00871 //btVector3 max(-1.663, 3.215,0.972); 00872 00873 pcl::PointCloud<pcl::PointXYZRGB>::Ptr inBox (new pcl::PointCloud<pcl::PointXYZRGB>); 00874 00875 getPointsInBox(cloud,min,max,inBox); 00876 00877 pubCloud(inBox); 00878 00879 std::vector<btVector3> center; 00880 std::vector<double> radius; 00881 std::vector<int> numinliers; 00882 00883 getCirclesFromCloud(*inBox, .2, .04,center,radius,numinliers,1); 00884 00885 if (numinliers[0] < 300) 00886 return false; 00887 00888 lid.setOrigin(center[0]); 00889 lid.setRotation(btQuaternion(0,0,0,1)); 00890 lid.frame_id_ = "/map"; 00891 00892 lid = Geometry::getPoseIn("base_link", lid); 00893 lid.setRotation(btQuaternion(0,0,1,0)); 00894 lid = Geometry::getPoseIn("map", lid); 00895 00896 announce("Lid", lid); 00897 00898 return true; 00899 } 00900 00901 00902 void calcPotGraspPoints(tf::Stamped<tf::Pose> det, tf::Stamped<tf::Pose> &leftpreg, tf::Stamped<tf::Pose> &leftg, tf::Stamped<tf::Pose> &rightpreg, tf::Stamped<tf::Pose> &rightg) 00903 { 00904 btTransform potww; 00905 potww.setOrigin(det.getOrigin()); 00906 potww.setRotation(det.getRotation()); 00907 btTransform leftrel, rightrel; 00908 btTransform leftgrasp, rightgrasp; 00909 00910 rightrel.setOrigin(btVector3(0.136, -0.012, -0.014)); 00911 rightrel.setRotation(btQuaternion(-0.179, -0.684, 0.685, -0.175)); 00912 00913 leftrel.setOrigin(btVector3(-0.130, -0.008, -0.013)); 00914 leftrel.setRotation(btQuaternion(-0.677, 0.116, 0.168, 0.707)); 00915 00916 btTransform pregrasp(btQuaternion(0,0,0,1), btVector3(-.06,0,0)); 00917 btTransform leftpregrasp,rightpregrasp; 00918 00919 rightpregrasp = potww * rightrel * pregrasp; 00920 leftpregrasp = potww * leftrel * pregrasp; 00921 00922 rightgrasp = potww * rightrel; 00923 leftgrasp = potww * leftrel; 00924 00925 leftg = det; 00926 rightg = det; 00927 leftg.frame_id_ = "/map"; 00928 rightg.frame_id_ = "/map"; 00929 00930 leftg.setOrigin(leftgrasp.getOrigin()); 00931 leftg.setRotation(leftgrasp.getRotation()); 00932 rightg.setOrigin(rightgrasp.getOrigin()); 00933 rightg.setRotation(rightgrasp.getRotation()); 00934 00935 leftpreg.frame_id_ = "/map"; 00936 rightpreg.frame_id_ = "/map"; 00937 leftpreg.setOrigin(leftpregrasp.getOrigin()); 00938 leftpreg.setRotation(leftpregrasp.getRotation()); 00939 rightpreg.setOrigin(rightpregrasp.getOrigin()); 00940 rightpreg.setRotation(rightpregrasp.getRotation()); 00941 } 00942 00943 00945 bool getPotPose(tf::Stamped<tf::Pose> &potPose, tf::Stamped<tf::Pose> &leftpreg, tf::Stamped<tf::Pose> &leftg, tf::Stamped<tf::Pose> &rightpreg, tf::Stamped<tf::Pose> &rightg, bool via_lid=true) 00946 { 00947 00948 ros::Time query_time = ros::Time::now(); 00949 00950 double table_height = 0.865; 00951 double pot_cyl_min = 0.02; 00952 double pot_cyl_max = 0.05; 00953 double pot_handle_min = 0.06; 00954 double pot_handle_max = 0.09; 00955 double pot_radius = 0.20 / 2.0; 00956 double pot_handle_radius_max = 0.28 / 2.0; 00957 double pot_handle_radius_min = 0.25 / 2.0; 00958 //-1.77 3.09 00959 //-2.06 2.41 00960 //btVector3 roi_min(-2.134, 2.625, table_height + pot_cyl_min); 00961 //btVector3 roi_max(-1.663, 3.215, table_height + pot_cyl_max); 00962 btVector3 roi_min(-2.06, 2.41, table_height + pot_cyl_min); 00963 btVector3 roi_max(-1.7, 3.09, table_height + pot_cyl_max); 00964 00965 announce_box("pot search", roi_min, roi_max); 00966 announce_box("pot search", roi_min, roi_max); 00967 00968 ros::NodeHandle node_handle; 00969 00970 ros::Publisher cloud_pub = node_handle.advertise<sensor_msgs::PointCloud2>("/debug_cloud",0,true); 00971 ros::Publisher pose_pub = node_handle.advertise<geometry_msgs::PoseStamped>( "/cop_detection", 0 , true); 00972 ros::Publisher pose_pubr = node_handle.advertise<geometry_msgs::PoseStamped>( "/cop_detectionr", 0 , true); 00973 ros::Publisher pose_publ = node_handle.advertise<geometry_msgs::PoseStamped>( "/cop_detectionl", 0 , true); 00974 00975 00976 // sensor_msgs::PointCloud2 pc = *(ros::topic::waitForMessage<sensor_msgs::PointCloud2>("/kinect/cloud_throttled")); 00977 00978 //tf::Stamped<tf::Pose> net_stamped = RobotArm::getPose("/map","/openni_rgb_optical_frame"); 00979 //tf::Transform net_transform; 00980 //net_transform.setOrigin(net_stamped.getOrigin()); 00981 //net_transform.setRotation(net_stamped.getRotation()); 00982 00983 //sensor_msgs::PointCloud2 pct; //in map frame 00984 00985 //pcl_ros::transformPointCloud("/map",net_transform,pc,pct); 00986 //pct.header.frame_id = "/map"; 00987 00988 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); 00989 00990 Kinect::getInstance()->getCloud(cloud, "/map", query_time); 00991 //pcl::fromROSMsg(pct, *cloud); 00992 00993 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>); 00994 00995 Eigen::Vector4f min_pt, max_pt; 00996 00997 // find the pot center 00998 btVector3 center; 00999 01000 01001 double radius; 01002 if (!via_lid) 01003 { 01005 01006 pcl::PointCloud<pcl::PointXYZ>::Ptr pot_cyl_cloud(new pcl::PointCloud<pcl::PointXYZ>); 01007 Eigen::Vector4f min_pt, max_pt; 01008 01009 //min_pt = Eigen::Vector4f(-2.134, 2.625, 0.95 - 0.03, 0); 01010 //max_pt = Eigen::Vector4f(-1.663, 3.215, 0.95 + 0.03, 0); 01011 01012 min_pt = Eigen::Vector4f(roi_min.x(), roi_min.y(), roi_min.z(),1); 01013 max_pt = Eigen::Vector4f(roi_max.x(), roi_max.y(), roi_max.z(),1); 01014 01015 boost::shared_ptr<std::vector<int> > indices( new std::vector<int> ); 01016 pcl::getPointsInBox(*cloud,min_pt,max_pt,*indices); 01017 pcl::ExtractIndices<pcl::PointXYZ> ei; 01018 ei.setInputCloud(cloud); 01019 ei.setIndices(indices); 01020 01021 ei.filter(*pot_cyl_cloud); 01022 01023 pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients); 01024 pcl::PointIndices::Ptr inliers (new pcl::PointIndices); 01025 // Create the segmentation object 01026 pcl::SACSegmentation<pcl::PointXYZ> seg; 01027 // Optional 01028 seg.setOptimizeCoefficients (true); 01029 // Mandatory 01030 seg.setModelType (pcl::SACMODEL_CIRCLE2D); 01031 seg.setMethodType (pcl::SAC_RANSAC); 01032 seg.setDistanceThreshold (0.01); 01033 01034 seg.setInputCloud (pot_cyl_cloud); 01035 01036 seg.setProbability(0.9999); 01037 seg.setOptimizeCoefficients(true); 01038 01039 seg.segment (*inliers, *coefficients); 01040 01041 if (inliers->indices.size () == 0) 01042 { 01043 PCL_ERROR ("Could not estimate a planar model for the given dataset."); 01044 return false; 01045 } 01046 else 01047 { 01048 ROS_INFO("MODEL :"); 01049 //coefficients.get() 01050 ROS_INFO("%f %f %f %f", coefficients->values[0], coefficients->values[1], coefficients->values[2], coefficients->values[3]); 01051 center = btVector3(coefficients->values[0], coefficients->values[1],0.96); 01052 radius = coefficients->values[2]; 01053 } 01054 } 01055 01056 //min_pt = Eigen::Vector4f(center.x(),center.y(),1,1) - Eigen::Vector4f(.25,.25,.0, 0); 01057 //max_pt = Eigen::Vector4f(center.x(),center.y(),1,1) + Eigen::Vector4f(.25,.25,.1, 0); 01058 01059 if (via_lid) 01060 { 01061 tf::Stamped<tf::Pose> lidPose; 01062 bool got_lid_pose = false; 01063 while (!got_lid_pose) 01064 got_lid_pose = getLidPose(lidPose); 01065 center = lidPose.getOrigin(); 01066 } 01067 ROS_INFO("CENTER %f %f %f",center.x(),center.y(),center.z()); 01068 01069 01070 min_pt = Eigen::Vector4f(center.x(),center.y(),table_height,1) - Eigen::Vector4f(pot_handle_radius_max,pot_handle_radius_max,-pot_handle_min, 0); 01071 max_pt = Eigen::Vector4f(center.x(),center.y(),table_height,1) + Eigen::Vector4f(pot_handle_radius_max,pot_handle_radius_max,pot_handle_max, 0); 01072 01073 boost::shared_ptr<std::vector<int> > indices( new std::vector<int> ); 01074 pcl::getPointsInBox(*cloud,min_pt,max_pt,*indices); 01075 pcl::ExtractIndices<pcl::PointXYZ> ei; 01076 ei.setInputCloud(cloud); 01077 ei.setIndices(indices); 01078 ei.filter(*cloud_filtered); 01079 01080 indices->clear(); 01081 double perc = 0; 01082 01083 ROS_INFO("cloud filtered size : %zu", cloud_filtered->points.size()); 01084 01085 if (cloud_filtered->points.size() < 10) 01086 return false; 01087 01088 ROS_INFO("center %f %f %f", center.x(),center.y(),center.z()); 01089 01090 //double pot_radius; 01091 01092 //ros::param::param<double>("pot_radius", pot_radius, .155); 01093 01094 ROS_INFO("pot_radius=%f", pot_radius); 01095 01096 for (size_t k = 0; k < cloud_filtered->points.size(); ++k) 01097 { 01098 btVector3 act(cloud_filtered->points[k].x,cloud_filtered->points[k].y,cloud_filtered->points[k].z); 01099 btVector3 rel = center - act; 01100 rel.setZ(0); 01101 double radius = rel.length(); 01102 //ROS_INFO("radius : %f", radius); 01103 01104 //if (((pot_radius > 0) && (radius > pot_radius)) || ((pot_radius < 0) && (radius < fabs(pot_radius)))) 01105 //if ((radius > .155) && (radius < .1925)) 01106 if ((radius > pot_handle_radius_min) && (radius < pot_handle_radius_max)) 01107 { 01108 indices->push_back(k); 01109 perc+=1.0; 01110 } 01111 } 01112 01113 ROS_INFO("Percentage of points : %f/%zu= %f",perc,cloud_filtered->points.size(), perc / cloud_filtered->points.size()); 01114 01115 if (cloud_filtered->points.size() < 150) 01116 { 01117 ROS_ERROR("did not get enough pot handle candidates"); 01118 return false; 01119 } 01120 01121 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered2 (new pcl::PointCloud<pcl::PointXYZ>); 01122 ei.setInputCloud(cloud_filtered); 01123 ei.setIndices(indices); 01124 ei.setIndices(indices); 01125 ei.filter(*cloud_filtered2); 01126 01127 double atansum = 0; 01128 double atannum = 0; 01129 for (size_t k = 0; k < cloud_filtered2->points.size(); ++k) 01130 { 01131 //y/x, i 01132 btVector3 act(cloud_filtered2->points[k].x- center.x(),cloud_filtered2->points[k].y - center.y(),0); 01133 if (act.x() != 0.0) 01134 { 01135 double at = atan2(act.y(),act.x()); 01136 //ROS_INFO("atan %f %f = %f", act.x(), act.y(), at); 01137 if (at < 0) 01138 at += M_PI; 01139 //double at = atan(act.x()/act.y()); 01140 atansum += at; 01141 atannum += 1.0; 01142 } 01143 } 01144 ROS_INFO("atansum %f num %f = %f", atansum, atannum, atansum/atannum); 01145 01146 01147 if (atansum < 20) 01148 { 01149 ROS_ERROR("did not get enough pot handle inliers"); 01150 return false; 01151 } 01152 01153 01154 01155 tf::Stamped<tf::Pose> det; 01156 det.frame_id_ = "/map"; 01157 det.setOrigin(center); 01158 atansum /= atannum; 01159 //if (atansum < 0) 01160 // atansum += M_PI; 01161 det.setRotation(btQuaternion(btVector3(0,0,1),atansum)); 01162 01163 potPose = det; 01164 01165 ROS_INFO("angle : %f", det.getRotation().getAngle()); 01166 01167 //if (0) 01168 { 01169 sensor_msgs::PointCloud2 filtered_msg; 01170 pcl::toROSMsg(*cloud_filtered2,filtered_msg); 01171 cloud_pub.publish(filtered_msg); 01172 } 01173 01175 calcPotGraspPoints(det, leftpreg, leftg, rightpreg, rightg); 01176 01177 { 01178 geometry_msgs::PoseStamped det_msg; 01179 tf::poseStampedTFToMsg(det,det_msg); 01180 pose_pub.publish(det_msg); 01181 01182 geometry_msgs::PoseStamped rightg_msg, leftg_msg; 01183 tf::poseStampedTFToMsg(rightg,rightg_msg); 01184 tf::poseStampedTFToMsg(leftg,leftg_msg); 01185 01186 pose_pubr.publish(rightg_msg); 01187 pose_publ.publish(leftg_msg); 01188 01189 announce("Pot", potPose); 01190 01191 printPose("pot", potPose); 01192 01193 announce("Pot_L", leftg); 01194 01195 announce("Pot_R", rightg); 01196 } 01197 01198 //pubMarker(det,radius); 01199 01200 ROS_INFO("XXXXXXXXXXXXXXXXXXXXXXXXXX"); 01201 01202 return true; 01203 } 01204 01205 01206 01207 void findBoundary1(pcl::PointCloud<pcl::PointXYZRGB>& in,pcl::PointCloud<pcl::PointXYZRGB>& edges, pcl::PointCloud<pcl::PointXYZRGB>&other, std::vector<int>& edge_indices ) 01208 { 01209 01210 pcl::KdTreeFLANN<pcl::PointXYZRGB>::Ptr knntree (new pcl::KdTreeFLANN<pcl::PointXYZRGB> () ); 01211 pcl::KdTreeFLANN<pcl::PointXYZRGB>::Ptr tree2 (new pcl::KdTreeFLANN<pcl::PointXYZRGB> () ); 01212 knntree->setInputCloud(in.makeShared()); 01213 01214 pcl::PointCloud<pcl::Normal> normals; 01215 pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne; 01216 ne.setSearchMethod (tree2); 01217 ne.setKSearch (20); 01218 ne.setInputCloud (in.makeShared()); 01219 ne.compute (normals); 01220 01221 // getNormals(in, normals); printf("normals.size %d\n", normals.points.size()); 01222 01223 pcl::BoundaryEstimation<pcl::PointXYZRGB ,pcl::Normal, pcl::Boundary> be; 01224 be.setInputCloud(in.makeShared()); 01225 be.setInputNormals(normals.makeShared()); 01226 Eigen::Vector3f u = Eigen::Vector3f::Zero (); 01227 Eigen::Vector3f v = Eigen::Vector3f::Zero (); 01228 //be.compute( 01229 for (size_t idx = 0; idx < in.points.size(); idx++) // printf("it %d\n", idx); 01230 { 01231 be.getCoordinateSystemOnPlane(normals.points[idx], u, v); 01232 pcl::Vector3fMap n4uv = normals.points[idx].getNormalVector3fMap();// std::cout<<" n4uv "<<std::endl<<n4uv<<std::endl; 01233 01234 std::vector<int> nb_idxs; 01235 std::vector<float> nb_dists; 01236 // knntree->nearestKSearch(idx, 100, nb_idxs, nb_dists); 01237 knntree->radiusSearch(idx,0.01, nb_idxs, nb_dists, 100); 01238 01239 // pcl::Vector3fMap n4uv = 01240 normals.points[idx].getNormalVector3fMap (); 01241 bool pt = false; 01242 pt = be.isBoundaryPoint (in, idx, nb_idxs, u, v, M_PI * 0.75);// 01243 //printf("it %zu\n", idx); 01244 if (pt) 01245 { 01246 edges.points.push_back(in.points[idx]); 01247 edge_indices.push_back(idx); 01248 } 01249 else 01250 { 01251 other.points.push_back(in.points[idx]); 01252 } 01253 01254 } 01255 } 01256 01257 void findBoundary2(pcl::PointCloud<pcl::PointXYZRGB>& in,pcl::PointCloud<pcl::PointXYZRGB>& edges, pcl::PointCloud<pcl::PointXYZRGB>&other, std::vector<int>& edge_indices ) 01258 { 01259 01260 pcl::KdTreeFLANN<pcl::PointXYZRGB>::Ptr knntree (new pcl::KdTreeFLANN<pcl::PointXYZRGB> () ); 01261 pcl::KdTreeFLANN<pcl::PointXYZRGB>::Ptr tree2 (new pcl::KdTreeFLANN<pcl::PointXYZRGB> () ); 01262 01263 ROS_INFO("before knntree"); 01264 knntree->setInputCloud(in.makeShared()); 01265 ROS_INFO("before knntree"); 01266 01267 pcl::PointCloud<pcl::Normal> normals; 01268 pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne; 01269 ne.setSearchMethod (tree2); 01270 ne.setKSearch (50); 01271 ne.setInputCloud (in.makeShared()); 01272 ROS_INFO("before normals"); 01273 ne.compute (normals); 01274 ROS_INFO("before normals"); 01275 01276 // getNormals(in, normals); printf("normals.size %d\n", normals.points.size()); 01277 01278 pcl::BoundaryEstimation<pcl::PointXYZRGB ,pcl::Normal, pcl::Boundary> be; 01279 be.setInputCloud(in.makeShared()); 01280 be.setInputNormals(normals.makeShared()); 01281 Eigen::Vector3f u = Eigen::Vector3f::Zero (); 01282 Eigen::Vector3f v = Eigen::Vector3f::Zero (); 01283 pcl::PointCloud<pcl::Boundary> boundary; 01284 01285 be.setSearchMethod(tree2); 01286 be.setKSearch (50); 01287 01288 ROS_INFO("before boundary"); 01289 be.compute(boundary); 01290 ROS_INFO("after boundary"); 01291 01292 for (size_t idx = 0; idx < boundary.points.size(); idx++) // printf("it %d\n", idx); 01293 { 01294 if (boundary.points[idx].boundary_point) 01295 { 01296 edges.points.push_back(in.points[idx]); 01297 edge_indices.push_back(idx); 01298 } 01299 else 01300 { 01301 other.points.push_back(in.points[idx]); 01302 } 01303 01304 } 01305 } 01306 01307 int Current::manipulateKnob(int direction) 01308 { 01309 01310 btVector3 correction(0.006,0,0); 01311 01312 tf::Stamped<tf::Pose> knob_pre_grasp; 01313 knob_pre_grasp.frame_id_ = "/map"; 01314 knob_pre_grasp.setOrigin(btVector3(0.815572 - .1, 2.204640, 1.408645)); 01315 knob_pre_grasp.setRotation(btQuaternion(-0.005306, -0.020663, 0.023385, 0.999499)); 01316 01317 tf::Stamped<tf::Pose> knob_grasp; 01318 knob_grasp.frame_id_ = "/map"; 01319 knob_grasp.setOrigin(btVector3(0.815572 + correction.x(), 2.204640, 1.408645)); 01320 knob_grasp.setRotation(btQuaternion(-0.005306, -0.020663, 0.023385, 0.999499)); 01321 01322 01323 tf::Stamped<tf::Pose> k3; 01324 k3.frame_id_ = "/map"; 01325 k3.setOrigin(btVector3(0.811484 + correction.x(), 2.207182, 1.416687)); 01326 k3.setRotation(btQuaternion(0.978148, 0.024668, 0.015891, -0.205827)); 01327 01328 tf::Stamped<tf::Pose> k3post; 01329 k3post.frame_id_ = "/map"; 01330 k3post.setOrigin(btVector3(0.811484 - .1, 2.207182, 1.416687)); 01331 k3post.setRotation(btQuaternion(0.978148, 0.024668, 0.015891, -0.205827)); 01332 01333 //RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(k3); 01334 01335 //- Translation: [0.818, 2.214, 1.413] 01336 //- Rotation: in Quaternion [0.988, 0.026, -0.029, 0.148] 01337 01338 tf::Stamped<tf::Pose> knob_rot; 01339 knob_rot.frame_id_ = "/map"; 01340 knob_rot.setOrigin(btVector3(0.818 + correction.x(), 2.214, 1.413)); 01341 knob_rot.setRotation(btQuaternion(0.988, 0.026, -0.029, 0.148)); 01342 //knob_rot.setOrigin(btVector3(0.811130, 2.201299, 1.409015)); 01343 //knob_rot.setRotation(btQuaternion(0.431538, -0.021031, 0.064140, 0.899566)); 01344 01345 tf::Stamped<tf::Pose> knob_post_rot; 01346 knob_post_rot.frame_id_ = "/map"; 01347 knob_post_rot.setOrigin(btVector3(0.818 - .1, 2.214, 1.413)); 01348 knob_post_rot.setRotation(btQuaternion(0.988, 0.026, -0.029, 0.148)); 01349 //knob_post_rot.setOrigin(btVector3(0.811130 - .1, 2.201299, 1.409015)); 01350 //knob_post_rot.setRotation(btQuaternion(0.431538, -0.021031, 0.064140, 0.899566)); 01351 01352 knob_post_rot = k3post; 01353 knob_rot = k3; 01354 01355 RobotHead::getInstance()->lookAtThreaded("/map",0.815572, 2.204640, 1.408645); 01356 01357 OperateHandleController::plateAttackPose(); 01358 01359 RobotDriver::moveBase4(0.206569, 2.269677, 0.021550, 0.999766); 01360 01361 announce("Knob", knob_grasp); 01362 01363 01364 if (direction == 1) 01365 { 01366 01367 bool got_it = false; 01368 while (!got_it) 01369 { 01370 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(knob_pre_grasp); 01371 Gripper::getInstance(0)->open(.056108); 01372 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(knob_grasp); 01373 Gripper::getInstance(0)->close(); 01374 got_it = Gripper::getInstance(0)->getAmountOpen() > 0.016; 01375 01376 ROS_INFO("manipulateKnob %f",Gripper::getInstance(0)->getAmountOpen()); 01377 } 01378 01379 01380 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(knob_rot); 01381 Gripper::getInstance(0)->open(.056108); 01382 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(knob_post_rot); 01383 } 01384 if (direction == -1) 01385 { 01386 01387 bool got_it = false; 01388 while (!got_it) 01389 { 01390 Gripper::getInstance(0)->open(.056108); 01391 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(knob_post_rot); 01392 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(knob_rot); 01393 Gripper::getInstance(0)->close(); 01394 got_it = Gripper::getInstance(0)->getAmountOpen() > 0.016; 01395 01396 ROS_INFO("manipulateKnob %f",Gripper::getInstance(0)->getAmountOpen()); 01397 } 01398 01399 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(knob_grasp); 01400 Gripper::getInstance(0)->open(.056108); 01401 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(knob_pre_grasp); 01402 01403 } 01404 return 0; 01405 } 01406 01407 int Current::getPotOut_openDrawer(int jump) 01408 { 01409 01410 Torso *torso = Torso::getInstance(); 01411 01412 double lift = 0.29; 01413 01414 RobotHead::getInstance()->lookAtThreaded("/map",-1.636, 2.664, 0.354); 01415 01416 boost::thread t(&Torso::pos, torso, .29); 01417 01418 boost::thread t1(&OperateHandleController::plateTuckPose); 01419 01420 RobotDriver::moveBase4(-1.011, 2.110, 0.999, -0.033); 01421 01422 t1.join(); 01423 t.join(); 01424 01425 announce("Handle",Geometry::make_pose(-1.636, 2.664, 0.354 + lift, -0.023, 0.721, 0.691, -0.054,"/map")); 01426 01427 RobotHead::getInstance()->lookAtThreaded("/r_gripper_tool_frame",0,0,0); 01428 01429 // open drawer 01430 Gripper::getInstance(0)->openThreaded(); 01431 RobotArm::getInstance(0)->universal_move_toolframe_ik(-1.536, 2.664, 0.354 + lift, -0.023, 0.721, 0.691, -0.054, "/map"); 01432 RobotArm::getInstance(0)->universal_move_toolframe_ik(-1.636, 2.664, 0.354 + lift, -0.023, 0.721, 0.691, -0.054,"/map"); 01433 Gripper::getInstance(0)->close(); 01434 01435 ROS_ERROR("getPotOut_openDrawerAMOUNT OPEN: %f", Gripper::getInstance(1)->getAmountOpen()); 01436 01437 ros::Duration(0.5).sleep(); 01438 01439 if (Gripper::getInstance(0)->getAmountOpen() < 0.01) 01440 { 01441 RobotArm::getInstance(0)->universal_move_toolframe_ik(-1.536, 2.664, 0.354 + lift, -0.023, 0.721, 0.691, -0.054, "/map"); 01442 OperateHandleController::plateTuckPoseRight(); 01443 return Current::getPotOut_openDrawer(jump); 01444 } 01445 01446 RobotArm::getInstance(0)->universal_move_toolframe_ik(-1.159, 2.680, 0.348 + lift, -0.043, 0.708, 0.705, -0.004,"/map"); 01447 Gripper::getInstance(0)->openThreaded(); 01448 01450 01451 //RobotHead::getInstance()->lookAtThreaded("/map",-1.373, 2.951, 0.70); 01452 RobotHead::getInstance()->lookAtThreaded("/map",-1.636, 2.664, 0.354); 01453 01454 01455 RobotDriver::moveBase4(-0.756, 2.093,1,0); 01456 01457 return 0; 01458 } 01459 01460 01461 int Current::getPotOut_pickPlacePot(int jump) 01462 { 01463 01464 double modifier = -.06; 01465 01466 RobotHead::getInstance()->lookAtThreaded("/map",-1.636, 2.664, 0.354); 01467 01468 01469 boost::thread t2(&OperateHandleController::plateTuckPose); 01470 01471 Torso *torso = Torso::getInstance(); 01472 01473 double lift = 0.29; 01474 01475 boost::thread tt(&Torso::pos, torso, + lift); 01476 tt.join(); 01477 01478 lift += modifier; 01479 01480 Gripper::getInstance(0)->closeThreaded(); 01481 Gripper::getInstance(1)->closeThreaded(); 01482 RobotDriver::moveBase4(-0.812520, 2.580165, 0.999515, -0.031016); 01483 01484 tf::Stamped<tf::Pose> ravoid, rappr, lappr, rpick, lpick, rplace, lplace, rplaceup, lplaceup; 01485 01486 rpick.frame_id_ = "/map"; 01487 rpick.setOrigin(btVector3(-1.373, 2.951, 0.280 + lift)); 01488 rpick.setRotation(btQuaternion(-0.661, 0.035, 0.748, 0.056)); 01489 rappr = rpick; 01490 rappr.setOrigin(rappr.getOrigin() + btVector3(0,0,0.3)); 01491 01492 lpick.frame_id_ = "/map"; 01493 lpick.setOrigin(btVector3(-1.403, 2.711, 0.290 + lift)); 01494 lpick.setRotation(btQuaternion(-0.627, 0.039, 0.778, -0.019)); 01495 lappr = lpick; 01496 lappr.setOrigin(lappr.getOrigin() + btVector3(0,0,0.3)); 01497 01498 01499 //tf::Stamped<tf::Pose> rpick; 01500 rpick.frame_id_ = "/map"; 01501 rpick.setOrigin(btVector3(-1.378332, 2.929956, 0.513234)); 01502 rpick.setRotation(btQuaternion(-0.659041, 0.029168, 0.750170, 0.045374)); 01503 01504 //RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(rpick); 01505 01506 //tf::Stamped<tf::Pose> lpick; 01507 lpick.frame_id_ = "/map"; 01508 lpick.setOrigin(btVector3(-1.399699, 2.720151, 0.52270)); 01509 lpick.setRotation(btQuaternion(-0.625505, 0.034901, 0.779373, -0.010184)); 01510 01511 //RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(rpick); 01512 01513 //RobotArm::moveBothArms(lpick,rpick); 01514 01515 01516 ravoid = rpick; 01517 ravoid.setOrigin(btVector3(-1.223, 2.960, 0.593 + lift)); 01518 ravoid.setRotation(btQuaternion(-0.137, 0.840, -0.069, 0.521)); 01519 01520 tf::Stamped<tf::Pose> pot = lpick; 01521 pot.setOrigin((lpick.getOrigin() + rpick.getOrigin()) * 0.5); 01522 01523 announce("Pot", pot); 01524 01525 //OperateHandleController::closeGrippers(false); 01526 01527 RobotHead::getInstance()->lookAtThreaded("/r_gripper_tool_frame",0,0,0); 01528 01529 RobotArm::getInstance()->startTrajectory(RobotArm::getInstance(0)->goalTraj(-0.91654420464731023, 0.55680337139226421, -1.0197552147091691, -1.6391094508469026, -33.205223487262245, -1.5794848996581, 26.217879010657214),true); 01530 01531 RobotArm::moveBothArms(lappr, rappr); 01532 01533 //RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(rappr); 01534 01535 OperateHandleController::openGrippers(true); 01536 01537 RobotArm::moveBothArms(lpick, rpick); 01538 01539 OperateHandleController::closeGrippers(); 01540 01541 //exit(0); 01542 01543 boost::thread t3(&Torso::up, torso); 01544 01545 OperateHandleController::spinnerL(0,0,0.5); 01546 01547 RobotHead::getInstance()->lookAtThreaded("/map",-1.866, 3.027, 1); 01548 01549 01550 t3.join(); 01551 01552 //OperateHandleController::spinnerL(0,0,0.1); 01553 01554 //RobotDriver::moveBase4(-1.235, 2.64,1,-0.029); // this was the one used 01555 01556 rplace.frame_id_ = "/map"; 01557 //rplace.setOrigin(btVector3(-1.866, 3.027, 1)); 01558 //rplace.setRotation(btQuaternion(-0.652, 0.052, 0.729, 0.200)); 01559 //rplace.setOrigin(btVector3(-1.796 - 0.02, 2.993, 0.997 + modifier)); 01560 rplace.setOrigin(btVector3(-1.796 - 0.02, 2.993 + 0.02, 0.997 + modifier)); 01561 rplace.setRotation(btQuaternion(-0.582, 0.259, 0.7019, 0.317)); 01562 rplaceup = rplace; 01563 rplaceup.setOrigin(rplaceup.getOrigin() + btVector3(0,0,0.1)); 01564 01565 lplace.frame_id_ = "/map"; 01566 //lplace.setOrigin(btVector3(-1.920, 2.802, 1)); 01567 //lplace.setRotation(btQuaternion(-0.639, 0.028, 0.767, 0.052)); 01568 //lplace.setOrigin(btVector3(-1.946 - 0.02 , 2.817, 1.010 + modifier)); 01569 lplace.setOrigin(btVector3(-1.946 - 0.02, 2.817 + 0.02, 1.010 + modifier)); 01570 lplace.setRotation(btQuaternion(-0.629, 0.166, 0.731, 0.208)); 01571 lplaceup = lplace; 01572 lplaceup.setOrigin(lplaceup.getOrigin() + btVector3(0,0,0.1)); 01573 01574 // TODO findbasemove 01575 { 01576 tf::Stamped<tf::Pose> result; 01577 std::vector<int> arm; 01578 std::vector<tf::Stamped<tf::Pose> > goal; 01579 arm.push_back(1); 01580 arm.push_back(1); 01581 arm.push_back(0); 01582 arm.push_back(0); 01583 goal.push_back(lplace); 01584 goal.push_back(lplaceup); 01585 goal.push_back(rplace); 01586 goal.push_back(rplaceup); 01587 //bool RobotArm::findBaseMovement(tf::Stamped<tf::Pose> &result, std::vector<int> arm, std::vector<tf::Stamped<tf::Pose> > goal, bool drive, bool reach) 01588 01589 RobotArm::findBaseMovement(result, arm, goal, true, false); 01590 } 01591 01592 01593 RobotArm::moveBothArms(lplaceup,rplaceup); 01594 01595 RobotArm::moveBothArms(lplace,rplace); 01596 01597 OperateHandleController::openGrippers(); 01598 01599 RobotArm::moveBothArms(lplaceup,rplaceup); 01600 01601 01602 RobotDriver::moveBase4(-0.868230, 2.383544, 0.997340, 0.072885); 01603 01604 OperateHandleController::plateAttackPose(); 01605 01606 OperateHandleController::plateTuckPose(); 01607 01608 tf::Stamped<tf::Pose> predrawerclose; 01609 predrawerclose.frame_id_ = "/map"; 01610 predrawerclose.setOrigin(btVector3(-1.420218, 2.811923, 0.620214)); 01611 predrawerclose.setRotation(btQuaternion(0.027181, -0.678301, 0.732514, -0.050909)); 01612 01613 RobotHead::getInstance()->lookAtThreaded("/r_gripper_tool_frame",0,0,0); 01614 01615 01616 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(predrawerclose); 01617 01618 tf::Stamped<tf::Pose> postdrawerclose; 01619 postdrawerclose.frame_id_ = "/map"; 01620 //postdrawerclose.setOrigin(btVector3(-1.660690, 2.574179, 0.667216)); 01621 postdrawerclose.setOrigin(btVector3(-1.610690, 2.574179, 0.667216)); 01622 postdrawerclose.setRotation(btQuaternion(0.018551, -0.684924, 0.724965, -0.070439)); 01623 01624 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(postdrawerclose); 01625 01626 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(predrawerclose); 01627 01628 OperateHandleController::plateTuckPose(); 01629 01630 return 0; 01631 } 01632 01633 void getPotOut(int jump) 01634 { 01635 RobotHead::getInstance()->lookAtThreaded("/r_gripper_tool_frame",0,0,0); 01636 01637 switch (jump) 01638 { 01639 case 0: 01640 Current::getPotOut_openDrawer(jump); 01641 case 1: 01642 Current::getPotOut_pickPlacePot(jump); 01643 } 01644 } 01645 01646 int Current::openDrawerUnderOven(int jump) 01647 { 01648 RobotHead::getInstance()->lookAtThreaded("/map",0.527460,2.304037,0.832586); 01649 01650 Gripper::getInstance(1)->openThreaded(); 01651 Gripper::getInstance(0)->openThreaded(); 01652 01653 Torso *torso = Torso::getInstance(); 01654 01655 double lift = 0.29; 01656 01657 01658 boost::thread t(&Torso::pos, torso, lift); 01659 01660 boost::thread t1(&OperateHandleController::plateTuckPose); 01661 01662 RobotDriver::moveBase4(-0.031 - 0.1, 2.211, 0.034, 0.999); 01663 01664 t1.join(); 01665 01666 announce("Handle",Geometry::make_pose(0.77, 2.367, 0.846, -0.719, -0.023, 0.032, 0.693, "/map")); 01667 01668 RobotArm::getInstance(1)->universal_move_toolframe_ik(0.7, 2.367, 0.846, -0.719, -0.023, 0.032, 0.693, "/map"); 01669 //RobotArm::getInstance(1)->universal_move_toolframe_ik(0.759, 2.367, 0.846, -0.719, -0.023, 0.032, 0.693, "/map"); 01670 RobotArm::getInstance(1)->universal_move_toolframe_ik(0.77, 2.367, 0.846, -0.719, -0.023, 0.032, 0.693, "/map"); 01671 //RobotArm::getInstance(1)->universal_move_toolframe_ik(0.77, 2.367, 0.846, -0.719, -0.023, 0.032, 0.693, "/map"); 01672 Gripper::getInstance(1)->close(); 01673 01674 01675 ros::Duration(0.5).sleep(); 01676 01677 ROS_ERROR("openFavouriteopenDrawerUnderOvenDrawer OPEN: %f", Gripper::getInstance(1)->getAmountOpen()); 01678 01679 if (Gripper::getInstance(1)->getAmountOpen() < 0.01) 01680 { 01681 RobotArm::getInstance(1)->universal_move_toolframe_ik(0.7, 2.367, 0.846, -0.719, -0.023, 0.032, 0.693, "/map"); 01682 OperateHandleController::plateTuckPoseRight(); 01683 return Current::openDrawerUnderOven(jump); 01684 } 01685 01686 01687 RobotArm::getInstance(1)->universal_move_toolframe_ik( 0.291, 2.335, 0.841, -0.732, -0.008, 0.039, 0.680 , "/map"); // drawer_open 01688 01689 return 0; 01690 } 01691 01692 01693 int Current::getLidOut(int jump) 01694 { 01695 01696 tf::Stamped<tf::Pose> lid; 01697 lid.frame_id_ = "/map"; 01698 lid.setOrigin(btVector3(0.527460,2.304037,0.832586)); 01699 lid.setRotation(btQuaternion(-0.155035,0.112869,0.756283,0.625509)); 01700 01701 announce("Lid", lid); 01702 01703 tf::Stamped<tf::Pose> highlid = lid; 01704 highlid.setOrigin(lid.getOrigin() + btVector3(0,0,0.2)); 01705 01706 tf::Stamped<tf::Pose> prelid; 01707 prelid.frame_id_ = "/map"; 01708 prelid.setOrigin(btVector3(0.542697,2.212567,0.871439)); 01709 prelid.setRotation(btQuaternion(-0.155615,0.112088,0.756168,0.625644)); 01710 01711 tf::Stamped<tf::Pose> lid_pre_grip; 01712 lid_pre_grip.frame_id_ = "/map"; 01713 lid_pre_grip.setOrigin(btVector3(0.543219, 2.230091, 0.836666)); 01714 lid_pre_grip.setRotation(btQuaternion(-0.132676, 0.078832, 0.814762, 0.558879)); 01715 01716 tf::Stamped<tf::Pose> lid_final_grasp; 01717 lid_final_grasp.frame_id_ = "/map"; 01718 lid_final_grasp.setOrigin(btVector3(0.500972, 2.299158, 0.834633)); 01719 lid_final_grasp.setRotation(btQuaternion(-0.108869, 0.051036, 0.840173, 0.528821)); 01720 01721 Gripper::getInstance(0)->openThreaded(); 01722 01723 OperateHandleController::plateAttackPoseRight(); 01724 01725 RobotArm::getInstance(0)->raise_elbow = true; 01726 01727 RobotArm::getInstance(0)->preset_angle = 2.7; 01728 01729 double time = RobotArm::getInstance(0)->time_to_target; 01730 RobotArm::getInstance(0)->time_to_target = 0.5; 01731 RobotArm::getInstance(1)->time_to_target = 0.5; 01732 01733 01734 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(highlid); 01735 01736 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(lid_pre_grip); 01737 01738 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(lid_final_grasp); 01739 01740 01741 Gripper::getInstance(0)->close(); 01742 01743 01745 01746 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(highlid); 01747 01748 01749 tf::Stamped<tf::Pose> lidcarry; 01750 lidcarry.frame_id_ = "base_link"; 01751 lidcarry.setOrigin(btVector3(0.465009,-0.200021,1.1)); 01752 lidcarry.setRotation(btQuaternion(-0.151885,0.117935,0.735543,0.649614)); 01753 01754 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(lidcarry); 01755 01756 RobotArm::getInstance(0)->time_to_target = time; 01757 RobotArm::getInstance(1)->time_to_target = time; 01758 01759 01760 RobotArm::getInstance(0)->raise_elbow = false; 01761 01762 { 01763 tf::Stamped<tf::Pose> lidcarry; 01764 lidcarry.frame_id_ = "base_link"; 01765 lidcarry.setOrigin(btVector3(0.088186, -0.539420, 1.110697)); 01766 lidcarry.setRotation(btQuaternion(-0.061714, 0.110614, 0.436300, 0.890841)); 01767 01768 boost::thread t(&RobotArm::universal_move_toolframe_ik_pose,RobotArm::getInstance(0),lidcarry); 01769 } 01770 return 0; 01771 } 01772 01773 int Current::getBowlOut(int jump) 01774 { 01775 RobotHead::getInstance()->lookAtThreaded("/map",0.614, 1.945, 0.84); 01776 01777 //RobotDriver::moveBase4(-0.031 - 0.1, 2.211, 0.034, 0.999); // bowl out 01778 01779 Gripper::getInstance(1)->openThreaded(); 01780 01781 if (jump < 100) 01782 { 01783 01784 tf::Stamped<tf::Pose> act = RobotArm::getInstance(1)->getToolPose("/map"); 01785 //act.getOrigin() += btVector3(-.1,0,0); 01786 act.getOrigin() += btVector3(0,+.25,0); 01787 01788 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(act); 01789 } 01790 01791 01792 OperateHandleController::plateAttackPoseLeft(); 01793 01794 RobotArm::getInstance(1)->raise_elbow = true; 01795 01796 btVector3 min(0.614, 1.945, 0.84); 01797 btVector3 max(0.796, 2.245, 0.92); 01798 btVector3 center; 01799 double radius; 01800 getCircle(min, max, center, radius); 01801 01802 ROS_INFO("center %f %f %f", center.x(), center.y(), center.z()); 01803 01804 { 01805 tf::Stamped<tf::Pose> bowl; 01806 bowl.setOrigin(center); 01807 bowl.setRotation(btQuaternion(0,0,0,1)); 01808 bowl.frame_id_ = "/map"; 01809 01810 announce("Bowl", bowl); 01811 } 01812 01813 tf::Stamped<tf::Pose> grasp; 01814 grasp.setOrigin(center + btVector3(0,0.08,-0.035)); 01815 grasp.setRotation(btQuaternion(-0.128, 0.591, -0.167, 0.778)); 01816 grasp.frame_id_ = "/map"; 01817 01818 tf::Stamped<tf::Pose> grasphigh = grasp; 01819 grasphigh.getOrigin() += btVector3(0,0,0.1); 01820 01821 tf::Stamped<tf::Pose> grasphighpre = grasp; 01822 grasphighpre.getOrigin() += btVector3(-.2,.1,0.1); 01823 01824 ROS_INFO("grasphigh %f %f %f", grasphigh.getOrigin().x(), grasphigh.getOrigin().y(), grasphigh.getOrigin().z()); 01825 01826 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(grasphighpre); 01827 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(grasphigh); 01828 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(grasp); 01829 01830 Gripper::getInstance(1)->close(); 01831 01832 ros::Duration(0.5).sleep(); 01833 01834 ROS_ERROR("getBowlOut LID AMOUNT OPEN: %f", Gripper::getInstance(1)->getAmountOpen()); 01835 01836 if (Gripper::getInstance(1)->getAmountOpen() < 0.005) 01837 { 01838 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(grasphigh); 01839 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(grasphighpre); 01840 return Current::getBowlOut(101); 01841 } 01842 01843 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(grasphigh); 01844 01845 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(grasphighpre); 01846 01847 RobotArm::getInstance(1)->raise_elbow = false; 01848 01849 //RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(grasp); 01850 01851 //Gripper::getInstance(1)->open(); 01852 //RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(grasphigh); 01853 01854 //OperateHandleController::plateAttackPose(); 01855 01856 tf::Stamped<tf::Pose> bowl_carry; 01857 bowl_carry.frame_id_ = "base_link"; 01858 bowl_carry.setOrigin(btVector3(0.209078, 0.4470, 1.053729)); 01859 bowl_carry.setRotation(btQuaternion(-0.153977, 0.579149, -0.128882, 0.790106)); 01860 01861 //RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(bowl_carry); 01862 01863 boost::thread t(&RobotArm::universal_move_toolframe_ik_pose,RobotArm::getInstance(1),bowl_carry); 01864 01865 01866 01867 return 0; 01868 } 01869 01870 int Current::closeDrawerUnderOven(int jump) 01871 { 01872 /*RobotArm::getInstance(1)->universal_move_toolframe_ik(0.759, 2.367, 0.846, -0.719, -0.023, 0.032, 0.693, "/map"); 01873 Gripper::getInstance(1)->open(); 01874 RobotArm::getInstance(1)->universal_move_toolframe_ik(0.7, 2.367, 0.846, -0.719, -0.023, 0.032, 0.693, "/map"); 01875 01876 OperateHandleController::plateTuckPoseLeft();*/ 01877 01878 { 01879 RobotDriver::moveBase4(-0.031 - 0.1, 2.211, 0.034, 0.999); // bowl out 01880 01881 tf::Stamped<tf::Pose> bowl_carry; 01882 bowl_carry.frame_id_ = "base_link"; 01883 bowl_carry.setOrigin(btVector3(0.209078, 0.4470, 1.053729)); 01884 bowl_carry.setRotation(btQuaternion(-0.153977, 0.579149, -0.128882, 0.790106)); 01885 01886 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(bowl_carry); 01887 01888 //boost::thread t(&RobotArm::universal_move_toolframe_ik_pose,RobotArm::getInstance(1),bowl_carry); 01889 RobotHead::getInstance()->lookAtThreaded("/l_gripper_tool_frame",0, 0, .1); 01890 01891 01892 tf::Stamped<tf::Pose> pre_slam; 01893 pre_slam.frame_id_ = "/map"; 01894 pre_slam.setOrigin(btVector3(0.154007, 2.283781, 0.764292)); 01895 pre_slam.setRotation(btQuaternion(0.224605, 0.621592, -0.546879, 0.513906)); 01896 01897 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(pre_slam); 01898 01899 tf::Stamped<tf::Pose> post_slam; 01900 post_slam.frame_id_ = "/map"; 01901 //post_slam.setOrigin(btVector3(0.693888, 2.316993, 0.792044)); 01902 post_slam.setOrigin(btVector3(0.643888, 2.316993, 0.792044)); 01903 post_slam.setRotation(btQuaternion(0.224605, 0.621592, -0.546879, 0.513906)); 01904 01905 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(post_slam); 01906 01907 //RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(bowl_carry); 01908 01909 boost::thread t(&RobotArm::universal_move_toolframe_ik_pose,RobotArm::getInstance(1),bowl_carry); 01910 01911 } 01912 return 0; 01913 } 01914 01915 int Current::pourPopCorn(int jump) 01916 { 01917 01918 double modifier = -.06; // small pot vs high pot 01919 01920 RobotHead::getInstance()->lookAtThreaded("/map",-1.906074,2.872285,1.171132); 01921 01922 01923 //RobotDriver::moveBase4(-1.187991, 2.401353, 0.999250, -0.038681); 01924 RobotDriver::moveBase4(-1.230, 2.782, 0.999, -0.042); // move base to island 01925 01926 // t.join(); 01927 01928 tf::Stamped<tf::Pose> potPose, pre_grasp_r, grasp_r, pre_grasp_l, grasp_l; 01929 bool gotPotPose = false; 01930 while (!gotPotPose) 01931 { 01932 //gotPotPose = getPotPose(potPose, pre_grasp_l, grasp_l, pre_grasp_r, grasp_r); 01933 gotPotPose = getPotPose(potPose, pre_grasp_l, grasp_l, pre_grasp_r, grasp_r); 01934 } 01935 01936 // pour the popcorn 01937 { 01938 01939 RobotHead::getInstance()->lookAtThreaded("l_gripper_tool_frame",0,0,0); 01940 01941 { 01942 tf::Stamped<tf::Pose> bowl_carry; 01943 bowl_carry.frame_id_ = "base_link"; 01944 bowl_carry.setOrigin(btVector3(0.209078, 0.4470, 1.053729)); 01945 bowl_carry.setRotation(btQuaternion(-0.153977, 0.579149, -0.128882, 0.790106)); 01946 01947 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(bowl_carry); 01948 } 01949 01950 tf::Stamped<tf::Pose> poura = RobotArm::getInstance(1)->getToolPose("/map"); 01951 poura.getOrigin().setX(potPose.getOrigin().x()) ; 01952 poura.getOrigin().setY(potPose.getOrigin().y() - .1); 01953 poura.getOrigin().setZ(poura.getOrigin().getZ() + .1 + modifier); 01954 01955 01956 tf::Stamped<tf::Pose> bowl_pour_b; 01957 bowl_pour_b.frame_id_ = "/map"; 01958 bowl_pour_b.setOrigin(btVector3(-1.892476 + 1.91 + potPose.getOrigin().x(), 2.942343 - 2.927 + potPose.getOrigin().y(), 1.180554 + .1 + modifier)); 01959 bowl_pour_b.setRotation(btQuaternion(-0.167260, 0.680787, 0.601136, -0.383652)); 01960 01961 01962 RobotArm::getInstance(0)->raise_elbow = true; 01963 01964 // TODO findbasemove 01965 { 01966 tf::Stamped<tf::Pose> result; 01967 std::vector<int> arm; 01968 std::vector<tf::Stamped<tf::Pose> > goal; 01969 arm.push_back(1); 01970 arm.push_back(1); 01971 goal.push_back(bowl_pour_b); 01972 goal.push_back(poura); 01973 //bool RobotArm::findBaseMovement(tf::Stamped<tf::Pose> &result, std::vector<int> arm, std::vector<tf::Stamped<tf::Pose> > goal, bool drive, bool reach) 01974 01975 RobotArm::findBaseMovement(result, arm, goal, true, false); 01976 } 01977 01978 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(poura); 01979 01980 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(bowl_pour_b); 01981 01982 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(poura); 01983 01984 RobotArm::getInstance(0)->raise_elbow = false; 01985 01986 tf::Stamped<tf::Pose> put_down; 01987 put_down.frame_id_ = "/map"; 01988 put_down.setOrigin(btVector3(-1.610931, 1.983166 + .12, 0.929598)); 01989 put_down.setRotation(btQuaternion(-0.353326, -0.545381, 0.643021, -0.405270)); 01990 01991 01992 tf::Stamped<tf::Pose> put_down_inter; 01993 put_down_inter.frame_id_ = "/map"; 01994 put_down_inter.setOrigin(0.5 * (put_down.getOrigin() + bowl_pour_b.getOrigin())); 01995 put_down_inter.setRotation(btQuaternion(-0.353326, -0.545381, 0.643021, -0.405270)); 01996 01997 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(put_down_inter); 01998 01999 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(put_down); 02000 02001 Gripper::getInstance(1)->openThreaded(); 02002 02003 ros::Duration(1).sleep(); 02004 02005 tf::Stamped<tf::Pose> put_down_high; 02006 put_down_high.frame_id_ = "/map"; 02007 put_down_high.setOrigin(btVector3(-1.612672, 1.985903 + .12, 0.931158 + .1)); 02008 put_down_high.setRotation(btQuaternion(-0.353345, -0.544065, 0.643510, -0.406245)); 02009 02010 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(put_down_high); 02011 } 02012 return 0; 02013 02014 } 02015 02016 /* 02017 int Current::putLidOn(int jump) 02018 { 02019 02020 tf::Stamped<tf::Pose> lidcarry; 02021 lidcarry.frame_id_ = "base_link"; 02022 lidcarry.setOrigin(btVector3(0.088186, -0.539420, 1.110697)); 02023 lidcarry.setRotation(btQuaternion(-0.061714, 0.110614, 0.436300, 0.890841)); 02024 02025 double modifier = -.06; // small pot vs high pot 02026 02027 //pr2_controllers_msgs::JointTrajectoryGoal goalAT = RobotArm::getInstance(0)->goalTraj(-2.13282, -0.3, -1.209236618713309, -1.8705012213796224, -0.2192995424769604, -1.2529613898971834, 8.2846172962242548,1); 02028 //boost::thread t2T(&RobotArm::startTrajectory, RobotArm::getInstance(0), goalAT,true); 02029 //boost::thread t1(&RobotArm::startTrajectory,RobotArm::getInstance(0),tg); 02030 02031 RobotHead::getInstance()->lookAtThreaded("/map",-1.906074,2.872285,1.171132); 02032 02033 RobotDriver::moveBase4(-1.230, 2.782, 0.999, -0.042); // move base to island 02034 02035 02036 //tf::Stamped<tf::Pose> curr = RobotArm::getInstance(0)->getToolPose("base_link"); 02037 //curr.getOrigin() += btVector3(0,0,.2); 02038 //boost::thread t9(&RobotArm::universal_move_toolframe_ik_pose, RobotArm::getInstance(0), curr); 02039 RobotArm::getInstance(0)->raise_elbow = true; 02040 02041 tf::Stamped<tf::Pose> potPose, pre_grasp_r, grasp_r, pre_grasp_l, grasp_l; 02042 bool gotPotPose = false; 02043 02044 discardKinectFrame(); 02045 discardKinectFrame(); 02046 02047 while (!gotPotPose) 02048 { 02049 gotPotPose = getPotPose(potPose, pre_grasp_l, grasp_l, pre_grasp_r, grasp_r); 02050 } 02051 02052 RobotHead::getInstance()->lookAtThreaded("r_gripper_tool_frame",0,0,0); 02053 02054 //t9.join(); 02055 02056 double adj_x = 0.005; 02057 double adj_y = -.015; 02058 02059 tf::Stamped<tf::Pose> goal; 02060 goal = RobotArm::getInstance(0)->getToolPose("/map"); 02061 //goal.setOrigin(btVector3(potPose.getOrigin().x() + adj_x ,potPose.getOrigin().y() + adj_y,goal.getOrigin().z())); 02062 02063 //RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goal); 02064 02065 //goal.setOrigin(btVector3(potPose.getOrigin().x() - .0,potPose.getOrigin().y() -.02 ,1.06 + modifier)); 02066 goal.setOrigin(btVector3(potPose.getOrigin().x() + adj_x,potPose.getOrigin().y() + adj_y,1.06 + modifier - 0.01)); 02067 02068 tf::Stamped<tf::Pose> goal_base_rot = Geometry::getPoseIn("base_link", goal); 02069 goal_base_rot.setRotation(btQuaternion(0,0,0,1)); 02070 goal_base_rot = Geometry::getPoseIn("/map", goal_base_rot); 02071 02072 tf::Stamped<tf::Pose> goalappr_rot = goal; 02073 tf::Stamped<tf::Pose> goalappr_shift= goal; 02074 02075 goalappr_rot = Geometry::rotateAroundPose(goal,goal_base_rot,0,0.15,0); 02076 goalappr_rot.getOrigin() += btVector3(0.02,0,0.04); 02077 02078 tf::Stamped<tf::Pose> goalappr_rot_high = goalappr_rot; 02079 02080 //tf::Stamped<tf::Pose> goalappr_rot_shift = goalappr_rot; 02081 02082 goalappr_rot_high.getOrigin() += btVector3(0,0,0.1); 02083 02084 goalappr_shift.getOrigin() += btVector3(-0.05,0,0); 02085 02086 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goalappr_rot_high); 02087 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goalappr_rot); 02088 //RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goalappr_rot_shift); 02089 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goalappr_shift); 02090 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goal); 02091 02092 tf::Stamped<tf::Pose> pot_pushed_to_cooker; 02093 pot_pushed_to_cooker.frame_id_ = "/map"; 02094 pot_pushed_to_cooker.setOrigin(btVector3(-1.901817, 2.941642, 1.015725)); 02095 pot_pushed_to_cooker.setRotation(btQuaternion(-0.117109, -0.076221, 0.877845, -0.458110)); 02096 02097 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(pot_pushed_to_cooker); 02098 02099 //pot_pushed_to_cooker.getOrigin() += btVector3(0,0,0.1); 02100 02101 //RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(pot_pushed_to_cooker); 02102 02103 //goal.setOrigin(btVector3(potPose.getOrigin().x() + adj_x,potPose.getOrigin().y() + adj_y,1.06 + modifier - 0.02 + 0.1)); 02104 02105 //RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goal); 02106 02107 //RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(lidcarry); 02108 02109 RobotArm::getInstance(0)->raise_elbow = false; 02110 02111 //exit(0); 02112 02113 Gripper::getInstance(0)->open(); 02114 02115 goal.setOrigin(btVector3(potPose.getOrigin().x() - .0,potPose.getOrigin().y() -.02 ,goal.getOrigin().z() + .1)); 02116 02117 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goal); 02118 02119 RobotArm::getInstance((0))->universal_move_toolframe_ik_pose(lidcarry); 02120 return 0; 02121 } 02122 */ 02123 02124 int Current::putLidOn(int jump) 02125 { 02126 02127 tf::Stamped<tf::Pose> lidcarry; 02128 lidcarry.frame_id_ = "base_link"; 02129 lidcarry.setOrigin(btVector3(0.088186, -0.539420, 1.110697)); 02130 lidcarry.setRotation(btQuaternion(-0.061714, 0.110614, 0.436300, 0.890841)); 02131 02132 double modifier = -.06; // small pot vs high pot 02133 02134 //pr2_controllers_msgs::JointTrajectoryGoal goalAT = RobotArm::getInstance(0)->goalTraj(-2.13282, -0.3, -1.209236618713309, -1.8705012213796224, -0.2192995424769604, -1.2529613898971834, 8.2846172962242548,1); 02135 //boost::thread t2T(&RobotArm::startTrajectory, RobotArm::getInstance(0), goalAT,true); 02136 //boost::thread t1(&RobotArm::startTrajectory,RobotArm::getInstance(0),tg); 02137 02138 RobotHead::getInstance()->lookAtThreaded("/map",-1.906074,2.872285,1.171132); 02139 02140 RobotDriver::moveBase4(-1.230, 2.782, 0.999, -0.042); // move base to island 02141 02142 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(lidcarry); 02143 02144 Gripper::getInstance(0)->closeThreaded(); 02145 02146 02147 //tf::Stamped<tf::Pose> curr = RobotArm::getInstance(0)->getToolPose("base_link"); 02148 //curr.getOrigin() += btVector3(0,0,.2); 02149 //boost::thread t9(&RobotArm::universal_move_toolframe_ik_pose, RobotArm::getInstance(0), curr); 02150 RobotArm::getInstance(0)->raise_elbow = true; 02151 02152 tf::Stamped<tf::Pose> potPose, pre_grasp_r, grasp_r, pre_grasp_l, grasp_l; 02153 bool gotPotPose = false; 02154 02155 discardKinectFrame(); 02156 discardKinectFrame(); 02157 02158 while (!gotPotPose) 02159 { 02160 gotPotPose = getPotPose(potPose, pre_grasp_l, grasp_l, pre_grasp_r, grasp_r); 02161 } 02162 02163 //RobotHead::getInstance()->lookAtThreaded("r_gripper_tool_frame",0,0,0); 02164 02165 //t9.join(); 02166 02167 double adj_x = 0.005; 02168 double adj_y = -.015; 02169 02170 tf::Stamped<tf::Pose> goal; 02171 goal = RobotArm::getInstance(0)->getToolPose("/map"); 02172 //goal.setOrigin(btVector3(potPose.getOrigin().x() + adj_x ,potPose.getOrigin().y() + adj_y,goal.getOrigin().z())); 02173 02174 //RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goal); 02175 02176 //goal.setOrigin(btVector3(potPose.getOrigin().x() - .0,potPose.getOrigin().y() -.02 ,1.06 + modifier)); 02177 goal.setOrigin(btVector3(potPose.getOrigin().x() + adj_x,potPose.getOrigin().y() + adj_y,1.06 + modifier - 0.01)); 02178 //goal.getOrigin() += btVector3(0,0,0.04); 02179 02180 tf::Stamped<tf::Pose> goal_base_rot = Geometry::getPoseIn("base_link", goal); 02181 goal_base_rot.setRotation(btQuaternion(0,0,0,1)); 02182 goal_base_rot = Geometry::getPoseIn("/map", goal_base_rot); 02183 02184 tf::Stamped<tf::Pose> goalappr_rot = goal; 02185 tf::Stamped<tf::Pose> goalappr_rot_backwards = goal; 02186 tf::Stamped<tf::Pose> goalappr_shift= goal; 02187 02188 goalappr_rot = Geometry::rotateAroundPose(goal,goal_base_rot,0,0.25,0); 02189 goalappr_rot.getOrigin() += btVector3(0.02,0,0.04); 02190 02191 goalappr_rot_backwards = Geometry::rotateAroundPose(goal,goal_base_rot,0,-0.15,0); 02192 goalappr_rot_backwards.getOrigin() -= btVector3(0.02,0,0.00); 02193 02194 tf::Stamped<tf::Pose> goalappr_rot_high = goalappr_rot; 02195 02196 //tf::Stamped<tf::Pose> goalappr_rot_shift = goalappr_rot; 02197 02198 goalappr_rot_high.getOrigin() += btVector3(0,0,0.1); 02199 02200 goalappr_shift.getOrigin() += btVector3(-0.05,0,0); 02201 02202 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goalappr_rot_high); 02203 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goalappr_rot); 02204 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goalappr_rot_backwards); 02205 //RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goalappr_rot_shift); 02206 //RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goalappr_shift); 02207 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goal); 02208 02209 tf::Stamped<tf::Pose> pot_pushed_to_cooker; 02210 pot_pushed_to_cooker.frame_id_ = "/map"; 02211 pot_pushed_to_cooker.setOrigin(btVector3(-1.901817, 2.941642, 1.015725)); 02212 pot_pushed_to_cooker.setRotation(btQuaternion(-0.117109, -0.076221, 0.877845, -0.458110)); 02213 02214 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(pot_pushed_to_cooker); 02215 02216 if (jump == 17) 02217 { 02218 pot_pushed_to_cooker.getOrigin() += btVector3(0,0,0.1); 02219 02220 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(pot_pushed_to_cooker); 02221 02222 //goal.setOrigin(btVector3(potPose.getOrigin().x() + adj_x,potPose.getOrigin().y() + adj_y,1.06 + modifier - 0.02 + 0.1)); 02223 02224 //RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goal); 02225 02226 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(lidcarry); 02227 02228 RobotArm::getInstance(0)->raise_elbow = false; 02229 02230 exit(0); 02231 } 02232 02233 Gripper::getInstance(0)->open(); 02234 02235 goal.setOrigin(btVector3(potPose.getOrigin().x() - .0,potPose.getOrigin().y() -.02 ,goal.getOrigin().z() + .1)); 02236 02237 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(goal); 02238 02239 RobotArm::getInstance((0))->universal_move_toolframe_ik_pose(lidcarry); 02240 return 0; 02241 } 02242 02243 02244 void getLidAndBowl(int jump) 02245 { 02246 switch (jump) 02247 02248 { 02249 02250 //get around cable 02251 case -2: 02252 { 02253 RobotDriver::moveBase4(-0.346670, 2.307890, 0.757347, 0.653002); 02254 } 02255 02256 case -1: 02257 { 02258 Current::manipulateKnob(1); 02259 //Current::manipulateKnob(-1); 02260 } 02261 02262 case 0: 02263 { 02264 Current::openDrawerUnderOven(jump); 02265 } 02266 02267 // get the lid out 02268 case 1: 02269 { 02270 Current::getLidOut(jump); 02271 } 02272 02273 // get the bowl out 02274 case 2: 02275 { 02276 Current::getBowlOut(jump); 02277 } 02278 02279 //close drawer 02280 case 3: 02281 { 02282 02283 Current::closeDrawerUnderOven(jump); 02284 02285 } 02286 02287 //get around cable 02288 case 25: 02289 { 02290 RobotDriver::moveBase4(-0.346670, 2.307890, 0.757347, 0.653002); 02291 } 02292 02293 // pour popcorn and put lid on pot 02294 case 4: 02295 { 02296 02297 Current::pourPopCorn(jump); 02298 } 02299 02300 case 5: 02301 { 02302 Current::putLidOn(jump); 02303 } 02304 02305 } 02306 } 02307 02308 int Current::removeLid(int jump) 02309 { 02310 02311 RobotHead::getInstance()->lookAtThreaded("/map", -1.86 , 2.76, 0.956078350673); 02312 02313 // RobotHead::getInstance()->lookAtThreaded("/map", -1.89231883149, 2.93624266139, 0.956078350673); 02314 02315 OperateHandleController::plateAttackPose(); 02316 Gripper::getInstance(1)->openThreaded(); 02317 02318 RobotDriver::moveBase4(-1.243378, 2.790111, 0.998631, -0.052253); 02319 02320 02321 tf::Stamped<tf::Pose> lid; 02322 getLidPose(lid); 02323 02324 btTransform lidRel; 02325 //lidRel.setOrigin(btVector3(0.026, 0.013, 0.042)); 02326 lidRel.setOrigin(btVector3(0.026, 0.033, 0.042)); 02327 lidRel.setRotation(btQuaternion(0.655, 0.742, -0.102, 0.097)); 02328 02329 //btTransform lidBt; 02330 //lidBt.setOrigin(lid.getOrigin()); 02331 //lidBt.setRotation(lid.getRotation()); 02332 02333 btTransform lidAbs = lid * lidRel; 02334 02335 btTransform lidPreRel; 02336 lidPreRel.setOrigin(btVector3(0.034, -0.043, 0.083)); 02337 lidPreRel.setRotation(btQuaternion(0.649, 0.733, -0.142, 0.142)); 02338 02339 btTransform lidPreAbs = lid * lidPreRel; 02340 02341 announce("Lid_grasp", Geometry::make_pose(lidAbs,"/map")); 02342 02343 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(Geometry::make_pose(lidPreAbs,"/map")); 02344 02345 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(Geometry::make_pose(lidAbs,"/map")); 02346 02347 Gripper::getInstance(1)->close(); 02348 02349 ros::Duration(0.5).sleep(); 02350 02351 ROS_ERROR("REMOVE LID AMOUNT OPEN: %f", Gripper::getInstance(1)->getAmountOpen()); 02352 02353 if (Gripper::getInstance(1)->getAmountOpen() < 0.03) 02354 { 02355 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(Geometry::make_pose(lidPreAbs,"/map")); 02356 OperateHandleController::plateAttackPoseLeft(); 02357 return Current::removeLid(jump); 02358 } 02359 02360 tf::Stamped<tf::Pose> lidhigh = Geometry::make_pose(lidAbs,"/map"); 02361 lidhigh.getOrigin() += btVector3(0,0,.1); 02362 02363 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(lidhigh); 02364 02365 tf::Stamped<tf::Pose> lidside; 02366 lidside.frame_id_ = "/map"; 02367 lidside.setOrigin(btVector3(-1.719, 2.383, 0.918)); 02368 lidside.setRotation(btQuaternion(0.287, 0.951, -0.031, 0.113)); 02369 02370 02371 tf::Stamped<tf::Pose> lidsidehigh; 02372 lidsidehigh.frame_id_ = "/map"; 02373 lidsidehigh.setOrigin(btVector3(-1.719, 2.383, 0.918 + 0.15)); 02374 lidsidehigh.setRotation(btQuaternion(0.287, 0.951, -0.031, 0.113)); 02375 02376 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(lidsidehigh); 02377 02378 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(lidside); 02379 02380 02381 Gripper::getInstance(1)->open(); 02382 02383 02384 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(lidsidehigh); 02385 02386 02387 02388 02389 02390 //RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(Geometry::make_pose(lidAbs,"/map")); 02391 02392 //Gripper::getInstance(1)->open(); 02393 02394 02395 //RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(Geometry::make_pose(lidPreAbs,"/map")); 02396 02397 //exit(0); 02398 02399 02400 02401 02402 02403 /*tf::Stamped<tf::Pose> potPose, pre_grasp_r, grasp_r, pre_grasp_l, grasp_l; 02404 bool gotPotPose = false; 02405 while (!gotPotPose) 02406 gotPotPose = getPotPose(potPose, pre_grasp_l, grasp_l, pre_grasp_r, grasp_r); 02407 02408 potPose.getOrigin().setZ(1.084787); 02409 02410 tf::Stamped<tf::Pose> prelid; 02411 prelid.frame_id_ = "/map"; 02412 prelid.setOrigin(potPose.getOrigin() - btVector3(0,.1,-.015)); 02413 prelid.setRotation(btQuaternion(-0.006873, 0.028028, 0.721502, 0.691810)); 02414 02415 tf::Stamped<tf::Pose> lid; 02416 lid.frame_id_ = "/map"; 02417 lid.setOrigin(potPose.getOrigin() - btVector3(-0.02,-.03,0)) ; 02418 lid.getOrigin().setZ(1.075707); 02419 lid.setRotation(btQuaternion(-0.054255, 0.079032, 0.718619, 0.688765)); 02420 02421 announce("Lid", lid); 02422 02423 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(prelid); 02424 02425 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(lid); 02426 02427 Gripper::getInstance(1)->close(); 02428 02429 tf::Stamped<tf::Pose> lidhigh; 02430 lidhigh.frame_id_ = "/map"; 02431 lidhigh.setOrigin(potPose.getOrigin() + btVector3(0,0,0.07)); 02432 lidhigh.setRotation(btQuaternion(-0.053563, 0.077269, 0.718727, 0.688906)); 02433 02434 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(lidhigh); 02435 02436 02437 tf::Stamped<tf::Pose> lidside; 02438 lidside.frame_id_ = "/map"; 02439 lidside.setOrigin(btVector3(-1.799645, 2.544812, 1.148517)); 02440 lidside.setRotation(btQuaternion(-0.066076, 0.066084, 0.707530, 0.700477)); 02441 02442 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(lidside); 02443 tf::Stamped<tf::Pose> liddown; 02444 liddown.frame_id_ = "/map"; 02445 liddown.setOrigin(btVector3(-1.751367, 2.353818, 0.922780)); 02446 liddown.setRotation(btQuaternion(-0.073592, 0.048190, 0.918971, 0.384387)); 02447 02448 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(liddown); 02449 02450 Gripper::getInstance(1)->open(); 02451 02452 tf::Stamped<tf::Pose> lidexit; 02453 lidexit.frame_id_ = "/map"; 02454 lidexit.setOrigin(btVector3(-1.686919, 2.283597, 0.933412)); 02455 lidexit.setRotation(btQuaternion(-0.088774, 0.080089, 0.911498, 0.393544)); 02456 02457 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(lidexit);*/ 02458 02459 return 0; 02460 } 02461 02462 02463 tf::Stamped<tf::Pose> hack_r, hack_l; 02464 02465 02466 int Current::takePotFromIsland(int jump) 02467 { 02468 //RobotHead::getInstance()->lookAtThreaded("/map", -1.89231883149, 2.93624266139, 0.956078350673); 02469 RobotHead::getInstance()->lookAtThreaded("/map", -1.86 , 2.76, 0.956078350673); 02470 02471 // -1.77 2.76 .95 02472 02473 boost::thread ty(&OperateHandleController::plateAttackPose); 02474 02475 Gripper::getInstance(0)->openThreaded(0.04); 02476 Gripper::getInstance(1)->openThreaded(0.04); 02477 02478 02479 RobotArm::getInstance(0)->raise_elbow = true; 02480 RobotArm::getInstance(1)->raise_elbow = true; 02481 02482 02483 //RobotDriver::moveBase4(-1.318529, 2.688299, 0.998893, -0.047046); 02484 RobotDriver::moveBase4(-1.243378, 2.790111, 0.998631, -0.052253); // takepotfrom 02485 02486 //RobotDriver::moveBase4(-1.243155, 2.693516, 0.999085, -0.042705); 02487 02488 tf::Stamped<tf::Pose> potPose, pre_grasp_r, grasp_r, pre_grasp_l, grasp_l; 02489 bool gotPotPose = false; 02490 while (!gotPotPose) 02491 { 02492 gotPotPose = getPotPose(potPose, pre_grasp_l, grasp_l, pre_grasp_r, grasp_r,true); 02493 gotPotPose = getPotPose(potPose, pre_grasp_l, grasp_l, pre_grasp_r, grasp_r,true); 02494 } 02495 02496 RobotArm::moveBothArms(pre_grasp_l,pre_grasp_r); 02497 02498 grasp_l.getOrigin() += btVector3(0,0,-0.01); 02499 grasp_r.getOrigin() += btVector3(0,0,-0.01); 02500 02501 hack_l = grasp_l; 02502 hack_r = grasp_r; 02503 02504 RobotArm::moveBothArms(grasp_l,grasp_r); 02505 OperateHandleController::closeGrippers(); 02506 02507 ros::Duration(0.5).sleep(); 02508 02509 ROS_ERROR("takePotFromIsland AMOUNT OPEN: %f", Gripper::getInstance(0)->getAmountOpen()); 02510 ROS_ERROR("takePotFromIsland AMOUNT OPEN: %f", Gripper::getInstance(1)->getAmountOpen()); 02511 02512 if ((Gripper::getInstance(1)->getAmountOpen() < 0.007) || (Gripper::getInstance(0)->getAmountOpen() < 0.007) || 02513 (Gripper::getInstance(1)->getAmountOpen() > 0.03) || (Gripper::getInstance(0)->getAmountOpen() > 0.03)) 02514 { 02515 02516 Gripper::getInstance(0)->openThreaded(0.04); 02517 Gripper::getInstance(1)->open(0.04); 02518 02519 RobotArm::moveBothArms(pre_grasp_l,pre_grasp_r); 02520 02521 OperateHandleController::plateAttackPose(); 02522 return Current::takePotFromIsland(jump); 02523 } 02524 02525 02526 02527 //OperateHandleController::openGrippers(); 02528 //RobotArm::moveBothArms(pre_grasp_l,pre_grasp_r); 02529 //OperateHandleController::plateAttackPose(); 02530 //big pot 02531 //tf::Stamped<tf::Pose> rcarry0; 02532 //rcarry0.frame_id_ = "base_link"; 02533 //rcarry0.setOrigin(btVector3(0.553647, -0.319272, 1.162564)); 02534 //rcarry0.setRotation(btQuaternion(0.547706, 0.480213, -0.537497, -0.424865)); 02535 02536 tf::Stamped<tf::Pose> rcarry0; 02537 rcarry0.frame_id_ = "base_link"; 02538 rcarry0.setOrigin(btVector3(0.564247, -0.253055, 1.162559)); 02539 rcarry0.setRotation(btQuaternion(-0.520823, -0.509241, 0.559830, 0.394977)); 02540 //big pot 02541 //tf::Stamped<tf::Pose> lcarry0; 02542 //lcarry0.frame_id_ = "base_link"; 02543 //lcarry0.setOrigin(btVector3(0.528605, 0.034132, 1.164678)); 02544 //lcarry0.setRotation(btQuaternion(0.527690, -0.480534, -0.526408, 0.462088)); 02545 tf::Stamped<tf::Pose> lcarry0; 02546 lcarry0.frame_id_ = "base_link"; 02547 lcarry0.setOrigin(btVector3(0.524614, 0.019969, 1.164658)); 02548 lcarry0.setRotation(btQuaternion(-0.414234, 0.548428, -0.363319, 0.628997)); 02549 02550 grasp_l= Geometry::getPoseIn("base_link", grasp_l); 02551 02552 lcarry0.setRotation(grasp_l.getRotation()); 02553 02554 02555 RobotArm::moveBothArms(lcarry0,rcarry0); 02556 02557 RobotArm::getInstance(0)->raise_elbow = false; 02558 RobotArm::getInstance(1)->raise_elbow = false; 02559 02560 return 0; 02561 } 02562 02563 void printPose(const char title[], tf::Pose pose) 02564 { 02565 ROS_INFO("%s %f %f %f %f %f %f %f", title, pose.getOrigin().x(), pose.getOrigin().y(), pose.getOrigin().z() 02566 , pose.getRotation().x(), pose.getRotation().y(), pose.getRotation().z(), pose.getRotation().w()); 02567 } 02568 02569 02570 int Current::pushPot(int jump) 02571 { 02572 RobotHead::getInstance()->lookAtThreaded("/map", -1.89231883149, 2.93624266139, 0.956078350673); 02573 02574 //OperateHandleController::plateAttackPose(); 02575 boost::thread ty(&OperateHandleController::plateAttackPose); 02576 02577 Gripper::getInstance(0)->openThreaded(0.04); 02578 Gripper::getInstance(1)->openThreaded(0.04); 02579 02580 //RobotDriver::moveBase4(-1.318529, 2.688299, 0.998893, -0.047046); 02581 RobotDriver::moveBase4(-1.243378 - 0.075, 2.790111, 0.998631, -0.052253); 02582 //RobotDriver::moveBase4(-1.243155, 2.693516, 0.999085, -0.042705); 02583 RobotArm::getInstance(0); 02584 02585 tf::Stamped<tf::Pose> potPose, pre_grasp_r, grasp_r, pre_grasp_l, grasp_l; 02586 //to make sure we dont move, discard one frame 02587 discardKinectFrame(); 02588 02589 bool hadtodrive = true; 02590 02591 bool gotPotPose = false; 02592 02593 while (hadtodrive) 02594 { 02595 while (!gotPotPose) 02596 gotPotPose = getPotPose(potPose, pre_grasp_l, grasp_l, pre_grasp_r, grasp_r,true); 02597 02598 printPose("potPose",potPose); 02599 02600 tf::Stamped<tf::Pose> result; 02601 std::vector<int> arm; 02602 std::vector<tf::Stamped<tf::Pose> > goal; 02603 arm.push_back(0); 02604 arm.push_back(0); 02605 arm.push_back(1); 02606 arm.push_back(1); 02607 goal.push_back(pre_grasp_r); 02608 goal.push_back(grasp_r); 02609 goal.push_back(pre_grasp_l); 02610 goal.push_back(grasp_l); 02611 //bool RobotArm::findBaseMovement(tf::Stamped<tf::Pose> &result, std::vector<int> arm, std::vector<tf::Stamped<tf::Pose> > goal, bool drive, bool reach) 02612 02613 RobotArm::findBaseMovement(result, arm, goal, true, false); 02614 02615 if (result.getOrigin().length() < 0.01) 02616 hadtodrive = false; 02617 } 02618 02619 02620 RobotArm::getInstance(0)->raise_elbow = true; 02621 RobotArm::getInstance(1)->raise_elbow = true; 02622 02623 RobotArm::moveBothArms(pre_grasp_l,pre_grasp_r); 02624 02625 grasp_l.getOrigin() += btVector3(0,0,-0.01); 02626 grasp_r.getOrigin() += btVector3(0,0,-0.01); 02627 02628 RobotArm::moveBothArms(grasp_l,grasp_r); 02629 OperateHandleController::closeGrippers(); 02630 02631 ros::Duration(0.5).sleep(); 02632 02633 { 02634 btTransform btri = grasp_r; 02635 btTransform btli = grasp_l; 02636 btTransform relIntended = btri.inverseTimes(btli); 02637 tf::Stamped<tf::Pose> act_r, act_l; 02638 act_r = RobotArm::getInstance(0)->getToolPose("map"); 02639 act_l = RobotArm::getInstance(1)->getToolPose("map"); 02640 btTransform btr = act_r; 02641 btTransform btl = act_l; 02642 btTransform relAct = btr.inverseTimes(btl); 02643 02644 ROS_ERROR("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); 02645 printPose("intended", relIntended); 02646 printPose("relAct", relAct); 02647 ROS_ERROR("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); 02648 02649 if (1) 02650 { 02651 gotPotPose = false; 02652 while (!gotPotPose) 02653 gotPotPose = getPotPose(potPose, pre_grasp_l, grasp_l, pre_grasp_r, grasp_r,true); 02654 printPose("potPose after grasp",potPose); 02655 } 02656 } 02657 02658 ROS_ERROR("pushPot AMOUNT OPEN: %f", Gripper::getInstance(0)->getAmountOpen()); 02659 ROS_ERROR("pushPot AMOUNT OPEN: %f", Gripper::getInstance(1)->getAmountOpen()); 02660 02661 if ((Gripper::getInstance(1)->getAmountOpen() < 0.007) || (Gripper::getInstance(0)->getAmountOpen() < 0.007)) 02662 { 02663 02664 Gripper::getInstance(0)->openThreaded(0.04); 02665 Gripper::getInstance(1)->open(0.04); 02666 02667 RobotArm::moveBothArms(pre_grasp_l,pre_grasp_r); 02668 02669 OperateHandleController::plateAttackPose(); 02670 return Current::pushPot(jump); 02671 } 02672 02673 02674 // push to side 02675 tf::Stamped<tf::Pose> rpot_down; 02676 rpot_down.frame_id_ = "/map"; 02677 rpot_down.setOrigin(btVector3(-1.867984, 2.791455, 0.941677)); 02678 rpot_down.setRotation(btQuaternion(-0.435962, 0.552046, -0.310802, 0.639206)); 02679 02680 02681 tf::Stamped<tf::Pose> lpot_down; 02682 lpot_down.frame_id_ = "/map"; 02683 lpot_down.setOrigin(btVector3(-1.837314, 2.528506, 0.945535)); 02684 lpot_down.setRotation(btQuaternion(-0.608696, -0.378505, 0.631323, 0.296063)); 02685 02686 RobotHead::getInstance()->lookAtThreaded("/map",-1.837314, 2.528506, 0.945535); 02687 02688 02689 //RobotDriver::moveBase4(-1.173220, 2.577223, 0.998607, -0.052696); 02690 02691 RobotArm::moveBothArms(lpot_down,rpot_down); 02692 02693 //OperateHandleController::openGrippers(); 02694 Gripper::getInstance(0)->openThreaded(0.04); 02695 Gripper::getInstance(1)->open(0.04); 02696 02697 tf::Stamped<tf::Pose> rpot_down_exit; 02698 rpot_down_exit.frame_id_ = "/map"; 02699 rpot_down_exit.setOrigin(btVector3(-1.867984, 2.791455 + .1, 0.941677)); 02700 rpot_down_exit.setRotation(btQuaternion(-0.435962, 0.552046, -0.310802, 0.639206)); 02701 02702 02703 tf::Stamped<tf::Pose> lpot_down_exit; 02704 lpot_down_exit.frame_id_ = "/map"; 02705 lpot_down_exit.setOrigin(btVector3(-1.837314, 2.528506 - .1, 0.945535)); 02706 lpot_down_exit.setRotation(btQuaternion(-0.608696, -0.378505, 0.631323, 0.296063)); 02707 02708 02709 RobotArm::moveBothArms(lpot_down_exit,rpot_down_exit); 02710 02711 OperateHandleController::plateAttackPose(); 02712 02713 RobotArm::getInstance(0)->raise_elbow = false; 02714 RobotArm::getInstance(1)->raise_elbow = false; 02715 02716 02717 return 0; 02718 } 02719 02720 02721 int pourReadyPopcorn_(double base_x, double base_y, double base_oz, double base_ow, double height_ = 0.0) 02722 { 02723 02724 RobotArm::getInstance(0)->raise_elbow = true; 02725 RobotArm::getInstance(1)->raise_elbow = true; 02726 02728 02729 //RobotDriver::moveBase4(-0.941867, 1.919927, 0.999686, -0.025022); 02730 02731 //RobotDriver::moveBase4(-1.094190, 1.929376, 0.997743, -0.067087); 02732 //RobotDriver::moveBase4(-1.094190, 1.6, 0.997743, -0.067087); 02733 RobotDriver::moveBase4(base_x, base_y, base_oz, base_ow); 02734 02735 tf::Stamped<tf::Pose> r,l,rrot,lrot,mid; 02736 02737 r = RobotArm::getInstance(0)->getToolPose("/base_link"); 02738 l = RobotArm::getInstance(1)->getToolPose("/base_link"); 02739 02740 r.getOrigin() += btVector3(0.02, 0,0); 02741 l.getOrigin() += btVector3(0.02, 0,0); 02742 02743 mid = r; 02744 mid.setRotation(btQuaternion(0,0,0,1)); 02745 mid.setOrigin(0.5 * (r.getOrigin() + l.getOrigin())); 02746 02747 printPose("r" , r); 02748 printPose("l" , l); 02749 02750 rrot = Geometry::rotateAroundPose(r, mid, 0, 2.4, 0); 02751 lrot = Geometry::rotateAroundPose(l, mid, 0, 2.4, 0); 02752 02753 printPose("r" , r); 02754 printPose("l" , l); 02755 02756 OperateHandleController::spinnerL(0,0,-.1 - height_); 02757 02758 double time = RobotArm::getInstance(0)->time_to_target; 02759 02760 RobotArm::getInstance(0)->time_to_target = 5; 02761 RobotArm::getInstance(1)->time_to_target = 5; 02762 02763 double down = -.12; 02764 02765 down = -.2 - height_; 02766 02767 lrot.setOrigin(l.getOrigin() + btVector3(0,0,down)); 02768 rrot.setOrigin(r.getOrigin() + btVector3(0,0,down)); 02769 02770 RobotArm::moveBothArms(lrot,rrot); 02771 02772 RobotArm::getInstance(0)->time_to_target = time; 02773 RobotArm::getInstance(1)->time_to_target = time; 02774 02775 lrot.setOrigin(l.getOrigin() + btVector3(0,0,0)); 02776 rrot.setOrigin(r.getOrigin() + btVector3(0,0,0)); 02777 02778 RobotArm::moveBothArms(lrot,rrot); 02779 02780 RobotArm::moveBothArms(l,r); 02781 02782 RobotArm::getInstance(0)->raise_elbow = false; 02783 RobotArm::getInstance(1)->raise_elbow = false; 02784 02785 02786 return 0; 02787 } 02788 02789 02790 int fotopourReadyPopcorn_(double base_x, double base_y, double base_oz, double base_ow, double height_ , double angle, bool do_exit = false) 02791 { 02792 02793 RobotArm::getInstance(0)->raise_elbow = true; 02794 RobotArm::getInstance(1)->raise_elbow = true; 02795 02797 02798 //RobotDriver::moveBase4(-0.941867, 1.919927, 0.999686, -0.025022); 02799 02800 //RobotDriver::moveBase4(-1.094190, 1.929376, 0.997743, -0.067087); 02801 //RobotDriver::moveBase4(-1.094190, 1.6, 0.997743, -0.067087); 02802 RobotDriver::moveBase4(base_x, base_y, base_oz, base_ow); 02803 02804 02805 tf::Stamped<tf::Pose> r,l,rrot,lrot,mid; 02806 02807 r = RobotArm::getInstance(0)->getToolPose("/base_link"); 02808 l = RobotArm::getInstance(1)->getToolPose("/base_link"); 02809 02810 r.getOrigin() += btVector3(0.02, 0,0); 02811 l.getOrigin() += btVector3(0.02, 0,0); 02812 02813 mid = r; 02814 mid.setRotation(btQuaternion(0,0,0,1)); 02815 mid.setOrigin(0.5 * (r.getOrigin() + l.getOrigin())); 02816 02817 printPose("r" , r); 02818 printPose("l" , l); 02819 02820 rrot = Geometry::rotateAroundPose(r, mid, 0, angle, 0); 02821 lrot = Geometry::rotateAroundPose(l, mid, 0, angle, 0); 02822 02823 printPose("r" , r); 02824 printPose("l" , l); 02825 02826 OperateHandleController::spinnerL(0,0,-.1 - height_); 02827 02828 double time = RobotArm::getInstance(0)->time_to_target; 02829 02830 RobotArm::getInstance(0)->time_to_target = 5; 02831 RobotArm::getInstance(1)->time_to_target = 5; 02832 02833 double down = -.12; 02834 02835 down = -.2 - height_; 02836 02837 lrot.setOrigin(l.getOrigin() + btVector3(0,0,down)); 02838 rrot.setOrigin(r.getOrigin() + btVector3(0,0,down)); 02839 RobotArm::moveBothArms(lrot,rrot); 02840 02841 02842 if (do_exit) 02843 exit(0); 02844 02845 RobotArm::getInstance(0)->time_to_target = time; 02846 RobotArm::getInstance(1)->time_to_target = time; 02847 02848 lrot.setOrigin(l.getOrigin() + btVector3(0,0,0)); 02849 rrot.setOrigin(r.getOrigin() + btVector3(0,0,0)); 02850 02851 RobotArm::moveBothArms(lrot,rrot); 02852 02853 RobotArm::moveBothArms(l,r); 02854 02855 RobotArm::getInstance(0)->raise_elbow = false; 02856 RobotArm::getInstance(1)->raise_elbow = false; 02857 02858 02859 return 0; 02860 } 02861 02862 02863 02864 //return pot to heater 02865 02866 void returnPotToHeater() 02867 { 02868 tf::Stamped<tf::Pose> rpot_down; 02869 rpot_down.frame_id_ = "/map"; 02870 rpot_down.setOrigin(btVector3(-1.867984, 2.791455, 0.941677)); 02871 rpot_down.setRotation(btQuaternion(-0.435962, 0.552046, -0.310802, 0.639206)); 02872 02873 02874 tf::Stamped<tf::Pose> lpot_down; 02875 lpot_down.frame_id_ = "/map"; 02876 lpot_down.setOrigin(btVector3(-1.837314, 2.528506, 0.945535)); 02877 lpot_down.setRotation(btQuaternion(-0.608696, -0.378505, 0.631323, 0.296063)); 02878 02879 RobotHead::getInstance()->lookAtThreaded("/map",-1.837314, 2.528506, 0.945535); 02880 02881 RobotDriver::moveBase4(-1.173220, 2.577223, 0.998607, -0.052696); 02882 02883 RobotArm::moveBothArms(lpot_down,rpot_down); 02884 02885 //OperateHandleController::openGrippers(); 02886 Gripper::getInstance(0)->openThreaded(0.04); 02887 Gripper::getInstance(1)->open(0.04); 02888 02889 tf::Stamped<tf::Pose> rpot_down_exit; 02890 rpot_down_exit.frame_id_ = "/map"; 02891 rpot_down_exit.setOrigin(btVector3(-1.867984, 2.791455 + .1, 0.941677)); 02892 rpot_down_exit.setRotation(btQuaternion(-0.435962, 0.552046, -0.310802, 0.639206)); 02893 02894 02895 tf::Stamped<tf::Pose> lpot_down_exit; 02896 lpot_down_exit.frame_id_ = "/map"; 02897 lpot_down_exit.setOrigin(btVector3(-1.837314, 2.528506 - .1, 0.945535)); 02898 lpot_down_exit.setRotation(btQuaternion(-0.608696, -0.378505, 0.631323, 0.296063)); 02899 02900 RobotArm::moveBothArms(lpot_down_exit,rpot_down_exit); 02901 02902 OperateHandleController::plateAttackPose(); 02903 } 02904 02905 02906 void returnPotToSink() 02907 { 02908 02909 RobotHead::getInstance()->lookAtThreaded("/map",1.08, .31, 0.945535); 02910 02911 02912 RobotDriver::moveBase4(0.030936, 0.289066, 0.022239, 0.999752); 02913 RobotArm::getInstance(0)->raise_elbow = true; 02914 RobotArm::getInstance(1)->raise_elbow = true; 02915 02916 02917 //RobotArm::moveBothArms(lpot_down,rpot_down); 02918 tf::Stamped<tf::Pose> rputdown; 02919 rputdown.frame_id_ = "/map"; 02920 rputdown.setOrigin(btVector3(1.060072, 0.144450, 0.957838)); 02921 rputdown.setRotation(btQuaternion(0.545655, 0.541955, -0.543372, -0.336590)); 02922 02923 02924 tf::Stamped<tf::Pose> lputdown; 02925 lputdown.frame_id_ = "/map"; 02926 lputdown.setOrigin(btVector3(1.001025, 0.414402, 0.966610)); 02927 lputdown.setRotation(btQuaternion(-0.382869, 0.495838, -0.391748, 0.673862)); 02928 02929 tf::Stamped<tf::Pose> rputdownexit; 02930 rputdownexit.frame_id_ = "/map"; 02931 rputdownexit.setOrigin(btVector3(1.058829, 0.145553 - .07, 0.958970)); 02932 rputdownexit.setRotation(btQuaternion(0.546275, 0.541866, -0.543263, -0.335902)); 02933 02934 02935 tf::Stamped<tf::Pose> lputdownexit; 02936 lputdownexit.frame_id_ = "/map"; 02937 lputdownexit.setOrigin(btVector3(0.999645, 0.415450 + .07, 0.967175)); 02938 lputdownexit.setRotation(btQuaternion(-0.383121, 0.495288, -0.392308, 0.673797)); 02939 02940 { 02941 tf::Stamped<tf::Pose> result; 02942 std::vector<int> arm; 02943 std::vector<tf::Stamped<tf::Pose> > goal; 02944 arm.push_back(0); 02945 arm.push_back(0); 02946 arm.push_back(1); 02947 arm.push_back(1); 02948 goal.push_back(rputdown); 02949 goal.push_back(rputdownexit); 02950 goal.push_back(lputdown); 02951 goal.push_back(lputdownexit); 02952 //bool RobotArm::findBaseMovement(tf::Stamped<tf::Pose> &result, std::vector<int> arm, std::vector<tf::Stamped<tf::Pose> > goal, bool drive, bool reach) 02953 02954 RobotArm::findBaseMovement(result, arm, goal, true, false); 02955 } 02956 02957 RobotArm::moveBothArms(lputdown,rputdown); 02958 02959 //OperateHandleController::openGrippers(); 02960 Gripper::getInstance(0)->openThreaded(0.04); 02961 Gripper::getInstance(1)->open(0.04); 02962 02963 RobotArm::moveBothArms(lputdownexit,rputdownexit); 02964 02965 Gripper::getInstance(0)->openThreaded(); 02966 Gripper::getInstance(1)->openThreaded(); 02967 02968 //RobotArm::moveBothArms(lpot_down_exit,rpot_down_exit); 02969 02970 lputdownexit.getOrigin() += btVector3(0,0,0.1); 02971 rputdownexit.getOrigin() += btVector3(0,0,0.1); 02972 02973 RobotArm::moveBothArms(lputdownexit,rputdownexit); 02974 02975 RobotArm::getInstance(0)->raise_elbow = false; 02976 RobotArm::getInstance(1)->raise_elbow = false; 02977 02978 OperateHandleController::plateAttackPose(); 02979 } 02980 02981 // this is a dirty hack, we keep record of how the bowl pose deviates from the exepected pose and simply add this to the position we salt above 02982 // would probably be cleaner to keep the bowl pose instead of the delta.. 02983 btVector3 diff(-.12,0,0); 02984 02985 tf::Stamped<tf::Pose> getBigBowlPose(const btVector3 &search); 02986 02987 int Current::pourReadyPopcorn(int jump) 02988 { 02989 RobotHead::getInstance()->lookAtThreaded("/map",-1.692, 1.621, 0.899); 02990 //pourReadyPopcorn_(-1.094190, 1.6, 0.997743, -0.067087); 02991 //pourReadyPopcorn_(-1.044190, 1.6, 0.997743, -0.067087); 02992 //pourReadyPopcorn_(-1, 1.6, 0.997743, -0.067087); 02993 02994 RobotDriver::moveBase4(-1.154662, 1.573712, 0.998081, -0.061899); 02995 02996 btVector3 search(-1.72, 1.6, .88); 02997 tf::Stamped<tf::Pose> bowlPose = getBigBowlPose(search); 02998 02999 diff = bowlPose.getOrigin() - btVector3(-1.583374,1.634822,1.087549); 03000 03001 { 03002 tf::Stamped<tf::Pose> inBase = Geometry::getPoseIn("base_link", bowlPose); 03003 printPose("BowlPoseinbase", bowlPose); 03004 // define where the bowl should be in base coords to make the trajectory work for it 03005 tf::Stamped<tf::Pose> goalPose = Geometry::make_pose(0.600358,-0.125386,0.736068,-0.001765,-0.002289,-0.004847,0.999984,"base_link"); 03006 03007 // calc how much we have to move to bring the bowl into the desired position relative to the robot 03008 btVector3 rel = inBase.getOrigin() - goalPose.getOrigin(); 03009 ROS_ERROR("rel %f %f", rel.x(), rel.y()); 03010 03011 tf::Stamped<tf::Pose> nav_goal; 03012 nav_goal.frame_id_ = "/base_link"; 03013 nav_goal.setRotation(btQuaternion(0,0,0,1)); 03014 nav_goal.setOrigin(btVector3(rel.x(), rel.y(), 0)); 03015 nav_goal = Geometry::getPoseIn("map", nav_goal); 03016 03017 //RobotDriver::getInstance()->driveInMap(nav_goal, false); // 03018 03019 printPose("BowlPose", bowlPose); 03020 03021 pourReadyPopcorn_(nav_goal.getOrigin().x(), nav_goal.getOrigin().y(), nav_goal.getRotation().z(), nav_goal.getRotation().w(), 0); 03022 03023 } 03024 03025 return 0; 03026 } 03027 03028 03029 03030 03031 //RobotDriver::moveBase4(-1.087042, 1.707556 - .025, 0.998003, -0.063155); 03032 void salt_it(btVector3 saltloc, double base_x =-1.087042 + .1, double base_y = 1.707556 - .025, double base_oz = 0.998003, double base_ow = -0.063155) 03033 { 03034 btVector3 expected(-.9, 3.8, 0.88); 03035 03036 //expected = btVector3(atof(argv[2]),atof(argv[3]),atof(argv[4])); 03037 expected = saltloc; 03038 03039 double time = RobotArm::getInstance(0)->time_to_target; 03040 RobotArm::getInstance(0)->time_to_target = 0.5; 03041 RobotArm::getInstance(1)->time_to_target = 0.5; 03042 03043 03044 RobotHead::getInstance()->lookAtThreaded("/map", expected); 03045 03046 boost::thread t0(&OperateHandleController::plateTuckPose); 03047 03048 RobotDriver::moveBase4(base_x - .15, base_y, base_oz, base_ow); 03049 03050 t0.join(); 03051 03052 RobotHead::getInstance()->lookAtThreaded("/map", expected); 03053 03054 03055 //RobotDriver::moveBase4(-1.087042, 1.707556, 0.998003, -0.063155); 03056 // 03057 03058 RobotArm *rarm = RobotArm::getInstance(0); 03059 RobotArm *larm = RobotArm::getInstance(1); 03060 03061 RobotHead::getInstance()->lookAtThreaded("/map", expected); 03062 03063 boost::thread t1(&OperateHandleController::plateAttackPose); 03064 03065 Gripper::getInstance(1)->openThreaded(); 03066 Gripper::getInstance(0)->openThreaded(); 03067 03068 bool found = false; 03069 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>); 03070 pcl::PointCloud<pcl::PointXYZRGB>::Ptr inBox (new pcl::PointCloud<pcl::PointXYZRGB>); 03071 03072 std::vector<btVector3> center; 03073 std::vector<double> radius; 03074 std::vector<int> numinliers; 03075 03076 while (!found && ros::ok()) 03077 { 03078 03079 Kinect::getInstance()->getCloud(cloud); 03080 03081 double search_radius = 0.15; 03082 double height = 0.10; 03083 03084 getPointsInBox(cloud,expected - btVector3(search_radius,search_radius,-0.05),expected + btVector3(search_radius,search_radius,height),inBox); 03085 03086 getCirclesFromCloud(*inBox, .02, .01,center,radius,numinliers,1); 03087 03088 //if (numinliers[0] < 300) 03089 //return false; 03090 03091 tf::Stamped<tf::Pose> lid; 03092 03093 lid.setOrigin(center[0]); 03094 lid.setRotation(btQuaternion(0,0,0,1)); 03095 lid.frame_id_ = "/map"; 03096 03097 announce("Salt", lid); 03098 03099 if ((radius[0] < 0.05) && (radius[0] > 0.01) && (numinliers[0] > 50)) 03100 found = true; 03101 } 03102 03103 /* 03104 tf::Stamped<tf::Pose> lid; 03105 getLidPose(lid); 03106 03107 btTransform lidRel; 03108 //lidRel.setOrigin(btVector3(0.026, 0.013, 0.042)); 03109 lidRel.setOrigin(btVector3(0.026, 0.033, 0.042)); 03110 lidRel.setRotation(btQuaternion(0.655, 0.742, -0.102, 0.097)); 03111 03112 btTransform lidBt; 03113 lidBt.setOrigin(lid.getOrigin()); 03114 lidBt.setRotation(lid.getRotation()); 03115 03116 btTransform lidAbs = lid * lidRel; 03117 03118 btTransform lidPreRel; 03119 lidPreRel.setOrigin(btVector3(0.034, -0.043, 0.083)); 03120 lidPreRel.setRotation(btQuaternion(0.649, 0.733, -0.142, 0.142)); 03121 03122 btTransform lidPreAbs = lid * lidPreRel; 03123 03124 announce("Lid_grasp", Geometry::make_pose(lidAbs,"/map")); 03125 03126 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(Geometry::make_pose(lidPreAbs,"/map")); 03127 03128 */ 03129 03130 tf::Stamped<tf::Pose> cen; 03131 cen.setOrigin(center[0]); 03132 cen.setRotation(btQuaternion(0,0,0,1)); 03133 cen.frame_id_ = "map"; 03134 cen = Geometry::getPoseIn("/base_link", cen); 03135 cen.setRotation(btQuaternion(0.000, -0.001, 0.657, 0.754)); 03136 03137 03138 btTransform lidRel; 03139 //lidRel.setOrigin(btVector3(-0.039, 0.012, -0.062)); 03140 //lidRel.setRotation(btQuaternion(-0.040, 0.999, 0.008, 0.014)); 03141 lidRel.setOrigin(btVector3(-0.030, -0.033, -0.068)); 03142 lidRel.setRotation(btQuaternion(-0.389, 0.921, -0.014, 0.000)); 03143 03144 btTransform lidAbs = cen * lidRel; 03145 03146 cen = Geometry::getPoseIn("/map",Geometry::make_pose(lidAbs,"base_link")); 03147 03148 pubCloud(inBox); 03149 03150 cen.getOrigin() += btVector3(0,0,0.054); 03151 03152 tf::Stamped<tf::Pose> inMap,inMapAppr,inMap_high; 03153 inMap = cen; 03154 //inMap = Geometry::approach(inMap, 0.015); 03155 inMap = Geometry::approach(inMap, 0.02); 03156 inMapAppr = Geometry::approach(inMap, 0.1); 03157 03158 inMap_high = inMapAppr; 03159 inMap_high.getOrigin() += btVector3(0,0,.1); 03160 03161 t1.join(); 03162 { 03163 tf::Stamped<tf::Pose> result; 03164 std::vector<int> arm; 03165 std::vector<tf::Stamped<tf::Pose> > goal; 03166 arm.push_back(1); 03167 arm.push_back(1); 03168 arm.push_back(1); 03169 goal.push_back(inMap_high); 03170 goal.push_back(inMapAppr); 03171 goal.push_back(inMap); 03172 //bool RobotArm::findBaseMovement(tf::Stamped<tf::Pose> &result, std::vector<int> arm, std::vector<tf::Stamped<tf::Pose> > goal, bool drive, bool reach) 03173 03174 RobotArm::findBaseMovement(result, arm, goal, true, false); 03175 } 03176 03177 RobotHead::getInstance()->lookAtThreaded("/l_gripper_tool_frame", 0,0,0); 03178 03179 //RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(inMap_high); 03180 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(inMapAppr); 03181 //Gripper::getInstance(1)->closeThreaded(); 03182 //boost::thread t1(&Gripper::close,Gripper::getInstance(1),0); 03183 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(inMap); 03184 Gripper::getInstance(1)->close(); 03185 03186 ros::Duration(0.5).sleep(); 03187 03188 ROS_ERROR("salt_it AMOUNT OPEN: %f", Gripper::getInstance(0)->getAmountOpen()); 03189 ROS_ERROR("salt_it AMOUNT OPEN: %f", Gripper::getInstance(1)->getAmountOpen()); 03190 03191 if (Gripper::getInstance(1)->getAmountOpen() < 0.015) 03192 { 03193 03194 Gripper::getInstance(1)->open(); 03195 03196 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(inMap_high); 03197 03198 OperateHandleController::plateAttackPose(); 03199 03200 salt_it(saltloc, base_x, base_y, base_oz, base_ow); 03201 03202 return; 03203 } 03204 03205 //t1.join(); 03206 03207 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(inMap_high); 03208 03209 if (0) 03210 { 03211 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(inMap); 03212 Gripper::getInstance(1)->openThreaded(); 03213 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(inMap_high); 03214 } 03215 03216 tf::Stamped<tf::Pose> curr = larm->getToolPose("/base_link"); 03217 curr.setOrigin(btVector3(0.6,-0.03,curr.getOrigin().z())); 03218 curr.setRotation(btQuaternion(-1,1,0,0)); 03219 larm->universal_move_toolframe_ik_pose(curr); 03220 03221 double state[7]; 03222 RobotArm::getInstance(1)->getJointState(state); 03223 state[6] += 3.142; 03224 boost::thread tturn(&RobotArm::startTrajectory, larm,larm->goalTraj(state[0],state[1],state[2],state[3],state[4],state[5],state[6]),true); 03225 //RobotArm::getInstance(1)->startTrajectory(larm->goalTraj(state[0],state[1],state[2],state[3],state[4],state[5],state[6])); 03226 tturn.join(); 03227 03228 tf::Stamped<tf::Pose> right_appr_rel; 03229 right_appr_rel.frame_id_ = "l_gripper_tool_frame"; 03230 right_appr_rel.setOrigin(btVector3(0.000251, -0.000434, 0.085977)); 03231 right_appr_rel.setRotation(btQuaternion(0.001757, -0.000095, 0.999998, -0.000168)); 03232 03233 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(right_appr_rel); 03234 03235 tf::Stamped<tf::Pose> right_final_rel; 03236 right_final_rel.frame_id_ = "l_gripper_tool_frame"; 03237 right_final_rel.setOrigin(btVector3(-0.068345, -0.000794, 0.056093)); 03238 right_final_rel.setRotation(btQuaternion(0.001791, -0.000075, 0.999998, 0.001085)); 03239 03240 //Gripper::getInstance(0)->closeThreaded(); 03241 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(right_final_rel); 03242 Gripper::getInstance(0)->close(); 03243 03244 //fake it 03245 if (0) 03246 { 03247 double open = Gripper::getInstance(0)->getAmountOpen(); 03248 Gripper::getInstance(0)->openThreaded(open + 0.005); 03249 } 03250 03251 tf::Stamped<tf::Pose> right_mid = rarm->getToolPose("base_link"); // mid as in no additional rotation 03252 tf::Stamped<tf::Pose> left_mid = larm->getToolPose("base_link"); 03253 tf::Stamped<tf::Pose> left_minus,left_plus,right_minus,right_plus, left_act, right_act; // positive and negative rotation 03254 03255 double amount = 0.2; 03256 03257 left_minus = Geometry::rotateAroundPose(left_mid, left_mid, 0,0,-amount); 03258 left_plus = Geometry::rotateAroundPose(left_mid, left_mid, 0,0,amount); 03259 right_minus = Geometry::rotateAroundPose(right_mid, right_mid, 0,0,-amount); 03260 right_plus = Geometry::rotateAroundPose(right_mid, right_mid, 0,0,amount); 03261 03262 double center_x = 0.6 - (0.5 * (right_mid.getOrigin().x() + left_mid.getOrigin().x())); 03263 double center_y = -0.03 - (0.5 * (right_mid.getOrigin().y() + left_mid.getOrigin().y())); 03264 03265 //RobotDriver::moveBase4(-1.087042, 1.707556 - .025, 0.998003, -0.063155); 03266 RobotDriver::moveBase4(base_x + diff.x(), base_y + diff.y(), base_oz, base_ow); 03267 03268 RobotArm::getInstance(0)->time_to_target = 0; 03269 RobotArm::getInstance(1)->time_to_target = 0; 03270 03271 { 03272 tf::Stamped<tf::Pose> centerPose; 03273 centerPose.frame_id_ = "/base_link"; 03274 centerPose.setOrigin(btVector3(center_x, center_y,0) + ((left_mid.getOrigin() + right_mid.getOrigin()) * 0.5)); 03275 centerPose.setRotation(btQuaternion(0,0,0,1)); 03276 centerPose = Geometry::getPoseIn("/map", centerPose); 03277 ROS_ERROR("no error"); 03278 printPose("salting center", centerPose); 03279 announce("above bowl", centerPose); 03280 } 03281 03282 03283 bool bit = false; 03284 double rad = 0.07; 03285 double max = 4*M_PI; 03286 double step = M_PI / 2.5; 03287 double steps = max / step; 03288 double radstep = rad / steps; 03289 for (double angle = 0; angle < max + M_PI; angle += step) 03290 { 03291 03292 if (angle >= max) 03293 rad = 0; 03294 03295 double x_add = cos(angle) * rad + center_x; 03296 double y_add = sin(angle) * rad + center_y; 03297 if (bit) 03298 { 03299 left_act = left_plus; 03300 right_act = right_minus; 03301 } 03302 else 03303 { 03304 left_act = left_minus; 03305 right_act = right_plus; 03306 } 03307 left_act.getOrigin() += btVector3(x_add,y_add,0); 03308 right_act.getOrigin() += btVector3(x_add,y_add,0); 03309 03310 RobotArm::moveBothArms(left_act, right_act); 03311 03312 bit = !bit; 03313 rad -= radstep * 0.7; 03314 //RobotArm::moveBothArms(left_plus, right_minus); 03315 } 03316 03317 RobotArm::moveBothArms(left_mid, right_mid); 03318 03319 RobotArm::getInstance(0)->time_to_target = time; 03320 RobotArm::getInstance(1)->time_to_target = time; 03321 03322 03323 if (1) 03324 { 03325 Gripper::getInstance(0)->openThreaded(); 03326 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(right_appr_rel); 03327 boost::thread t0(&OperateHandleController::plateAttackPoseRight); 03328 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(inMap); 03329 Gripper::getInstance(1)->openThreaded(); 03330 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(inMapAppr); 03331 OperateHandleController::plateAttackPose(); 03332 } 03333 } 03334 03335 int Current::salt(int jump) 03336 { 03337 salt_it(btVector3( -1.65,1.23 ,.894)); // 6:27 pour 6:50 pot down 03338 return 0; 03339 } 03340 03341 03342 03343 void takepot(int jump) 03344 { 03345 03346 switch (jump) 03347 { 03348 03349 case 0: 03350 { 03351 Current::removeLid(jump); 03352 } 03353 03354 03355 case 1: 03356 { 03357 Current::takePotFromIsland(jump); 03358 03359 } 03360 03361 case 2: 03362 { 03363 Current::pourReadyPopcorn(jump); 03364 } 03365 03366 03367 03368 } 03369 } 03370 03371 tf::Stamped<tf::Pose> getBigBowlPose(const btVector3 &search) 03372 { 03373 03374 RobotHead::getInstance()->lookAt("/map",search.x(),search.y(),search.z(),true); 03375 RobotHead::getInstance()->lookAtThreaded("/map",search); 03376 03377 tf::Stamped<tf::Pose> bowl; 03378 03379 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>); 03380 03381 Kinect::getInstance()->getCloud(cloud); 03382 03383 pcl::PointCloud<pcl::PointXYZRGB>::Ptr inBox (new pcl::PointCloud<pcl::PointXYZRGB>); 03384 03385 getPointsInBox(cloud, search - btVector3(.2,.2,-.03), search + btVector3(.2,.2,.05),inBox); 03386 03387 pubCloud(inBox); 03388 03389 btVector3 center; 03390 double radius; 03391 03392 getCircleFromCloud(*inBox, center, radius); 03393 03394 bool found = true; 03395 double roi_size = btVector3(.4,.4,0).length(); 03396 double circle_center_distance = (center - search).length(); 03397 if (circle_center_distance > roi_size / 2) 03398 found = false; 03399 if (radius > 0.15) 03400 found = false; 03401 03402 if (!found) 03403 { 03404 return getBigBowlPose(search); 03405 } 03406 else 03407 { 03408 bowl.frame_id_ = "/map"; 03409 bowl.setOrigin(center); 03410 bowl.setRotation(btQuaternion(0,0,0,1)); 03411 bowl = Geometry::getPoseIn("/base_link",bowl); 03412 bowl.setRotation(btQuaternion(0,0,0,1)); 03413 bowl = Geometry::getPoseIn("/map",bowl); 03414 03415 announce("bowl", bowl); 03416 03417 printPose("bowl", bowl); 03418 } 03419 03420 return bowl; 03421 } 03422 03423 void calcBigBowlGraspPoses(const tf::Stamped<tf::Pose> &bowl, tf::Stamped<tf::Pose> &l_pregrasp, tf::Stamped<tf::Pose> &l_grasp, tf::Stamped<tf::Pose> &r_pregrasp, tf::Stamped<tf::Pose> &r_grasp) 03424 { 03425 tf::Stamped<tf::Pose> pregrasp; 03426 pregrasp.setRotation(btQuaternion(btVector3(0,0,1), 0.3)); 03427 pregrasp.setOrigin(btVector3(-.05,0,0)); 03428 03429 tf::Stamped<tf::Pose> l_grip_bowl; 03430 l_grip_bowl.frame_id_ = "bowl"; 03431 l_grip_bowl.setOrigin(btVector3(0.009556, 0.118237, -0.009350)); 03432 l_grip_bowl.setRotation(btQuaternion(-0.205230, 0.662406, -0.227324, 0.683683)); 03433 03434 tf::Stamped<tf::Pose> r_grip_bowl; 03435 r_grip_bowl.frame_id_ = "bowl"; 03436 r_grip_bowl.setOrigin(btVector3(-0.009556, -0.118237, -0.009350)); 03437 r_grip_bowl.setRotation(btQuaternion(-0.662406,-0.205230, 0.683683, 0.227324)); 03438 03439 l_grasp = Geometry::getRel(bowl, l_grip_bowl); 03440 r_grasp = Geometry::getRel(bowl, r_grip_bowl); 03441 03442 l_pregrasp = Geometry::getRel(bowl, Geometry::getRel(l_grip_bowl, pregrasp)); 03443 r_pregrasp = Geometry::getRel(bowl, Geometry::getRel(r_grip_bowl, pregrasp)); 03444 } 03445 03446 bool graspBigBowl(const tf::Stamped<tf::Pose> &bowl, bool grasp = true) 03447 { 03448 tf::Stamped<tf::Pose> l_grip_bowl_,r_grip_bowl_,l_pre_grip_bowl_,r_pre_grip_bowl_; 03449 03450 calcBigBowlGraspPoses(bowl, l_pre_grip_bowl_, l_grip_bowl_, r_pre_grip_bowl_, r_grip_bowl_); 03451 03452 //if (grasp) { 03453 announce("r", r_grip_bowl_); 03454 announce("l", l_grip_bowl_); 03455 //} 03456 03457 RobotArm::getInstance(0)->raise_elbow = true; 03458 RobotArm::getInstance(1)->raise_elbow = true; 03459 03460 if (grasp) 03461 { 03462 OperateHandleController::openGrippers(true); 03463 03464 tf::Stamped<tf::Pose> rt = RobotArm::getInstance(0)->getToolPose("/map"); 03465 tf::Stamped<tf::Pose> lt = RobotArm::getInstance(1)->getToolPose("/map"); 03466 03467 rt.setRotation(r_pre_grip_bowl_.getRotation()); 03468 lt.setRotation(l_pre_grip_bowl_.getRotation()); 03469 03470 rt.getOrigin() += r_pre_grip_bowl_.getOrigin() + btVector3(0,0,0.2); 03471 rt.getOrigin() *= 0.5; 03472 03473 lt.getOrigin() += l_pre_grip_bowl_.getOrigin() + btVector3(0,0,0.2); 03474 lt.getOrigin() *= 0.5; 03475 03476 { 03477 tf::Stamped<tf::Pose> result; 03478 std::vector<int> arm; 03479 std::vector<tf::Stamped<tf::Pose> > goal; 03480 arm.push_back(1); 03481 arm.push_back(1); 03482 arm.push_back(1); 03483 arm.push_back(0); 03484 arm.push_back(0); 03485 arm.push_back(0); 03486 goal.push_back(lt); 03487 goal.push_back(l_pre_grip_bowl_); 03488 goal.push_back(l_grip_bowl_); 03489 goal.push_back(rt); 03490 goal.push_back(r_pre_grip_bowl_); 03491 goal.push_back(r_grip_bowl_); 03492 //bool RobotArm::findBaseMovement(tf::Stamped<tf::Pose> &result, std::vector<int> arm, std::vector<tf::Stamped<tf::Pose> > goal, bool drive, bool reach) 03493 03494 RobotArm::findBaseMovement(result, arm, goal, true, false); 03495 } 03496 03497 03498 RobotArm::moveBothArms(lt,rt); 03499 03500 RobotArm::moveBothArms(l_pre_grip_bowl_,r_pre_grip_bowl_); 03501 Gripper::getInstance(0)->closeThreaded(0.04); 03502 Gripper::getInstance(1)->closeThreaded(0.04); 03503 RobotArm::moveBothArms(l_grip_bowl_,r_grip_bowl_); 03504 OperateHandleController::closeGrippers(); 03505 03506 ros::Duration(0.5).sleep(); 03507 03508 ROS_ERROR("graspBigBowl AMOUNT OPEN: %f", Gripper::getInstance(0)->getAmountOpen()); 03509 ROS_ERROR("graspBigBowl AMOUNT OPEN: %f", Gripper::getInstance(1)->getAmountOpen()); 03510 03511 if ((Gripper::getInstance(1)->getAmountOpen() < 0.004) || (Gripper::getInstance(0)->getAmountOpen() < 0.004)) 03512 { 03513 03514 Gripper::getInstance(0)->openThreaded(0.04); 03515 Gripper::getInstance(1)->open(0.04); 03516 03517 RobotArm::moveBothArms(l_pre_grip_bowl_,r_pre_grip_bowl_); 03518 03519 OperateHandleController::plateAttackPose(); 03520 03521 03522 RobotArm::getInstance(0)->raise_elbow = false; 03523 RobotArm::getInstance(1)->raise_elbow = false; 03524 03525 03526 return false; 03527 } 03528 03529 03530 RobotArm::moveBothArms(Geometry::getRelInBase(l_grip_bowl_,btVector3(0,0,.1)),Geometry::getRelInBase(r_grip_bowl_,btVector3(0,0,.1))); 03531 } 03532 else 03533 { 03534 tf::Stamped<tf::Pose> rapp, lapp; 03535 rapp = r_grip_bowl_; 03536 lapp = l_grip_bowl_; 03537 //rapp.getOrigin() += btVector3(0,0,0.05); 03538 //lapp.getOrigin() += btVector3(0,0,0.05); 03539 //r_grip_bowl_.getOrigin() += btVector3(0,0,0.01); 03540 //l_grip_bowl_.getOrigin() += btVector3(0,0,0.01); 03541 ROS_ERROR("EXT"); 03542 //RobotArm::moveBothArms(lapp,rapp); 03543 RobotArm::moveBothArms(l_grip_bowl_,r_grip_bowl_); 03544 OperateHandleController::openGrippers(false); 03545 RobotArm::moveBothArms(l_pre_grip_bowl_,r_pre_grip_bowl_); 03546 l_pre_grip_bowl_.getOrigin() += btVector3(0,0,0.07); 03547 r_pre_grip_bowl_.getOrigin() += btVector3(0,0,0.07); 03548 RobotArm::moveBothArms(l_pre_grip_bowl_,r_pre_grip_bowl_); 03549 OperateHandleController::plateAttackPose(); 03550 } 03551 03552 RobotArm::getInstance(0)->raise_elbow = false; 03553 RobotArm::getInstance(1)->raise_elbow = false; 03554 03555 return true; 03556 } 03557 03558 03559 void getBigBowlOut() 03560 { 03561 btVector3 search(.51, 1.12, .75); 03562 03563 bool got_it = false; 03564 03565 while (!got_it) 03566 { 03567 tf::Stamped<tf::Pose> bowlPose = getBigBowlPose(search); 03568 got_it = graspBigBowl(bowlPose, true); 03569 } 03570 03571 OperateHandleController::plateCarryPose(); 03572 } 03573 03574 03575 int openFavouriteDrawer(int jump) 03576 { 03577 btVector3 search(.51, 1.12, .75); 03578 03579 RobotHead::getInstance()->lookAtThreaded("/map",search); 03580 03581 Gripper::getInstance(0)->openThreaded(); 03582 03583 03584 RobotDriver::moveBase4(-0.187269, 1.122678, 0.023650, 0.999720); 03585 03586 tf::Stamped<tf::Pose> drawer_pre_closed_grasp; 03587 drawer_pre_closed_grasp.frame_id_ = "/map"; 03588 drawer_pre_closed_grasp.setOrigin(btVector3(0.6, 0.868231, 0.789463)); 03589 drawer_pre_closed_grasp.setRotation(btQuaternion(0.694022, 0.007679, 0.072881, 0.716214)); 03590 03591 // open drawer 03592 03593 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(drawer_pre_closed_grasp); 03594 03595 tf::Stamped<tf::Pose> drawer_closed_grasp; 03596 drawer_closed_grasp.frame_id_ = "/map"; 03597 drawer_closed_grasp.setOrigin(btVector3(0.691291, 0.868231, 0.789463)); 03598 drawer_closed_grasp.setOrigin(btVector3(0.671291, 0.868231, 0.789463)); 03599 drawer_closed_grasp.setRotation(btQuaternion(0.694022, 0.007679, 0.072881, 0.716214)); 03600 03601 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(drawer_closed_grasp); 03602 03603 Gripper::getInstance(0)->close(); 03604 03605 ros::Duration(0.5).sleep(); 03606 03607 ROS_ERROR("openFavouriteDrawer OPEN: %f", Gripper::getInstance(0)->getAmountOpen()); 03608 03609 if (Gripper::getInstance(0)->getAmountOpen() < 0.01) 03610 { 03611 Gripper::getInstance(0)->close(); 03612 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(drawer_pre_closed_grasp); 03613 OperateHandleController::plateTuckPoseRight(); 03614 return openFavouriteDrawer(jump); 03615 } 03616 03617 tf::Stamped<tf::Pose> drawer_open_grasp; 03618 drawer_open_grasp.frame_id_ = "/map"; 03619 drawer_open_grasp.setOrigin(btVector3(0.217701, 0.836088, 0.783115)); 03620 drawer_open_grasp.setRotation(btQuaternion(0.690426, -0.012174, 0.045241, 0.721884)); 03621 03622 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(drawer_open_grasp); 03623 03624 Gripper::getInstance(0)->openThreaded(); 03625 03626 tf::Stamped<tf::Pose> drawer_avoid_open_grasp; 03627 drawer_avoid_open_grasp.frame_id_ = "/map"; 03628 drawer_avoid_open_grasp.setOrigin(btVector3(0.217025, 0.635642, 0.783132)); 03629 drawer_avoid_open_grasp.setRotation(btQuaternion(0.690618, -0.012459, 0.045518, 0.721678)); 03630 03631 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(drawer_avoid_open_grasp); 03632 03633 OperateHandleController::plateAttackPose(); 03634 03635 //get bowl out 03636 03637 //getBigBowlOut(); 03638 03639 return 0; 03640 } 03641 03642 int getBowlFromDrawer(int jump) 03643 { 03644 getBigBowlOut(); 03645 return 0; 03646 } 03647 03648 03649 03650 int closeDrawer(int jump) 03651 { 03652 03653 btVector3 search(.51, 1.12, .75); 03654 03655 RobotHead::getInstance()->lookAtThreaded("/map",search); 03656 03657 Gripper::getInstance(0)->openThreaded(); 03658 03659 OperateHandleController::plateTuckPose(); 03660 03661 RobotDriver::moveBase4(-0.187269, 1.122678, 0.023650, 0.999720); 03662 03663 tf::Stamped<tf::Pose> drawer_pre_closed_grasp; 03664 drawer_pre_closed_grasp.frame_id_ = "/map"; 03665 drawer_pre_closed_grasp.setOrigin(btVector3(0.6, 0.868231, 0.789463)); 03666 drawer_pre_closed_grasp.setRotation(btQuaternion(0.694022, 0.007679, 0.072881, 0.716214)); 03667 03668 tf::Stamped<tf::Pose> drawer_closed_grasp; 03669 drawer_closed_grasp.frame_id_ = "/map"; 03670 drawer_closed_grasp.setOrigin(btVector3(0.671291, 0.868231, 0.789463)); 03671 drawer_closed_grasp.setRotation(btQuaternion(0.694022, 0.007679, 0.072881, 0.716214)); 03672 03673 tf::Stamped<tf::Pose> drawer_open_grasp; 03674 drawer_open_grasp.frame_id_ = "/map"; 03675 drawer_open_grasp.setOrigin(btVector3(0.217701, 0.836088, 0.783115)); 03676 drawer_open_grasp.setRotation(btQuaternion(0.690426, -0.012174, 0.045241, 0.721884)); 03677 03678 tf::Stamped<tf::Pose> drawer_avoid_open_grasp; 03679 drawer_avoid_open_grasp.frame_id_ = "/map"; 03680 drawer_avoid_open_grasp.setOrigin(btVector3(0.217025, 0.635642, 0.783132)); 03681 drawer_avoid_open_grasp.setRotation(btQuaternion(0.690618, -0.012459, 0.045518, 0.721678)); 03682 03683 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(drawer_avoid_open_grasp); 03684 03685 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(drawer_open_grasp); 03686 03687 //Gripper::getInstance(0)->close(); 03688 03689 //Gripper::getInstance(0)->openThreaded(); 03690 03691 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(drawer_closed_grasp); 03692 03693 Gripper::getInstance(0)->open(); 03694 03695 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(drawer_pre_closed_grasp); 03696 03697 03698 OperateHandleController::plateAttackPose(); 03699 03700 return 0; 03701 03702 } 03703 03704 void putBigBowlOntoIsland() 03705 { 03706 btVector3 search(-1.699046, 1.632452, 0.88); 03707 03708 RobotHead::getInstance()->lookAtThreaded("/map",search); 03709 03710 RobotDriver::moveBase4(-0.977623, 1.694076, 0.998947, -0.045763); 03711 03712 tf::Stamped<tf::Pose> bowlPose; 03713 bowlPose.setOrigin(search); 03714 bowlPose.setRotation(Geometry::getRelativeTransform("/map", "base_link").getRotation()); 03715 bowlPose.frame_id_ = "/map"; 03716 03717 graspBigBowl(bowlPose, false); 03718 } 03719 03720 03721 void putBigBowlOntoTable(btVector3 search, double base_x, double base_y, double base_oz, double base_ow) 03722 { 03723 //btVector3 search(.45, -1.35, .88 - .13); 03724 03725 RobotHead::getInstance()->lookAtThreaded("/map",search); 03726 03727 //RobotDriver::moveBase4(-0.977623, 1.694076, 0.998947, -0.045763); 03728 //RobotDriver::moveBase4(0.073525, -0.679463, -0.682670, 0.730720); // putBigBowlOntoTable 03729 RobotDriver::moveBase4(base_x, base_y, base_oz, base_ow); 03730 03731 tf::Stamped<tf::Pose> bowlPose; 03732 bowlPose.setOrigin(search); 03733 bowlPose.setRotation(Geometry::getRelativeTransform("/map", "base_link").getRotation()); 03734 bowlPose.frame_id_ = "/map"; 03735 03736 graspBigBowl(bowlPose, false); 03737 } 03738 03739 void putBigBowlOntoIsland_heater() 03740 { 03741 btVector3 search(-1.91044139862 + 0.03, 2.9423532486, 0.88); 03742 03743 RobotHead::getInstance()->lookAtThreaded("/map",search); 03744 03745 //RobotDriver::moveBase4(-0.977623, 1.694076, 0.998947, -0.045763); 03746 03747 tf::Stamped<tf::Pose> bowlPose; 03748 bowlPose.setOrigin(search); 03749 bowlPose.setRotation(Geometry::getRelativeTransform("/map", "base_link").getRotation()); 03750 bowlPose.frame_id_ = "/map"; 03751 03752 ROS_ERROR("putting it down now"); 03753 03754 graspBigBowl(bowlPose, false); 03755 } 03756 03757 03758 03759 void shake_it() 03760 { 03761 03762 RobotArm *rarm = RobotArm::getInstance(0); 03763 RobotArm *larm = RobotArm::getInstance(1); 03764 tf::Stamped<tf::Pose> r_tp = rarm->getToolPose("/base_link"); 03765 tf::Stamped<tf::Pose> l_tp = larm->getToolPose("/base_link"); 03766 03767 tf::Stamped<tf::Pose> r_tp_map = Geometry::getPoseIn("/map",r_tp); 03768 tf::Stamped<tf::Pose> l_tp_map = Geometry::getPoseIn("/map",l_tp); 03769 03770 tf::Stamped<tf::Pose> mid,mid_tilted; 03771 mid.frame_id_ = "/base_link"; 03772 mid.setOrigin(0.5 * (r_tp.getOrigin() + l_tp.getOrigin())); 03773 mid.setRotation(btQuaternion(0,0,0,1)); 03774 03775 btTransform midbt; 03776 midbt.setOrigin(mid.getOrigin()); 03777 midbt.setRotation(mid.getRotation()); 03778 03779 double angle = 0; 03780 double amplitude = 0.35; 03781 double angle_increment = M_PI / 5.0; 03782 double amplitude_diminisher = amplitude / ((2 * M_PI) / angle_increment); 03783 03784 ROS_ERROR("angle_increment %f amplitude_diminisher %f", angle_increment, amplitude_diminisher); 03785 03786 ros::Rate r(2); 03787 while (angle < 2 * M_PI) 03788 { 03789 mid_tilted = Geometry::rotateAroundPose(mid,mid,cos(angle) * amplitude,sin(angle) * amplitude,0); 03790 btTransform mid_tiltedbt; 03791 mid_tiltedbt.setOrigin(mid_tilted.getOrigin()); 03792 mid_tiltedbt.setRotation(mid_tilted.getRotation()); 03793 03794 //announce("mid", mid); 03795 03796 //announce("mid", mid_tilted); 03797 03798 r.sleep(); 03799 03800 btTransform r,l; 03801 03802 r = r_tp; 03803 l = l_tp; 03804 03805 l = mid_tiltedbt * mid.inverseTimes(l); 03806 r = mid_tiltedbt * mid.inverseTimes(r); 03807 03808 tf::Stamped<tf::Pose> act_l_tp = l_tp; 03809 act_l_tp.setOrigin(l.getOrigin()); 03810 act_l_tp.setRotation(l.getRotation()); 03811 tf::Stamped<tf::Pose> act_r_tp = r_tp; 03812 act_r_tp.setOrigin(r.getOrigin()); 03813 act_r_tp.setRotation(r.getRotation()); 03814 03815 //announce("r",act_r_tp); 03816 //announce("l",act_l_tp); 03817 03818 RobotArm::moveBothArms(act_l_tp, act_r_tp, 0, false); 03819 03820 ros::Duration(0.5).sleep(); 03821 03822 angle += angle_increment; 03823 amplitude -= amplitude_diminisher; 03824 } 03825 03826 03827 RobotArm::moveBothArms(l_tp_map,r_tp_map); 03828 /* 03829 r 03830 x: -1.8773600001 03831 y: 3.0805883138 03832 z: 0.946 03833 orientation: 03834 x: -0.320103064305 03835 y: 0.630521636559 03836 z: -0.39629712381 03837 w: 0.585598056446 03838 03839 l 03840 03841 x: -1.91300054796 03842 y: 2.81695646567 03843 z: 0.947 03844 orientation: 03845 x: -0.583435311095 03846 y: -0.362567567153 03847 z: 0.594931073057 03848 w: 0.417378743261 03849 */ 03850 03851 tf::Stamped<tf::Pose> r_putdown; 03852 r_putdown.frame_id_ = "/map"; 03853 r_putdown.setOrigin(btVector3( -1.8773600001, 3.0805883138, 0.946)); 03854 r_putdown.setRotation(btQuaternion(-0.320103064305,0.630521636559, -0.39629712381, 0.585598056446)); 03855 03856 tf::Stamped<tf::Pose> l_putdown; 03857 l_putdown.frame_id_ = "/map"; 03858 l_putdown.setOrigin(btVector3(-1.91300054796, 2.81695646567, 0.947)); 03859 l_putdown.setRotation(btQuaternion(-0.583435311095, -0.362567567153, 0.594931073057, 0.417378743261)); 03860 03861 //r_putdown = hack_r; 03862 //l_putdown = hack_l; 03863 03864 tf::Stamped<tf::Pose> r_putdown_exit = r_putdown; 03865 r_putdown_exit.getOrigin() += btVector3(0,0.1,0.0); 03866 tf::Stamped<tf::Pose> l_putdown_exit = l_putdown; 03867 l_putdown_exit.getOrigin() -= btVector3(0,0.1,0.0); 03868 03869 03870 RobotArm::getInstance(0)->raise_elbow = true; 03871 RobotArm::getInstance(1)->raise_elbow = true; 03872 03873 RobotArm::moveBothArms(l_putdown,r_putdown); 03874 03875 if (0) // re-align to get pot to the right spot 03876 { 03877 // rosrun tf static_transform_publisher -1.899720 2.966096 0.960000 0.000000 0.000000 0.769873 0.638197 /map pot 100 03878 btVector3 potTarget = btVector3(-1.899720, 2.966096, 0.960000); 03879 03880 tf::Stamped<tf::Pose> potPose, pre_grasp_r, grasp_r, pre_grasp_l, grasp_l; 03881 03882 ros::Duration(0.5).sleep(); 03883 03884 bool gotPotPose = false; 03885 while (!gotPotPose) 03886 gotPotPose = getPotPose(potPose, pre_grasp_l, grasp_l, pre_grasp_r, grasp_r, true); 03887 03888 btVector3 diff = potTarget - potPose.getOrigin(); 03889 03890 ROS_ERROR("POT DIFF %f %f", diff.x(), diff.y()); 03891 03892 diff.setZ(0); 03893 03894 tf::Stamped<tf::Pose> radj, ladj; 03895 radj = r_putdown; 03896 ladj = l_putdown; 03897 radj.getOrigin() += diff; 03898 ladj.getOrigin() += diff; 03899 03900 l_putdown_exit.getOrigin() += diff; 03901 r_putdown_exit.getOrigin() += diff; 03902 03903 tf::Stamped<tf::Pose> l_putdown_exit_high, r_putdown_exit_high; 03904 l_putdown_exit_high = l_putdown_exit; 03905 r_putdown_exit_high = r_putdown_exit; 03906 03907 l_putdown_exit_high.getOrigin() += btVector3(0,0,.1); 03908 r_putdown_exit_high.getOrigin() += btVector3(0,0,.1); 03909 03910 { 03911 tf::Stamped<tf::Pose> result; 03912 std::vector<int> arm; 03913 std::vector<tf::Stamped<tf::Pose> > goal; 03914 arm.push_back(1); 03915 arm.push_back(1); 03916 arm.push_back(1); 03917 arm.push_back(0); 03918 arm.push_back(0); 03919 arm.push_back(0); 03920 goal.push_back(ladj); 03921 goal.push_back(l_putdown_exit); 03922 goal.push_back(l_putdown_exit_high); 03923 goal.push_back(radj); 03924 goal.push_back(r_putdown_exit); 03925 goal.push_back(r_putdown_exit_high); 03926 //bool RobotArm::findBaseMovement(tf::Stamped<tf::Pose> &result, std::vector<int> arm, std::vector<tf::Stamped<tf::Pose> > goal, bool drive, bool reach) 03927 03928 RobotArm::findBaseMovement(result, arm, goal, true, false); 03929 } 03930 03931 RobotArm::moveBothArms(ladj,radj); 03932 03933 Gripper::getInstance(0)->openThreaded(0.055); 03934 Gripper::getInstance(1)->openThreaded(0.055); 03935 03936 RobotArm::moveBothArms(l_putdown_exit,r_putdown_exit); 03937 03938 OperateHandleController::openGrippers(false); 03939 03940 RobotArm::moveBothArms(l_putdown_exit_high,r_putdown_exit_high); 03941 03942 // 9x9x9x 03943 } 03944 else 03945 { 03946 Gripper::getInstance(0)->openThreaded(0.055); 03947 Gripper::getInstance(1)->openThreaded(0.055); 03948 03949 RobotArm::moveBothArms(l_putdown_exit,r_putdown_exit); 03950 03951 Gripper::getInstance(0)->openThreaded(0.055); 03952 Gripper::getInstance(1)->openThreaded(0.055); 03953 03954 l_putdown_exit.getOrigin() += btVector3(0,0,.1); 03955 r_putdown_exit.getOrigin() += btVector3(0,0,.1); 03956 03957 RobotArm::moveBothArms(l_putdown_exit,r_putdown_exit); 03958 } 03959 03960 RobotArm::getInstance(0)->raise_elbow = false; 03961 RobotArm::getInstance(1)->raise_elbow = false; 03962 03963 OperateHandleController::plateAttackPose(); 03964 03965 03966 } 03967 03968 03969 int pourReadyPopcornTable(int jump) 03970 { 03971 03972 RobotHead::getInstance()->lookAtThreaded("/map",.27, -1.33, 0.899); 03973 03974 RobotDriver::moveBase4(.3098 + diff.x() , -0.716 + diff.y(), -0.659599, 0.751613); 03975 03976 //pourReadyPopcorn_(0.279824 + 0.025, -0.691109 -.03, -0.659599, 0.751613, 0.12); 03977 03978 //pourReadyPopcorn_(0.279824 + xshift, -0.691109 + yshift, -0.659599, 0.751613, 0.12); 03979 tf::Stamped<tf::Pose> bowlPose = getBigBowlPose(btVector3(.27,-1.35, .75)); 03980 bowlPose = getBigBowlPose(btVector3(.27,-1.35, .75)); 03981 03982 diff = bowlPose.getOrigin() - btVector3(.271, -1.33, 1.00); 03983 03984 //ROS_ERROR("BOWL DIFF %f %f", diff.x(), diff.y()); 03985 //for bowl .271 -1.33 1.00 03986 03987 03988 if (0) 03989 { 03990 03991 bowlPose = Geometry::getPoseIn("map", bowlPose); 03992 RobotDriver::moveBase4(.3098 + diff.x() , -0.716 + diff.y(), -0.659599, 0.751613); 03993 bowlPose = Geometry::getPoseIn("base_link", bowlPose); 03994 printPose("Bowl Pose", bowlPose); 03995 exit(0); 03996 //0.600358 -0.125386 0.736068 -0.001765 -0.002289 -0.004847 0.999984 03997 //0.602894 -0.119965 0.736622 0.000888 -0.000972 0.004101 0.999991 03998 } 03999 04000 pourReadyPopcorn_(.3098 + diff.x() , -0.716 + diff.y(), -0.659599, 0.751613, 0.12); 04001 04002 //pourReadyPopcorn_(-1.094190, 1.6, 0.997743, -0.067087); 04003 return 0; 04004 } 04005 04006 04007 04008 int current(int argc, char** argv) 04009 { 04010 04011 ros::NodeHandle node_handle; 04012 04013 development_tools(argc, argv); 04014 04015 //run the whole damn thing 04016 if (atoi(argv[1]) == -700) 04017 { 04018 getPotOut(0); 04019 getLidAndBowl(-2); 04020 Current::removeLid(0); 04021 takepot(1); 04022 } 04023 04024 if (atoi(argv[1]) == -701) 04025 { 04026 04027 int jump = 0; 04028 04029 switch (atoi(argv[2])) 04030 { 04031 04032 case 0 : //0:15 04033 Current::getPotOut_openDrawer(jump); 04034 04035 case 1 : //0:54 pot on // 1:30 04036 Current::getPotOut_pickPlacePot(jump); 04037 04038 case 2 : 04039 if ((argc > 3) && (atoi(argv[3])==1)) 04040 RobotDriver::moveBase4(-0.346670, 2.307890, 0.757347, 0.653002); 04041 04042 case 3 : 04043 Current::manipulateKnob(1); // 1:54 04044 //Current::manipulateKnob(-1); 04045 04046 case 4 : 04047 Current::openDrawerUnderOven(jump); // 2:23 04048 04049 case 5 : 04050 Current::getLidOut(jump); // 2:45 04051 04052 case 6 : 04053 Current::getBowlOut(jump); // 3:15 04054 04055 case 7 : 04056 Current::closeDrawerUnderOven(jump); // 3:30 04057 04058 case 8 : 04059 if ((argc > 3) && (atoi(argv[3])==1)) 04060 RobotDriver::moveBase4(-0.346670, 2.307890, 0.757347, 0.653002); 04061 case 9 : 04062 Current::pourPopCorn(jump); //3:54 04063 04064 case 10 : 04065 Current::putLidOn(jump); //4:10 04066 RobotDriver::moveBase4(-0.904410, 2.493494, 0.998334, -0.057692); // for waiting 04067 04068 case 11 : 04069 Current::pushPot(jump); // 4:31 04070 04071 case 12 : 04072 if ((argc > 3) && (atoi(argv[3])==1)) 04073 RobotDriver::moveBase4(-0.346670, 2.307890, 0.757347, 0.653002); 04074 Current::manipulateKnob(-1); // 5:13 04075 04076 case 13 : 04077 Current::removeLid(jump); //5:51 04078 04079 case 14 : 04080 Current::takePotFromIsland(jump); // 6:06 04081 04082 case 15 : 04083 //Current::pourReadyPopcorn(jump); // 6:27 pour 6:50 pot down 04084 fotopourReadyPopcorn_(-1, 1.6, 0.997743, -0.067087, .0 , 2.4,false); 04085 } 04086 } 04087 04088 04089 if (atoi(argv[1]) == -616) 04090 { 04091 tf::Stamped<tf::Pose> r,l,mid; 04092 04093 04094 r = RobotArm::getInstance(0)->getToolPose("/base_link"); 04095 l = RobotArm::getInstance(1)->getToolPose("/base_link"); 04096 04097 mid = r; 04098 mid.setRotation(btQuaternion(0,0,0,1)); 04099 mid.setOrigin(0.5 * (r.getOrigin() + l.getOrigin())); 04100 04101 printPose("r" , r); 04102 printPose("l" , l); 04103 04104 r = Geometry::rotateAroundPose(r, mid, atof(argv[2]),atof(argv[3]), atof(argv[4])); 04105 l = Geometry::rotateAroundPose(l, mid, atof(argv[2]),atof(argv[3]), atof(argv[4])); 04106 04107 printPose("r" , r); 04108 printPose("l" , l); 04109 04110 RobotArm::moveBothArms(l,r); 04111 } 04112 04113 /* 04114 //test cop based pot detection 04115 if (atoi(argv[1]) == -617) 04116 { 04117 ros::Publisher pose_pub = node_handle.advertise<geometry_msgs::PoseStamped>( "/cop_detection", 0 , true); 04118 ros::Publisher best_pose_pub = node_handle.advertise<geometry_msgs::PoseStamped>( "/cop_detection_best", 0, true ); 04119 04120 std::vector<tf::Stamped<tf::Pose> > poses; 04121 std::vector<double > votes; 04122 04123 while (ros::ok()) 04124 { 04125 tf::Stamped<tf::Pose> pose; 04126 pose = OperateHandleController::getCopPose("PotWW", "/openni_rgb_optical_frame"); 04127 ros::Duration(0.05).sleep(); 04128 if (pose.frame_id_ == "NO_ID_STAMPED_DEFAULT_CONSTRUCTION") 04129 { 04130 ROS_ERROR("dropped %s", pose.frame_id_.c_str()); 04131 continue; 04132 } 04133 04134 if (pose.getOrigin().length() < 0.1) 04135 continue; 04136 pose = Geometry::getPoseIn("/map", pose); 04137 04138 geometry_msgs::PoseStamped pose_stamped, best_pose_stamped; 04139 04140 tf::poseStampedTFToMsg(pose,pose_stamped); 04141 pose_pub.publish(pose_stamped); 04142 ros::Duration(0.05).sleep(); 04143 04144 if ((btVector3(-1.836059, 2.612557, 1.016513) - pose.getOrigin()).length() > 0.5) 04145 continue; 04146 04147 { 04148 poses.push_back(pose); 04149 votes.push_back(.0); 04150 04151 ROS_INFO("tick"); 04152 04153 if (poses.size() > 1) 04154 { 04155 for (size_t k = 0; k < poses.size(); ++k) 04156 { 04157 votes[k] = 0; 04158 } 04159 double max_score = 0; 04160 for (size_t k = 0; k < poses.size(); ++k) 04161 { 04162 for (size_t j = 0; j < poses.size(); ++j) 04163 { 04164 btTransform a,b,c; 04165 a.setOrigin(poses[k].getOrigin()); 04166 a.setRotation(poses[k].getRotation()); 04167 b.setOrigin(poses[j].getOrigin()); 04168 b.setRotation(poses[j].getRotation()); 04169 c = b.inverseTimes(a); 04170 double score = c.getOrigin().length() + c.getRotation().getAngle() * .001; 04171 votes[j] += score; 04172 votes[k] += score; 04173 if (votes[k] > max_score) 04174 max_score = votes[k]; 04175 if (votes[j] > max_score) 04176 max_score = votes[j]; 04177 } 04178 } 04179 double minscore = 1000000; 04180 tf::Stamped<tf::Pose> best; 04181 for (size_t k = 0; k < poses.size(); ++k) 04182 { 04183 double act = votes[k] / max_score; 04184 ROS_INFO("%zu score %f: %f", k, votes[k], act); 04185 if (act < minscore) 04186 { 04187 minscore = act; 04188 best = poses[k]; 04189 } 04190 } 04191 tf::poseStampedTFToMsg(best,best_pose_stamped); 04192 ROS_INFO("min score = %f", minscore); 04193 best_pose_pub.publish(best_pose_stamped); 04194 ros::Duration(0.05).sleep(); 04195 } 04196 } 04197 } 04198 } 04199 */ 04200 04201 04203 if (atoi(argv[1]) == -619) 04204 { 04205 04206 RobotHead::getInstance()->lookAtThreaded("/map",0.527460,2.304037,0.832586); 04207 04208 switch (atoi(argv[2])) 04209 { 04210 04211 case 0 : 04212 { 04213 04214 Gripper::getInstance(1)->openThreaded(); 04215 04216 btVector3 min(0.614, 1.945, 0.84); 04217 btVector3 max(0.796, 2.245, 0.92); 04218 btVector3 center; 04219 double radius; 04220 getCircle(min, max, center, radius); 04221 04222 ROS_INFO("center %f %f %f", center.x(), center.y(), center.z()); 04223 04224 tf::Stamped<tf::Pose> grasp; 04225 grasp.setOrigin(center + btVector3(0,0.08,-0.02)); 04226 grasp.setRotation(btQuaternion(-0.128, 0.591, -0.167, 0.778)); 04227 grasp.frame_id_ = "/map"; 04228 04229 tf::Stamped<tf::Pose> grasphigh = grasp; 04230 grasphigh.getOrigin() += btVector3(0,0,0.1); 04231 04232 ROS_INFO("grasphigh %f %f %f", grasphigh.getOrigin().x(), grasphigh.getOrigin().y(), grasphigh.getOrigin().z()); 04233 04234 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(grasphigh); 04235 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(grasp); 04236 04237 Gripper::getInstance(1)->close(); 04238 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(grasphigh); 04239 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(grasp); 04240 04241 Gripper::getInstance(1)->open(); 04242 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(grasphigh); 04243 04244 04245 OperateHandleController::plateAttackPose(); 04246 04247 } 04248 04249 } 04250 04251 /* 04252 - Translation: [0.614, 1.945, 0.807] 04253 - Rotation: in Quaternion [-0.514, 0.481, 0.476, 0.527] 04254 in RPY [-1.470, 1.487, 0.084] 04255 ruehr@pr2b:~/sshsandbox/ias_drawer_executive$ rosrun tf tf_echo map l_gripper_tool_frame 04256 At time 1319040599.730 04257 - Translation: [0.796, 2.245, 0.810] 04258 - Rotation: in Quaternion [0.719, 0.008, -0.695, -0.008] 04259 in RPY [-2.569, 1.529, 0.573] 04260 */ 04261 04262 } 04263 04264 04265 if (atoi(argv[1]) == -620) 04266 { 04267 04268 if (atoi(argv[2]) == 0) { 04269 04270 tf::Stamped<tf::Pose> potPose, pre_grasp_r, grasp_r, pre_grasp_l, grasp_l; 04271 04272 bool via_lid = false; 04273 if (argc > 3) 04274 via_lid = true; 04275 04276 while (ros::ok()) 04277 { 04278 bool gotPotPose = false; 04279 while (!gotPotPose) 04280 gotPotPose = getPotPose(potPose, pre_grasp_l, grasp_l, pre_grasp_r, grasp_r, via_lid); 04281 } 04282 } else { 04283 //9x9x9x 04284 ROS_INFO("Dip"); 04285 PotLocalizer *pot = new PotLocalizer(); 04286 04287 double table_height = 0.865; 04288 tf::Vector3 roi_min(-2.06, 2.41, table_height); 04289 tf::Vector3 roi_max(-1.7, 3.09, table_height + .4); 04290 04291 tf::Stamped<tf::Pose> pose; 04292 04293 ros::Rate rt(5); 04294 04295 while (ros::ok()) 04296 { 04297 ObjectLocalizer::localize("Pot",&pose, 1, Keywords("min",roi_min)("max",roi_max)); 04298 rt.sleep(); 04299 } 04300 } 04301 } 04302 04303 04304 if (atoi(argv[1]) == -621) 04305 { 04306 04307 ros::Publisher cloud_pub = node_handle.advertise<sensor_msgs::PointCloud2>("/debug_cloud",0,true); 04308 04309 04310 while (ros::ok()) 04311 { 04312 04313 04314 sensor_msgs::PointCloud2 pc = *(ros::topic::waitForMessage<sensor_msgs::PointCloud2>("/kinect/cloud_throttled")); 04315 04316 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>); 04317 04318 tf::Stamped<tf::Pose> net_stamped = Geometry::getPose("/map","/openni_rgb_optical_frame"); 04319 tf::Transform net_transform; 04320 net_transform.setOrigin(net_stamped.getOrigin()); 04321 net_transform.setRotation(net_stamped.getRotation()); 04322 04323 sensor_msgs::PointCloud2 pct; //in map frame 04324 04325 pcl_ros::transformPointCloud("/map",net_transform,pc,pct); 04326 pct.header.frame_id = "/map"; 04327 04328 pcl::fromROSMsg(pct, *cloud); 04329 04330 pcl::PointCloud<pcl::PointXYZRGB>::Ptr boundary (new pcl::PointCloud<pcl::PointXYZRGB>); 04331 pcl::PointCloud<pcl::PointXYZRGB>::Ptr not_boundary (new pcl::PointCloud<pcl::PointXYZRGB>); 04332 std::vector<int> edge_indices; 04333 04334 pcl::PointCloud<pcl::PointXYZRGB>::Ptr inBox (new pcl::PointCloud<pcl::PointXYZRGB>); 04335 { 04336 04337 Eigen::Vector4f min_pt, max_pt; 04338 04339 04340 04341 min_pt = Eigen::Vector4f(0.33,.82,0.75, 1); 04342 max_pt = Eigen::Vector4f(.72,1.4, .8, 1); 04343 /* 04344 { 04345 tf::Stamped<tf::Pose> res; 04346 res.setOrigin(min); 04347 res.setRotation(btQuaternion(0,0,0,1)); 04348 res.frame_id_ = "/map"; 04349 04350 geometry_msgs::PoseStamped res_msg; 04351 tf::poseStampedTFToMsg(res,res_msg); 04352 04353 pose_pubr.publish(res_msg); 04354 } 04355 04356 { 04357 tf::Stamped<tf::Pose> res; 04358 res.setOrigin(max); 04359 res.setRotation(btQuaternion(0,0,0,1)); 04360 res.frame_id_ = "/map"; 04361 04362 geometry_msgs::PoseStamped res_msg; 04363 tf::poseStampedTFToMsg(res,res_msg); 04364 04365 pose_publ.publish(res_msg); 04366 }*/ 04367 04368 04369 ROS_INFO("min %f %f %f" ,min_pt[0],min_pt[1],min_pt[2]); 04370 ROS_INFO("max %f %f %f" ,max_pt[0],max_pt[1],max_pt[2]); 04371 04372 ROS_INFO("cloud size : %zu", cloud->points.size()); 04373 04374 boost::shared_ptr<std::vector<int> > indices( new std::vector<int> ); 04375 pcl::getPointsInBox(*cloud,min_pt,max_pt,*indices); 04376 04377 pcl::ExtractIndices<pcl::PointXYZRGB> ei; 04378 ei.setInputCloud(cloud); 04379 ei.setIndices(indices); 04380 ei.filter(*inBox); 04381 } 04382 04383 04384 findBoundary2(*inBox,*boundary,*not_boundary, edge_indices ); 04385 04386 sensor_msgs::PointCloud2 out; //in map frame 04387 04388 pcl::toROSMsg(*boundary,out); 04389 out.header.frame_id = "/map"; 04390 04391 btVector3 center; 04392 double radius_goal = .1356; 04393 double radius = radius_goal; 04394 getCircleFromCloud( *boundary, center, radius); 04395 04396 //if (fabs(radius - radius_goal) > 0.01) 04397 // continue 04398 04399 cloud_pub.publish(out); 04400 04401 ROS_INFO("published"); 04402 04403 } 04404 04405 } 04406 04407 04408 if (atoi(argv[1]) == -622) 04409 { 04410 04411 //ros::Publisher cloud_pub = node_handle.advertise<sensor_msgs::PointCloud2>("/debug_cloud",0,true); 04412 ros::Publisher pose_pub = node_handle.advertise<geometry_msgs::PoseStamped>( "/cop_detection", 0 , true); 04413 ros::Publisher pose_pubr = node_handle.advertise<geometry_msgs::PoseStamped>( "/cop_detectionr", 0 , true); 04414 ros::Publisher pose_publ = node_handle.advertise<geometry_msgs::PoseStamped>( "/cop_detectionl", 0 , true); 04415 04416 while (ros::ok()) 04417 { 04418 sensor_msgs::PointCloud2 pc = *(ros::topic::waitForMessage<sensor_msgs::PointCloud2>("/kinect/cloud_throttled")); 04419 04420 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>); 04421 04422 tf::Stamped<tf::Pose> net_stamped = Geometry::getPose("/map","/openni_rgb_optical_frame"); 04423 tf::Transform net_transform; 04424 net_transform.setOrigin(net_stamped.getOrigin()); 04425 net_transform.setRotation(net_stamped.getRotation()); 04426 04427 sensor_msgs::PointCloud2 pct; //in map frame 04428 04429 pcl_ros::transformPointCloud("/map",net_transform,pc,pct); 04430 pct.header.frame_id = "/map"; 04431 04432 pcl::fromROSMsg(pct, *cloud); 04433 04434 pcl::PointCloud<pcl::PointXYZRGB>::Ptr boundary (new pcl::PointCloud<pcl::PointXYZRGB>); 04435 pcl::PointCloud<pcl::PointXYZRGB>::Ptr not_boundary (new pcl::PointCloud<pcl::PointXYZRGB>); 04436 std::vector<int> edge_indices; 04437 04438 pcl::PointCloud<pcl::PointXYZRGB>::Ptr inBox (new pcl::PointCloud<pcl::PointXYZRGB>); 04439 { 04440 04441 Eigen::Vector4f min_pt, max_pt; 04442 04443 //min_pt = Eigen::Vector4f(0.33,.82,0.75, 1); 04444 //max_pt = Eigen::Vector4f(.72,1.4, .8, 1); 04445 04446 btVector3 min(0.33,.82,.75); 04447 btVector3 max(1.2, 1.4,.9); 04448 04449 04450 min_pt = Eigen::Vector4f(min.x(),min.y(),min.z(), 1); 04451 max_pt = Eigen::Vector4f(max.x(),max.y(),max.z(), 1); 04452 04453 min_pt = Eigen::Vector4f(0.33,.82,0.75, 1); 04454 max_pt = Eigen::Vector4f(.72,1.4, .8, 1); 04455 04456 04457 04458 { 04459 tf::Stamped<tf::Pose> res; 04460 res.setOrigin(min); 04461 res.setRotation(btQuaternion(0,0,0,1)); 04462 res.frame_id_ = "/map"; 04463 04464 geometry_msgs::PoseStamped res_msg; 04465 tf::poseStampedTFToMsg(res,res_msg); 04466 04467 pose_pubr.publish(res_msg); 04468 } 04469 04470 { 04471 tf::Stamped<tf::Pose> res; 04472 res.setOrigin(max); 04473 res.setRotation(btQuaternion(0,0,0,1)); 04474 res.frame_id_ = "/map"; 04475 04476 geometry_msgs::PoseStamped res_msg; 04477 tf::poseStampedTFToMsg(res,res_msg); 04478 04479 pose_publ.publish(res_msg); 04480 } 04481 04482 04483 ROS_INFO("min %f %f %f" ,min_pt[0],min_pt[1],min_pt[2]); 04484 ROS_INFO("max %f %f %f" ,max_pt[0],max_pt[1],max_pt[2]); 04485 04486 ROS_INFO("cloud size : %zu", cloud->points.size()); 04487 04488 boost::shared_ptr<std::vector<int> > indices( new std::vector<int> ); 04489 pcl::getPointsInBox(*cloud,min_pt,max_pt,*indices); 04490 04491 pcl::ExtractIndices<pcl::PointXYZRGB> ei; 04492 ei.setInputCloud(cloud); 04493 ei.setIndices(indices); 04494 ei.filter(*inBox); 04495 } 04496 04497 04498 findBoundary2(*inBox,*boundary,*not_boundary, edge_indices ); 04499 04500 //btVector3 center; 04501 //double radius_goal = .1356; 04502 //double radius = radius_goal; 04503 std::vector<btVector3> center; 04504 std::vector<double> radius; 04505 std::vector<int> numinliers;; 04506 04507 //getCircleFromCloud( *boundary, center, radius); 04508 getCirclesFromCloud(*boundary, .136, .02, 04509 center, 04510 radius, 04511 numinliers, 04512 2); 04513 04514 //if (fabs(radius - radius_goal) > 0.01) 04515 // continue 04516 04517 04518 04519 ROS_INFO("published"); 04520 04521 } 04522 04523 } 04524 04525 04526 if (atoi(argv[1]) == -623) 04527 { 04528 04529 ros::Publisher cloud_pub = node_handle.advertise<sensor_msgs::PointCloud2>("/debug_cloud",0,true); 04530 04531 rosbag::Bag bag; 04532 bag.open("clouds.bag", rosbag::bagmode::Write); 04533 04534 04535 while (ros::ok()) 04536 { 04537 04538 sensor_msgs::PointCloud2 pc = *(ros::topic::waitForMessage<sensor_msgs::PointCloud2>("/kinect/cloud_throttled")); 04539 04540 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>); 04541 04542 tf::Stamped<tf::Pose> net_stamped = Geometry::getPose("/map","/openni_rgb_optical_frame"); 04543 tf::Transform net_transform; 04544 net_transform.setOrigin(net_stamped.getOrigin()); 04545 net_transform.setRotation(net_stamped.getRotation()); 04546 04547 sensor_msgs::PointCloud2 pct; //in map frame 04548 04549 pcl_ros::transformPointCloud("/map",net_transform,pc,pct); 04550 pct.header.frame_id = "/map"; 04551 04552 pcl::fromROSMsg(pct, *cloud); 04553 04554 pcl::PointCloud<pcl::PointXYZRGB>::Ptr boundary (new pcl::PointCloud<pcl::PointXYZRGB>); 04555 pcl::PointCloud<pcl::PointXYZRGB>::Ptr not_boundary (new pcl::PointCloud<pcl::PointXYZRGB>); 04556 std::vector<int> edge_indices; 04557 04558 04559 findBoundary2(*cloud,*boundary,*not_boundary, edge_indices ); 04560 04561 sensor_msgs::PointCloud2 out; //in map frame 04562 04563 pcl::toROSMsg(*boundary,out); 04564 out.header.frame_id = "/map"; 04565 04566 //btVector3 center; 04567 //double radius_goal = .1356; 04568 //double radius = radius_goal; 04569 //getCircleFromCloud( *boundary, center, radius); 04570 04571 //if (fabs(radius - radius_goal) > 0.01) 04572 // continue 04573 04574 cloud_pub.publish(out); 04575 04576 ROS_INFO("published"); 04577 04578 04579 bag.write("/kinect/cloud_throttled", ros::Time::now(), pct); 04580 bag.write("/boundaries", ros::Time::now(), out); 04581 04582 04583 } 04584 bag.close(); 04585 04586 } 04587 04588 04589 if (atoi(argv[1]) == -624) 04590 { 04591 while (ros::ok()) 04592 { 04593 04594 tf::Stamped<tf::Pose> lid; 04595 getLidPose(lid); 04596 printPose("lid", lid); 04597 04598 } 04599 } 04600 04601 04602 if (atoi(argv[1]) == -625) 04603 { 04604 04605 while (ros::ok()) 04606 { 04607 tf::Stamped<tf::Pose> a; 04608 a.frame_id_ = "base_link"; 04609 a.setOrigin(btVector3(0.388559, -0.559736, 1.131493)); 04610 a.setRotation(btQuaternion(-0.623655, -0.207955, -0.531256, 0.534393)); 04611 04612 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(a); 04613 04614 RobotArm::getInstance(0)->evil_switch = true; 04615 04616 04617 tf::Stamped<tf::Pose> b; 04618 b.frame_id_ = "base_link"; 04619 b.setOrigin(btVector3(0.389019, 0.000308, 1.131259)); 04620 b.setRotation(btQuaternion(-0.624204, -0.207787, -0.530962, 0.534110)); 04621 04622 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(b); 04623 04624 bool reached = false; 04625 while (!reached) 04626 { 04627 reached = (RobotArm::getInstance(0)->getToolPose(b.frame_id_.c_str()).getOrigin() - b.getOrigin()).length() < 0.05; 04628 ros::Duration(0.001).sleep(); 04629 } 04630 04631 ROS_INFO("DIST : %f ", (RobotArm::getInstance(0)->getToolPose(b.frame_id_.c_str()).getOrigin() - b.getOrigin()).length()); 04632 04633 RobotArm::getInstance(0)->evil_switch = false; 04634 } 04635 04636 } 04637 04638 if (atoi(argv[1]) == -626) 04639 { 04640 tf::Stamped<tf::Pose> a; 04641 a.frame_id_ = "base_link"; 04642 a.setOrigin(btVector3(0.388559, -0.559736, 1.131493)); 04643 a.setRotation(btQuaternion(-0.623655, -0.207955, -0.531256, 0.534393)); 04644 04645 tf::Stamped<tf::Pose> b; 04646 b.frame_id_ = "base_link"; 04647 b.setOrigin(btVector3(0.389019, 0.000308, 1.131259)); 04648 b.setRotation(btQuaternion(-0.624204, -0.207787, -0.530962, 0.534110)); 04649 04650 while (ros::ok()) 04651 { 04652 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(a); 04653 04654 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose_tolerance(b,0.25); 04655 } 04656 } 04657 04658 04659 if (atoi(argv[1]) == -627) 04660 { 04661 Current::putLidOn(17); 04662 } 04663 04664 04665 04666 if (atoi(argv[1]) == -628) 04667 { 04668 tf::Stamped<tf::Pose> r,l,mid; 04669 04670 r = RobotArm::getInstance(0)->getToolPose("/base_link"); 04671 04672 mid = r; 04673 mid.setRotation(btQuaternion(0,0,0,1)); 04674 04675 printPose("r" , r); 04676 04677 r = Geometry::rotateAroundPose(r, mid, atof(argv[2]),atof(argv[3]), atof(argv[4])); 04678 04679 printPose("r" , r); 04680 04681 //RobotArm::moveBothArms(l,r); 04682 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(r); 04683 } 04684 04685 04686 if (atoi(argv[1]) == -629) 04687 { 04688 tf::Stamped<tf::Pose> r,l,mid; 04689 04690 04691 r = RobotArm::getInstance(0)->getToolPose("/base_link"); 04692 l = RobotArm::getInstance(1)->getToolPose("/base_link"); 04693 04694 mid = r; 04695 mid.setRotation(btQuaternion(0,0,0,1)); 04696 mid.setOrigin(0.5 * (r.getOrigin() + l.getOrigin())); 04697 04698 printPose("r" , r); 04699 printPose("l" , l); 04700 04701 r = Geometry::rotateAroundPose(r, mid, atof(argv[2]),atof(argv[3]), atof(argv[4])); 04702 l = Geometry::rotateAroundPose(l, mid, -atof(argv[2]),-atof(argv[3]), -atof(argv[4])); 04703 04704 printPose("r" , r); 04705 printPose("l" , l); 04706 04707 RobotArm::moveBothArms(l,r); 04708 } 04709 04710 04711 04712 if (atoi(argv[1]) == -630) 04713 { 04714 Current::salt(0); 04715 } 04716 04717 04718 if (atoi(argv[1]) == -631) // -1.7 1.66 .88 just detect 04719 { 04720 OperateHandleController::plateAttackPose(); 04721 04722 btVector3 search(atof(argv[2]),atof(argv[3]), atof(argv[4])); 04723 tf::Stamped<tf::Pose> bowlPose = getBigBowlPose(search); 04724 //graspBigBowl(bowlPose, true); 04725 04726 //OperateHandleController::plateCarryPose(); 04727 04728 //graspBigBowl(bowlPose, false); 04729 } 04730 04731 if (atoi(argv[1]) == -632) // -1.7 1.66 .88 04732 { 04733 OperateHandleController::plateAttackPose(); 04734 04735 btVector3 search(atof(argv[2]),atof(argv[3]), atof(argv[4])); 04736 tf::Stamped<tf::Pose> bowlPose = getBigBowlPose(search); 04737 04738 graspBigBowl(bowlPose, true); 04739 04740 OperateHandleController::plateCarryPose(); 04741 } 04742 04743 if (atoi(argv[1]) == -633) // put down 04744 { 04745 btVector3 search(atof(argv[2]),atof(argv[3]), atof(argv[4])); 04746 tf::Stamped<tf::Pose> bowlPose; 04747 bowlPose.setOrigin(search); 04748 bowlPose.setRotation(Geometry::getRelativeTransform("/map", "base_link").getRotation()); 04749 bowlPose.frame_id_ = "/map"; 04750 04751 graspBigBowl(bowlPose, false); 04752 } 04753 04754 // pour ready popcorn 04755 if (atoi(argv[1]) == -635) // -1.7 1.66 .88 04756 { 04757 04758 RobotDriver::moveBase4(-1.154662, 1.573712, 0.998081, -0.061899); 04759 04760 btVector3 search(atof(argv[2]),atof(argv[3]), atof(argv[4])); 04761 tf::Stamped<tf::Pose> bowlPose = getBigBowlPose(search); 04762 04763 { 04764 tf::Stamped<tf::Pose> inBase = Geometry::getPoseIn("base_link", bowlPose); 04765 printPose("BowlPoseinbase", bowlPose); 04766 // define where the bowl should be in base coords to make the trajectory work for it 04767 tf::Stamped<tf::Pose> goalPose = Geometry::make_pose(0.600358,-0.125386,0.736068,-0.001765,-0.002289,-0.004847,0.999984,"base_link"); 04768 04769 // calc how much we have to move to bring the bowl into the desired position relative to the robot 04770 btVector3 rel = inBase.getOrigin() - goalPose.getOrigin(); 04771 ROS_ERROR("rel %f %f", rel.x(), rel.y()); 04772 04773 tf::Stamped<tf::Pose> nav_goal; 04774 nav_goal.frame_id_ = "/base_link"; 04775 nav_goal.setRotation(btQuaternion(0,0,0,1)); 04776 nav_goal.setOrigin(btVector3(rel.x(), rel.y(), 0)); 04777 nav_goal = Geometry::getPoseIn("map", nav_goal); 04778 04779 //RobotDriver::getInstance()->driveInMap(nav_goal, false); // 04780 04781 printPose("BowlPose", bowlPose); 04782 04783 pourReadyPopcorn_(nav_goal.getOrigin().x(), nav_goal.getOrigin().y(), nav_goal.getRotation().z(), nav_goal.getRotation().w(), 0); 04784 04785 } 04786 04787 if (0) 04788 { 04789 tf::Stamped<tf::Pose> bowlPose = getBigBowlPose(search); 04790 bowlPose = Geometry::getPoseIn("/base_link", bowlPose); 04791 printPose("bowlpose_in_base_link", bowlPose); 04792 exit(0); 04793 } 04794 04795 //graspBigBowl(bowlPose, true); 04796 04797 //OperateHandleController::plateCarryPose(); 04798 04799 //graspBigBowl(bowlPose, false); 04800 } 04801 04802 /*if (atoi(argv[1]) == -637) 04803 { 04804 // try rotating pot to distribute popcorn more evenly 04805 04806 RobotArm *rarm = RobotArm::getInstance(0); 04807 RobotArm *larm = RobotArm::getInstance(1); 04808 tf::Stamped<tf::Pose> r_tp = rarm->getToolPose("/base_link"); 04809 tf::Stamped<tf::Pose> l_tp = larm->getToolPose("/base_link"); 04810 tf::Stamped<tf::Pose> mid,mid_tilted; 04811 mid.frame_id_ = "/base_link"; 04812 mid.setOrigin(0.5 * (r_tp.getOrigin() + l_tp.getOrigin())); 04813 mid.setRotation(btQuaternion(0,0,0,1)); 04814 04815 btTransform midbt; 04816 midbt.setOrigin(mid.getOrigin()); 04817 midbt.setRotation(mid.getRotation()); 04818 04819 double angle = 0; 04820 04821 ros::Rate r(2); 04822 while (ros::ok()) 04823 { 04824 mid_tilted = RobotArm::rotateAroundPose(mid,mid,cos(angle) * 0.25,sin(angle) * 0.25,0); 04825 btTransform mid_tiltedbt; 04826 mid_tiltedbt.setOrigin(mid_tilted.getOrigin()); 04827 mid_tiltedbt.setRotation(mid_tilted.getRotation()); 04828 04829 announce("mid", mid); 04830 04831 announce("mid", mid_tilted); 04832 04833 r.sleep(); 04834 04835 btTransform r,l; 04836 04837 r = r_tp; 04838 l = l_tp; 04839 04840 l = mid_tiltedbt * mid.inverseTimes(l); 04841 r = mid_tiltedbt * mid.inverseTimes(r); 04842 04843 tf::Stamped<tf::Pose> act_l_tp = l_tp; 04844 act_l_tp.setOrigin(l.getOrigin()); 04845 act_l_tp.setRotation(l.getRotation()); 04846 tf::Stamped<tf::Pose> act_r_tp = r_tp; 04847 act_r_tp.setOrigin(r.getOrigin()); 04848 act_r_tp.setRotation(r.getRotation()); 04849 04850 announce("r",act_r_tp); 04851 announce("l",act_l_tp); 04852 04853 RobotArm::moveBothArms(act_l_tp, act_r_tp, 0, false); 04854 04855 04856 ros::Duration(0.5).sleep(); 04857 04858 04859 angle += M_PI / 5.0; 04860 } 04861 }*/ 04862 04863 if (atoi(argv[1]) == -702) 04864 { 04865 04866 int jump = 0; 04867 04868 switch (atoi(argv[2])) 04869 { 04870 04871 case 0 : //0:15 04872 Current::getPotOut_openDrawer(jump); 04873 04874 case 1 : //0:54 pot on // 1:30 04875 Current::getPotOut_pickPlacePot(jump); 04876 04877 case 2 : 04878 if ((argc > 3) && (atoi(argv[3])==1)) 04879 RobotDriver::moveBase4(-0.346670, 2.307890, 0.757347, 0.653002); 04880 04881 case 3 : 04882 Current::manipulateKnob(1); // 1:54 04883 //Current::manipulateKnob(-1); 04884 04885 case 4 : 04886 Current::openDrawerUnderOven(jump); // 2:23 04887 04888 case 5 : 04889 Current::getLidOut(jump); // 2:45 04890 04891 case 6 : 04892 Current::getBowlOut(jump); // 3:15 04893 04894 case 7 : 04895 Current::closeDrawerUnderOven(jump); // 3:30 04896 04897 case 8 : 04898 if ((argc > 3) && (atoi(argv[3])==1)) 04899 RobotDriver::moveBase4(-0.346670, 2.307890, 0.757347, 0.653002); 04900 case 9 : 04901 Current::pourPopCorn(jump); //3:54 04902 04903 case 10 : 04904 Current::putLidOn(jump); //4:10 04905 //RobotDriver::moveBase4(-0.904410, 2.493494, 0.998334, -0.057692); // for waiting 04906 case 11: 04907 04908 Current::takePotFromIsland(jump); // 6:06 04909 shake_it(); 04910 ROS_ERROR(" SHAKE DONE "); 04911 //putBigBowlOntoIsland_heater(); 04912 04913 case 12: 04914 getBowlFromDrawer(0); 04915 04916 case 13: 04917 putBigBowlOntoIsland(); 04918 04919 case 14: 04920 closeDrawer(0); 04921 04922 case 15 : 04923 Current::pushPot(jump); // 4:31 04924 04925 case 16 : 04926 if ((argc > 3) && (atoi(argv[3])==1)) 04927 RobotDriver::moveBase4(-0.346670, 2.307890, 0.757347, 0.653002); 04928 Current::manipulateKnob(-1); // 5:13 04929 04930 case 17 : 04931 Current::removeLid(jump); //5:51 04932 04933 case 18 : 04934 Current::takePotFromIsland(jump); // 6:06 04935 04936 case 19 : 04937 Current::pourReadyPopcorn(jump); // 6:27 pour 6:50 pot down 04938 04939 case 20 : 04940 Current::salt(jump); // 6:27 pour 6:50 pot down 04941 04942 } 04943 } 04944 04945 /*if (atoi(argv[1]) == -638) 04946 { 04947 getBowlFromDrawer(0); 04948 btVector3 search(.27, -1.33, .75); 04949 putBigBowlOntoTable(search, 0.129038, -0.702062, -0.655191, 0.755459); 04950 closeDrawer(0); 04951 } 04952 if (atoi(argv[1]) == -639) 04953 { 04954 //btVector3 search(.45, -1.35, .88 - .13); 04955 btVector3 search(.27, -1.33, .75); 04956 putBigBowlOntoTable(search, 0.129038, -0.702062, -0.655191, 0.755459); 04957 }*/ 04958 04959 if (atoi(argv[1]) == -640) 04960 { 04961 04962 //btVector3 search(.637, -1.486, .742 + .022); // should be 2.2 cm above table 04963 //RobotDriver::moveBase4(0.168233, -0.847962, -0.512474, 0.85870); 04964 //salt_it(search, 0.168233, -0.847962, -0.512474, 0.85870); 04965 //salt_it(search, 0.073525, -0.679463, -0.682670, 0.730720); 04966 // .18 -1.29 04967 btVector3 search(.43, -1.46, .742 + 0.022); 04968 salt_it(search, 0.129038 + 0.09, -0.702062 - 0.04, -0.655191, 0.75545); 04969 } 04970 04971 if (atoi(argv[1]) == -703) 04972 { 04973 04974 int jump = 0; 04975 04976 switch (atoi(argv[2])) 04977 { 04978 04979 case 0 : //0:15 04980 Current::getPotOut_openDrawer(jump); 04981 04982 case 1 : //0:54 pot on // 1:30 04983 Current::getPotOut_pickPlacePot(jump); 04984 04985 case 2 : 04986 if ((argc > 3) && (atoi(argv[3])==1)) 04987 RobotDriver::moveBase4(-0.346670, 2.307890, 0.757347, 0.653002); 04988 04989 case 3 : 04990 Current::manipulateKnob(1); // 1:54 04991 //Current::manipulateKnob(-1); 04992 04993 case 4 : 04994 Current::openDrawerUnderOven(jump); // 2:23 04995 04996 case 5 : 04997 Current::getLidOut(jump); // 2:45 04998 04999 case 6 : 05000 Current::getBowlOut(jump); // 3:15 05001 05002 case 7 : 05003 Current::closeDrawerUnderOven(jump); // 3:30 05004 05005 case 8 : 05006 if ((argc > 3) && (atoi(argv[3])==1)) 05007 RobotDriver::moveBase4(-0.346670, 2.307890, 0.757347, 0.653002); 05008 case 9 : 05009 Current::pourPopCorn(jump); //3:54 05010 05011 case 10 : 05012 Current::putLidOn(jump); //4:10 05013 //RobotDriver::moveBase4(-0.904410, 2.493494, 0.998334, -0.057692); // for waiting 05014 case 11: 05015 05016 Current::takePotFromIsland(jump); // 6:06 05017 05018 shake_it(); 05019 05020 ROS_ERROR(" SHAKE DONE "); 05021 //putBigBowlOntoIsland_heater(); 05022 05023 case 12: 05024 openFavouriteDrawer(0); 05025 case 13: 05026 getBowlFromDrawer(0); 05027 05028 case 14: 05029 //putBigBowlOntoIsland(); 05030 05031 putBigBowlOntoTable(btVector3(.27, -1.33, .75), 0.129038, -0.702062, -0.655191, 0.755459); 05032 05033 case 15: 05034 05035 closeDrawer(0); 05036 05037 case 16 : 05038 Current::pushPot(jump); // 4:31 05039 05040 case 17 : 05041 if ((argc > 3) && (atoi(argv[3])==1)) 05042 RobotDriver::moveBase4(-0.346670, 2.307890, 0.757347, 0.653002); 05043 Current::manipulateKnob(-1); // 5:13 05044 05045 case 18 : 05046 Current::removeLid(jump); //5:51 05047 05048 case 19 : 05049 Current::takePotFromIsland(jump); // 6:06 05050 05051 case 20 : 05052 05053 pourReadyPopcornTable(jump); // 6:27 pour 6:50 pot down 05054 //pourReadyPopcorn(0); 05055 //RobotHead::getInstance()->lookAtThreaded("/map", -1.7, 1.5, 0.899); 05056 //fotopourReadyPopcorn_(-1, 1.6, 0.997743, -0.067087, 0,2.4,false); 05057 05058 case 21 : 05059 05060 //returnPotToHeater(); 05061 returnPotToSink(); 05062 05063 case 22 : 05064 //Current::salt(jump); // 6:27 pour 6:50 pot down 05065 05066 salt_it(btVector3(.43, -1.46, .742 + 0.022 + 0.006), 0.129038 + 0.09, -0.702062 - 0.04, -0.655191, 0.75545); 05067 exit(0); 05068 case 23: 05069 tf::Stamped<tf::Pose> roffer; 05070 roffer.frame_id_ = "/map"; 05071 roffer.setOrigin(btVector3(0.128651, -1.243839, 0.835045)); 05072 roffer.setRotation(btQuaternion(0.976158, -0.112988, -0.179133, -0.047544)); 05073 05074 tf::Stamped<tf::Pose> loffer; 05075 loffer.frame_id_ = "/map"; 05076 loffer.setOrigin(btVector3(0.423095, -1.223293, 0.8270)); 05077 loffer.setRotation(btQuaternion(-0.229902, 0.959984, 0.038952, 0.155109)); 05078 05079 RobotHead::getInstance()->lookAtThreaded("/map",.29, -1.38, 0.899); 05080 05081 //RobotArm::moveBothArms(loffer,roffer); 05082 05083 boost::thread t0(&OperateHandleController::plateAttackPose); 05084 05085 RobotDriver::moveBase4(-0.135284, -0.136694, -0.676531, 0.736413); 05086 05087 t0.join(); 05088 05089 //RobotHead::getInstance()->lookAt("/map", 2.1, -5.1, 1.6, true); 05090 //RobotHead::getInstance()->lookAt("/map", -2.8, -6.3, 1.6, true); 05091 05092 boost::thread t1(&OperateHandleController::plateTuckPose); 05093 05094 RobotHead::getInstance()->lookAtThreaded("/map",.29, -1.38, 0.899); 05095 05096 05097 } 05098 } 05099 05100 if (atoi(argv[1]) == -641) 05101 { 05102 double xshift = atof(argv[2]); 05103 double yshift = atof(argv[3]); 05104 //pourReadyPopcorn_(0.279824 + 0.025, -0.691109 -.03, -0.659599, 0.751613, 0.12); 05105 RobotHead::getInstance()->lookAtThreaded("/map",.27, -1.33, 0.899); 05106 //pourReadyPopcorn_(0.279824 + xshift, -0.691109 + yshift, -0.659599, 0.751613, 0.12); 05107 tf::Stamped<tf::Pose> bowlPose = getBigBowlPose(btVector3(.27,-1.35, .75)); 05108 05109 btVector3 diff = bowlPose.getOrigin() - btVector3(.271, -1.33, 1.00); 05110 ROS_ERROR("BOWL DIFF %f %f", diff.x(), diff.y()); 05111 //for bowl .271 -1.33 1.00 05112 pourReadyPopcorn_(.3098 + diff.x() + xshift, -0.716 + diff.y() + yshift, -0.659599, 0.751613, 0.12); 05113 } 05114 05115 if (atoi(argv[1]) == -642) 05116 { 05117 ROS_INFO("RECORD TRAJECTORY WHILE GRIPPER IS CLOSED."); 05118 ROS_INFO("bin/ias_drawer_executive -642 amountOpenThreshold rate side"); 05119 double gripperOpeningThreshold = atof(argv[2]); 05120 double rate = atof(argv[3]); 05121 ros::Rate rt(rate); 05122 05123 while (ros::ok()) 05124 { 05125 if (Gripper::getInstance(atoi(argv[4]))->getAmountOpen() < gripperOpeningThreshold) 05126 printPoseSimple(RobotArm::getInstance(atoi(argv[4]))->getToolPose("/map")); 05127 rt.sleep(); 05128 } 05129 } 05130 05131 if (atoi(argv[1]) == -643) 05132 { 05133 RobotDriver::moveBase4(-1.281009, -3.185903, 0.830314, 0.557294); 05134 05135 05136 RobotHead::getInstance()->lookAtThreaded("r_gripper_tool_frame",0,0,0); 05137 05138 double pts[][7] ={{-1.351540,-2.296082,0.975278,0.659204,0.751421,-0.023565,-0.016137}, 05139 {-1.351977,-2.296833,0.975388,0.658666,0.751905,-0.022882,-0.016551}, 05140 {-1.351919,-2.297108,0.975577,0.660577,0.750314,-0.020253,-0.016063}, 05141 {-1.352188,-2.296892,0.975475,0.664234,0.747228,-0.015198,-0.014589}, 05142 {-1.351736,-2.301302,0.975433,0.659887,0.751031,-0.014568,-0.017011}, 05143 {-1.343917,-2.335844,0.976201,0.619519,0.784706,-0.018606,-0.009272}, 05144 {-1.329244,-2.372110,0.976194,0.574161,0.818253,-0.025994,-0.011172}, 05145 {-1.312993,-2.402995,0.975653,0.524666,0.850551,-0.033886,-0.011848}, 05146 {-1.289472,-2.436672,0.975557,0.476669,0.878117,-0.039786,-0.010718}, 05147 {-1.248192,-2.478786,0.975374,0.407516,0.912462,-0.036654,-0.000978}, 05148 {-1.196179,-2.513152,0.975324,0.316567,0.948113,-0.029311,0.002950}, 05149 {-1.134346,-2.533039,0.975364,0.167569,0.985736,-0.012399,0.009524}, 05150 {-1.083221,-2.539201,0.976012,0.087312,0.996137,-0.007728,-0.005284}, 05151 {-1.045371,-2.537415,0.976197,0.028048,0.999574,-0.004110,-0.006976}, 05152 {-1.010388,-2.531838,0.976724,-0.027442,0.999588,0.002041,-0.008125}, 05153 {-0.990392,-2.526423,0.976715,-0.056290,0.998398,0.001162,-0.005625}, 05154 {-0.989306,-2.526726,0.976869,-0.059351,0.998221,0.000320,-0.005661}, 05155 {-0.988068,-2.526833,0.981427,-0.063703,0.997895,0.002038,-0.012009}, 05156 {-0.987489,-2.526563,0.985804,-0.073449,0.997171,-0.003679,-0.015570}, 05157 {-0.984144,-2.524953,0.984858,-0.071556,0.997236,-0.010002,-0.017344}, 05158 {-0.986933,-2.526707,0.988158,-0.075933,0.997079,-0.004444,-0.006946}, 05159 {-0.982650,-2.524833,0.988676,-0.077677,0.996949,-0.001231,-0.007560}, 05160 {-0.981975,-2.524955,0.990235,-0.077920,0.996923,-0.004331,-0.007301}, 05161 {-0.980884,-2.521257,0.991953,-0.079351,0.996689,-0.016710,-0.005972}, 05162 {-0.979558,-2.521293,0.992222,-0.079630,0.996626,-0.019001,-0.005824} 05163 }; 05164 05165 std::vector<tf::Stamped<tf::Pose> > poses; 05166 05167 poses.resize(24); 05168 05169 for (size_t k = 0; k < poses.size(); k ++) 05170 { 05171 tf::Stamped<tf::Pose> act; 05172 act.frame_id_ = "map"; 05173 act.setOrigin(btVector3(pts[k][0],pts[k][1],pts[k][2])); 05174 act.setRotation(btQuaternion(pts[k][3],pts[k][4],pts[k][5],pts[k][6])); 05175 poses[k] = act; 05176 } 05177 05178 //we have our pose vector now: 05179 05180 //check for a base pose 05181 { 05182 tf::Stamped<tf::Pose> result; 05183 std::vector<int> arm; 05184 std::vector<tf::Stamped<tf::Pose> > goal; 05185 05186 for (size_t k = 0; k < poses.size(); k ++) 05187 { 05188 arm.push_back(0); 05189 goal.push_back(poses[k]); 05190 } 05191 05192 RobotArm::findBaseMovement(result, arm, goal, true, false); 05193 } 05194 05195 05196 05197 Gripper::getInstance(0)->open(); 05198 05199 for (int k = 10; k > 0 ; k --) 05200 { 05201 ROS_INFO("K %i", k); 05202 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(poses[k]); 05203 } 05204 05205 Gripper::getInstance(0)->close(); 05206 05207 for (size_t k = 0; k < poses.size() ; k++) 05208 { 05209 ROS_INFO("K %zu", k); 05210 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(poses[k]); 05211 } 05212 05213 Gripper::getInstance(0)->open(); 05214 05215 for (size_t k = poses.size() -1 ; k > 0 ; k --) 05216 { 05217 ROS_INFO("K %zu", k); 05218 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(poses[k]); 05219 } 05220 05221 } 05222 05223 05224 if (atoi(argv[1]) == -644) 05225 { 05226 ROS_INFO("RECORD TRAJECTORY WHILE GRIPPER IS CLOSED."); 05227 ROS_INFO("bin/ias_drawer_executive -642 amountOpenThreshold rate side"); 05228 double gripperOpeningThreshold = atof(argv[2]); 05229 double rate = atof(argv[3]); 05230 ros::Rate rt(rate); 05231 05232 05233 ros::Time start = ros::Time::now(); 05234 bool hit = false; 05235 05236 tf::Stamped<tf::Pose> act = RobotArm::getInstance(atoi(argv[4]))->getToolPose("/map"); 05237 05238 while (ros::ok()) 05239 { 05240 if (Gripper::getInstance(atoi(argv[4]))->getAmountOpen() < gripperOpeningThreshold) 05241 { 05242 if (!hit) 05243 { 05244 hit = true; 05245 start = ros::Time::now(); 05246 printf("std::vector<tf::Stamped<tf::Pose> > poses;\n"); 05247 printf("std::vector<double > timestamps;\n"); 05248 printf("tf::Stamped<tf::Pose> curr; curr.frame_id_ = \"/map\"; \n"); 05249 } 05250 tf::Stamped<tf::Pose> act = RobotArm::getInstance(atoi(argv[4]))->getToolPose("/map"); 05251 printf("curr.setOrigin(btVector3(%f,%f,%f));", act.getOrigin().x(), act.getOrigin().y(), act.getOrigin().z()); 05252 printf("curr.setRotation(btQuaternion(%f,%f,%f,%f));", act.getRotation().x(), act.getRotation().y(), act.getRotation().z(),act.getRotation().w()); 05253 printf("poses.push_back(curr);"); 05254 ros::Duration actTime = ros::Time::now() - start; 05255 printf("timestamps.push_back(%f);\n",actTime.toSec()); 05256 //printPoseSimple(RobotArm::getInstance(atoi(argv[4]))->getToolPose("/map")); 05257 } 05258 rt.sleep(); 05259 } 05260 } 05261 05262 if (atoi(argv[1]) == -645) 05263 { 05264 05265 std::vector<tf::Stamped<tf::Pose> > poses; 05266 std::vector<double > timestamps; 05267 tf::Stamped<tf::Pose> curr; 05268 curr.frame_id_ = "/map"; 05269 curr.setOrigin(btVector3(-0.858909,2.662146,1.069023)); 05270 curr.setRotation(btQuaternion(-0.063184,0.705228,0.700371,-0.090230)); 05271 poses.push_back(curr); 05272 timestamps.push_back(0.010172); 05273 curr.setOrigin(btVector3(-0.858132,2.662023,1.068230)); 05274 curr.setRotation(btQuaternion(-0.061947,0.706447,0.699131,-0.091168)); 05275 poses.push_back(curr); 05276 timestamps.push_back(0.510091); 05277 curr.setOrigin(btVector3(-0.856363,2.663267,1.066434)); 05278 curr.setRotation(btQuaternion(-0.059214,0.709004,0.696730,-0.091511)); 05279 poses.push_back(curr); 05280 timestamps.push_back(1.010011); 05281 curr.setOrigin(btVector3(-0.830527,2.676649,1.066342)); 05282 curr.setRotation(btQuaternion(-0.043343,0.708105,0.701059,-0.072286)); 05283 poses.push_back(curr); 05284 timestamps.push_back(1.510092); 05285 curr.setOrigin(btVector3(-0.727655,2.686956,1.064891)); 05286 curr.setRotation(btQuaternion(-0.053571,0.706820,0.704510,-0.034657)); 05287 poses.push_back(curr); 05288 timestamps.push_back(2.010104); 05289 curr.setOrigin(btVector3(-0.607844,2.665836,1.075091)); 05290 curr.setRotation(btQuaternion(-0.053020,0.709189,0.699932,-0.065840)); 05291 poses.push_back(curr); 05292 timestamps.push_back(2.510075); 05293 curr.setOrigin(btVector3(-0.568007,2.651925,1.071384)); 05294 curr.setRotation(btQuaternion(-0.054405,0.709798,0.699263,-0.065253)); 05295 poses.push_back(curr); 05296 timestamps.push_back(3.010017); 05297 curr.setOrigin(btVector3(-0.568066,2.650177,1.071403)); 05298 curr.setRotation(btQuaternion(-0.091834,0.724687,0.679900,-0.064276)); 05299 poses.push_back(curr); 05300 timestamps.push_back(3.510078); 05301 curr.setOrigin(btVector3(-0.562386,2.652335,1.072278)); 05302 curr.setRotation(btQuaternion(-0.096352,0.716489,0.687963,-0.063779)); 05303 poses.push_back(curr); 05304 timestamps.push_back(4.010068); 05305 curr.setOrigin(btVector3(-0.550039,2.660620,1.069650)); 05306 curr.setRotation(btQuaternion(-0.087717,0.715498,0.691267,-0.050182)); 05307 poses.push_back(curr); 05308 timestamps.push_back(4.510390); 05309 05310 std::vector<int> arms; 05311 for (int k =0; k < poses.size(); k++) 05312 arms.push_back(0); 05313 05314 tf::Stamped<tf::Pose> result; 05315 RobotArm::findBaseMovement(result, arms, poses, true, false); 05316 05317 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(poses[0]); 05318 RobotArm::getInstance(0)->startTrajectory(RobotArm::getInstance(0)->multiPointTrajectory(poses,timestamps)); 05319 05320 } 05321 05322 05323 if (atoi(argv[1]) == -677) 05324 { 05325 fotopourReadyPopcorn_(atof(argv[2]), 1.6, 0.997743, -0.067087, atof(argv[3]), atof(argv[4]),atof(argv[5]) > 0); 05326 } 05327 05328 if (atoi(argv[1]) == -677) 05329 { 05330 salt_it(btVector3(.43, -1.46, .742 + 0.022 + 0.006), 0.129038 + 0.09, -0.702062 - 0.04, -0.655191, 0.75545); 05331 } 05332 05333 05334 05335 if (atoi(argv[1]) == -704) 05336 { 05337 05338 int jump = 0; 05339 05340 switch (atoi(argv[2])) 05341 { 05342 05343 case 0 : //0:15 05344 Current::getPotOut_openDrawer(jump); 05345 05346 case 1 : //0:54 pot on // 1:30 05347 Current::getPotOut_pickPlacePot(jump); 05348 05349 case 2 : 05350 if ((argc > 3) && (atoi(argv[3])==1)) 05351 RobotDriver::moveBase4(-0.346670, 2.307890, 0.757347, 0.653002); 05352 05353 case 3 : 05354 Current::manipulateKnob(1); // 1:54 05355 //Current::manipulateKnob(-1); 05356 05357 case 4 : 05358 Current::openDrawerUnderOven(jump); // 2:23 05359 05360 case 5 : 05361 Current::getLidOut(jump); // 2:45 05362 05363 case 6 : 05364 Current::getBowlOut(jump); // 3:15 05365 05366 case 7 : 05367 Current::closeDrawerUnderOven(jump); // 3:30 05368 05369 case 8 : 05370 if ((argc > 3) && (atoi(argv[3])==1)) 05371 RobotDriver::moveBase4(-0.346670, 2.307890, 0.757347, 0.653002); 05372 case 9 : 05373 Current::pourPopCorn(jump); //3:54 05374 05375 case 10 : 05376 Current::putLidOn(jump); //4:10 05377 //RobotDriver::moveBase4(-0.904410, 2.493494, 0.998334, -0.057692); // for waiting 05378 case 11: 05379 05380 Current::takePotFromIsland(jump); // 6:06 05381 05382 shake_it(); 05383 05384 ROS_ERROR(" SHAKE DONE "); 05385 //putBigBowlOntoIsland_heater(); 05386 05387 case 12: 05388 openFavouriteDrawer(0); 05389 case 13: 05390 getBowlFromDrawer(0); 05391 05392 case 14: 05393 putBigBowlOntoIsland(); 05394 05395 //putBigBowlOntoTable(btVector3(.27, -1.33, .75), 0.129038, -0.702062, -0.655191, 0.755459); 05396 05397 case 15: 05398 05399 closeDrawer(0); 05400 05401 case 16 : 05402 Current::pushPot(jump); // 4:31 05403 05404 case 17 : 05405 if ((argc > 3) && (atoi(argv[3])==1)) 05406 RobotDriver::moveBase4(-0.346670, 2.307890, 0.757347, 0.653002); 05407 Current::manipulateKnob(-1); // 5:13 05408 05409 case 18 : 05410 Current::removeLid(jump); //5:51 05411 05412 case 19 : 05413 Current::takePotFromIsland(jump); // 6:06 05414 05415 case 20 : 05416 //pourReadyPopcornTable(jump); // 6:27 pour 6:50 pot down 05417 Current::pourReadyPopcorn(0); 05418 // 05419 //RobotHead::getInstance()->lookAtThreaded("/map", -1.7, 1.5, 0.899); 05420 05421 //fotopourReadyPopcorn_(-1, 1.6, 0.997743, -0.067087, 0,2.4,false); 05422 05423 case 21 : 05424 05425 returnPotToHeater(); 05426 //returnPotToSink(); 05427 05428 case 22 : 05429 Current::salt(jump); // 6:27 pour 6:50 pot down 05430 05431 //salt_it(btVector3(.43, -1.46, .742 + 0.022 + 0.006), 0.129038 + 0.09, -0.702062 - 0.04, -0.655191, 0.75545); 05432 exit(0); 05433 05434 } 05435 } 05436 05437 05438 05439 05440 05441 return 0; 05442 } 05443 05444 05445 // deviation between odom_combined and map relative to base_link