00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include <ros/ros.h>
00032
00033 #include <iostream>
00034 #include <fstream>
00035 using namespace std;
00036
00037 #include <ias_drawer_executive/Approach.h>
00038 #include <ias_drawer_executive/RobotDriver.h>
00039 #include <ias_drawer_executive/Gripper.h>
00040 #include <ias_drawer_executive/Geometry.h>
00041 #include <ias_drawer_executive/Perception3d.h>
00042 #include <ias_drawer_executive/Pressure.h>
00043 #include <ias_drawer_executive/Poses.h>
00044 #include <ias_drawer_executive/RobotArm.h>
00045 #include <ias_drawer_executive/AverageTF.h>
00046 #include <ias_drawer_executive/Torso.h>
00047 #include <ias_drawer_executive/Head.h>
00048 #include <ias_drawer_executive/OperateHandleController.h>
00049 #include <ias_drawer_executive/yamlWriter.h>
00050
00051 #include <boost/thread.hpp>
00052
00053 #include <actionlib/client/simple_client_goal_state.h>
00054 #include <visualization_msgs/Marker.h>
00055
00056 #include <ias_drawer_executive/DemoScripts.h>
00057
00058 #include <articulation_pr2/ArticulatedObjectAction.h>
00059 #include <actionlib/client/simple_action_client.h>
00060
00061 #include <pcl/ros/conversions.h>
00062
00063 #include <pcl_ros/point_cloud.h>
00064 #include <pcl_ros/transforms.h>
00065
00066 #include <pcl/kdtree/kdtree_flann.h>
00067
00068 #include "rosbag/bag.h"
00069 #include "rosbag/query.h"
00070 #include "rosbag/view.h"
00071 #include <boost/foreach.hpp>
00072 #include <limits>
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 void printPose(const char title[], tf::Stamped<tf::Pose> pose)
00083 {
00084 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()
00085 , pose.getRotation().x(), pose.getRotation().y(), pose.getRotation().z(), pose.getRotation().w(), pose.frame_id_.c_str(), title);
00086 }
00087
00088 void printPose(const char title[], tf::Pose pose)
00089 {
00090 ROS_INFO("%s %f %f %f %f %f %f %f", title, pose.getOrigin().x(), pose.getOrigin().y(), pose.getOrigin().z()
00091 , pose.getRotation().x(), pose.getRotation().y(), pose.getRotation().z(), pose.getRotation().w());
00092 }
00093
00094 pcl::PointCloud<pcl::PointXYZRGB> substractPC(pcl::PointCloud<pcl::PointXYZRGB> clouda, pcl::PointCloud<pcl::PointXYZRGB> cloudb, double distance_threshold = 0.01)
00095 {
00096 pcl::KdTree<pcl::PointXYZRGB>::Ptr tree;
00097 tree.reset (new pcl::KdTreeFLANN<pcl::PointXYZRGB>);
00098
00099 pcl::PointCloud<pcl::PointXYZRGB> inp;
00100 for (size_t k = 0; k < cloudb.points.size(); ++k )
00101 {
00102 if (!isnan(cloudb.points[k].x))
00103 {
00104 inp.points.push_back(cloudb.points[k]);
00105 }
00106 }
00107
00108
00109
00110 tree->setInputCloud (boost::make_shared<pcl::PointCloud<pcl::PointXYZRGB> >(inp));
00111
00112
00113
00114 std::vector<int> nn_indices (1);
00115 std::vector<float> nn_sqr_dists (1);
00116
00117 pcl::PointCloud<pcl::PointXYZRGB> result;
00118 for (size_t k = 0; k < clouda.points.size(); ++k )
00119 {
00120 if (!isnan(clouda.points[k].x))
00121 {
00122 if (tree->radiusSearch (clouda.points[k],fabs(distance_threshold), nn_indices,nn_sqr_dists, 1) != 0)
00123 {
00124
00125
00126
00127
00128 if (distance_threshold < 0)
00129 result.push_back(clouda.points[k]);
00130 }
00131 else
00132 {
00133 if (distance_threshold > 0)
00134 result.push_back(clouda.points[k]);
00135
00136
00137 }
00138 }
00139 }
00140 return result;
00141 }
00142
00143 pcl::KdTree<pcl::PointXYZRGB>::Ptr getTree(pcl::PointCloud<pcl::PointXYZRGB> &cloudb)
00144 {
00145 pcl::KdTree<pcl::PointXYZRGB>::Ptr tree;
00146 tree.reset (new pcl::KdTreeFLANN<pcl::PointXYZRGB>);
00147
00148 tree->setInputCloud (boost::make_shared<pcl::PointCloud<pcl::PointXYZRGB> >(cloudb));
00149 return tree;
00150 }
00151
00152 pcl::PointCloud<pcl::PointXYZRGB> substractPC(pcl::PointCloud<pcl::PointXYZRGB> clouda, pcl::KdTree<pcl::PointXYZRGB>::Ptr &tree, double distance_threshold = 0.01)
00153 {
00154
00155
00156 std::vector<int> nn_indices (1);
00157 std::vector<float> nn_sqr_dists (1);
00158
00159 pcl::PointCloud<pcl::PointXYZRGB> result;
00160 for (size_t k = 0; k < clouda.points.size(); ++k )
00161 {
00162 if (!isnan(clouda.points[k].x))
00163 {
00164 bool found = false;
00165 if ((tree->nearestKSearch (clouda.points[k], 1, nn_indices, nn_sqr_dists) != 0) && (nn_sqr_dists[0] < distance_threshold * distance_threshold))
00166 {
00167 if (distance_threshold < 0)
00168 result.push_back(clouda.points[k]);
00169 }
00170 else
00171 {
00172 if (distance_threshold > 0)
00173 result.push_back(clouda.points[k]);
00174 }
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 }
00189 }
00190 return result;
00191 }
00192
00193 double pointDist(pcl::PointXYZRGB &p, pcl::KdTree<pcl::PointXYZRGB>::Ptr &tree)
00194 {
00195 std::vector<int> nn_indices (1);
00196 std::vector<float> nn_sqr_dists (1);
00197 if (tree->nearestKSearch (p, 1, nn_indices, nn_sqr_dists) < 1)
00198 return 1000;
00199 else
00200 return nn_sqr_dists[0];
00201 }
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374 #include <stdio.h>
00375 #include <ctype.h>
00376
00377 std::string removeWhitespace(const std::string in)
00378 {
00379 std::string ret;
00380 for (int k = 0; k < in.size(); ++k)
00381 {
00382 if (in[k] != ' ')
00383 ret += in[k];
00384 }
00385 return ret;
00386 }
00387
00388 void mangle(const char filename[])
00389 {
00390 ros::NodeHandle node_handle;
00391 ros::Publisher pcm_pub_in = node_handle.advertise<sensor_msgs::PointCloud2>( "/pc_inlier", 10 , true);
00392 ros::Publisher pcm_pub_out = node_handle.advertise<sensor_msgs::PointCloud2>( "/pc_outlier", 10 , true);
00393
00394 ros::Publisher pcm_pub_amap = node_handle.advertise<sensor_msgs::PointCloud2>( "/pc_map", 10 , true);
00395 ros::Publisher pcm_pub_atool = node_handle.advertise<sensor_msgs::PointCloud2>( "/pc_tool", 10 , true);
00396
00397 bool done = false;
00398 int numclouds = 0;
00399
00400 std::vector<pcl::PointCloud<pcl::PointXYZRGB> > pcs;
00401 std::vector<pcl::PointCloud<pcl::PointXYZRGB> > pcs_tool;
00402 std::vector<pcl::PointCloud<pcl::PointXYZRGB> > pcs_map;
00403 std::vector<pcl::PointCloud<pcl::PointXYZRGB> > foreground;
00404 std::vector<pcl::PointCloud<pcl::PointXYZRGB> > filtered_foreground;
00405 std::vector<pcl::PointCloud<pcl::PointXYZRGB> > background;
00406
00407 pcl::PointCloud<pcl::PointXYZRGB> allInMap;
00408 pcl::PointCloud<pcl::PointXYZRGB> allInTool;
00409
00410
00411 std::vector<tf::Stamped<tf::Pose> > fr_cl_to_base;
00412 std::vector<tf::Stamped<tf::Pose> > fr_cl_to_tool;
00413 std::vector<tf::Stamped<tf::Pose> > fr_cl_to_map;
00414 std::vector<tf::Stamped<tf::Pose> > fr_base_to_map;
00415
00416 ROS_INFO("READY");
00417
00418 boost::shared_ptr<const sensor_msgs::PointCloud2> act;
00419
00420 ros::Time lastTime = ros::Time::now();
00421
00422 rosbag::Bag bag;
00423 bag.open(filename, rosbag::bagmode::Read);
00424
00425 std::string base_to_map = "/base_to_map";
00426 std::string cl_to_base = "/cl_to_base";
00427 std::string cl_to_map = "/cl_to_map";
00428 std::string cl_to_tool = "/cl_to_tool";
00429 std::string pc = "/pc";
00430
00431
00432 std::vector<std::string> topics;
00433 topics.push_back(base_to_map);
00434 topics.push_back(cl_to_base);
00435 topics.push_back(cl_to_map);
00436 topics.push_back(cl_to_tool);
00437 topics.push_back(pc);
00438
00439
00440 rosbag::View view(bag);
00441
00442
00443 BOOST_FOREACH(rosbag::MessageInstance const m, view)
00444 {
00445
00446
00447 std::string topicname = removeWhitespace(m.getTopic());
00448
00449
00450 ROS_INFO("topic of msg: %s|", topicname.c_str());
00451
00452 if (topicname == pc || ("/" + m.getTopic() == pc))
00453 {
00454
00455 sensor_msgs::PointCloud2::ConstPtr msg = m.instantiate<sensor_msgs::PointCloud2>();
00456 if (msg != NULL)
00457 {
00458 pcl::PointCloud<pcl::PointXYZRGB> actPC = pcl::PointCloud<pcl::PointXYZRGB>();
00459 pcl::fromROSMsg(*msg,actPC);
00460 pcl::PointCloud<pcl::PointXYZRGB> *actPCclean = new pcl::PointCloud<pcl::PointXYZRGB>();
00461 for (size_t k = 0; k < actPC.points.size(); ++k)
00462 {
00463 if (!isnan(actPC.points[k].x))
00464 actPCclean->push_back(actPC.points[k]);
00465 }
00466 pcs.push_back(*actPCclean);
00467
00468 sensor_msgs::PointCloud2 outliermsg;
00469
00470 pcl::toROSMsg(*actPCclean,outliermsg);
00471
00472 outliermsg.header.frame_id = "/map";
00473 outliermsg.header.stamp = ros::Time::now();
00474
00475 pcm_pub_out.publish(outliermsg);
00476
00477 ROS_INFO("%zu PC Cleaned SIZE %zu", pcs.size(), actPCclean->points.size());
00478 }
00479 }
00480
00481 if (topicname == cl_to_tool || ("/" + m.getTopic() == cl_to_tool))
00482 {
00483
00484
00485 geometry_msgs::PoseStamped::ConstPtr msg = m.instantiate<geometry_msgs::PoseStamped>();
00486 if (msg != NULL)
00487 {
00488 tf::Stamped<tf::Pose> act;
00489 tf::poseStampedMsgToTF(*msg, act);
00490 fr_cl_to_tool.push_back(act);
00491 ROS_INFO("fr_cl_to_tool size %zu", fr_cl_to_tool.size());
00492 }
00493 }
00494
00495 if (topicname == cl_to_base || ("/" + m.getTopic() == cl_to_base))
00496 {
00497
00498
00499 geometry_msgs::PoseStamped::ConstPtr msg = m.instantiate<geometry_msgs::PoseStamped>();
00500 if (msg != NULL)
00501 {
00502 tf::Stamped<tf::Pose> act;
00503 tf::poseStampedMsgToTF(*msg, act);
00504 fr_cl_to_base.push_back(act);
00505 ROS_INFO("cl_to_base size %zu", cl_to_base.size());
00506 }
00507 }
00508
00509 if (topicname == cl_to_map || ("/" + m.getTopic() == cl_to_map))
00510 {
00511
00512
00513 geometry_msgs::PoseStamped::ConstPtr msg = m.instantiate<geometry_msgs::PoseStamped>();
00514 if (msg != NULL)
00515 {
00516 tf::Stamped<tf::Pose> act;
00517 tf::poseStampedMsgToTF(*msg, act);
00518 fr_cl_to_map.push_back(act);
00519 ROS_INFO("cl_to_map size %zu", cl_to_map.size());
00520 }
00521 }
00522
00523 if (topicname == base_to_map || ("/" + m.getTopic() == base_to_map))
00524 {
00525
00526
00527 geometry_msgs::PoseStamped::ConstPtr msg = m.instantiate<geometry_msgs::PoseStamped>();
00528 if (msg != NULL)
00529 {
00530 tf::Stamped<tf::Pose> act;
00531 tf::poseStampedMsgToTF(*msg, act);
00532 fr_base_to_map.push_back(act);
00533 ROS_INFO("base_to_map size %zu", base_to_map.size());
00534 }
00535 }
00536 }
00537
00538 for (size_t k =0; k < pcs.size(); ++k)
00539 {
00540 sensor_msgs::PointCloud2 msg,msg_tool,msg_map;
00541 pcl::toROSMsg(pcs[k],msg);
00542 {
00543 pcl_ros::transformPointCloud("/map",fr_cl_to_base[k],msg,msg_map);
00544 pcl::PointCloud<pcl::PointXYZRGB> *actPC = new pcl::PointCloud<pcl::PointXYZRGB>();
00545 pcl::fromROSMsg(msg_map,*actPC);
00546 pcs_map.push_back(*actPC);
00547 ROS_INFO("pcs_map%zu", pcs_map.size());
00548 }
00549
00550 {
00551 pcl_ros::transformPointCloud("/r_gripper_tool_frame",fr_cl_to_tool[k],msg,msg_tool);
00552 pcl::PointCloud<pcl::PointXYZRGB> *actPC = new pcl::PointCloud<pcl::PointXYZRGB>();
00553 pcl::fromROSMsg(msg_tool,*actPC);
00554 pcs_tool.push_back(*actPC);
00555 ROS_INFO("pcs_tool %zu", pcs_tool.size());
00556 }
00557 }
00558
00559
00560 std::vector<pcl::KdTree<pcl::PointXYZRGB>::Ptr > trees_tool;
00561 trees_tool.resize(pcs_tool.size());
00562 for (size_t k = 0; k < pcs_tool.size(); ++k)
00563 {
00564 trees_tool[k] = getTree(pcs_tool[k]);
00565 }
00566
00567 std::vector<pcl::KdTree<pcl::PointXYZRGB>::Ptr > trees_map;
00568 trees_map.resize(pcs_map.size());
00569 for (size_t k = 0; k < pcs_map.size(); ++k)
00570 {
00571 trees_map[k] = getTree(pcs_map[k]);
00572 }
00573
00574 double threshold = 0.02;
00575 double threshold_squared = threshold * threshold;
00576
00577
00578 for (int k = 0; k < pcs.size(); ++k)
00579 {
00580 foreground.push_back(*(new pcl::PointCloud<pcl::PointXYZRGB>()));
00581 background.push_back(*(new pcl::PointCloud<pcl::PointXYZRGB>()));
00582
00583 double avg_map = 0;
00584 double avg_tool = 0;
00585
00586 for (int i = 0; i < pcs[k].points.size(); i += 1)
00587 {
00588
00589 int numMapHits = 0;
00590 int numToolHits = 0;
00591 pcl::PointXYZRGB inMap = pcs_map[k].points[i];
00592 pcl::PointXYZRGB inTool = pcs_tool[k].points[i];
00593
00594 allInMap.points.push_back(inMap);
00595 allInTool.points.push_back(inTool);
00596
00597
00598 for (int o=0; o<pcs.size(); ++o)
00599 {
00600 if (pointDist(inMap,trees_map[o]) <= threshold_squared)
00601 numMapHits ++;
00602 if (pointDist(inTool,trees_tool[o]) <= threshold_squared)
00603 numToolHits ++;
00604 }
00605
00606 avg_map += numMapHits;
00607 avg_tool += numToolHits;
00608
00609 if ((numToolHits > numMapHits + 2) && (numToolHits > 3))
00610 {
00611 foreground[0].points.push_back(inTool);
00612 }
00613
00614 if ((numToolHits + 2 < numMapHits) && (numMapHits > 3))
00615 {
00616 background[0].points.push_back(inMap);
00617 }
00618
00619
00620 }
00621
00622 ROS_INFO("AVERAGES : map %f tool %f", avg_map / pcs[k].size(), avg_tool / pcs[k].size());
00623
00624 ROS_INFO("foreground size : %zu", foreground[0].points.size());
00625
00626 {
00627 sensor_msgs::PointCloud2 outliermsg;
00628
00629 pcl::toROSMsg(foreground[0],outliermsg);
00630
00631 outliermsg.header.frame_id = "/map";
00632 outliermsg.header.stamp = ros::Time::now();
00633
00634 btTransform to_map = fr_cl_to_map[0] * fr_cl_to_tool[0].inverse();
00635 sensor_msgs::PointCloud2 pctm;
00636 outliermsg.header.frame_id = "/tmp";
00637 pcl_ros::transformPointCloud("/map",to_map ,outliermsg,pctm);
00638 pctm.header.stamp = ros::Time::now();
00639 pcm_pub_in.publish(pctm);
00640 }
00641 {
00642 sensor_msgs::PointCloud2 outliermsg;
00643
00644 pcl::toROSMsg(background[0],outliermsg);
00645
00646 outliermsg.header.frame_id = "/map";
00647 outliermsg.header.stamp = ros::Time::now();
00648
00649 pcm_pub_out.publish(outliermsg);
00650 }
00651
00652
00653 std::ostringstream filename;
00654 filename << k;
00655
00656 pcl::io::savePCDFile(std::string("allTool" + filename.str() + ".PCD"), allInTool, true);
00657 pcl::io::savePCDFile(std::string("allMap" + filename.str() + ".PCD"), allInMap, true);
00658
00659 pcl::io::savePCDFile(std::string("background" + filename.str() + ".PCD"), background[0], true);
00660 pcl::io::savePCDFile(std::string("foreground" + filename.str() + ".PCD"), foreground[0], true);
00661
00662 ROS_INFO("saved");
00663
00664 }
00665
00666 ROS_INFO("DONE DONE DONE DONE DONE DONE DONE DONE DONE DONE DONE DONE DONE DONE DONE DONE DONE DONE ");
00667
00668 while (ros::ok())
00669 {
00670 ros::Duration(1.0).sleep();
00671 {
00672 sensor_msgs::PointCloud2 outliermsg;
00673
00674 pcl::toROSMsg(foreground[0],outliermsg);
00675
00676 outliermsg.header.frame_id = "/map";
00677 outliermsg.header.stamp = ros::Time::now();
00678
00679 btTransform to_map = fr_cl_to_map[0] * fr_cl_to_tool[0].inverse();
00680 sensor_msgs::PointCloud2 pctm;
00681 outliermsg.header.frame_id = "/tmp";
00682 pcl_ros::transformPointCloud("/map",to_map ,outliermsg,pctm);
00683 pctm.header.stamp = ros::Time::now();
00684 pcm_pub_in.publish(pctm);
00685 }
00686 {
00687 sensor_msgs::PointCloud2 outliermsg;
00688
00689 pcl::toROSMsg(background[0],outliermsg);
00690
00691 outliermsg.header.frame_id = "/map";
00692 outliermsg.header.stamp = ros::Time::now();
00693
00694 pcm_pub_out.publish(outliermsg);
00695 }
00696
00697 if (0)
00698 {
00699 sensor_msgs::PointCloud2 outliermsg;
00700
00701 pcl::toROSMsg(allInMap,outliermsg);
00702
00703 outliermsg.header.frame_id = "/map";
00704 outliermsg.header.stamp = ros::Time::now();
00705
00706 pcm_pub_amap.publish(outliermsg);
00707 }
00708
00709 if (0)
00710 {
00711 sensor_msgs::PointCloud2 outliermsg;
00712
00713 pcl::toROSMsg(allInTool,outliermsg);
00714
00715 outliermsg.header.frame_id = "/map";
00716 outliermsg.header.stamp = ros::Time::now();
00717
00718 btTransform to_map = fr_cl_to_map[0] * fr_cl_to_tool[0].inverse();
00719 sensor_msgs::PointCloud2 pctm;
00720 outliermsg.header.frame_id = "/tmp";
00721 pcl_ros::transformPointCloud("/map",to_map ,outliermsg,pctm);
00722 pctm.header.stamp = ros::Time::now();
00723 pcm_pub_atool.publish(pctm);
00724 }
00725 }
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853 }
00854
00855 typedef actionlib::SimpleActionClient<articulation_pr2::ArticulatedObjectAction> Client;
00856
00857 double reachable_distance(tf::Stamped<tf::Pose> secondlast, tf::Stamped<tf::Pose> last)
00858 {
00859
00860 btTransform t[1000];
00861
00862 t[0].setOrigin(secondlast.getOrigin());
00863 t[0].setRotation(secondlast.getRotation());
00864 t[1].setOrigin(last.getOrigin());
00865 t[1].setRotation(last.getRotation());
00866
00867 ROS_INFO("START");
00868 bool reachable = true;
00869
00870 double distance = 0;
00871
00872 for (int k = 2; reachable && (k < 1000); ++k)
00873 {
00874 t[k] = t[k-1] * (t[0].inverseTimes(t[1]));
00875 tf::Stamped<tf::Pose> act;
00876 act.frame_id_ = last.frame_id_;
00877 act.setOrigin(t[k].getOrigin());
00878 act.setRotation(t[k].getRotation());
00879
00880
00881 geometry_msgs::PoseStamped pose;
00882 double start_angles[7];
00883 double solution[7];
00884 tf::poseStampedTFToMsg(RobotArm::getInstance(0)->tool2wrist(act),pose);
00885 reachable &= RobotArm::getInstance(0)->run_ik(pose,start_angles,solution,"r_wrist_roll_link");
00886 if (reachable)
00887 distance += (t[k].getOrigin() - t[k-1].getOrigin()).length();
00888
00889 }
00890 return distance;
00891 }
00892
00893 void calc_better_base_pose(articulation_pr2::ArticulatedObjectResultConstPtr result, double desired_length)
00894 {
00895 if (result->posterior_model.track.pose_resampled.size() < 2)
00896 {
00897 ROS_ERROR("too few points (%i) in the trajectory to interpolate it", (int)result->posterior_model.track.pose_resampled.size());
00898 return;
00899 }
00900
00901 double trajectory_length = 0;
00902 geometry_msgs::Pose act = result->posterior_model.track.pose_resampled[0];
00903 tf::Pose lastTF;
00904 tf::poseMsgToTF(act,lastTF);
00905
00906 for (int pos_i = 0; pos_i < result->posterior_model.track.pose_resampled.size(); ++pos_i)
00907 {
00908 geometry_msgs::Pose act = result->posterior_model.track.pose_resampled[pos_i];
00909 ROS_INFO("%f %f %f %f %f %f %f", act.position.x, act.position.y, act.position.z,
00910 act.orientation.x, act.orientation.y, act.orientation.z, act.orientation.w);
00911 tf::Pose actTF;
00912 tf::poseMsgToTF(act,actTF);
00913 trajectory_length += (actTF.getOrigin() - lastTF.getOrigin()).length();
00914 lastTF = actTF;
00915 }
00916 ROS_INFO("TRAJECTORY LENGTH: %f", trajectory_length);
00917
00918
00919 tf::Pose tmpPose;
00920 tf::Stamped<tf::Pose> secondlast;
00921 tf::poseMsgToTF(result->posterior_model.track.pose_resampled[result->posterior_model.track.pose_resampled.size() - 2],tmpPose);
00922 secondlast.setOrigin(tmpPose.getOrigin());
00923 secondlast.setRotation(tmpPose.getRotation());
00924 secondlast.frame_id_ = result->posterior_model.track.header.frame_id;
00925
00926 tf::Stamped<tf::Pose> last;
00927 tf::poseMsgToTF(result->posterior_model.track.pose_resampled[result->posterior_model.track.pose_resampled.size() - 1],tmpPose);
00928 last.setOrigin(tmpPose.getOrigin());
00929 last.setRotation(tmpPose.getRotation());
00930 last.frame_id_ = result->posterior_model.track.header.frame_id;
00931
00932 double dist = reachable_distance(secondlast,last);
00933
00934 ROS_INFO("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
00935 ROS_INFO("FURTHER REACHABLE DIST : %f", dist);
00936 ROS_INFO("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
00937
00938
00939 std::vector<int> arm;
00940 std::vector<tf::Stamped<tf::Pose> > goal;
00941 if (trajectory_length < desired_length)
00942 {
00943
00944 double covered_length = 0;
00945 geometry_msgs::Pose act = result->posterior_model.track.pose_resampled[0];
00946 tf::Pose lastTF;
00947 tf::poseMsgToTF(act,lastTF);
00948
00949 for (int pos_i = 0; pos_i < result->posterior_model.track.pose_resampled.size(); ++pos_i)
00950 {
00951 geometry_msgs::Pose act = result->posterior_model.track.pose_resampled[pos_i];
00952 ROS_INFO("%f %f %f %f %f %f %f", act.position.x, act.position.y, act.position.z,
00953 act.orientation.x, act.orientation.y, act.orientation.z, act.orientation.w);
00954 tf::Pose actTF;
00955 tf::poseMsgToTF(act,actTF);
00956
00957 tf::Stamped<tf::Pose> ps;
00958 ps.frame_id_ = result->posterior_model.track.header.frame_id;
00959 ps.setOrigin(actTF.getOrigin());
00960 ps.setRotation(actTF.getRotation());
00961 arm.push_back(0);
00962 goal.push_back(ps);
00963
00964 covered_length += (actTF.getOrigin() - lastTF.getOrigin()).length();
00965
00966 lastTF = actTF;
00967 }
00968 btTransform t[1000];
00969
00970 t[0].setOrigin(secondlast.getOrigin());
00971 t[0].setRotation(secondlast.getRotation());
00972 t[1].setOrigin(last.getOrigin());
00973 t[1].setRotation(last.getRotation());
00974
00975 for (int k = 2; (covered_length < desired_length) && (k < 1000); ++k)
00976 {
00977 t[k] = t[k-1] * (t[0].inverseTimes(t[1]));
00978 tf::Stamped<tf::Pose> act;
00979 act.frame_id_ = last.frame_id_;
00980 act.setOrigin(t[k].getOrigin());
00981 act.setRotation(t[k].getRotation());
00982 covered_length += (t[k].getOrigin() - t[k-1].getOrigin()).length();
00983 arm.push_back(0);
00984 goal.push_back(act);
00985 }
00986 tf::Stamped<tf::Pose> betterBasePose;
00987 RobotArm::findBaseMovement(betterBasePose, arm, goal, false, false);
00988
00989 ROS_ERROR("<base> BETTER BASE POSE: bin/ias_drawer_executive -4 %f %f %f %f", betterBasePose.getOrigin().x(), betterBasePose.getOrigin().y(), betterBasePose.getRotation().z(), betterBasePose.getRotation().w());
00990 betterBasePose = Geometry::getPoseIn("map", betterBasePose);
00991 ROS_WARN("<map> BETTER BASE POSE: bin/ias_drawer_executive -4 %f %f %f %f", betterBasePose.getOrigin().x(), betterBasePose.getOrigin().y(), betterBasePose.getRotation().z(), betterBasePose.getRotation().w());
00992 }
00993
00994 }
00995
00996
00997 int articulate(const string & filename, double desired_length,
00998 const string & kinect_rgb_optical_frame = "/openni_rgb_optical_frame", const string & arm = "r",
00999 const string & kinect_cloud_topic = "/kinect/cloud_throttled", bool model = true)
01000 {
01001
01002 ROS_INFO("ARTICULATE %s %f %s %s %s", filename.c_str(), desired_length, kinect_rgb_optical_frame.c_str(), arm.c_str(), kinect_cloud_topic.c_str());
01003
01004 ros::NodeHandle node_handle;
01005
01006 ros::Publisher pct_pub = node_handle.advertise<sensor_msgs::PointCloud2>( "/pc", 10 , true);
01007
01008 Client client(arm + "_articulate_object", true);
01009 client.waitForServer();
01010 {
01011 articulation_pr2::ArticulatedObjectGoal goal;
01012 goal.timeout = ros::Duration(20.00);
01013 goal.initial_pulling_direction.header.frame_id = "torso_lift_link";
01014 goal.initial_pulling_direction.vector.x = -1;
01015 goal.desired_velocity = 0.04;
01016
01017
01018 client.sendGoal(goal);
01019 client.waitForResult(ros::Duration(5.0));
01020 while (client.getState() != actionlib::SimpleClientGoalState::SUCCEEDED)
01021 {
01022
01023 printf("Current State: %s\n", client.getState().toString().c_str());
01024 if (client.getState() == actionlib::SimpleClientGoalState::ABORTED)
01025 {
01026 ROS_ERROR("SLIPPED OFF OF HANDLE ?");
01027 return -1;
01028 }
01029 ros::Duration(0.5).sleep();
01030 }
01031
01032 articulation_pr2::ArticulatedObjectResultConstPtr result = client.getResult();
01033
01034 {
01035 rosbag::Bag bag;
01036 bag.open(filename, rosbag::bagmode::Write);
01037
01038 bag.write("articulation_result", ros::Time::now(), result);
01039
01040 bag.close();
01041 }
01042
01043 ROS_INFO("FRAME of articulation model : %s", result->posterior_model.track.header.frame_id.c_str());
01044
01045
01046 tf::Stamped<tf::Pose> lastPose;
01047 lastPose.setOrigin(btVector3(0,0,10000));
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061 calc_better_base_pose(result,desired_length);
01062
01063 if (!model)
01064 return 0;
01065
01066
01067 rosbag::Bag cloudbag;
01068 cloudbag.open(filename + "_clouds", rosbag::bagmode::Write);
01069
01071 tf::Pose middle;
01072 tf::poseMsgToTF(result->posterior_model.track.pose_resampled[result->posterior_model.track.pose_resampled.size() / 2], middle);
01073 RobotHead::getInstance()->lookAtThreaded(result->posterior_model.track.header.frame_id.c_str(),middle.getOrigin().x(),middle.getOrigin().y(),middle.getOrigin().z());
01074
01075 std::vector<tf::Stamped<tf::Pose> > opening_trajectory;
01076 for (int pos_i = 0; pos_i < result->posterior_model.track.pose_resampled.size() - 1; ++pos_i)
01077 {
01078 geometry_msgs::Pose act = result->posterior_model.track.pose_resampled[pos_i];
01079
01080
01081 tf::Pose actTF;
01082 tf::poseMsgToTF(act,actTF);
01083 tf::Stamped<tf::Pose> actSTF;
01084 actSTF.setOrigin(actTF.getOrigin());
01085 actSTF.setRotation(actTF.getRotation());
01086 actSTF.frame_id_ = result->posterior_model.track.header.frame_id.c_str();
01087 if (pos_i == 0)
01088 {
01089 if (arm == "r")
01090 Gripper::getInstance(0)->open();
01091 else
01092 Gripper::getInstance(1)->open();
01093 }
01094
01095
01096 bool reachable = RobotArm::getInstance(arm == "r" ? 0 : 1)->reachable(actSTF);
01097
01098
01099
01100 btTransform relative = lastPose.inverseTimes(actSTF);
01101 btVector3 axis = relative.getRotation().getAxis();
01102
01103
01104
01105 if ((RobotArm::getInstance(arm == "r" ? 0 : 1)->reachable(actSTF)) &&
01106 (((actSTF.getOrigin() - lastPose.getOrigin()).length() >= 0.05)))
01107 {
01108
01109
01110
01111
01112 opening_trajectory.push_back (actSTF);
01113 if (arm == "r")
01114 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(actSTF);
01115 else
01116 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(actSTF);
01117 lastPose = actSTF;
01118
01119
01120 {
01121
01122 tf::Stamped<tf::Pose> cam = Geometry::getPose("/map", kinect_rgb_optical_frame.c_str());
01123 tf::Stamped<tf::Pose> grip = Geometry::getPose("map",("/" + arm + "_gripper_tool_frame").c_str());
01124
01125 geometry_msgs::PoseStamped camPS;
01126 tf::poseStampedTFToMsg(cam,camPS);
01127
01128 geometry_msgs::PoseStamped gripPS;
01129 tf::poseStampedTFToMsg(grip,gripPS);
01130
01131 sensor_msgs::PointCloud2 pc = *(ros::topic::waitForMessage<sensor_msgs::PointCloud2>(kinect_cloud_topic));
01132
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147
01148
01149
01150 pct_pub.publish(pc);
01151
01152 cloudbag.write("/pc", pc.header.stamp, pc);
01153
01154 {
01155 tf::Stamped<tf::Pose> cl_to_tool = Geometry::getPose(("/" + arm + "_gripper_tool_frame").c_str(), kinect_rgb_optical_frame.c_str());
01156
01157 cl_to_tool = Geometry::getPoseIn(kinect_rgb_optical_frame.c_str(), actSTF);
01158 btTransform trans = cl_to_tool;
01159 trans = trans.inverse();
01160 cl_to_tool.setOrigin(trans.getOrigin());
01161 cl_to_tool.setRotation(trans.getRotation());
01162 cl_to_tool.frame_id_ = ("/" + arm + "_gripper_tool_frame").c_str();
01163
01164 geometry_msgs::PoseStamped cl_to_tool_msg;
01165 tf::poseStampedTFToMsg(cl_to_tool,cl_to_tool_msg);
01166 cloudbag.write("/cl_to_tool", pc.header.stamp, cl_to_tool_msg);
01167 }
01168
01169 {
01170 tf::Stamped<tf::Pose> cl_to_base = Geometry::getPose("/base_link", kinect_rgb_optical_frame.c_str());
01171 geometry_msgs::PoseStamped cl_to_base_msg;
01172 tf::poseStampedTFToMsg(cl_to_base,cl_to_base_msg);
01173 cloudbag.write("/cl_to_base", pc.header.stamp, cl_to_base_msg);
01174 }
01175
01176 {
01177 tf::Stamped<tf::Pose> cl_to_map = Geometry::getPose("/map", kinect_rgb_optical_frame.c_str());
01178 geometry_msgs::PoseStamped cl_to_map_msg;
01179 tf::poseStampedTFToMsg(cl_to_map,cl_to_map_msg);
01180 cloudbag.write("/cl_to_map", pc.header.stamp, cl_to_map_msg);
01181 }
01182
01183 {
01184 tf::Stamped<tf::Pose> base_to_map = Geometry::getPose("/map", "/base_link");
01185 geometry_msgs::PoseStamped base_to_map_msg;
01186 tf::poseStampedTFToMsg(base_to_map,base_to_map_msg);
01187 cloudbag.write("/base_to_map", pc.header.stamp, base_to_map_msg);
01188 }
01189
01190
01191
01192
01193
01194
01195
01196
01197 }
01198
01199 }
01200
01201 if (pos_i == 0)
01202 {
01203 if (arm == "r")
01204 Gripper::getInstance(0)->close();
01205 else
01206 Gripper::getInstance(1)->close();
01207 }
01208 }
01209
01210 cloudbag.close();
01211
01212 for (int pos_i = result->posterior_model.track.pose_resampled.size() - 2; pos_i >= 0 ; --pos_i)
01213 {
01214 geometry_msgs::Pose act = result->posterior_model.track.pose_resampled[pos_i];
01215
01216
01217 tf::Pose actTF;
01218 tf::poseMsgToTF(act,actTF);
01219 tf::Stamped<tf::Pose> actSTF;
01220 actSTF.setOrigin(actTF.getOrigin());
01221 actSTF.setRotation(actTF.getRotation());
01222 actSTF.frame_id_ = result->posterior_model.track.header.frame_id.c_str();
01223
01224 if ((RobotArm::getInstance(arm == "r" ? 0 : 1)->reachable(actSTF)) &&
01225 (((actSTF.getOrigin() - lastPose.getOrigin()).length() >= 0.10) || (pos_i == result->posterior_model.track.pose_resampled.size() - 1)))
01226 {
01227 if (arm == "r")
01228 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(actSTF);
01229 else
01230 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(actSTF);
01231 lastPose = actSTF;
01232 }
01233
01234 if (pos_i == 0)
01235 {
01236 if (arm == "r")
01237 Gripper::getInstance(0)->open();
01238 else
01239 Gripper::getInstance(1)->open();
01240 }
01241 }
01242
01243
01244 for (uint ot_point = 0; ot_point < opening_trajectory.size(); ot_point++)
01245 printPose("OPENING TRaJECT0RY: ", opening_trajectory[ot_point]);
01246 yamlWriter trajectory_writer;
01247 trajectory_writer.writeTrajectory (std::string(filename) + ".yaml", opening_trajectory);
01248 std::cerr << "Trajectory written to: " << std::string(filename) + ".yaml" << std::endl;
01249
01250 printf("Yay! The dishes are now clean");
01251 }
01252 if (0)
01253 {
01254 articulation_pr2::ArticulatedObjectGoal goal;
01255 goal.timeout = ros::Duration(20.00);
01256 goal.initial_pulling_direction.header.frame_id = "torso_lift_link";
01257 goal.initial_pulling_direction.vector.x = 1;
01258 goal.desired_velocity = 0.04;
01259
01260
01261 client.sendGoal(goal);
01262 client.waitForResult(ros::Duration(5.0));
01263 while (client.getState() != actionlib::SimpleClientGoalState::SUCCEEDED)
01264 {
01265
01266 printf("Current State: %s\n", client.getState().toString().c_str());
01267 ros::Duration(0.5).sleep();
01268 }
01269 printf("Yay! The dishes are now clean");
01270 }
01271
01272 return 0;
01273 }
01274
01275 tf::Stamped<tf::Pose> toPose(double x, double y, double z, double ox, double oy, double oz, double ow, const char fixed_frame[])
01276 {
01277 tf::Stamped<tf::Pose> p0;
01278 p0.frame_id_=fixed_frame;
01279 p0.stamp_=ros::Time();
01280 p0.setOrigin(btVector3(x,y,z));
01281 p0.setRotation(btQuaternion(ox,oy,oz,ow));
01282 return p0;
01283 }
01284
01285 tf::Stamped<tf::Pose> toPose(const char text[], const char fixed_frame[])
01286 {
01287 double x,y,z, ox,oy,oz,ow;
01288 sscanf(text,"%f %f %f %f %f %f %f", &x, &y, &z, &ox, &oy, &oz, &ow);
01289 return toPose(x,y,z, ox,oy,oz,ow,fixed_frame);
01290 }
01291
01292 void copyState(double *src, double *tar, int num = 7)
01293 {
01294 for (int i = 0; i < 7 ; ++i)
01295 tar[i] = src[i];
01296 }
01297
01298 void addState(double *a, double *b, double *tar, int num = 7)
01299 {
01300 for (int i = 0; i < 7 ; ++i)
01301 tar[i] = a[i] + b[i];
01302 }
01303
01304 void addStateDiscounted(double *a, double *b, double discount, double *tar, int num = 7)
01305 {
01306 for (int i = 0; i < 7 ; ++i)
01307 tar[i] = a[i] + (b[i] * discount);
01308 }
01309
01310
01311
01312 void cart_err_monit(int side)
01313 {
01314 RobotArm::RobotArm *arm = RobotArm::getInstance(side);
01315 ros::Rate rate(5);
01316 while (ros::ok())
01317 {
01318 ros::spinOnce();
01319 rate.sleep();
01320 btVector3 err = arm->cartError();
01321 ROS_INFO("CARTESIAN ERROR :D %f x %f y %f z %f", err.length(), err.x(), err.y(), err.z());
01322 }
01323 }
01324
01325
01326
01327 void findBothArms(tf::Stamped<tf::Pose> leftArm, tf::Stamped<tf::Pose> rightArm)
01328 {
01329
01330 std::vector<int> arm;
01331 std::vector<tf::Stamped<tf::Pose> > goal;
01332 tf::Stamped<tf::Pose> result;
01333
01334 arm.push_back(1);
01335 goal.push_back(leftArm);
01336 arm.push_back(0);
01337 goal.push_back(rightArm);
01338
01339 RobotArm::findBaseMovement(result, arm, goal,false, false);
01340 }
01341
01342
01343 ros::NodeHandle *node_handle_ = 0;
01344 bool have_vis_pub = false;
01345 ros::Publisher vis_pub_;
01346
01347 void pubPose(tf::Stamped<tf::Pose> &t)
01348 {
01349
01350 if (!have_vis_pub)
01351 {
01352 vis_pub_ = node_handle_->advertise<geometry_msgs::PoseStamped>( "/cart_poses", 100, true );
01353 have_vis_pub = true;
01354 }
01355
01356 geometry_msgs::PoseStamped pose;
01357 pose.header.frame_id = t.frame_id_;
01358 pose.header.stamp = ros::Time::now();
01359 pose.pose.orientation.x = t.getRotation().x();
01360 pose.pose.orientation.y = t.getRotation().y();
01361 pose.pose.orientation.z = t.getRotation().z();
01362 pose.pose.orientation.w = t.getRotation().w();
01363 pose.pose.position.x = t.getOrigin().x();
01364 pose.pose.position.y = t.getOrigin().y();
01365 pose.pose.position.z = t.getOrigin().z();
01366
01367
01368 vis_pub_.publish( pose );
01369
01370
01371 for (int k = 0; k < 10; ++k)
01372 {
01373 ros::spinOnce();
01374 ros::Duration(0.01).sleep();
01375 }
01376 }
01377
01378 void pubPose(tf::Stamped<tf::Pose> &t, ros::Publisher vis_pub)
01379 {
01380 geometry_msgs::PoseStamped pose;
01381 pose.header.frame_id = t.frame_id_;
01382 pose.header.stamp = ros::Time::now();
01383 pose.pose.orientation.x = t.getRotation().x();
01384 pose.pose.orientation.y = t.getRotation().y();
01385 pose.pose.orientation.z = t.getRotation().z();
01386 pose.pose.orientation.w = t.getRotation().w();
01387 pose.pose.position.x = t.getOrigin().x();
01388 pose.pose.position.y = t.getOrigin().y();
01389 pose.pose.position.z = t.getOrigin().z();
01390
01391
01392 vis_pub.publish( pose );
01393
01394 ROS_INFO("Published Pose");
01395
01396 ros::spinOnce();
01397 }
01398
01399
01400 tf::Stamped<tf::Pose> turnToSide(int side,tf::Stamped<tf::Pose> toolPose, tf::Stamped<tf::Pose> bowlPose)
01401 {
01402 toolPose = Geometry::getPoseIn("/base_link", toolPose);
01403 bowlPose = Geometry::getPoseIn("/base_link", bowlPose);
01404
01405 RobotArm *arm = RobotArm::getInstance(side);
01406
01407 tf::Stamped<tf::Pose> bestPose = toolPose;
01408 tf::Stamped<tf::Pose> worstPose = toolPose;
01409 double bestX = -100;
01410 double bestAngle = 0;
01411 double worstX = 100;
01412
01413 for (double angle = -M_PI; (angle < 2 * M_PI) && (ros::ok()); angle += M_PI / 10.0)
01414 {
01415 btTransform curr;
01416 curr.setOrigin(toolPose.getOrigin());
01417 curr.setRotation(toolPose.getRotation());
01418
01419 bowlPose.setRotation(btQuaternion(0,0,0,1));
01420
01421 tf::Stamped<tf::Pose> act = Geometry::rotateAroundPose(toolPose, bowlPose, 0,0, angle);
01422
01423 tf::Stamped<tf::Pose> actInBase = Geometry::getPoseIn("/base_link", act);
01424 double actx = actInBase.getOrigin().y() * (side ? 1 : -1);
01425 if (actx > bestX)
01426 {
01427 bestX = actx;
01428 bestPose = act;
01429 bestAngle = angle;
01430 }
01431 else if (actx < worstX)
01432 {
01433 worstX = actx;
01434 worstPose = act;
01435 }
01436 }
01437
01438 return bestPose;
01439 }
01440
01441
01442
01443 tf::Stamped<tf::Pose> turnBowlStraight(int currside, tf::Stamped<tf::Pose> &bowlPose)
01444 {
01445
01446 RobotHead::getInstance()->lookAt("/base_link",1,0,0.5);
01447
01448 RobotArm *arm = RobotArm::getInstance(currside);
01449
01450 bowlPose = OperateHandleController::getBowlPose();
01451 bowlPose = Geometry::getPoseIn("/base_link", bowlPose);
01452 pubPose(bowlPose);
01453 printPose("Bowl Pose vision", bowlPose);
01454
01455 tf::Stamped<tf::Pose> bowlInBase = Geometry::getPoseIn("/base_link", bowlPose);
01456
01457
01458 tf::Stamped<tf::Pose> bowlCorrected = bowlPose;
01459 bowlCorrected.setRotation(bowlInBase.getRotation().inverse() * bowlPose.getRotation());
01460
01461 pubPose(bowlCorrected);
01462 pubPose(bowlCorrected);
01463 pubPose(bowlCorrected);
01464 printPose("Bowl Pose corrected", bowlCorrected);
01465
01466 tf::Stamped<tf::Pose> newToolPose = arm->getToolPose("/base_link");
01467 printPose("Tool Pose", newToolPose);
01468 btQuaternion cor = bowlInBase.getRotation().inverse();
01469
01470 printPose("Bowl Pose", bowlInBase);
01471 tf::Stamped<tf::Pose> actt = Geometry::rotateAroundPose(newToolPose, bowlInBase, cor);
01472 printPose("act Pose", actt);
01473
01474
01475
01476 printPose("nt Pose (rot)", newToolPose);
01477
01478
01479
01480 return actt;
01481 }
01482
01483 void releaseWhenPulled(int side)
01484 {
01485
01486 RobotArm *arm = RobotArm::getInstance(side);
01487 Gripper *grip = Gripper::getInstance(side);
01488 ros::Rate rate(5);
01489 double threshold = 0;
01490 double numtaken = 0;
01491 while (ros::ok())
01492 {
01493 ros::spinOnce();
01494 rate.sleep();
01495 btVector3 err = arm->cartError();
01496 ROS_INFO("CARTESIAN ERROR :D %f x %f y %f z %f", err.length(), err.x(), err.y(), err.z());
01497
01498 threshold += err.length();
01499 numtaken += 1;
01500
01501 ROS_INFO("CARTESIAN ERROR :D %f (%f) x %f y %f z %f", err.length(), threshold / numtaken, err.x(), err.y(), err.z());
01502
01503 if ((numtaken > 5) && (err.length() > (threshold / numtaken) * 3.0))
01504 {
01505 boost::thread t1(&Gripper::open, grip, 0.09);
01506 tf::Stamped<tf::Pose> toolPose = arm->getToolPose("/map");
01507 toolPose.setOrigin(toolPose.getOrigin() + btVector3(0,0,0.05));
01508 arm->universal_move_toolframe_ik_pose(toolPose);
01509 return;
01510 }
01511
01512 }
01513 }
01514
01515 int current(int argc, char** argv);
01516
01517 int measures(int argc, char** argv);
01518
01519 int main(int argc, char** argv)
01520 {
01521
01522
01523
01524
01525 ros::init(argc, argv, "ias_drawer_executive");
01526
01527 printf("ias_drawer_executive %i\n", argc);
01528 printf("usage: ias_drawer_executive <drawer_position> <drawer_height> [<drawer_position> <drawer_height> .. <drawer_position> <drawer_height>] \n");
01529 printf("drawer_position:-1 .. dont move base \n");
01530 printf(" 0 .. island left \n");
01531 printf(" 1 .. island middle \n");
01532 printf(" 2 .. island right \n");
01533 printf(" 3 .. under oven \n");
01534 printf(" 4 .. left of dishwasher \n");
01535 printf(" 5 .. dishwasher \n");
01536 printf(" 6 .. right of dishwasher \n");
01537 printf(" 7 .. right of oven \n");
01538 printf(" 8 .. fridge \n");
01539 printf("drawer_height:-1 .. dont grasp/open drawer\n");
01540 printf(" 0 .. low (~34cm) \n");
01541 printf(" 1 .. middle (~64cm) \n");
01542 printf(" 2 .. high (~78cm) \n");
01543 printf(" 3 .. higher (~97cm) \n\n");
01544
01545 ros::NodeHandle node_handle;
01546 node_handle_ = &node_handle;
01547
01548 ROS_INFO("argc %i", argc);
01549 for (int i = 0; i < argc; i ++)
01550 {
01551 ROS_INFO("i %i, %s", i, argv[i]);
01552 }
01553
01554 current(argc, argv);
01555 measures(argc, argv);
01556
01557
01558
01559
01560
01561
01562
01563
01564
01565
01566
01567
01568
01569
01570
01571
01572
01573 if ((argc > 1) && (atoi(argv[1]) > -2) )
01574 for (int i = 0; i < (argc - 1) / 2 ; ++i)
01575 {
01576 if (argc >= (i * 2 + 3))
01577 {
01578 if (atoi(argv[i* 2 + 1]) >= 0)
01579 {
01580 Torso *torso = Torso::getInstance();
01581
01582
01583
01584
01585
01586 boost::thread t((atoi(argv[i* 2 + 1])==8) ? &Torso::up : &Torso::down, torso);
01587 ROS_INFO("TARGET POSE IN MAP %f %f %f %f",Poses::poses[atoi(argv[i* 2 + 1])][0],Poses::poses[atoi(argv[i* 2 + 1])][1],Poses::poses[atoi(argv[i* 2 + 1])][2],Poses::poses[atoi(argv[i* 2 + 1])][3]);
01588 RobotDriver::getInstance()->moveBase(Poses::poses[atoi(argv[i* 2 + 1])]);
01589 t.join();
01590 }
01591 if (atoi(argv[i* 2 + 2]) >= 0)
01592 {
01593 tf::Stamped<tf::Pose> aM = OperateHandleController::getHandlePoseFromMarker(0,atoi(argv[i* 2 + 2]));
01594 OperateHandleController::operateHandle(0,aM);
01595 }
01596 }
01597 }
01598
01600 if (atoi(argv[1]) == -4)
01601 {
01602
01603 RobotArm::getInstance(0)->tucked = true;
01604 for (int i = 0; i < (argc - 1 ) / 4; ++i)
01605 {
01606 double p[4];
01607 p[0] = atof(argv[2 + i * 4]);
01608 p[1] = atof(argv[3 + i * 4]);
01609 p[2] = atof(argv[4 + i * 4]);
01610 p[3] = atof(argv[5 + i * 4]);
01611 ROS_INFO("going to %f %f %f %f", p[0], p[1], p[2], p[3]);
01612 RobotDriver::getInstance()->moveBase(p);
01613 }
01614 }
01615
01616 if (atoi(argv[1]) == -45)
01617 {
01618
01619
01620
01621
01622
01623
01624
01625
01626
01627
01628
01629
01630
01631
01632
01633
01634
01635
01636
01637
01638
01639
01640
01641 RobotArm::getInstance(atoi(argv[2]))->rotate_toolframe_ik(atof(argv[3]),atof(argv[4]),atof(argv[5]));
01642 }
01643
01644 if (atoi(argv[1]) == -5)
01645 {
01646
01647 Gripper *gripper = Gripper::getInstance(0);
01648 gripper->open();
01649 Pressure::getInstance()->reset();
01650 gripper->close();
01651 RobotArm *arm = RobotArm::getInstance();
01652 arm->stabilize_grip();
01653 }
01654
01656 if (atoi(argv[1]) == -3)
01657 {
01658
01659 double x,y,z,ox,oy,oz,ow;
01660 x = atof(argv[3]);
01661 y = atof(argv[4]);
01662 z = atof(argv[5]);
01663 ox = atof(argv[6]);
01664 oy = atof(argv[7]);
01665 oz = atof(argv[8]);
01666 ow = atof(argv[9]);
01667 printf("moving tool to ik goal pos in map %f %f %f or %f %f %f %f \n", x,y,z,ox,oy,oz,ow);
01668 while (ros::ok())
01669 {
01670 RobotArm::getInstance(atoi(argv[2]))->universal_move_toolframe_ik(x,y,z,ox,oy,oz,ow,"map");
01671 if (argc < 11)
01672 return 0;
01673 }
01674 }
01675
01676 if (atoi(argv[1]) == -300)
01677 {
01678
01679 double x,y,z,ox,oy,oz,ow;
01680 x = atof(argv[3]);
01681 y = atof(argv[4]);
01682 z = atof(argv[5]);
01683 ox = atof(argv[6]);
01684 oy = atof(argv[7]);
01685 oz = atof(argv[8]);
01686 ow = atof(argv[9]);
01687 double elbow_hint = atof(argv[10]);
01688 RobotArm::getInstance(atoi(argv[2]))->raise_elbow = true;
01689 RobotArm::getInstance(atoi(argv[2]))->preset_angle = elbow_hint;
01690 printf("moving tool to ik goal pos in map %f %f %f or %f %f %f %f \n", x,y,z,ox,oy,oz,ow);
01691 RobotArm::getInstance(atoi(argv[2]))->universal_move_toolframe_ik(x,y,z,ox,oy,oz,ow,"map");
01692 RobotArm::getInstance(atoi(argv[2]))->raise_elbow = false;
01693 }
01694
01696 if (atoi(argv[1]) == -2)
01697 {
01698
01699 double x,y,z,ox,oy,oz,ow;
01700 x = atof(argv[3]);
01701 y = atof(argv[4]);
01702 z = atof(argv[5]);
01703 ox = atof(argv[6]);
01704 oy = atof(argv[7]);
01705 oz = atof(argv[8]);
01706 ow = atof(argv[9]);
01707 printf("moving tool %s to ik goal pos %f %f %f or %f %f %f %f \n", (atoi(argv[2])==0) ? "right" : "left" , x,y,z,ox,oy,oz,ow);
01708 RobotArm::getInstance(atoi(argv[2]))->universal_move_toolframe_ik(x,y,z,ox,oy,oz,ow,"base_link");
01709
01710
01711
01712
01713
01714
01715
01716
01717
01718
01719
01720
01721
01722 }
01723
01725 if (atoi(argv[1]) == -6)
01726 {
01727
01728 double x,y,z,ox,oy,oz,ow;
01729 x = atof(argv[3]);
01730 y = atof(argv[4]);
01731 z = atof(argv[5]);
01732 ox = atof(argv[6]);
01733 oy = atof(argv[7]);
01734 oz = atof(argv[8]);
01735 ow = atof(argv[9]);
01736 printf("moving tool to ik goal pos in map %f %f %f or %f %f %f %f \n", x,y,z,ox,oy,oz,ow);
01737 RobotArm::getInstance(atoi(argv[2]))->universal_move_toolframe_ik(x,y,z,ox,oy,oz,ow,argv[10]);
01738 }
01739
01740
01741
01742
01743
01744
01745
01746
01747
01748
01749
01750
01751
01752
01753
01754
01755
01756
01757
01758
01759
01760
01761
01762
01764 if (atoi(argv[1]) == -9)
01765 DemoScripts::takePlate();
01766
01768 if (atoi(argv[1]) == -10)
01769 {
01770 double target[4];
01771 target[0] = atof(argv[2]);
01772 target[1] = atof(argv[3]);
01773 target[2] = 0;
01774 target[3] = 1;
01775 ROS_INFO("POSE IN BASE %f %f %f", target[0],target[1], target[2]);
01776 RobotDriver::getInstance()->driveInOdom(target, 1);
01777 }
01778
01780 if (atoi(argv[1]) == -11)
01781 {
01782 btVector3 vec = OperateHandleController::getPlatePose();
01783 ROS_INFO("POSE IN MAP %f %f %f", vec.x(), vec.y(), vec.z());
01784 }
01785
01787 if (atoi(argv[1]) == -12)
01788 DemoScripts::takeBottle();
01790 if (atoi(argv[1]) == -13)
01791 {
01792 RobotArm::getInstance(0)->raise_elbow = true;
01793 RobotArm::getInstance(1)->raise_elbow = true;
01794 OperateHandleController::spinnerL(atof(argv[2]), atof(argv[3]),atof(argv[4]));
01795 }
01796
01797 if (atoi(argv[1]) == -14)
01798 {
01799
01800 RobotArm::getInstance(1)->universal_move_toolframe_ik(1.25, -0.7000, 1, 0.005001, -0.053009, -0.029005, 0.998160,"map");
01801 RobotArm::getInstance(1)->universal_move_toolframe_ik(1.165, -0.655, 1.151, 0.005, -0.053, -0.029, 0.998, "map");
01802 RobotArm::getInstance(1)->universal_move_toolframe_ik(0.9, -0.655, 1.251, 0.005, -0.053, -0.029, 0.998, "map");
01803 RobotArm::getInstance(1)->universal_move_toolframe_ik(0.9, -0.255, 1.251, 0.005, -0.053, -0.029, 0.998, "map");
01804 }
01805
01806 if (atoi(argv[1]) == -15)
01807 {
01808 RobotDriver *driver = RobotDriver::getInstance();
01809 double relativePose[2] = {0,0};
01810 for (relativePose[0] = 0; relativePose[0] < 1; relativePose[0] = relativePose[0] + 0.025)
01811 {
01812 ROS_INFO("CAN DRIVE %f %i", relativePose[0], driver->checkCollision(relativePose));
01813 }
01814 }
01815
01816 if (atoi(argv[1]) == -16)
01817 {
01818 std::vector<int> arm;
01819 std::vector<tf::Stamped<tf::Pose> > goal;
01820 tf::Stamped<tf::Pose> result;
01821
01822 tf::Stamped<tf::Pose> p0;
01823 p0.frame_id_="map";
01824 p0.stamp_=ros::Time();
01825 p0.setOrigin(btVector3(0.9, -0.255, 1.251));
01826 p0.setRotation(btQuaternion(0.005, -0.053, -0.029, 0.998));
01827 goal.push_back(p0);
01828 arm.push_back(1);
01829
01830 RobotArm::findBaseMovement(result, arm, goal,true, false);
01831
01832 RobotArm::getInstance(1)->universal_move_toolframe_ik(0.9, -0.255, 1.251, 0.005, -0.053, -0.029, 0.998, "map");
01833 }
01834
01835 if (atoi(argv[1]) == -17)
01836 {
01837
01838 char posestrings[][100] = {{"0.542329 -0.981344 1.23612 0.0330708 0.00176235 0.595033 0.803019"},
01839 {"0.556517 -0.920874 1.23603 0.0298695 -0.00432607 0.545786 0.837381"},
01840 {"0.572956 -0.861407 1.23635 0.0268959 -0.00695657 0.494586 0.868685"},
01841 {"0.581633 -0.828156 1.23589 0.0252092 -0.00877769 0.475406 0.879362"},
01842 {"0.604209 -0.781168 1.23568 0.0179254 0.00291321 0.436192 0.89967"},
01843 {"0.622422 -0.748086 1.23539 0.0152842 0.00913191 0.340254 0.940165"},
01844 {"0.639726 -0.721124 1.23581 0.0164386 0.0162648 0.278332 0.960206"},
01845 {"0.661803 -0.694327 1.23576 0.0219128 0.0176437 0.246738 0.968674"},
01846 {"0.698809 -0.657863 1.23729 0.0284113 0.0207615 0.238006 0.970626"},
01847 {"0.740968 -0.625336 1.23853 0.0375375 0.0235445 0.227272 0.972823"},
01848 {"0.784319 -0.598149 1.23992 0.0450486 0.0276238 0.212765 0.975673"},
01849 {"0.82972 -0.572236 1.24111 0.0451087 0.0322855 0.169386 0.983987"},
01850 {"0.875225 -0.553171 1.24195 0.0358857 0.032936 0.122281 0.9913"},
01851 {"0.956881 -0.532016 1.24365 0.0254018 0.0329301 0.0418438 0.998258"},
01852 {"0.972319 -0.530781 1.2467 0.0022027 0.0133422 0.0679044 0.9976"},
01853 {"1.02179 -0.52356 1.24665 0.0022027 0.0133422 0.0679044 0.9976"}
01854 };
01855 tf::Stamped<tf::Pose> oldposes[20];
01856 for (int k = 0; k < 16; ++k)
01857 {
01858 oldposes[k] = toPose(posestrings[k],"map");
01859 printPose("traj : ", oldposes[k]);
01860 }
01861 for (int k = 1; k < 14; ++k)
01862 {
01863 tf::Pose diffPose = oldposes[k].inverse() * oldposes[k-1];
01864
01865
01866 double distance = diffPose.getOrigin().length();
01867 btQuaternion adjusted = diffPose.getRotation() * (1 / distance);
01868 adjusted.normalize();
01869 ROS_INFO("DIST : %f QUAT ADJ : %f %f %f %f", distance, adjusted.x(), adjusted.y(), adjusted.z(), adjusted.w());
01870 }
01871 }
01872
01873
01874 if (atoi(argv[1]) == -18)
01875 {
01876 Gripper::getInstance(atoi(argv[2]))->open();
01877 }
01878 if (atoi(argv[1]) == -19)
01879 {
01880 if (argc == 4)
01881 Gripper::getInstance(atoi(argv[2]))->close(atof(argv[3]));
01882 else
01883 Gripper::getInstance(atoi(argv[2]))->close();
01884 }
01885
01886 if (atoi(argv[1]) == -20)
01887 {
01888 Torso::getInstance()->pos(atof(argv[2]));
01889 }
01890
01892 if (atoi(argv[1]) == -22)
01893 {
01894
01895 RobotHead::getInstance()->lookAtThreaded(argv[2],atof(argv[3]),atof(argv[4]),atof(argv[5]));
01896 ros::Rate rt(10);
01897 int numpy = 50;
01898 while (ros::ok() && (--numpy > 0))
01899 {
01900 ros::spinOnce();
01901 rt.sleep();
01902 }
01903 RobotHead::getInstance()->stopThread();
01904 while (ros::ok())
01905 {
01906 ros::spinOnce();
01907 rt.sleep();
01908 }
01909 }
01910
01911 if (atoi(argv[1]) == -23)
01912 {
01913 tf::Stamped<tf::Pose> in;
01914 in.setOrigin(btVector3(atof(argv[2]),atof(argv[3]),atof(argv[4])));
01915 in.frame_id_ = "base_link";
01916 tf::Stamped<tf::Pose> out = Geometry::getPoseIn("map",in);
01917 printf("pos in map %f %f %f \n", out.getOrigin().x(),out.getOrigin().y(),out.getOrigin().z());
01918 }
01919
01920
01921 if (atoi(argv[1]) == -24)
01922 {
01923
01924 double x,y,z,ox,oy,oz,ow;
01925 x = atof(argv[3]);
01926 y = atof(argv[4]);
01927 z = atof(argv[5]);
01928 ox = atof(argv[6]);
01929 oy = atof(argv[7]);
01930 oz = atof(argv[8]);
01931 ow = atof(argv[9]);
01932 printf("moving tool to ik goal pos in map %f %f %f or %f %f %f %f \n", x,y,z,ox,oy,oz,ow);
01933
01934
01935 tf::Stamped<tf::Pose> p0;
01936 p0.frame_id_="map";
01937 p0.stamp_=ros::Time();
01938 p0.setOrigin(btVector3(x,y,z));
01939 p0.setRotation(btQuaternion(ox,oy,oz,ow));
01940 RobotArm::getInstance(atoi(argv[2]))->move_toolframe_ik_pose(p0);
01941 }
01942
01943
01944 if (atoi(argv[1]) == -25)
01945 {
01946 ros::NodeHandle node_handle;
01947 ros::Publisher vis_pub = node_handle.advertise<visualization_msgs::Marker>( "/robot_arm_marker", 0 );
01948
01949 visualization_msgs::Marker marker;
01950 marker.header.frame_id = "/base_link";
01951 marker.header.stamp = ros::Time::now();
01952 marker.ns = "goalpoints";
01953 marker.id = 10000;
01954 marker.type = visualization_msgs::Marker::ARROW;
01955 marker.action = visualization_msgs::Marker::ADD;
01956
01957 double x,y,z,ox,oy,oz,ow;
01958 x = atof(argv[3]);
01959 y = atof(argv[4]);
01960 z = atof(argv[5]);
01961 ox = atof(argv[6]);
01962 oy = atof(argv[7]);
01963 oz = atof(argv[8]);
01964 ow = atof(argv[9]);
01965 marker.pose.orientation.x = ox;
01966 marker.pose.orientation.y = oy;
01967 marker.pose.orientation.z = oz;
01968 marker.pose.orientation.w = ow;
01969 marker.pose.position.x = x;
01970 marker.pose.position.y = y;
01971 marker.pose.position.z = z;
01972 marker.scale.x = 0.1;
01973 marker.scale.y = 0.1;
01974 marker.scale.z = 0.1;
01975 marker.color.r = 1.0;
01976 marker.color.g = 0.0;
01977 marker.color.b = 0.0;
01978 marker.color.a = 1.0;
01979
01980 ROS_INFO("PUBLISH MARKER %i", marker.id);
01981
01982 ros::Rate rate(10.0);
01983 while (ros::ok())
01984 {
01985 marker.id = ++marker.id;
01986 marker.pose.position.x = marker.pose.position.x + .01;
01987 vis_pub.publish( marker );
01988 ros::spinOnce();
01989 rate.sleep();
01990 }
01991 }
01992
01994 if (atoi(argv[1]) == -26)
01995 {
01996 OperateHandleController::openGrippers();
01997 }
01998
01999 if (atoi(argv[1]) == -27)
02000 {
02001 Perception3d::getHandlePoseFromLaser(0);
02002 }
02003
02004
02006 if (atoi(argv[1]) == -28)
02007 {
02008 RobotHead::getInstance()->lookAt("/map", 1.243111, -0.728864, 0.9);
02009 std::vector<tf::Stamped<tf::Pose> *> handlePoses;
02010 handlePoses.clear();
02011 tf::Stamped<tf::Pose> bottle = Perception3d::getBottlePose();
02012 ROS_INFO("BOTTLE in %s : %f %f %f", bottle.frame_id_.c_str(), bottle.getOrigin().x(),bottle.getOrigin().y(),bottle.getOrigin().z());
02013 }
02014
02016 if (atoi(argv[1]) == -29)
02017 {
02018 std::vector<tf::Stamped<tf::Pose> > targetPose;
02019 std::vector<std::string> frame_ids;
02020 RobotDriver::getInstance()->driveToMatch(targetPose, frame_ids);
02021 }
02022
02023 if (atoi(argv[1]) == -30)
02024 {
02025 Gripper::getInstance(atoi(argv[2]))->updatePressureZero();
02026 Gripper::getInstance(atoi(argv[2]))->closeCompliant(atof(argv[3]));
02027 }
02028
02030 if (atoi(argv[1]) == -31)
02031 DemoScripts::serveBottle();
02032
02034 if (atoi(argv[1]) == -32)
02035 DemoScripts::servePlateToIsland();
02036
02038
02039
02040
02041
02042
02043
02044
02045
02046
02047
02048
02049
02050
02051
02052
02053
02054
02055
02056
02057
02058
02059
02060
02061
02062
02063
02064
02065
02066
02067
02068
02069
02070
02071
02072
02073
02074
02075
02076
02077
02078
02079
02080
02081
02082
02083
02084
02085
02086
02087
02088
02089
02090
02091
02092
02093
02094
02095
02096
02097
02098
02099
02100
02101
02102
02103
02104
02105
02106
02107
02108
02109
02110
02111
02112
02113
02114
02115
02116
02117
02118
02119
02120
02121
02122
02123
02124
02125
02126
02127
02129 if (atoi(argv[1]) == -34)
02130 {
02131 tf::Stamped<tf::Pose> rightTip = RobotArm::getInstance(0)->getToolPose();
02132 tf::Stamped<tf::Pose> leftTip = RobotArm::getInstance(1)->getToolPose();
02133
02134 leftTip.setOrigin(btVector3(leftTip.getOrigin().x(), leftTip.getOrigin().y(), rightTip.getOrigin().z()));
02135
02136 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(leftTip);
02137
02138 rightTip = RobotArm::getInstance(0)->getToolPose();
02139 leftTip = RobotArm::getInstance(1)->getToolPose();
02140
02141 double averageX = (rightTip.getOrigin().x() + leftTip.getOrigin().x()) * 0.5;
02142 double averageY = (rightTip.getOrigin().y() + leftTip.getOrigin().y()) * 0.5;
02143 double averageZ = (rightTip.getOrigin().z() + leftTip.getOrigin().z()) * 0.5;
02144
02145 ROS_INFO("AVERAGE Y pre: %f", averageY);
02146
02147 OperateHandleController::spinnerL(.45 - averageX,0 - averageY,.935 - averageZ);
02148
02149 }
02150
02151
02153 if (atoi(argv[1]) == -35)
02154 DemoScripts::serveToTable();
02155
02157 if (atoi(argv[1]) == -36)
02158 {
02159
02160
02161
02162
02163
02164
02165
02166
02167
02168
02169
02170
02171
02172
02173
02174
02175
02176 {
02177
02178
02179 std::vector<int> arm;
02180 std::vector<tf::Stamped<tf::Pose> > goal;
02181 tf::Stamped<tf::Pose> result;
02182
02183 tf::Stamped<tf::Pose> p0;
02184 p0.frame_id_="map";
02185 p0.stamp_=ros::Time();
02186 p0.setOrigin(btVector3(0.64, 1.421, 0.757));
02187 p0.setRotation(btQuaternion(-0.714, -0.010, 0.051, 0.698));
02188 goal.push_back(p0);
02189 arm.push_back(0);
02190
02191 tf::Stamped<tf::Pose> p3;
02192 p3.frame_id_="map";
02193 p3.stamp_=ros::Time();
02194 p3.setOrigin(btVector3(0.55, 1.391, 0.734));
02195 p3.setRotation(btQuaternion(-0.714, -0.010, 0.051, 0.698));
02196 goal.push_back(p3);
02197 arm.push_back(0);
02198
02199 tf::Stamped<tf::Pose> p1;
02200 p1.frame_id_="map";
02201 p1.stamp_=ros::Time();
02202 p1.setOrigin(btVector3(0.168, 1.391, 0.734));
02203 p1.setRotation(btQuaternion(-0.714, -0.010, 0.051, 0.698));
02204 goal.push_back(p1);
02205 arm.push_back(0);
02206
02207 Gripper::getInstance(0)->open();
02208
02209 RobotArm::findBaseMovement(result, arm, goal,true, false);
02210
02211 RobotArm *a = RobotArm::getInstance(0);
02212 a->time_to_target = 2;
02213 a->universal_move_toolframe_ik_pose(p3);
02214 a->universal_move_toolframe_ik_pose(p0);
02215 Gripper::getInstance(0)->closeCompliant();
02216 Gripper::getInstance(0)->close();
02217
02218 a->universal_move_toolframe_ik_pose(p1);
02219 Gripper::getInstance(0)->open();
02220
02221
02222 }
02223
02224
02225 }
02226
02228 if (atoi(argv[1]) == -37)
02229 {
02230
02231
02232
02233
02234
02235
02236
02237
02238
02239
02240
02241
02242
02243
02244
02245
02246
02247
02248
02249
02250
02251
02252
02253
02254
02255
02256
02257
02258
02259
02260
02261
02262
02263
02264
02265
02266
02267
02268
02269
02270
02271
02272
02273
02274
02275
02276 tf::Stamped<tf::Pose> p0 = RobotArm::getInstance(0)->getToolPose("base_link");
02277
02278 OperateHandleController::operateHandle(0,p0);
02279
02280
02281
02282
02283
02284
02285 }
02286
02287
02288
02289 if (atoi(argv[1]) == -38)
02290 {
02291 ros::Rate rate(5);
02292 while (ros::ok())
02293 {
02294 ROS_INFO("GRIPPER OPENING R%f L%f", Gripper::getInstance(0)->getAmountOpen(), Gripper::getInstance(1)->getAmountOpen());
02295 rate.sleep();
02296 }
02297 }
02298
02299
02301 if (atoi(argv[1]) == -39)
02302 DemoScripts::takeSilverware();
02303
02305 if (atoi(argv[1]) == -40)
02306 DemoScripts::openDrawer();
02307
02309 if (atoi(argv[1]) == -41)
02310 DemoScripts::takePlateFromIsland();
02311
02312 if (atoi(argv[1]) == -42)
02313 OperateHandleController::plateTuckPose();
02314
02315
02316 if (atoi(argv[1]) == -43)
02317 OperateHandleController::plateAttackPose();
02318
02319
02320 if (atoi(argv[1]) == -44)
02321 OperateHandleController::plateCarryPose();
02322
02323
02324
02325
02326
02327 if (atoi(argv[1]) == -100)
02328 {
02329
02330 int idx = 0;
02331 if (argc > 1)
02332 idx = atoi(argv[2]);
02333
02334 ROS_INFO("INDEX TO DEMO :%i", idx);
02335
02336
02337
02338 switch (idx)
02339 {
02340
02341 case 0:
02342
02343
02344
02345 case 1:
02346
02347
02348
02349 case 2:
02350
02351
02352 DemoScripts::takeBottleFromFridge();
02353
02354 case 3:
02355
02356 DemoScripts::serveBottle();
02357
02358 case 4:
02359
02360 DemoScripts::openDrawer();
02361
02362 case 5:
02363
02364 DemoScripts::takePlate();
02365
02366 case 6:
02367
02368 DemoScripts::servePlateToIsland();
02369
02370 case 7:
02371
02372 DemoScripts::takeSilverware();
02373
02374 case 8:
02375
02376 DemoScripts::serveToTable();
02377
02378 case 9:
02379
02380 DemoScripts::takePlateFromIsland();
02381
02382 case 10:
02383
02384 DemoScripts::serveToTable();
02385 case 11:
02386
02387 DemoScripts::putObjectIntoFridge();
02388 }
02389 }
02390
02391 if (atoi(argv[1]) == -101)
02392 {
02393
02394
02395 RobotDriver::getInstance()->moveBaseP(-0.571, 2.819,0.729, 0.685);
02396
02397 OperateHandleController::pickPlate(btVector3(-0.600, 3.453, 0.87));
02398
02399
02400
02401
02402
02403 }
02404
02405
02406 if (atoi(argv[1]) == -102)
02407 {
02408 RobotArm::getInstance(atoi(argv[2]))->stabilize_grip();
02409 }
02410
02411 if (atoi(argv[1]) == -103)
02412 {
02413
02414 ros::Rate rate(5.0);
02415
02416 while (ros::ok())
02417 {
02418 btVector3 diff = RobotArm::getInstance(0)->cartError();
02419 ROS_INFO("DIFF %f %f %f DISTANCE %f", diff.x(), diff.y(), diff.y(), diff.length());
02420 ros::spinOnce();
02421 rate.sleep();
02422 }
02423 }
02424
02425
02426 if (atoi(argv[1]) == -104)
02427 {
02428
02429 ros::Rate rate(5.0);
02430
02431 double jiggle = 0;
02432
02433 RobotArm *arm = RobotArm::getInstance(0);
02434
02435 double state[7];
02436 double goalstate[7];
02437
02438 double primitive[100][7];
02439 int numinprim = 0;
02440
02441 double mp[100][7];
02442 for (int k = 0; k < 100; k ++)
02443 {
02444 for (int j = 0; j < 7; j++)
02445 {
02446 mp[k][j] = 0;
02447 primitive[k][j] = 0;
02448 }
02449 }
02450 mp[0][0] = 1;
02451 mp[1][1] = 1;
02452 mp[2][2] = 1;
02453 mp[3][3] = 1;
02454 mp[4][4] = 1;
02455 mp[5][5] = 1;
02456 mp[6][6] = 1;
02457
02458
02459 arm->getJointState(state);
02460 arm->getJointState(goalstate);
02461
02462 tf::Stamped<tf::Pose> goalP = arm->runFK(state);
02463
02464 while (ros::ok())
02465 {
02466
02467 jiggle += -.01;
02468
02469 double add[] = {0,jiggle,0,0,0,0,0};
02470
02471 double curr[7];
02472
02473 addState(state,add,curr);
02474
02475 copyState(curr,state);
02476
02477 double initialincrement = 0.075;
02478
02479
02480 double increment = initialincrement;
02481
02482 tf::Stamped<tf::Pose> newp = arm->runFK(curr);
02483
02484 double oldDist= (goalP.getOrigin() - newp.getOrigin()).length();
02485 double oldDistAngle = (goalP.getRotation().inverse() * newp.getRotation()).getAngle();
02486
02487 double flzeroes[] = {0,1,0,0,0,0,0,0,0,0,0};
02488 int numflippedzero = 1;
02489 double flipped[7];
02490 copyState(flzeroes,flipped,9);
02491 int numflipped = numflippedzero;
02492
02493 int metric = 0;
02494
02495 bool found = false;
02496
02497 while ((!found) && (ros::ok()))
02498 {
02499 if (numflipped == 7)
02500 {
02501 increment /= 2.0f;
02502 numflipped =numflippedzero;
02503 copyState(flzeroes,flipped,9);
02504 ROS_INFO("DECREMENTING INCREMENT to %f", increment);
02505 }
02506
02507 int jnt = rand() % 7;
02508 while (flipped[jnt] == 1)
02509 jnt = rand() % 7;
02510
02511
02512
02513
02514 flipped[jnt] = 1;
02515 numflipped += 1;
02516
02517
02518
02519 double currm[7];
02520 double currp[7];
02521
02522
02523 copyState(state,currm);
02524 copyState(state,currp);
02525
02526 double distance = 0;
02527 for (int k = 0; k < 7; k++)
02528 distance += mp[jnt][k] * mp[jnt][k];
02529 distance = sqrtf(distance);
02530
02531 double actual_increment = increment / distance;
02532
02533 for (int k = 0; k < 7; k++)
02534 {
02535 currm[k] -= mp[jnt][k] * actual_increment;
02536 currp[k] += mp[jnt][k] * actual_increment;
02537 }
02538
02539
02540 tf::Stamped<tf::Pose> newp = arm->runFK(currp);
02541 double distp = (goalP.getOrigin() - newp.getOrigin()).length();
02542 tf::Stamped<tf::Pose> newm = arm->runFK(currm);
02543 double distm = (goalP.getOrigin() - newm.getOrigin()).length();
02544
02545 double distpangle = (goalP.getRotation().inverse() * newp.getRotation()).getAngle();
02546 double distmangle = (goalP.getRotation().inverse() * newm.getRotation()).getAngle();
02547
02548
02549
02550
02551
02552 bool madeMove = false;
02553 double effect = 0;
02554 if (metric == 0)
02555 {
02556 if (distp < oldDist)
02557 {
02558
02559
02560 effect = actual_increment;
02561 oldDist = distp;
02562 oldDistAngle = distpangle;
02563 madeMove = true;
02564 }
02565 else if (distm < oldDist)
02566 {
02567
02568
02569 effect = -actual_increment;
02570 oldDist = distm;
02571 oldDistAngle = distmangle;
02572 madeMove = true;
02573 }
02574 }
02575 else
02576 {
02577 if (distpangle < oldDistAngle)
02578 {
02579
02580
02581 effect = actual_increment;
02582 oldDist = distp;
02583 oldDistAngle = distpangle;
02584 madeMove = true;
02585 }
02586 else if (distmangle < oldDistAngle)
02587 {
02588
02589
02590 effect = -actual_increment;
02591 oldDist = distm;
02592 oldDistAngle = distmangle;
02593 madeMove = true;
02594 }
02595 }
02596
02597
02598 if (madeMove)
02599 {
02600 addStateDiscounted(state, mp[jnt], effect, state);
02601 ROS_ERROR("%i Sucessful increment %f Resetting INCREMENT %f , METRIC : %i", jnt ,effect, initialincrement, metric);
02602 increment = increment * 2;
02603 if (increment > initialincrement)
02604 increment = initialincrement;
02605 numflipped = numflippedzero;
02606 copyState(flzeroes,flipped,9);
02607
02608 addStateDiscounted(primitive[metric],mp[jnt],effect,primitive[metric]);
02609 for (int j = 0; j < 7; j ++)
02610 {
02611 mp[7][j] = primitive[0][j];
02612 mp[8][j] = primitive[1][j];
02613 }
02614
02615 numinprim ++;
02616 ROS_ERROR("Motion primitive D: %f %f %f %f %f %f %f", primitive[0][0], primitive[0][1],primitive[0][2],primitive[0][3],primitive[0][4],primitive[0][5],primitive[0][6]);
02617 ROS_ERROR("Motion primitive A: %f %f %f %f %f %f %f", primitive[1][0], primitive[1][1],primitive[1][2],primitive[1][3],primitive[1][4],primitive[1][5],primitive[1][6]);
02618 }
02619
02620
02621
02622 ROS_INFO("%s %i d %f a %f STATE: %f %f %f %f %f %f %f", (metric==0) ? "dist" : "angl", jnt, oldDist, oldDistAngle, state[0],state[1],state[2],state[3],state[4],state[5],state[6]);
02623
02624 if ((oldDist < 0.01) && (metric == 0))
02625 metric = 1;
02626 if ((oldDistAngle < .05) && (metric == 1))
02627 metric = 0;
02628
02629
02630 if ((oldDist < 0.01) && (oldDistAngle < 0.05))
02631 {
02632 double poseA[7];
02633 double poseB[7];
02634
02635 ROS_INFO(" ");
02636 ROS_INFO(" ");
02637 ROS_INFO(" ");
02638 ROS_INFO(" ");
02639 ROS_ERROR("MOVING ARM NOW");
02640 ROS_INFO(" ");
02641 ROS_INFO(" ");
02642 ROS_INFO(" ");
02643 ROS_INFO(" ");
02644 ROS_INFO("OLD STATE %f %f %f %f %f %f %f", goalstate[0],goalstate[1],goalstate[2],goalstate[3],goalstate[4],goalstate[5],goalstate[6]);
02645 ROS_INFO("NEW STATE %f %f %f %f %f %f %f", state[0],state[1],state[2],state[3],state[4],state[5],state[6]);
02646
02647 double stateDiff[] = {0,0,0,0,0,0,0};
02648 addStateDiscounted(goalstate,state,-1,stateDiff);
02649 ROS_INFO("DIFF STATE %f %f %f %f %f %f %f", stateDiff[0],stateDiff[1],stateDiff[2],stateDiff[3],stateDiff[4],stateDiff[5],stateDiff[6]);
02650
02651
02652 for (int k = 0; k < 7; ++k)
02653 {
02654 poseA[k] = goalstate[k];
02655 poseB[k] = state[k];
02656 goalstate[k] = state[k];
02657 }
02658 arm->startTrajectory(arm->twoPointTrajectory(poseA, poseB));
02659 found = true;
02660 }
02661
02662 }
02663 }
02664 }
02665
02666
02667 if (atoi(argv[1]) == -105)
02668 {
02669
02670 RobotArm *arm = RobotArm::getInstance(0);
02671 double amount =0;
02672
02673 double start[] = {-0.896923, 0.513388, -1.284203, -1.535167, 4.452332, -0.837711, -9.765933};
02674 double d[] = {0.037500, 0.250000, 0.337500, 0.000000, -0.300000, -0.300000, 0.000000};
02675 double next[7] = {-0.896923, 0.513388, -1.284203, -1.535167, 4.452332, -0.837711, -9.765933};
02676 double act[7];
02677
02678
02679 while (ros::ok())
02680 {
02681 amount += 0.1;
02682
02683 for (int k = 0; k < 7; ++k)
02684 {
02685 act[k] = next[k];
02686 next[k] = start[k] + (- d[k] * amount);
02687 }
02688 ROS_INFO("amount %f" , amount);
02689 arm->startTrajectory(arm->twoPointTrajectory(start, next));
02690
02691 }
02692
02693 }
02694
02695 if (atoi(argv[1]) == -106)
02696 {
02697
02698 int side = atoi(argv[2]);
02699 RobotArm *arm = RobotArm::getInstance(side);
02700 double state[7];
02701 arm->getJointState(state);
02702 double solution[7];
02703
02704 tf::Stamped<tf::Pose> actPose;
02705 arm->getWristPose(actPose,"base_link");
02706
02707 geometry_msgs::PoseStamped stamped_pose;
02708 stamped_pose.header.frame_id = "base_link";
02709 stamped_pose.header.stamp = ros::Time::now();
02710 stamped_pose.pose.position.x=actPose.getOrigin().x();
02711 stamped_pose.pose.position.y=actPose.getOrigin().y();
02712 stamped_pose.pose.position.z=actPose.getOrigin().z();
02713 stamped_pose.pose.orientation.x=actPose.getRotation().x();
02714 stamped_pose.pose.orientation.y=actPose.getRotation().y();
02715 stamped_pose.pose.orientation.z=actPose.getRotation().z();
02716 stamped_pose.pose.orientation.w=actPose.getRotation().w();
02717
02718 double increment = -0.25;
02719
02720 double last = 0;
02721 int numup = 0;
02722 ros::Rate rate(2.0);
02723
02724 double lastState[7];
02725 double dif[7];
02726 int numit = 0;
02727
02728 for (double add = 0; ros::ok(); add+= 0.01)
02729 {
02730 rate.sleep();
02731 state[2] += increment;
02732
02733
02734 arm->run_ik(stamped_pose,state,solution,side == 0 ? "r_wrist_roll_link" : "l_wrist_roll_link");
02735 ROS_INFO("inc %f SEED STATE %f %f %f %f %f %f %f",increment, state[0],state[1],state[2],state[3],state[4],state[5],state[6]);
02736 ROS_INFO("%f SOLUTION %f %f %f %f %f %f %f", state[1], solution[0], solution[1],solution[2], solution[3], solution[4], solution[5], solution[6]);
02737 double pose[7];
02738 numit++;
02739
02740
02741
02742 double sum = 0;
02743 for (int k = 0; k < 7; ++k)
02744 {
02745 pose[k] = solution[k];
02746 sum += pose[k] * pose[k];
02747 }
02748
02749 if (sum > 0.01)
02750 arm->startTrajectory(arm->goalTraj(pose),false);
02751
02753
02754
02755
02756
02757
02758 if ((last == solution[1]) && (numup > 3))
02759 {
02760 increment=-increment;
02761 numup = -4;
02762 }
02763
02764 ROS_ERROR("DIFFERENCE %f %f %f %f %f %f %f",lastState[0] - solution[0], lastState[1] - solution[1],lastState[2] - solution[2], lastState[3] - solution[3], lastState[4] - solution[4], lastState[5] - solution[5], lastState[6] - solution[6]);
02765
02766 for (int k = 0; k < 7 ; ++k)
02767 {
02768 dif[k] = (-(lastState[k] - solution[k])) / 1.0;
02769 lastState[k] = solution[k];
02770 numit ++;
02771 }
02772
02773 last = solution[1];
02774
02775 numup++;
02776
02777 }
02778
02779
02780
02781
02782 }
02783
02784
02785
02786 if (atoi(argv[1]) == -107)
02787 {
02788
02789 int side = 1;
02790 RobotArm *arm = RobotArm::getInstance(side);
02791 double state[7];
02792 arm->getJointState(state);
02793
02794
02795 tf::Stamped<tf::Pose> actPose;
02796 arm->getWristPose(actPose,"base_link");
02797
02798 geometry_msgs::PoseStamped stamped_pose;
02799 stamped_pose.header.frame_id = "base_link";
02800 stamped_pose.header.stamp = ros::Time::now();
02801 stamped_pose.pose.position.x=actPose.getOrigin().x();
02802 stamped_pose.pose.position.y=actPose.getOrigin().y();
02803 stamped_pose.pose.position.z=actPose.getOrigin().z();
02804 stamped_pose.pose.orientation.x=actPose.getRotation().x();
02805 stamped_pose.pose.orientation.y=actPose.getRotation().y();
02806 stamped_pose.pose.orientation.z=actPose.getRotation().z();
02807 stamped_pose.pose.orientation.w=actPose.getRotation().w();
02808
02809
02810
02811
02812 ros::Rate rate(50.0);
02813
02814
02815
02816
02817
02818
02819 while (ros::ok())
02820 {
02821 rate.sleep();
02822 ros::spinOnce();
02823
02824 double jErr[7];
02825 double jDes[7];
02826
02827 arm->getJointStateErr(jErr);
02828 arm->getJointStateDes(jDes);
02829
02830 double increment = .1;
02831
02832
02833 {
02834
02835 double stateP[7];
02836 double statePK[7];
02837 double stateM[7];
02838
02839
02840
02841
02842 arm->getJointState(stateP);
02843 arm->getJointState(statePK);
02844 arm->getJointState(stateM);
02845
02846 double stA[7];
02847 double stB[7];
02848 double stC[7];
02849 arm->getJointState(stA);
02850 arm->getJointState(stB);
02851 arm->getJointState(stC);
02852
02853 stB[2] += increment;
02854
02855 double stAs[7];
02856 double stBs[7];
02857 double stCs[7];
02858
02859 arm->run_ik(stamped_pose,stA,stAs,side == 0 ? "r_wrist_roll_link" : "l_wrist_roll_link");
02860 arm->run_ik(stamped_pose,stB,stBs,side == 0 ? "r_wrist_roll_link" : "l_wrist_roll_link");
02861
02862 double newinc = (jErr[1] / (stBs[1] - stAs[1])) * increment;
02863
02864 stC[2] += newinc;
02865
02866 arm->run_ik(stamped_pose,stC,stCs,side == 0 ? "r_wrist_roll_link" : "l_wrist_roll_link");
02867
02868 ROS_INFO("curr (sta[1]) %f stCs %f", stA[1], stCs[1]);
02869
02870 double pose[7];
02871 double sum = 0;
02872 for (int k = 0; k < 7; ++k)
02873 {
02874 pose[k] = stCs[k];
02875 sum += stCs[k] * stCs[k];
02876 }
02877
02878 if (sum > 0.01)
02879 arm->startTrajectory(arm->goalTraj(pose));
02880
02881 if (stBs[2]==0)
02882 {
02883 increment = -increment;
02884 ROS_INFO("HIT LIMIT?");
02885 }
02886
02887
02888
02889 }
02890
02891
02892 }
02893
02894 }
02895
02896
02898 if (atoi(argv[1]) == -108)
02899 {
02900 ROS_INFO("OPEN HANDLE AT MAP COORDINATE arm orientation(0=vert 1=horiz) x_map y_map z_map");
02901
02902
02903 tf::Stamped<tf::Pose> p0;
02904 p0.setOrigin(btVector3(atof(argv[4]),atof(argv[5]),atof(argv[6])));
02905 p0.frame_id_ = "map";
02906 p0 = Geometry::getPoseIn("base_link",p0);
02907
02908 if (atoi(argv[3]) == 0)
02909 p0.setRotation(btQuaternion(1,0,0,0));
02910 else
02911 p0.setRotation(btQuaternion(0.707,0,0,0.707));
02912
02913 OperateHandleController::operateHandle(atoi(argv[2]),p0);
02914 }
02915
02916
02918 if (atoi(argv[1]) == -109)
02919 {
02920
02921 OperateHandleController::plateAttackPose();
02922
02923
02924
02925
02926 OperateHandleController::pickPlate(btVector3(atof(argv[2]),atof(argv[3]),atof(argv[4])), .27);
02927
02928 OperateHandleController::spinnerL(0,0,-.2);
02929
02930 OperateHandleController::openGrippers();
02931
02932 }
02933
02934
02935
02936
02937 if (atoi(argv[1]) == -110)
02938 {
02939
02940
02941
02942 int side = 0;
02943 RobotArm::RobotArm *arm = RobotArm::getInstance(side);
02944
02945 double pts[][7] =
02946 {
02947 {0.478704, -1.0355, 1.18101, 0.767433, 0.639987, 0.022135, 0.0311955},
02948 {0.489086, -0.984206, 1.17956, 0.797904, 0.601535, 0.01726, 0.0347398},
02949 {0.494529, -0.937741, 1.1803, 0.830545, 0.555891, 0.0110758, 0.0325103},
02950 {0.504333, -0.909376, 1.18066, 0.849808, 0.526105, 0.00709967, 0.03147},
02951 {0.507886, -0.884252, 1.17954, 0.8814, 0.471274, 0.00699274, 0.0313926},
02952 {0.516993, -0.854729, 1.18006, 0.903026, 0.428457, 0.00859376, 0.0299171},
02953 {0.527833, -0.832331, 1.1803, 0.920176, 0.390256, 0.0125722, 0.0286066},
02954 {0.541463, -0.80644, 1.18, 0.931353, 0.362808, 0.0186723, 0.0245782},
02955 {0.571712, -0.760535, 1.17887, 0.936451, 0.349496, 0.024334, 0.017896},
02956 {0.608236, -0.715618, 1.17839, 0.944274, 0.327791, 0.0273483, 0.0123364},
02957 {0.647457, -0.676296, 1.17812, 0.954053, 0.298037, 0.0302956, 0.00623379},
02958 {0.690692, -0.638766, 1.17999, 0.964469, 0.262043, 0.0336022, 0.00195834},
02959 {0.734141, -0.609302, 1.18042, 0.974717, 0.220844, 0.0339708, -0.00102721},
02960 {0.781735, -0.583995, 1.17916, 0.983083, 0.180164, 0.0327274, -0.00426907},
02961 {0.828575, -0.564397, 1.17937, 0.990023, 0.137179, 0.0315954, -0.00617472},
02962 {0.870116, -0.550422, 1.17831, 0.995336, 0.0920069, 0.0283872, -0.00586025},
02963 {0.921693, -0.544899, 1.17853, 0.998734, 0.0415909, 0.0273629, -0.00714236},
02964 {0.971471, -0.549669, 1.17854, 0.998732, 0.0416648, 0.0273237, -0.00716123}
02965 };
02966
02967
02968
02969 double z = 1.35;
02970 {
02971 int numf = 0;
02972 bool found = true;
02973
02974 double stA[7];
02975 arm->getJointState(stA);
02976
02977 RobotHead::getInstance()->lookAt("/map", 1.243111, -0.728864, 0.7);
02978
02979 for (int k = 0; k <= 16; ++k)
02980 {
02981 tf::Stamped<tf::Pose> act;
02982 act.frame_id_ = "map";
02983 act.setOrigin(btVector3(pts[k][0],pts[k][1],z));
02984 act.setRotation(btQuaternion(pts[k][3],pts[k][4],pts[k][5],pts[k][6]));
02985 act = arm->tool2wrist(act);
02986
02987 geometry_msgs::PoseStamped stamped_pose;
02988 stamped_pose.header.frame_id = "map";
02989 stamped_pose.header.stamp = ros::Time::now();
02990 stamped_pose.pose.position.x=act.getOrigin().x();
02991 stamped_pose.pose.position.y=act.getOrigin().y();
02992 stamped_pose.pose.position.z=z;
02993 stamped_pose.pose.orientation.x=pts[k][3];
02994 stamped_pose.pose.orientation.y=pts[k][4];
02995 stamped_pose.pose.orientation.z=pts[k][5];
02996 stamped_pose.pose.orientation.w=pts[k][6];
02997
02998 double stAs[7];
02999 int ret = arm->run_ik(stamped_pose,stA,stAs,side == 0 ? "r_wrist_roll_link" : "l_wrist_roll_link");
03000 ROS_INFO(" z %f k %i %s", z, k, ret ? "found." : "not found.");
03001 numf += ret;
03002 if (ret==0)
03003 found = false;
03004 else
03005 {
03006 for (int i = 0; i < 7; ++i)
03007 stA[i] = stAs[i];
03008 }
03009 }
03010 ROS_INFO("FOR HEIGHT z %f %s num %i", z, found ? "found." : "not found.", numf);
03011 if (found)
03012 {
03013
03014 double stA[7];
03015 arm->getJointState(stA);
03016 ros::Rate rate(3.0);
03017 int idx[] = {16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,16,16};
03018 for (int o = 0; o <= 16+16; ++o)
03019
03020 {
03021 int k = idx[o];
03022 tf::Stamped<tf::Pose> act;
03023 act.frame_id_ = "map";
03024 act.setOrigin(btVector3(pts[k][0],pts[k][1],z));
03025 act.setRotation(btQuaternion(pts[k][3],pts[k][4],pts[k][5],pts[k][6]));
03026 act = arm->tool2wrist(act);
03027
03028 geometry_msgs::PoseStamped stamped_pose;
03029 stamped_pose.header.frame_id = "map";
03030 stamped_pose.header.stamp = ros::Time::now();
03031 stamped_pose.pose.position.x=act.getOrigin().x();
03032 stamped_pose.pose.position.y=act.getOrigin().y();
03033 stamped_pose.pose.position.z=z;
03034 stamped_pose.pose.orientation.x=pts[k][3];
03035 stamped_pose.pose.orientation.y=pts[k][4];
03036 stamped_pose.pose.orientation.z=pts[k][5];
03037 stamped_pose.pose.orientation.w=pts[k][6];
03038
03039 double stAs[7];
03040 int ret = arm->run_ik(stamped_pose,stA,stAs,side == 0 ? "r_wrist_roll_link" : "l_wrist_roll_link");
03041
03042
03043 ROS_INFO("k : %i",k);
03044
03045 rate.sleep();
03046 if (ret)
03047 {
03048 double pose[7];
03049 double sum = 0;
03050 for (int k = 0; k < 7; ++k)
03051 {
03052 pose[k] = stAs[k];
03053 sum += stAs[k] * stAs[k];
03054 }
03055 if (sum > 0.01)
03056 arm->startTrajectory(arm->goalTraj(pose),false);
03057 }
03058 if (k == 0)
03059 {
03060
03061 RobotHead::getInstance()->lookAt("/map", 1.243111, -0.728864, 0.9);
03062 tf::Stamped<tf::Pose> bottle = Perception3d::getBottlePose();
03063
03064 double ptA[] = {0.41491862845470812, 1.3468554401788568, 1.501748997727044, -2.0247783614692936, -16.507431415382143, -1.3292235155277217, 15.027356561279952};
03065 double ptB[] = {0.040263624618489424, 0.96465557759293075, 0.27150676981727662, -1.6130504582945409, -14.582800985450046, -1.1869058378819473, 14.819427432123987};
03066 RobotArm *arml = RobotArm::getInstance(1);
03067 arml->startTrajectory(arml->goalTraj(ptA,1.5));
03068 arml->startTrajectory(arml->goalTraj(ptB,1.5));
03069 Gripper::getInstance(1)->open();
03070 RobotArm::getInstance(1)->universal_move_toolframe_ik(bottle.getOrigin().x() - .1, bottle.getOrigin().y(), bottle.getOrigin().z() + .03, 0.005, -0.053, -0.029005, 0.998160, "map");
03071 RobotArm::getInstance(1)->universal_move_toolframe_ik(bottle.getOrigin().x(), bottle.getOrigin().y(), bottle.getOrigin().z() + .03, 0.005, -0.053, -0.029005, 0.998160, "map");
03072
03073 Gripper::getInstance(1)->closeCompliant();
03074 Gripper::getInstance(1)->close(0.5);
03075 RobotArm::getInstance(1)->universal_move_toolframe_ik(bottle.getOrigin().x() - .1, bottle.getOrigin().y(), bottle.getOrigin().z() + .03, 0.005, -0.053, -0.029005, 0.998160, "map");
03076 arml->startTrajectory(arml->goalTraj(ptB,1.5));
03077 RobotArm::getInstance(1)->universal_move_toolframe_ik(0.208, 0.120, 0.785 , -0.020, -0.101, -0.662, 0.742, "base_link");
03078 }
03079 }
03080 }
03081 }
03082
03083 Gripper::getInstance(0)->open();
03084
03085 double target[4];
03086 target[0] = -0.3;
03087 target[1] = 0;
03088 target[2] = 0;
03089 target[3] = 1;
03090 ROS_INFO("POSE IN BASE %f %f %f", target[0],target[1], target[2]);
03091 RobotDriver::getInstance()->driveInOdom(target, 1);
03092
03093 pr2_controllers_msgs::JointTrajectoryGoal goalAT = RobotArm::getInstance(0)->twoPointTrajectory(Poses::prepDishRT,Poses::prepDishRT);
03094 boost::thread t2T(&RobotArm::startTrajectory, RobotArm::getInstance(0), goalAT,true);
03095 t2T.join();
03096
03097
03098
03099
03100
03101
03102 }
03103
03104
03105
03106 if (atoi(argv[1]) == -111)
03107 {
03108
03109 RobotArm::RobotArm *arm = RobotArm::getInstance(0);
03110 Torso *torso = Torso::getInstance();
03111 Gripper *gripper = Gripper::getInstance(0);
03112
03113 boost::thread t2(&Torso::up, torso);
03114
03115 OperateHandleController::plateTuckPose();
03116
03117 RobotDriver::getInstance()->moveBaseP(0.305, -0.515, -0.348, 0.938, false);
03118 t2.join();
03119
03120 tf::Stamped<tf::Pose> handleHint;
03121 handleHint.setOrigin(btVector3( 0.919, -0.553, 1.35 ));
03122 handleHint.frame_id_ = "/map";
03123 tf::Stamped<tf::Pose> handlePos = Perception3d::getHandlePoseFromLaser(handleHint);
03124
03125
03126 handlePos = Perception3d::getHandlePoseFromLaser(handleHint);
03127
03128
03129 handlePos = Geometry::getPoseIn("map",handlePos);
03130
03131 ROS_INFO("Handle in Map");
03132 arm->printPose(handlePos);
03133
03134 handlePos.setRotation(btQuaternion( 0.998732, 0.0416648, 0.0273237, -0.00716123));
03135
03136 tf::Stamped<tf::Pose> handlePosApp = handlePos;
03137 tf::Stamped<tf::Pose> handlePosAppB = handlePos;
03138 handlePosApp.setOrigin(handlePosApp.getOrigin() + btVector3(-.05,0,1.35 - handlePos.getOrigin().z() ));
03139 handlePosAppB.setOrigin(handlePosAppB.getOrigin() + btVector3(.05,0,1.35 - handlePos.getOrigin().z() ));
03140 tf::Stamped<tf::Pose> handlePosAppM = handlePos;
03141 handlePosAppM.setOrigin(handlePosAppM.getOrigin() + btVector3(-.10,0,1.35 - handlePos.getOrigin().z() ));
03142
03143
03144 arm->time_to_target = 2;
03145 arm->move_toolframe_ik_pose(handlePosAppM);
03146 arm->time_to_target = 1;
03147
03148 Approach *apr = new Approach();
03149 apr->init(0,handlePosApp, handlePosAppB, Approach::front);
03150
03151 gripper->close();
03152
03153 double distA = (apr->increment(0,0.5));
03154 if (distA == 0)
03155 {
03156 ROS_ERROR("DIDNT TOUCH IN THE FIRST 5 CM OF APPROACH");
03157 distA = (apr->increment(0.5,1));
03158 }
03159
03160 apr->move_to((distA - .5));
03161 gripper->open();
03162
03163 apr->move_to((distA + .375));
03164
03165 gripper->closeCompliant();
03166
03167 gripper->close();
03168
03169 arm->stabilize_grip();
03170
03171 }
03172
03173
03174
03175 if (atoi(argv[1]) == -112)
03176 {
03177
03178 OperateHandleController::plateTuckPose();
03179
03180 RobotDriver::getInstance()->moveBaseP(0.305, -0.515, -0.348, 0.938, false);
03181 {
03182 std::vector<int> arm;
03183 std::vector<tf::Stamped<tf::Pose> > goal;
03184 tf::Stamped<tf::Pose> result;
03185
03186 tf::Stamped<tf::Pose> p0;
03187 p0.frame_id_="map";
03188 p0.stamp_=ros::Time();
03189 p0.setOrigin(btVector3(0.8, -0.455, 1.251));
03190 p0.setRotation(btQuaternion(0.005, -0.053, -0.029, 0.998));
03191
03192
03193
03194 tf::Stamped<tf::Pose> p1;
03195 p1.frame_id_="map";
03196 p1.stamp_=ros::Time();
03197 p1.setOrigin(btVector3(0.8, -0.655, 1.251));
03198 p1.setRotation(btQuaternion(0.005, -0.053, -0.029, 0.998));
03199
03200
03201
03202 btVector3 bottle(1.227, -0.741, 0.986);
03203
03204 tf::Stamped<tf::Pose> p2;
03205 p2.frame_id_="map";
03206 p2.stamp_=ros::Time();
03207
03208 p2.setOrigin(bottle + btVector3(-.1,0,.03));
03209 p2.setRotation(btQuaternion(0.005, -0.053, -0.029, 0.998));
03210
03211
03212
03213 tf::Stamped<tf::Pose> p3;
03214 p3.frame_id_="map";
03215 p3.stamp_=ros::Time();
03216
03217 p3.setOrigin(bottle + btVector3(.02,0,.03));
03218 p3.setRotation(btQuaternion(0.005001, -0.053009, -0.029005, 0.998160));
03219 goal.push_back(p3);
03220 arm.push_back(1);
03221
03222 RobotArm::findBaseMovement(result, arm, goal,false, false);
03223
03224 }
03225
03226 }
03227
03228
03229 if (atoi(argv[1]) == -113)
03230 {
03231 ros::Rate rt(1);
03232 double ptA[] = {0.41491862845470812, 1.3468554401788568, 1.501748997727044, -2.0247783614692936, -16.507431415382143, -1.3292235155277217, 15.027356561279952};
03233 double ptB[] = {0.040263624618489424, 0.96465557759293075, 0.27150676981727662, -1.6130504582945409, -14.582800985450046, -1.1869058378819473, 14.819427432123987};
03234 RobotArm *arml = RobotArm::getInstance(1);
03235 arml->startTrajectory(arml->goalTraj(ptA));
03236 rt.sleep();
03237 rt.sleep();
03238 arml->startTrajectory(arml->goalTraj(ptB));
03239 rt.sleep();
03240 rt.sleep();
03241 Gripper::getInstance(1)->open();
03242 Gripper::getInstance(1)->close(0.5);
03243 arml->startTrajectory(arml->goalTraj(ptB));
03244 rt.sleep();
03245 rt.sleep();
03246 arml->startTrajectory(arml->goalTraj(ptA));
03247 rt.sleep();
03248 rt.sleep();
03249 }
03250
03251
03252 if (atoi(argv[1]) == -120)
03253 {
03254 RobotArm *arm = RobotArm::getInstance(atoi(argv[2]));
03255 double pose[7];
03256 for (int k = 0; k < 7; ++k)
03257 {
03258 pose[k] = atof(argv[3+k]);
03259 }
03260 double duration = 5;
03261 if (argc > 10)
03262 duration = atof(argv[10]);
03263 arm->startTrajectory(arm->goalTraj(pose,duration));
03264 }
03265
03266 if (atoi(argv[1]) == -121)
03267 {
03268 RobotArm *arm = RobotArm::getInstance(atoi(argv[2]));
03269 double pose[7];
03270 for (int k = 0; k < 7; ++k)
03271 {
03272 pose[k] = atof(argv[3+k]);
03273 }
03274 ros::Rate rate(5);
03275
03276 while (ros::ok())
03277 {
03278 arm->startTrajectory(arm->goalTraj(pose),false);
03279 pose[6] += atof(argv[10]);
03280 ros::spinOnce();
03281 rate.sleep();
03282 }
03283 }
03284
03285 if (atoi(argv[1]) == -130)
03286 {
03287 Pressure *r = Pressure::getInstance(0);
03288 double a[22], b[22];
03289 ros::Rate rate(25);
03290 double sum = 0;
03291 double num = 0;
03292
03293 double table[100];
03294 double tablesum=0;
03295 for (int i= 0; i < 100; ++i)
03296 {
03297 table[i] = 0;
03298 }
03299
03300 for (int x = 0; x < 10; ++x)
03301 {
03302 r->getCurrent(a,b,false);
03303 rate.sleep();
03304 }
03305 while (ros::ok())
03306 {
03307 double last = a[11];
03308 r->getCurrent(a,b,false);
03309 rate.sleep();
03310 sum += fabs(a[11]-last);
03311 num += 1;
03312
03313 double logchange = log(fabs(a[11] - last) + 1 );
03314 if (logchange > 9.9)
03315 logchange = 9.9;
03316 logchange *= 10;
03317 table[int(logchange)] += 1;
03318 tablesum+=1;
03319 double posi = 0;
03320 int i;
03321 for (i = 0; i <= int(logchange); ++i)
03322 posi += table[i];
03323
03324 ROS_INFO("at %.5fi %.3i logchange %.5f ", posi / tablesum, i, logchange);
03325
03326 }
03327 }
03328
03329
03330 if (atoi(argv[1]) == -131)
03331 {
03332 cart_err_monit(atoi(argv[2]));
03333 }
03334
03335 if (atoi(argv[1]) == -200)
03336 {
03337
03338
03339
03340
03341
03342
03343
03344
03345
03346
03347
03348
03349
03350
03351
03352
03353
03354 boost::thread tp1(OperateHandleController::plateTuckPose);
03355
03356 RobotHead::getInstance()->lookAt("/map",-.5,2.1,0.9,true);
03357
03358 tp1.join();
03359
03360 tf::Stamped<tf::Pose> midEdge;
03361 midEdge.frame_id_ = "map";
03362
03363
03364
03365 ros::Publisher ppub = node_handle_->advertise<geometry_msgs::PoseStamped>( "/cart_roi", 100, true );
03366 tf::Stamped<tf::Pose> roi_center;
03367 roi_center.frame_id_ = "/map";
03368 roi_center.setOrigin(btVector3(-.5,2.1,0.9));
03369 roi_center.setRotation(btQuaternion(0,0,0,1));
03370 pubPose(roi_center,ppub);
03371
03372 geometry_msgs::PoseStamped midpose = *(ros::topic::waitForMessage<geometry_msgs::PoseStamped>("output_grip_pose"));
03373
03374 roi_center.setOrigin(btVector3(-1,-1,-1));
03375 pubPose(roi_center,ppub);
03376
03377 btVector3 pnt;
03378 tf::pointMsgToTF(midpose.pose.position,pnt);
03379 btQuaternion quat;
03380 tf::quaternionMsgToTF(midpose.pose.orientation, quat);
03381
03382 midEdge.setOrigin( pnt );
03383 midEdge.setRotation( quat );
03384
03385
03386 tf::Stamped<tf::Pose> baseInCart;
03387 baseInCart.frame_id_ = "map";
03388 baseInCart.setOrigin(btVector3(-0.002, -0.378, -0.864));
03389 baseInCart.setRotation(btQuaternion(-0.000, 0.001, 0.713, 0.701));
03390
03391 btTransform basePose = midEdge * baseInCart;
03392 tf::Stamped<tf::Pose> newBasePose(basePose,ros::Time::now(),"map");
03393
03394
03395
03396
03397 RobotDriver::getInstance()->driveInMap(newBasePose);
03398
03399 ros::Rate rt(5);
03400
03401 tf::Stamped<tf::Pose> rightGrasp;
03402 rightGrasp.frame_id_ = "map";
03403
03404
03405
03406 tf::Stamped<tf::Pose> leftGrasp;
03407 leftGrasp.frame_id_ = "map";
03408
03409
03410
03411
03412 tf::Pose lRel;
03413
03414 lRel.setOrigin(btVector3(0.08, 0, 0.02));
03415 lRel.setRotation(btQuaternion(0.681431, 0.004566, 0.731829, 0.007564));
03416 printPose("lRel",lRel);
03417
03418 tf::Pose rRel;
03419 rRel.setOrigin(btVector3(-0.08, 0 ,0.02));
03420 rRel.setRotation(btQuaternion(-0.006577, -0.725437, 0.013462, 0.688126));
03421 rRel.setRotation(btQuaternion(0.681431, 0.004566, 0.731829, 0.007564));
03422
03423 printPose("rRel",rRel);
03424
03425 tf::Pose btrightGrasp = midEdge * rRel ;
03426 tf::Pose btleftGrasp = midEdge * lRel;
03427
03428 rightGrasp.setOrigin(btrightGrasp.getOrigin());
03429 leftGrasp.setOrigin(btleftGrasp.getOrigin());
03430
03431 rightGrasp.setRotation(btrightGrasp.getRotation());
03432 leftGrasp.setRotation(btleftGrasp.getRotation());
03433
03434 tf::Stamped<tf::Pose> rightBase = Geometry::getPoseIn("base_link", rightGrasp);
03435 tf::Stamped<tf::Pose> leftBase = Geometry::getPoseIn("base_link", leftGrasp);
03436
03437
03438 if (rightBase.getOrigin().y() > leftBase.getOrigin().y())
03439 {
03440 tf::Stamped<tf::Pose> tmp = rightGrasp;
03441 rightGrasp = leftGrasp;
03442 leftGrasp = tmp;
03443 }
03444
03445
03446 tf::Stamped<tf::Pose> preLeft;
03447 preLeft.setOrigin(btVector3(0.3, .1, .75));
03448 preLeft.frame_id_ = "base_link";
03449
03450 tf::Stamped<tf::Pose> preRight;
03451 preRight.setOrigin(btVector3(0.3, -.1, .75));
03452 preRight.frame_id_ = "base_link";
03453
03454 preRight = Geometry::getPoseIn("map",preRight);
03455 preLeft = Geometry::getPoseIn("map",preLeft);
03456
03457 preRight.setRotation(rightGrasp.getRotation());
03458 preLeft.setRotation(leftGrasp.getRotation());
03459
03460 preRight = Geometry::getPoseIn("base_link",preRight);
03461 preLeft = Geometry::getPoseIn("base_link",preLeft);
03462
03463
03464
03465
03466
03467
03468
03469 RobotArm::moveBothArms(preLeft, preRight);
03470
03471
03472
03473
03474
03475 tf::Stamped<tf::Pose> rightGraspSub = rightGrasp;
03476 rightGraspSub.setOrigin(rightGraspSub.getOrigin() - btVector3(0,0,.1));
03477 tf::Stamped<tf::Pose> leftGraspSub = leftGrasp;
03478 leftGraspSub.setOrigin(leftGraspSub.getOrigin() - btVector3(0,0,.1));
03479
03480 if (1)
03481 {
03482
03483
03484
03485
03486
03487
03488
03489
03490 RobotArm::moveBothArms(leftGraspSub, rightGraspSub);
03491
03492 OperateHandleController::openGrippers();
03493
03494
03495
03496
03497
03498
03499
03500 RobotArm::moveBothArms(leftGrasp, rightGrasp);
03501
03502 boost::thread a(&Gripper::close,Gripper::getInstance(0),0);
03503 boost::thread b(&Gripper::close,Gripper::getInstance(1),0);
03504
03505 a.join();
03506 b.join();
03507
03508
03509
03510
03511
03512
03513
03514
03515
03516 tf::Stamped<tf::Pose> rightGraspPl = rightGrasp;
03517 rightGraspPl = Geometry::getPoseIn("base_link", rightGrasp);
03518 rightGraspPl.setOrigin(rightGraspPl.getOrigin() + btVector3(0.1,0,0));
03519 tf::Stamped<tf::Pose> leftGraspPl = leftGrasp;
03520 leftGraspPl = Geometry::getPoseIn("base_link", leftGrasp);
03521 leftGraspPl.setOrigin(leftGraspPl.getOrigin() + btVector3(0.1,0,0));
03522
03523 RobotArm::moveBothArms(leftGraspPl, rightGraspPl);
03524
03525
03526
03527
03528
03529
03530
03531
03532 RobotArm::moveBothArms(leftGrasp, rightGrasp);
03533
03534 OperateHandleController::openGrippers();
03535
03536
03537
03538
03539
03540
03541
03542
03543 RobotArm::moveBothArms(leftGraspSub, rightGraspSub);
03544
03545
03546
03547
03548
03549
03550
03551
03552 RobotArm::moveBothArms(preLeft, preRight);
03553 }
03554
03555 ROS_INFO("Entering nop loop, spinning");
03556 if (0)
03557 while (ros::ok())
03558 {
03559
03560
03561
03562
03563
03564
03565
03566
03567
03568 pubPose(rightGrasp);
03569 printPose("rightGrasp" , rightGrasp);
03570 rt.sleep();
03571 ros::spinOnce();
03572 pubPose(leftGrasp);
03573 printPose("leftGrasp" , leftGrasp);
03574 rt.sleep();
03575 ros::spinOnce();
03576 }
03577
03578 }
03579
03580
03581 if (atoi(argv[1]) == -201)
03582 {
03583 while (ros::ok())
03584 {
03585 pr2_controllers_msgs::JointTrajectoryGoal goalAT = RobotArm::getInstance(0)->twoPointTrajectory(Poses::prepDishRT,Poses::prepDishRT);
03586 pr2_controllers_msgs::JointTrajectoryGoal goalBT = RobotArm::getInstance(1)->twoPointTrajectory(Poses::prepDishLT,Poses::prepDishLT);
03587 boost::thread t2T(&RobotArm::startTrajectory, RobotArm::getInstance(0), goalAT,true);
03588 boost::thread t3T(&RobotArm::startTrajectory, RobotArm::getInstance(1), goalBT,true);
03589 t2T.join();
03590 t3T.join();
03591
03592 pr2_controllers_msgs::JointTrajectoryGoal goalA = RobotArm::getInstance(0)->twoPointTrajectory(Poses::prepDishR1,Poses::prepDishR1);
03593 pr2_controllers_msgs::JointTrajectoryGoal goalB = RobotArm::getInstance(1)->twoPointTrajectory(Poses::prepDishL1,Poses::prepDishL1);
03594 boost::thread t2(&RobotArm::startTrajectory, RobotArm::getInstance(0), goalA,true);
03595 boost::thread t3(&RobotArm::startTrajectory, RobotArm::getInstance(1), goalB,true);
03596 t2.join();
03597 t3.join();
03598 }
03599
03600 }
03601
03602 if (atoi(argv[1]) == -202)
03603 {
03604 while (ros::ok())
03605 {
03606 RobotArm::getInstance(1)->universal_move_toolframe_ik(0.195, 0.215, 0.621, -0.438, 0.529, -0.163, 0.708,"base_link");
03607 RobotArm::getInstance(1)->universal_move_toolframe_ik(0.297, 0.357, 0.987, -0.457, 0.446, -0.339, 0.690,"base_link");
03608 }
03609 }
03610
03611 if (atoi(argv[1]) == -203)
03612 {
03613
03614 RobotHead::getInstance()->lookAt("/map",-1.625371,1.143165,0.833442,true);
03615
03616
03617 ros::Publisher ppub = node_handle_->advertise<geometry_msgs::PoseStamped>( "/bread_roi", 100, true );
03618 tf::Stamped<tf::Pose> roi_center;
03619 roi_center.frame_id_ = "/map";
03620 roi_center.setOrigin(btVector3(-1.7,1.28,0.833442));
03621 roi_center.setRotation(btQuaternion(0,0,0,1));
03622 pubPose(roi_center,ppub);
03623
03624 tf::Stamped<tf::Pose> midEdge;
03625 midEdge.frame_id_ = "map";
03626 midEdge.setRotation(btQuaternion(-0.473, 0.504, 0.504, 0.518));
03627
03628
03629 geometry_msgs::PoseStamped midpose = *(ros::topic::waitForMessage<geometry_msgs::PoseStamped>("/bread_pose"));
03630
03631 roi_center.setOrigin(btVector3(-1,-1,-1));
03632 pubPose(roi_center,ppub);
03633
03634 btVector3 pnt;
03635 tf::pointMsgToTF(midpose.pose.position,pnt);
03636
03637 RobotArm::getInstance(1)->universal_move_toolframe_ik(0.297, 0.357, 0.987, -0.457, 0.446, -0.339, 0.690,"base_link");
03638
03639 midEdge.setOrigin(pnt + btVector3(0,0,0.02) + btVector3(0,0,0.1));
03640 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(midEdge);
03641
03642 Gripper::getInstance(1)->open();
03643
03644 midEdge.setOrigin(pnt + btVector3(0,0,0.02) + btVector3(0,0,0));
03645 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(midEdge);
03646
03647 Gripper::getInstance(1)->updatePressureZero();
03648 Gripper::getInstance(1)->closeCompliant();
03649 Gripper::getInstance(1)->close(0.04);
03650
03651 midEdge.setOrigin(pnt + btVector3(0,0,0.02) + btVector3(0,0,0.05));
03652 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(midEdge);
03653
03654 tf::Stamped<tf::Pose> putdown;
03655 putdown.frame_id_ = "/map";
03656 putdown.setOrigin(btVector3(-1.595, 0.907, midEdge.getOrigin().z() + 0.03));
03657 putdown.setRotation(midEdge.getRotation());
03658
03659
03660 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(putdown);
03661
03662 putdown.setOrigin(btVector3(-1.595, 0.907, midEdge.getOrigin().z() - 0.02));
03663 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(putdown);
03664
03665 Gripper::getInstance(1)->open();
03666
03667 putdown.setOrigin(btVector3(-1.595, 0.907, midEdge.getOrigin().z() + 0.03));
03668 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(putdown);
03669
03670
03671
03672
03673 RobotArm::getInstance(1)->universal_move_toolframe_ik(0.297, 0.357, 0.987, -0.457, 0.446, -0.339, 0.690,"base_link");
03674
03675
03676
03677
03678 }
03679
03680
03681 if (atoi(argv[1]) == -204)
03682 {
03683
03684 RobotHead::getInstance()->lookAt("/map",-1.625371,1.143165,0.833442,true);
03685
03686 ros::Publisher ppub = node_handle_->advertise<geometry_msgs::PoseStamped>( "/bread_roi", 100, true );
03687 tf::Stamped<tf::Pose> roi_center;
03688 roi_center.frame_id_ = "/map";
03689 roi_center.setOrigin(btVector3(-1.7,1.28,0.833442));
03690 roi_center.setRotation(btQuaternion(0,0,0,1));
03691 pubPose(roi_center,ppub);
03692 ros::Rate rt(10);
03693 for (int j = 0; j < 50 ; j++)
03694 {
03695 rt.sleep();
03696 ros::spinOnce();
03697 }
03698
03699 }
03700
03701 if (atoi(argv[1]) == -205)
03702 {
03703
03704 RobotHead::getInstance()->lookAt("/map",-1.625371,1.143165,0.833442,true);
03705
03706
03707 ros::Publisher ppub = node_handle_->advertise<geometry_msgs::PoseStamped>( "/bread_roi", 100, true );
03708 tf::Stamped<tf::Pose> roi_center;
03709 roi_center.frame_id_ = "/map";
03710 roi_center.setOrigin(btVector3(-1,-1,-1));
03711 roi_center.setRotation(btQuaternion(0,0,0,1));
03712 pubPose(roi_center,ppub);
03713 ros::Rate rt(10);
03714 for (int j = 0; j < 50 ; j++)
03715 {
03716 rt.sleep();
03717 ros::spinOnce();
03718 }
03719 }
03720
03721
03722 if (atoi(argv[1]) == -133)
03723 {
03724 OperateHandleController::plateAttackPose();
03725
03726 RobotArm *arm = RobotArm::getInstance(atoi(argv[2]));
03727
03728 double x,y,z,ox,oy,oz,ow;
03729 x = atof(argv[3]);
03730 y = atof(argv[4]);
03731 z = atof(argv[5]);
03732 ox = atof(argv[6]);
03733 oy = atof(argv[7]);
03734 oz = atof(argv[8]);
03735 ow = atof(argv[9]);
03736 printf("moving tool to ik goal pos in map %f %f %f or %f %f %f %f \n", x,y,z,ox,oy,oz,ow);
03737 arm->universal_move_toolframe_ik(x,y,z,ox,oy,oz,ow,"map");
03738 double state[7];
03739 arm->getJointState(state);
03740
03741 double pose[7];
03742 for (int k = 0; k < 7; ++k)
03743 {
03744 pose[k] = state[k];
03745 ROS_INFO("k %i , state %f", k, pose[k]);
03746 }
03747 pose[0] = 0;
03748 double duration = 20;
03749
03750
03751
03752 arm->startTrajectory(arm->goalTraj(pose,duration));
03753 }
03754
03755
03756 if (atoi(argv[1]) == -210)
03757 {
03758
03759 Torso::getInstance()->up();
03760
03761 double numslices = atoi(argv[2]);
03762 double slicethickness = 0.02;
03763
03764
03765 boost::thread t0(&OperateHandleController::plateAttackPose);
03766
03767 RobotHead::getInstance()->lookAt("/slicer",0,0,-0.3);
03768
03769 tf::Stamped<tf::Pose> newBasePose;
03770 newBasePose.frame_id_ = "/map";
03771 newBasePose.setOrigin(btVector3(-2.679, 1.397, 0.052));
03772 newBasePose.setRotation(btQuaternion(-0.001, 0.000, 0.046, 0.999));
03773
03774 RobotDriver::getInstance()->driveInMap(newBasePose);
03775
03776 t0.join();
03777
03778 RobotHead::getInstance()->lookAt("/slicer",0,0,-0.3);
03779
03780
03781
03782
03783
03784
03785
03786
03787
03788
03789
03790
03791
03793
03794
03795 tf::Stamped<tf::Pose> leftEdge;
03796 leftEdge.setOrigin(btVector3(-2.032, 1.389, 1.121));
03797 leftEdge.frame_id_ = "map";
03798
03799 tf::Stamped<tf::Pose> rightEdge;
03800 rightEdge.setOrigin(btVector3(-2.106, 1.153, 0.901));
03801 rightEdge.frame_id_ = "map";
03802
03803 btVector3 rel = leftEdge.getOrigin() - rightEdge.getOrigin();
03804
03805 double at2 = atan2(rel.y(), rel.x());
03806
03807 double analog_synthesizer_tb = .303;
03808
03809 btQuaternion ori(btVector3(0,0,1), at2 + analog_synthesizer_tb);
03810
03811 tf::Stamped<tf::Pose> midEdge;
03812
03813 midEdge.frame_id_ = "map";
03814
03815 rightEdge.setRotation(ori);
03816 leftEdge.setRotation(ori);
03817 midEdge.setRotation(ori);
03818
03819 midEdge.setOrigin((rightEdge.getOrigin() + leftEdge.getOrigin()) * .5f);
03820
03821
03822
03823
03824
03825
03826
03827
03828 tf::Stamped<tf::Pose> pur;
03829 pur.setOrigin(btVector3(-0.2, 0.029, -0.109));
03830 pur.setRotation(btQuaternion(-0.014, 0.692, -0.007, 0.722));
03831 pur.frame_id_ = "slicer";
03832
03833
03834
03835
03836 tf::Stamped<tf::Pose> pre;
03837 pre.setOrigin(btVector3(-0.005, 0.191, -0.079));
03838 pre.setRotation(btQuaternion(0.004, 0.720, 0.022, 0.693));
03839 pre.frame_id_ = "slicer";
03840
03841
03842
03843
03844
03845 tf::Stamped<tf::Pose> post;
03846 post.setOrigin(btVector3(-0.005, -0.017, -0.079));
03847 post.setRotation(btQuaternion(-0.022, 0.738, 0.001, 0.675));
03848 post.frame_id_ = "slicer";
03849
03850
03851
03852
03853
03854 tf::Stamped<tf::Pose> butup;
03855 butup.setOrigin(btVector3(0.118, -0.037, 0.14));
03856 butup.setRotation(btQuaternion(-0.011, 0.705, 0.000, 0.709));
03857 butup.frame_id_ = "slicer";
03858 tf::Stamped<tf::Pose> butdown;
03859
03860
03861 butdown.setOrigin(btVector3(0.118, -0.037, 0.065));
03862 butdown.setRotation(btQuaternion(-0.011, 0.705, 0.000, 0.709));
03863 butdown.frame_id_ = "slicer";
03864
03865 RobotArm *rarm = RobotArm::getInstance(0);
03866 Gripper *rgrip = Gripper::getInstance(0);
03867 RobotArm *larm = RobotArm::getInstance(1);
03868 Gripper *lgrip = Gripper::getInstance(1);
03869
03870 ros::Rate onesec(1);
03871
03872 if (1)
03873 {
03874 tf::Stamped<tf::Pose> nextPoseR = pur;
03875 nextPoseR.setOrigin(pur.getOrigin() + btVector3(-numslices * slicethickness,0,0.15));
03876 rarm->universal_move_toolframe_ik_pose(nextPoseR);
03877 rgrip->open();
03878
03879 nextPoseR.setOrigin(pur.getOrigin() + btVector3(-numslices * slicethickness,0,0));
03880 rarm->universal_move_toolframe_ik_pose(nextPoseR);
03881 rgrip->close(0.04);
03882
03883
03884
03885
03886 boost::thread buttona(&RobotArm::move_toolframe_ik_pose, larm, butup);
03887
03888 nextPoseR.setOrigin(pur.getOrigin() + btVector3(-numslices * slicethickness -0.05,0,0.05));
03889 rarm->universal_move_toolframe_ik_pose(nextPoseR);
03890
03891 buttona.join();
03892
03893 lgrip->close();
03894
03895 boost::thread button(&RobotArm::move_toolframe_ik_pose, larm, butdown);
03896
03897 for (double nums = numslices; nums >= -1.0; nums-=1.0)
03898 {
03899
03900 nextPoseR = pre;
03901 nextPoseR.setOrigin(pre.getOrigin() + btVector3(-nums * slicethickness, 0,0));
03902 rarm->universal_move_toolframe_ik_pose(nextPoseR);
03903
03904 button.join();
03905
03906 onesec.sleep();
03907 onesec.sleep();
03908
03909 nextPoseR = post;
03910 nextPoseR.setOrigin(post.getOrigin() + btVector3(-nums * slicethickness, 0,0));
03911
03912 rarm->universal_move_toolframe_ik_pose(nextPoseR);
03913
03914
03915 if (nums > 0)
03916 {
03917 nextPoseR = pre;
03918 nextPoseR.setOrigin(pre.getOrigin() + btVector3(-nums * slicethickness, 0,0));
03919 rarm->universal_move_toolframe_ik_pose(nextPoseR);
03920 }
03921 }
03922
03923
03924
03925 boost::thread t2(&RobotArm::universal_move_toolframe_ik_pose,larm,butup);
03926
03927 nextPoseR.setOrigin(pur.getOrigin() + btVector3(0,0,0.15));
03928 rarm->universal_move_toolframe_ik_pose(nextPoseR);
03929 nextPoseR.setOrigin(pur.getOrigin() + btVector3(-0.02,0,0.02));
03930 rarm->universal_move_toolframe_ik_pose(nextPoseR);
03931 nextPoseR.setOrigin(pur.getOrigin() + btVector3(0.04,0,0.0));
03932 rarm->universal_move_toolframe_ik_pose(nextPoseR);
03933 rgrip->open();
03934 nextPoseR.setOrigin(pur.getOrigin() + btVector3(0,0,0.15));
03935 rarm->universal_move_toolframe_ik_pose(nextPoseR);
03936
03937 OperateHandleController::plateAttackPose();
03938
03939 }
03940
03941
03942 if (0)
03943 {
03944 larm->move_toolframe_ik_pose(butup);
03945 lgrip->close();
03946 larm->move_toolframe_ik_pose(butdown);
03947 onesec.sleep();
03948 onesec.sleep();
03949 onesec.sleep();
03950 larm->move_toolframe_ik_pose(butup);
03951 }
03952
03953
03954
03955 ros::Rate rt(10);
03956
03957 ROS_INFO("Entering nop loop, spinning");
03958 if (0)
03959 while (ros::ok())
03960 {
03961
03962
03963
03964
03965
03966
03967
03968
03969
03970 pubPose(midEdge);
03971 printPose("midEdge" , midEdge);
03972 rt.sleep();
03973 ros::spinOnce();
03974
03975
03976 rt.sleep();
03977 ros::spinOnce();
03978 }
03979
03980 }
03981
03982 if (atoi(argv[1]) == -211)
03983 {
03984
03985 Pressure::getInstance(0);
03986 Pressure::getInstance(1);
03987
03988 OperateHandleController::plateTuckPose();
03989
03990 tf::Stamped<tf::Pose> newBasePose;
03991 newBasePose.frame_id_ = "/map";
03992 newBasePose.setOrigin(btVector3(-2.679, 1.397, 0.052));
03993 newBasePose.setRotation(btQuaternion(-0.001, 0.000, 0.046, 0.999));
03994
03995 RobotDriver::getInstance()->driveInMap(newBasePose);
03996
03997 OperateHandleController::plateAttackPose();
03998
03999 tf::Stamped<tf::Pose> start;
04000 start.frame_id_ = "/map";
04001 start.setOrigin(btVector3(-2.144, 1.69, 0.889));
04002 start.setRotation(btQuaternion(-0.270, 0.666, -0.247, 0.650));
04003
04004 tf::Stamped<tf::Pose> end;
04005 end.frame_id_ = "/map";
04006 end.setOrigin(btVector3(-2.153, 1.573, 0.898));
04007 end.setRotation(btQuaternion(-0.270, 0.666, -0.247, 0.650));
04008
04009 OperateHandleController::singleSidedPick(1,start,end);
04010
04011 tf::Stamped<tf::Pose> larm = RobotArm::getInstance(1)->getToolPose("/map");
04012 btVector3 pos = larm.getOrigin();
04013 pos.setY(2.15);
04014 larm.setOrigin(pos);
04015
04016 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(larm);
04017
04018
04019 larm.setOrigin(btVector3(-2.278, 1.979, 0.87));
04020 larm.setRotation(btQuaternion(-0.671, 0.187, 0.279, 0.661));
04021
04022
04023
04024
04025 larm.setOrigin(btVector3(-2.226, 2.135, 0.87));
04026 larm.setRotation(btQuaternion(-0.376, 0.550, -0.068, 0.742));
04027 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(larm);
04028
04029
04030
04031
04032
04033 larm.setOrigin(btVector3(-2.300, 2.051, 0.87));
04034 larm.setRotation(btQuaternion(-0.533, 0.468, 0.116, 0.695));
04035 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(larm);
04036
04037
04038
04039 Gripper::getInstance(1)->open();
04040
04041
04042
04043 OperateHandleController::plateAttackPose();
04044
04045
04046
04047 RobotDriver::getInstance()->moveBaseP(-2.804, 1.95, 0.055, 0.998);
04048
04049 OperateHandleController::pickPlate(btVector3(-2.18, 1.95, 0.865),.26);
04050
04051 tf::Stamped<tf::Pose> basePos;
04052 RobotDriver::getInstance()->getRobotPose(basePos);
04053 basePos.setOrigin(basePos.getOrigin() + btVector3(-.15,0,0));
04054
04055 RobotDriver::getInstance()->driveInMap(basePos);
04056
04057 RobotDriver::getInstance()->moveBaseP(-3.390, -1.027, -0.697, 0.717);
04058
04059 OperateHandleController::spinnerL(0.25,0,-.25);
04060
04061 OperateHandleController::openGrippers();
04062
04063 OperateHandleController::plateAttackPose();
04064
04065
04066 }
04067 if (atoi(argv[1]) == -212)
04068 {
04069 Pressure::getInstance(0);
04070 Pressure::getInstance(1);
04071 OperateHandleController::plateAttackPose();
04072
04073 RobotDriver::getInstance()->moveBaseP(-2.685, 2.022,0,1);
04074 RobotHead::getInstance()->lookAt("/map",-1.8,1.6,.5,true);
04075
04076 tf::Stamped<tf::Pose> bowlPose_ = OperateHandleController::getBowlPose();
04077 btVector3 bowlPose = bowlPose_.getOrigin();
04078
04079
04080 bowlPose.setZ(.909);
04081
04082 tf::Stamped<tf::Pose> start;
04083 start.frame_id_ = "/map";
04084
04085 start.setOrigin(bowlPose - btVector3(.15,0,0));
04086 start.setRotation(btQuaternion(-0.631, 0.304, 0.379, 0.605));
04087 printPose("start", start);
04088
04089 tf::Stamped<tf::Pose> end;
04090 end.frame_id_ = "/map";
04091
04092 end.setOrigin(bowlPose - btVector3(0.05,0,0));
04093 end.setRotation(btQuaternion(-0.631, 0.304, 0.379, 0.605));
04094 printPose("end", end);
04095
04096 OperateHandleController::singleSidedPick(0,start,end);
04097
04098
04099
04100
04101 tf::Stamped<tf::Pose> pitch;
04102 pitch = RobotArm::getInstance(0)->getToolPose("/map");
04103 pitch.setRotation(btQuaternion(-0.615489,0.343613,0.456079,0.543226));
04104
04105 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(pitch);
04106
04107 tf::Stamped<tf::Pose> carry;
04108 carry.frame_id_ = "/base_link";
04109 carry.setOrigin(btVector3(0.347, -0.045, 0.986));
04110 carry.setRotation(btQuaternion(-0.610, -0.094, 0.737, 0.276));
04111 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(carry);
04112
04113 RobotDriver::getInstance()->moveBaseP(-2.981, 2.031, 0.002, 1.000);
04114
04115 RobotDriver::getInstance()->moveBaseP(-3.180, -1.117, -0.725, 0.689);
04116
04117 RobotArm::getInstance(0)->universal_move_toolframe_ik(-3.085, -1.792, 0.768, -0.371, 0.651, 0.132, 0.649,"/map");
04118
04119 Gripper::getInstance(0)->open();
04120
04121 OperateHandleController::plateAttackPose();
04122
04123 }
04124
04125
04126
04127
04128
04129 if (atoi(argv[1]) == -500)
04130 {
04131
04132 int idx = 0;
04133 if (argc > 1)
04134 idx = atoi(argv[2]);
04135
04136 ROS_INFO("INDEX TO DEMO :%i", idx);
04137
04138
04139
04140 switch (idx)
04141 {
04142
04143 case 0:
04144
04145 DemoScripts::sliceTheBread(3);
04146
04147 case 1:
04148
04149 DemoScripts::takeBreadPlate(0);
04150
04151 case 2:
04152
04153 DemoScripts::takeBowl(0);
04154
04155 }
04156 }
04157
04158
04159 if (atoi(argv[1]) == -304)
04160 {
04161
04162 if (argc != 10)
04163 {
04164 ROS_INFO("USAGE: bin/ias_drawer_executive -304 handleframe handlex handley handlz name_of_bagfile desired_trajectory_length arm (0 = right, 1 = left) handle orientation (0 = vertical, 1 = horizontal)" );
04165 exit (0);
04166 }
04167 {
04168
04169 tf::Stamped<tf::Pose> handleHint;
04170
04171 handleHint.setOrigin(btVector3(atof(argv[3]),atof(argv[4]),atof(argv[5])));
04172 handleHint.frame_id_ = argv[2];
04173 handleHint.setRotation(btQuaternion(0,0,0,1));
04174
04175 handleHint = Geometry::getPoseIn("/map", handleHint);
04176
04177 {
04178 RobotArm::getInstance(atoi(argv[8]))->bring_into_reach(handleHint);
04179 }
04180
04181 handleHint = Geometry::getPoseIn("/base_link", handleHint);
04182
04183 tf::Stamped<tf::Pose> handlePos = handleHint;
04184 if (atoi(argv[9]) == 0)
04185 handlePos.setRotation(btQuaternion(0,0,0,1));
04186 else
04187 handlePos.setRotation(btQuaternion(-0.7,0,0,0.7));
04188
04189 handlePos.setOrigin(handlePos.getOrigin() + btVector3(0,0,10));
04190
04191 while ((handlePos.getOrigin() - handleHint.getOrigin()).length() > 0.5)
04192 {
04193 handlePos = Perception3d::getHandlePoseFromLaser(handleHint);
04194 }
04195
04196 ros::Rate rt(10);
04197 int numsec = 5;
04198 while (ros::ok() && (--numsec > 0))
04199 {
04200 rt.sleep();
04201 ros::spinOnce();
04202 pubPose(handlePos);
04203 }
04204
04205 tf::Stamped<tf::Pose> preGraspPose = handlePos;
04206 preGraspPose = Geometry::getPoseIn("/base_link", preGraspPose);
04207 preGraspPose.setOrigin(preGraspPose.getOrigin() - btVector3(0.05,0,0));
04208 preGraspPose = Geometry::getPoseIn("/map", preGraspPose);
04209
04210 printPose("handlePos: ", handlePos);
04211 OperateHandleController::graspHandle(atoi(argv[8]), handlePos);
04212
04213 tf::Stamped<tf::Pose> actualGraspPose = RobotArm::getInstance(atoi(argv[8]))->getToolPose("/map");
04214
04215
04216
04217
04218 std::string arm;
04219 if (atoi(argv[8]) == 0)
04220 arm = "r";
04221 else
04222 arm = "l";
04223
04224 articulate(argv[6], atof(argv[7]), "/kinect_head_rgb_optical_frame", arm, "/kinect_head/camera/rgb/points");
04225
04226
04227 Gripper::getInstance(atoi(argv[8]))->open();
04228
04229 RobotArm::getInstance(atoi(argv[8]))->universal_move_toolframe_ik_pose(preGraspPose);
04230
04231 boost::thread t1(&Gripper::close, Gripper::getInstance(atoi(argv[8])), 0);
04232
04233 OperateHandleController::plateAttackPose();
04234 OperateHandleController::plateTuckPose();
04235 }
04236 }
04237
04238
04239 if (atoi(argv[1]) == -704)
04240 {
04241
04242 if (argc != 10)
04243 {
04244 ROS_INFO("USAGE: bin/ias_drawer_executive -304 handleframe handlex handley handlz name_of_bagfile desired_trajectory_length arm (0 = right, 1 = left) handle orientation (0 = vertical, 1 = horizontal)" );
04245 exit (0);
04246 }
04247 {
04248
04249 tf::Stamped<tf::Pose> handleHint;
04250
04251 handleHint.setOrigin(btVector3(atof(argv[3]),atof(argv[4]),atof(argv[5])));
04252 handleHint.frame_id_ = argv[2];
04253
04254 tf::Stamped<tf::Pose> preGraspPose = RobotArm::getInstance(atoi(argv[8]))->getToolPose("base_link");
04255
04256 preGraspPose = Geometry::getPoseIn("/base_link", preGraspPose);
04257 preGraspPose.setOrigin(preGraspPose.getOrigin() - btVector3(0.05,0,0));
04258 preGraspPose = Geometry::getPoseIn("/map", preGraspPose);
04259
04260
04261
04262
04263 tf::Stamped<tf::Pose> actualGraspPose = RobotArm::getInstance(atoi(argv[8]))->getToolPose("/map");
04264
04265
04266
04267
04268 std::string arm;
04269 if (atoi(argv[8]) == 0)
04270 arm = "r";
04271 else
04272 arm = "l";
04273
04274 articulate(argv[6], atof(argv[7]), "/kinect_head_rgb_optical_frame", arm, "/kinect_head/camera/rgb/points", false);
04275
04276
04277
04278
04279
04280
04281
04282
04283
04284
04285 }
04286 }
04287
04288
04289 if (atoi(argv[1]) == -705)
04290 {
04291
04292 if (argc != 10)
04293 {
04294 ROS_INFO("USAGE: bin/ias_drawer_executive -304 handleframe handlex handley handlz name_of_bagfile desired_trajectory_length arm (0 = right, 1 = left) handle orientation (0 = vertical, 1 = horizontal)" );
04295 exit (0);
04296 }
04297 {
04298
04299 tf::Stamped<tf::Pose> handleHint;
04300
04301 handleHint.setOrigin(btVector3(atof(argv[3]),atof(argv[4]),atof(argv[5])));
04302 handleHint.frame_id_ = argv[2];
04303
04304 tf::Stamped<tf::Pose> preGraspPose = RobotArm::getInstance(atoi(argv[8]))->getToolPose("base_link");
04305
04306 preGraspPose = Geometry::getPoseIn("/base_link", preGraspPose);
04307 preGraspPose.setOrigin(preGraspPose.getOrigin() - btVector3(0.05,0,0));
04308 preGraspPose = Geometry::getPoseIn("/map", preGraspPose);
04309
04310
04311
04312
04313 tf::Stamped<tf::Pose> actualGraspPose = RobotArm::getInstance(atoi(argv[8]))->getToolPose("/map");
04314
04315
04316
04317
04318 std::string arm;
04319 if (atoi(argv[8]) == 0)
04320 arm = "r";
04321 else
04322 arm = "l";
04323
04324 articulate(argv[6], atof(argv[7]), "/kinect_head_rgb_optical_frame", arm, "/kinect_head/camera/rgb/points", true);
04325
04326
04327 Gripper::getInstance(atoi(argv[8]))->open();
04328
04329 RobotArm::getInstance(atoi(argv[8]))->universal_move_toolframe_ik_pose(preGraspPose);
04330
04331 boost::thread t1(&Gripper::close, Gripper::getInstance(atoi(argv[8])), 0);
04332
04333 OperateHandleController::plateAttackPose();
04334 OperateHandleController::plateTuckPose();
04335 }
04336 }
04337
04338
04339 if (atoi(argv[1]) == -305)
04340 {
04341
04342 bool right = true;
04343
04344 while (ros::ok())
04345 {
04346 RobotHead::getInstance()->lookAt("/base_link",1,0,0.5);
04347
04348 right = !right;
04349
04350 if (!((argc > 2) && (atoi(argv[2]) == -1)))
04351 OperateHandleController::plateAttackPose();
04352
04353 tf::Stamped<tf::Pose> bowlPose = OperateHandleController::getBowlPose();
04354 pubPose(bowlPose);
04355 pubPose(bowlPose);
04356 pubPose(bowlPose);
04357 printPose("Bowl Pose", bowlPose);
04358
04359 if ((argc > 2) && (atoi(argv[2]) == -1))
04360 exit(0);
04361
04362 tf::Stamped<tf::Pose> prepur;
04363 prepur.setOrigin(btVector3(-0.015, -0.078, 0.067));
04364 prepur.setRotation(btQuaternion(0.726, 0.004, -0.686, -0.043));
04365 prepur.frame_id_ = "bowly";
04366 btTransform prepur_ = bowlPose * prepur;
04367
04368 tf::Stamped<tf::Pose> pur;
04369 pur.setOrigin(btVector3(-0.015, -0.078, 0.017));
04370 pur.setRotation(btQuaternion(0.726, 0.004, -0.686, -0.043));
04371 pur.frame_id_ = "bowly";
04372 btTransform pur_ = bowlPose * pur;
04373
04374 tf::Stamped<tf::Pose> pickup;
04375 pickup.frame_id_ = "map";
04376 pickup.setOrigin(pur_.getOrigin());
04377 pickup.setRotation(pur_.getRotation());
04378
04379 tf::Stamped<tf::Pose> prepickup;
04380 prepickup.frame_id_ = "map";
04381 prepickup.setOrigin(prepur_.getOrigin());
04382 prepickup.setRotation(prepur_.getRotation());
04383
04384 RobotArm *arm = RobotArm::getInstance(right ? 0 : 1);
04385 arm->time_to_target = 0;
04386 Gripper *grip = Gripper::getInstance(right ? 0 : 1);
04387
04388 boost::thread t1(&Gripper::open, grip, 0.09);
04389
04390 Pressure::getInstance(right ? 0 : 1)->reset();
04391 arm->universal_move_toolframe_ik_pose(prepickup);
04392
04393 t1.join();
04394
04395 arm->universal_move_toolframe_ik_pose(pickup);
04396 {
04397 RobotArm *arm = RobotArm::getInstance(right ? 0 : 1);
04398 tf::Stamped<tf::Pose> toolPose = arm->getToolPose("map");
04399
04400 btTransform pur;
04401 pur.setOrigin(btVector3(-0.015, -0.078, 0.017));
04402 pur.setRotation(btQuaternion(0.726, 0.004, -0.686, -0.043));
04403
04404 btTransform tool;
04405 tool.setOrigin(toolPose.getOrigin());
04406 tool.setRotation(toolPose.getRotation());
04407
04408 btTransform id;
04409 id.setIdentity();
04410 pur = pur.inverseTimes(id);
04411
04412 btTransform bowl = tool * pur;
04413
04414
04415 bowlPose.frame_id_ = "/map";
04416 bowlPose.setOrigin(bowl.getOrigin());
04417 bowlPose.setRotation(bowl.getRotation());
04418
04419 pubPose(bowlPose);
04420 printPose("Bowl Pose calc", bowlPose);
04421 }
04422
04423 grip->closeCompliant();
04424 grip->close();
04425
04426 arm->stabilize_grip();
04427
04428 tf::Stamped<tf::Pose> tpush = arm->getToolPose("/map");
04429 tpush.setOrigin(tpush.getOrigin() + btVector3(0,0,-.02));
04430 arm->universal_move_toolframe_ik_pose(tpush);
04431
04432 arm->stabilize_grip();
04433
04434 tf::Stamped<tf::Pose> tp = arm->getToolPose("/map");
04435 tf::Stamped<tf::Pose> tp_high = arm->getToolPose("/map");
04436 tp_high = Geometry::getPoseIn("/base_link",tp_high);
04437
04438 tp_high.setOrigin(tp_high.getOrigin() + btVector3(-.1,0,0.1));
04439
04440 arm->universal_move_toolframe_ik_pose(tp_high);
04441
04442 if (argc > 2)
04443 exit(0);
04444
04445 arm->universal_move_toolframe_ik_pose(tp);
04446 grip->open();
04447 arm->universal_move_toolframe_ik_pose(prepickup);
04448
04449 OperateHandleController::plateAttackPose();
04450
04451
04452 }
04453 }
04454
04455
04456 if (atoi(argv[1]) == -306)
04457 {
04458
04459 int currside = atoi(argv[2]);
04460
04461 bool closingCalibrated[2] = {false, false};
04462 double minClosing[2] = {0.0025, 0.0025};
04463
04464 while (ros::ok())
04465 {
04466
04467 RobotHead::getInstance()->lookAt("/base_link",1,0,0.5);
04468
04469 tf::Stamped<tf::Pose> bowlPose;
04470 pubPose(bowlPose);
04471 printPose("Bowl Pose vision", bowlPose);
04472
04473 RobotArm *arm = RobotArm::getInstance(currside);
04474 Gripper *gripper = Gripper::getInstance(currside);
04475
04476 tf::Stamped<tf::Pose> toolPose = arm->getToolPose("map");
04477
04478 btTransform pur;
04479 pur.setOrigin(btVector3(-0.015, -0.078, 0.017));
04480 pur.setRotation(btQuaternion(0.726, 0.004, -0.686, -0.043));
04481
04482 btTransform tool;
04483 tool.setOrigin(toolPose.getOrigin());
04484 tool.setRotation(toolPose.getRotation());
04485
04486 btTransform id;
04487 id.setIdentity();
04488 pur = pur.inverseTimes(id);
04489
04490 btTransform bowl = tool * pur;
04491
04492
04493 bowlPose.frame_id_ = "/map";
04494 bowlPose.setOrigin(bowl.getOrigin());
04495 bowlPose.setRotation(bowl.getRotation());
04496
04497
04498
04499
04500
04501 arm->time_to_target = 0.3;
04502
04503 ros::Rate rt(2);
04504
04505
04506 tf::Stamped<tf::Pose> bestPose = turnToSide(currside,toolPose,bowlPose);
04507
04508 arm->universal_move_toolframe_ik_pose(bestPose);
04509
04510
04511 tf::Stamped<tf::Pose> straightPose = turnBowlStraight(currside, bowlPose);
04512 straightPose = turnToSide(currside,straightPose,bowlPose);
04513
04514 arm->universal_move_toolframe_ik_pose(straightPose);
04515
04516 tf::Stamped<tf::Pose> worstPose = turnToSide(currside ? 0 : 1,straightPose,bowlPose);
04517
04518 RobotArm *otherarm = RobotArm::getInstance(currside ? 0 : 1);
04519
04520 tf::Stamped<tf::Pose> highapp = worstPose;
04521 highapp.setOrigin(worstPose.getOrigin() + btVector3(0,0,0.05));
04522 Gripper *othergripper = Gripper::getInstance(currside ? 0 : 1);
04523
04524 otherarm->universal_move_toolframe_ik_pose(highapp);
04525
04526 double amountopen = 0;
04527 double additional_depth = -.014;
04528 while (amountopen < minClosing[currside ? 0 : 1] + 0.003)
04529 {
04530 othergripper->open();
04531 tf::Stamped<tf::Pose> grasppose = worstPose;
04532 grasppose.setOrigin(worstPose.getOrigin() + btVector3(0,0,additional_depth));
04533 otherarm->universal_move_toolframe_ik_pose(grasppose);
04534 othergripper->closeCompliant();
04535 othergripper->close();
04536 ROS_INFO("Amount open %f", othergripper->getAmountOpen());
04537 amountopen = othergripper->getAmountOpen();
04538 additional_depth -= 0.025;
04539 }
04540 otherarm->stabilize_grip();
04541
04542 tf::Stamped<tf::Pose> highleave = bestPose;
04543 highleave.setOrigin(bestPose.getOrigin() + btVector3(0,0,0.05));
04544 ros::Duration(0.5).sleep();
04545 gripper->open();
04546 arm->universal_move_toolframe_ik_pose(highleave);
04547
04548 boost::thread t1(&Gripper::close, gripper, 0);
04549
04550 currside ? OperateHandleController::plateAttackPoseLeft() : OperateHandleController::plateAttackPoseRight();
04551
04552 t1.join();
04553 closingCalibrated[currside] = true;
04554 minClosing[currside] = gripper->getAmountOpen();
04555
04556 currside = currside ? 0 : 1;
04557
04558 }
04559
04560 }
04561
04562
04563 if (atoi(argv[1]) == -307)
04564 {
04565
04566 int currside = atoi(argv[2]);
04567
04568 while (ros::ok())
04569 {
04570
04571 RobotHead::getInstance()->lookAt("/base_link",1,0,0.5);
04572
04573 RobotArm *arm = RobotArm::getInstance(currside);
04574
04575 tf::Stamped<tf::Pose> bowlPose = OperateHandleController::getBowlPose();
04576 bowlPose = Geometry::getPoseIn("/base_link", bowlPose);
04577 pubPose(bowlPose);
04578 printPose("Bowl Pose vision", bowlPose);
04579
04580 tf::Stamped<tf::Pose> bowlInBase = Geometry::getPoseIn("/base_link", bowlPose);
04581
04582
04583 tf::Stamped<tf::Pose> bowlCorrected = bowlPose;
04584 bowlCorrected.setRotation(bowlInBase.getRotation().inverse() * bowlPose.getRotation());
04585
04586 pubPose(bowlCorrected);
04587 pubPose(bowlCorrected);
04588 pubPose(bowlCorrected);
04589 printPose("Bowl Pose corrected", bowlCorrected);
04590
04591 tf::Stamped<tf::Pose> newToolPose = arm->getToolPose("/base_link");
04592 printPose("Tool Pose", newToolPose);
04593 btQuaternion cor = bowlInBase.getRotation().inverse();
04594
04595 printPose("Bowl Pose", bowlInBase);
04596 tf::Stamped<tf::Pose> act = Geometry::rotateAroundPose(newToolPose, bowlInBase, cor);
04597 printPose("act Pose", act);
04598
04599 newToolPose.setRotation(bowlInBase.getRotation().inverse() * newToolPose.getRotation());
04600
04601 printPose("nt Pose (rot)", newToolPose);
04602
04603 arm->universal_move_toolframe_ik_pose(act);
04604
04605 exit(0);
04606
04607 }
04608 }
04609
04610 if (atoi(argv[1]) == -310)
04611 {
04612 releaseWhenPulled(atoi(argv[2]));
04613 }
04614
04615
04616 if (atoi(argv[1]) == -600)
04617 {
04618
04619 int idx = 0;
04620 if (argc > 1)
04621 idx = atoi(argv[2]);
04622
04623 ROS_INFO("INDEX TO DEMO :%i", idx);
04624
04625
04626
04627 switch (idx)
04628 {
04629 case 0:
04630
04631 case 2:
04632
04633 DemoScripts::takeBottleFromFridge();
04634
04635 case 3:
04636
04637 DemoScripts::serveBottle();
04638
04639 case 4:
04640
04641 DemoScripts::openDrawer();
04642
04643 case 5:
04644
04645 DemoScripts::takePlate();
04646
04647 case 6:
04648 {
04649 RobotHead::getInstance()->lookAtThreaded("/map", -1.85, 2.1, 1);
04650 DemoScripts::servePlateToIsland();
04651 }
04652
04653 case 7:
04654
04655 DemoScripts::takeSilverware();
04656
04657
04658 case 8:
04659 {
04660 RobotHead::getInstance()->lookAtThreaded("/map", -1.85, 2.1, 1);
04661 DemoScripts::servePlateToIsland();
04662 }
04663
04664 }
04665 }
04666
04667 if (atoi(argv[1]) == -601)
04668 {
04669
04670 int idx = 0;
04671 if (argc > 1)
04672 idx = atoi(argv[2]);
04673
04674 ROS_INFO("INDEX TO DEMO :%i", idx);
04675
04676
04677
04678 switch (idx)
04679 {
04680 case 0:
04681
04682 case 2:
04683
04684 DemoScripts::takeBottleFromFridge();
04685
04686 case 3:
04687
04688 DemoScripts::serveBottle();
04689
04690 case 4:
04691
04692 DemoScripts::openDrawer();
04693
04694 case 5:
04695
04696 DemoScripts::takePlate();
04697
04698 case 6:
04699 {
04700 RobotHead::getInstance()->lookAtThreaded("/map", -1.85, 2.1, 1);
04701 DemoScripts::servePlateToIsland();
04702 }
04703
04704 case 7:
04705
04706 DemoScripts::takeSilverware();
04707
04708 case 9:
04709 {
04710 RobotHead::getInstance()->lookAtThreaded("/map", .33, -2, 1);
04711 DemoScripts::serveToTable2();
04712 }
04713
04714 case 10:
04715 DemoScripts::takePlateFromIsland();
04716
04717 case 11:
04718 {
04719 RobotHead::getInstance()->lookAtThreaded("/map", .33, -2, 1);
04720 DemoScripts::serveToTable2();
04721 }
04722
04723
04724
04725 }
04726 }
04727
04728
04729 if (atoi(argv[1]) == -602)
04730 {
04731
04732 tf::Stamped<tf::Pose> rP = RobotArm::getInstance(0)->getToolPose("base_link");
04733 rP.setOrigin(rP.getOrigin() + btVector3(0,-.025,0.03));
04734 rP = Geometry::getPoseIn("map", rP);
04735
04736 tf::Stamped<tf::Pose> lP = RobotArm::getInstance(1)->getToolPose("base_link");
04737 lP.setOrigin(lP.getOrigin() + btVector3(0,0.025,0.03));
04738 lP = Geometry::getPoseIn("map", lP);
04739
04740 RobotArm::getInstance(0)->universal_move_toolframe_ik_pose(rP);
04741 RobotArm::getInstance(1)->universal_move_toolframe_ik_pose(lP);
04742 }
04743
04744
04745 if (atoi(argv[1]) == -603)
04746 {
04747 while (ros::ok())
04748
04749 {
04750
04751 tf::Stamped<tf::Pose> cam = Geometry::getPose("/map","/openni_rgb_optical_frame");
04752 tf::Stamped<tf::Pose> grip = Geometry::getPose("map","/r_gripper_tool_frame");
04753
04754 geometry_msgs::PoseStamped camPS;
04755 tf::poseStampedTFToMsg(cam,camPS);
04756
04757 geometry_msgs::PoseStamped gripPS;
04758 tf::poseStampedTFToMsg(grip,gripPS);
04759
04760 sensor_msgs::PointCloud2 pc = *(ros::topic::waitForMessage<sensor_msgs::PointCloud2>("/kinect/cloud_throttled"));
04761
04762 tf::Stamped<tf::Pose> net_stamped = Geometry::getPose("/r_gripper_tool_frame","/openni_rgb_optical_frame");
04763 tf::Transform net_transform;
04764 net_transform.setOrigin(net_stamped.getOrigin());
04765 net_transform.setRotation(net_stamped.getRotation());
04766
04767 sensor_msgs::PointCloud2 pct;
04768
04769 pcl_ros::transformPointCloud("/r_gripper_tool_frame",net_transform,pc,pct);
04770 pct.header.frame_id = "/map";
04771
04772
04773
04774
04775
04776
04777
04778 ros::Publisher pct_pub = node_handle.advertise<sensor_msgs::PointCloud2>( "/pct", 10 , true);
04779
04780 pct_pub.publish(pct);
04781
04782 ros::Rate rt(5.0);
04783
04784 while (ros::ok())
04785 {
04786 rt.sleep();
04787 ros::spinOnce();
04788 }
04789
04790
04791 if (0)
04792 {
04793 namespace ser = ros::serialization;
04794
04795
04796
04797
04798 uint32_t serial_size = ros::serialization::serializationLength(pc);
04799 boost::shared_array<uint8_t> buffer(new uint8_t[serial_size]);
04800
04801 ser::OStream stream(buffer.get(), serial_size);
04802 ser::serialize(stream, pc);
04803
04804 ROS_INFO("RECEIVED CLOUD %i", serial_size);
04805
04806
04807 ofstream outfile;
04808
04809 outfile.open ("test.txt");
04810
04811
04812
04813
04814
04815
04816 outfile.close();
04817
04818
04819
04820
04821
04822 {
04823
04824 sensor_msgs::PointCloud2 pco;
04825
04826
04827
04828
04829 ser::IStream stream(buffer.get(), serial_size);
04830
04831 ros::serialization::Serializer<sensor_msgs::PointCloud2>::read(stream, pco);
04832
04833 ROS_INFO("data size : %zu %zu", pco.data.size(), pc.data.size());
04834 }
04835 }
04836
04837 return 0;
04838
04839 }
04840 }
04841
04842 if (atoi(argv[1]) == -604)
04843 {
04844
04845 ros::Publisher pcm_pub_in = node_handle.advertise<sensor_msgs::PointCloud2>( "/pc_inlier", 10 , true);
04846 ros::Publisher pcm_pub_out = node_handle.advertise<sensor_msgs::PointCloud2>( "/pc_outlier", 10 , true);
04847
04848
04849 while (ros::ok())
04850 {
04851
04852
04853
04854
04855
04856
04857
04858
04859
04860 boost::shared_ptr<const sensor_msgs::PointCloud2> pca;
04861 boost::shared_ptr<const sensor_msgs::PointCloud2> pcb;
04862
04863 ros::Rate rt(5.0);
04864
04865 pca = ros::topic::waitForMessage<sensor_msgs::PointCloud2>("/pc");
04866
04867 ROS_INFO("Spinning");
04868
04869 while (ros::ok())
04870 {
04871
04872 pcb = pca;
04873 pca = ros::topic::waitForMessage<sensor_msgs::PointCloud2>("/pc");
04874
04875 ROS_INFO("got two clouds");
04876
04877 pcl::PointCloud<pcl::PointXYZRGB> clouda;
04878 pcl::PointCloud<pcl::PointXYZRGB> cloudb;
04879
04880 pcl::PointCloud<pcl::PointXYZRGB> cloudinlier;
04881 pcl::PointCloud<pcl::PointXYZRGB> cloudoutlier;
04882
04883 pcl::fromROSMsg(*pca,clouda);
04884 pcl::fromROSMsg(*pcb,cloudb);
04885
04886
04887
04888 pcl::KdTree<pcl::PointXYZRGB>::Ptr tree;
04889 tree.reset (new pcl::KdTreeFLANN<pcl::PointXYZRGB>);
04890 tree->setInputCloud (boost::make_shared<pcl::PointCloud<pcl::PointXYZRGB> >(clouda));
04891
04892
04893
04894 std::vector<int> nn_indices (1);
04895 std::vector<float> nn_sqr_dists (1);
04896
04897 double distance_threshold = 0.01;
04898 for (size_t k = 0; k < cloudb.points.size(); ++k )
04899 {
04900
04901 if (tree->radiusSearch (cloudb.points[k], distance_threshold, nn_indices,nn_sqr_dists, 1) != 0)
04902 {
04903
04904 cloudinlier.points.push_back(cloudb.points[k]);
04905 }
04906 else
04907 {
04908 cloudoutlier.points.push_back(cloudb.points[k]);
04909 }
04910 }
04911
04912 sensor_msgs::PointCloud2 outliermsg;
04913 sensor_msgs::PointCloud2 inliermsg;
04914
04915 pcl::toROSMsg(cloudoutlier,outliermsg);
04916 outliermsg.header = pcb->header;
04917 pcm_pub_out.publish(outliermsg);
04918
04919 pcl::toROSMsg(cloudinlier,inliermsg);
04920 inliermsg.header = pcb->header;
04921 pcm_pub_in.publish(inliermsg);
04922
04923 rt.sleep();
04924 ros::spinOnce();
04925 }
04926
04927 return 0;
04928
04929 }
04930 }
04931
04932 if (atoi(argv[1]) == -605)
04933 {
04934
04935
04936
04937
04938
04939
04940
04941
04942
04943
04944 btTransform t[1000];
04945
04946 t[0].setOrigin(btVector3(0.896, -0.185, 0.931));
04947 t[0].setRotation(btQuaternion(-0.007, -0.352, 0.003, 0.936));
04948 t[1].setOrigin(btVector3(0.896, -0.185, 0.92));
04949 t[1].setRotation(btQuaternion(-0.007, -0.352, 0.003, 0.936));
04950
04951 {
04952 tf::Stamped<tf::Pose> secondlast;
04953 secondlast.frame_id_ = "/base_link";
04954 secondlast.setOrigin(t[0].getOrigin());
04955 secondlast.setRotation(t[0].getRotation());
04956 tf::Stamped<tf::Pose> last;
04957 last.frame_id_ = "/base_link";
04958 last.setOrigin(t[1].getOrigin());
04959 last.setRotation(t[1].getRotation());
04960 double dist = reachable_distance(secondlast,last);
04961 ROS_INFO("REACHABLE DISTANCE %f", dist);
04962
04963 }
04964
04965 ROS_INFO("START");
04966 bool reachable = true;
04967
04968 double distance = 0;
04969
04970 for (int k = 2; reachable && (k < 1000); ++k)
04971 {
04972 t[k] = t[k-1] * (t[0].inverseTimes(t[1]));
04973 tf::Stamped<tf::Pose> act;
04974 act.frame_id_ = "/base_link";
04975 act.setOrigin(t[k].getOrigin());
04976 act.setRotation(t[k].getRotation());
04977
04978 printPose("interpolated", act);
04979 geometry_msgs::PoseStamped pose;
04980 double start_angles[7];
04981 double solution[7];
04982 tf::poseStampedTFToMsg(RobotArm::getInstance(0)->tool2wrist(act),pose);
04983 reachable &= RobotArm::getInstance(0)->run_ik(pose,start_angles,solution,"r_wrist_roll_link");
04984 if (reachable)
04985 distance += (t[k].getOrigin() - t[k-1].getOrigin()).length();
04986 ROS_INFO(reachable ? "reachable %f" : "not reachable %f", distance);
04987 }
04988
04989
04990
04991
04992
04993
04994 ROS_INFO("END");
04995 }
04996
04997
04998
04999
05000
05001
05002
05003
05004
05005 if (atoi(argv[1]) == -606)
05006 {
05007
05008 mangle(argv[2]);
05009
05010 }
05011
05012 if (atoi(argv[1]) == -607)
05013 {
05014 btVector3 hint(atof(argv[2]),atof(argv[3]),atof(argv[4]));
05015
05016
05017 tf::Stamped<tf::Pose> handleHint;
05018
05019 handleHint.setOrigin(hint);
05020 handleHint.frame_id_ = "/map";
05021
05022 handleHint = Geometry::getPoseIn("/map", handleHint);
05023
05024 if (0)
05025 {
05026 RobotArm::getInstance(atoi(argv[8]))->bring_into_reach(handleHint);
05027 }
05028
05029 handleHint = Geometry::getPoseIn("/base_link", handleHint);
05030
05031 ros::Time start = ros::Time::now();
05032
05033 tf::Stamped<tf::Pose> handlePos = handleHint;
05034 if (atoi(argv[9]) == 0)
05035 handlePos.setRotation(btQuaternion(0,0,0,1));
05036 else
05037 handlePos.setRotation(btQuaternion(-0.7,0,0,0.7));
05038
05039 handlePos.setOrigin(handlePos.getOrigin() + btVector3(0,0,10));
05040
05041 while (((handlePos.getOrigin() - handleHint.getOrigin()).length() > 0.5) && (ros::Time::now() - start < ros::Duration(60)))
05042 {
05043 handlePos = Perception3d::getHandlePoseFromLaser(handleHint, 30);
05044 }
05045
05046 printPose("pose in map", Geometry::getPoseIn("/map",handlePos));
05047
05048 if ((handlePos.getOrigin() - handleHint.getOrigin()).length() == 0)
05049 ROS_INFO("FAIL");
05050 else
05051 ROS_INFO("SUCCESS: %f ", (handlePos.getOrigin() - handleHint.getOrigin()).length() );
05052
05053 }
05054
05055 if (atoi(argv[1]) == -608)
05056 {
05057
05058 srand ( time(NULL) );
05059 ros::Publisher vis_pub;
05060 ros::NodeHandle nh_;
05061 vis_pub = nh_.advertise<visualization_msgs::Marker>( "find_base_pose_markers", 10000, true );
05062 int markerCnt =0;
05063
05064 btVector3 hint(atof(argv[2]),atof(argv[3]),atof(argv[4]));
05065
05066
05067 tf::Stamped<tf::Pose> inFront;
05068 inFront.frame_id_ = "/map";
05069 inFront.setOrigin(btVector3(0.295, 0.387, 0.051));
05070 inFront.setRotation(btQuaternion(0.000, -0.001, 0.037, 0.999));
05071
05072 RobotDriver::getInstance()->driveInMap(inFront);
05073
05074 inFront = Geometry::getPoseIn("/base_link", inFront);
05075
05076 std::vector<tf::Stamped<tf::Pose> > poses;
05077
05078 for (double x = 0; x >= - .5; x -= 0.25)
05079 for (double y = -0.35; y <= 0.35; y += 0.35)
05080 {
05081
05082 }
05083 }
05084
05085 if (atoi(argv[1]) == -609)
05086 {
05087
05088 srand ( time(NULL) );
05089 ros::Publisher vis_pub;
05090 ros::NodeHandle nh_;
05091 vis_pub = nh_.advertise<visualization_msgs::Marker>( "find_base_pose_markers", 10000, true );
05092 int markerCnt =0;
05093
05094 btVector3 hint(atof(argv[2]),atof(argv[3]),atof(argv[4]));
05095
05096
05097 while (ros::ok())
05098 {
05099 double x = ((rand() % 10000) / 5000.0f) - 1;
05100 double y = ((rand() % 10000) / 5000.0f) - 1;
05101 double angle = ((rand() % 10000) / (1000.0f));
05102 btQuaternion quat(btVector3(0,0,1), angle);
05103
05104 tf::Pose pose;
05105 pose.setOrigin(btVector3(hint.x() - x * 0.75 - 0.85 ,hint.y() + y * 1,0));
05106 pose.setRotation(quat);
05107
05108 tf::Stamped<tf::Pose> current;
05109 RobotDriver::getInstance()->getRobotPose(current);
05110
05111 double colr = 0;
05112 double colg = 1;
05113 double colb = 0;
05114
05115
05116
05117 btTransform relative = current.inverseTimes(pose);
05118 colr = 1;
05119 colg = 0;
05120 colb = 0;
05121 tf::Pose rel;
05122 rel.setOrigin(current.getOrigin());
05123 rel.setRotation(btQuaternion(btVector3(0,0,1),atan2( pose.getOrigin().y() - current.getOrigin().y(), pose.getOrigin().x() - current.getOrigin().x())));
05124 rel.setRotation(relative.getRotation());
05125
05126
05127
05128 tf::Pose handle;
05129 handle.setOrigin(hint);
05130 tf::Pose handleInNext = pose.inverseTimes(handle);
05131 double fangle = atan2(handleInNext.getOrigin().y(), handleInNext.getOrigin().x());
05132 {
05133 visualization_msgs::Marker marker;
05134 marker.header.frame_id = "/map";
05135 marker.header.stamp = ros::Time::now();
05136 marker.ns = "target base footprints";
05137 marker.id = ++markerCnt;
05138 marker.type = visualization_msgs::Marker::ARROW;
05139 marker.action = visualization_msgs::Marker::ADD;
05140 marker.pose.position.x = pose.getOrigin().x();
05141 marker.pose.position.y = pose.getOrigin().y();
05142 marker.pose.position.z = pose.getOrigin().z();
05143 marker.pose.orientation.x =pose.getRotation().x();
05144 marker.pose.orientation.y = pose.getRotation().y();
05145 marker.pose.orientation.z = pose.getRotation().z();
05146 marker.pose.orientation.w = pose.getRotation().w();
05147
05148 marker.scale.x = .25;
05149 marker.scale.y = 0.15;
05150 marker.scale.z = 0.15;
05151 marker.color.a = 1;
05152 if ((handleInNext.getOrigin().x() > 1) || (handleInNext.getOrigin().x() < 0) ||
05153 (fabs(handleInNext.getOrigin().y()) > 0.5))
05154 colr = 0;
05155 if (fabs(fangle) > M_PI / 2.0f)
05156 colr = 0;
05157 marker.color.r = colr;
05158 marker.color.g = colg;
05159 marker.color.b = colb;
05160 vis_pub.publish( marker );
05161 ros::spinOnce();
05162 }
05163
05164 ros::Duration(0.1).sleep();
05165
05166 if (0)
05167 {
05168 tf::Stamped<tf::Pose> relativeS;
05169 relativeS.setOrigin(rel.getOrigin() + btVector3(0.01,0.01,0));
05170 relativeS.setRotation(rel.getRotation());
05171 relativeS.frame_id_ = "/map";
05172 RobotDriver::getInstance()->driveInMap(relativeS,false);
05173
05174 tf::Stamped<tf::Pose> goalPose;
05175 goalPose.frame_id_ = "/map";
05176 goalPose.setOrigin(pose.getOrigin());
05177 goalPose.setRotation(pose.getRotation());
05178
05179 bool free = RobotDriver::getInstance()->checkCollision(goalPose);
05180 ROS_INFO("Free: %s", free ? "YES FREE" : "no.");
05181
05182 if (free)
05183 {
05184
05185 RobotDriver::getInstance()->driveInMap(goalPose);
05186
05187 btVector3 hint(atof(argv[2]),atof(argv[3]),atof(argv[4]));
05188
05189 tf::Stamped<tf::Pose> handleHint;
05190
05191 handleHint.setOrigin(hint);
05192 handleHint.frame_id_ = "/map";
05193
05194 handleHint = Geometry::getPoseIn("/map", handleHint);
05195
05196 if (0)
05197 {
05198 RobotArm::getInstance(atoi(argv[8]))->bring_into_reach(handleHint);
05199 }
05200
05201 handleHint = Geometry::getPoseIn("/base_link", handleHint);
05202
05203 ros::Time start = ros::Time::now();
05204
05205 tf::Stamped<tf::Pose> handlePos = handleHint;
05206 if (atoi(argv[9]) == 0)
05207 handlePos.setRotation(btQuaternion(0,0,0,1));
05208 else
05209 handlePos.setRotation(btQuaternion(-0.7,0,0,0.7));
05210
05211 handlePos.setOrigin(handlePos.getOrigin() + btVector3(0,0,10));
05212
05213
05214
05215 handlePos = Perception3d::getHandlePoseFromLaser(handleHint, 30);
05216
05217
05218 printPose("pose in map", Geometry::getPoseIn("/map",handlePos));
05219
05220 if (((handlePos.getOrigin() - handleHint.getOrigin()).length() > 0.2) || ((handlePos.getOrigin() - handleHint.getOrigin()).length() == 0.0))
05221 {
05222 ROS_INFO("FAIL");
05223 {
05224 visualization_msgs::Marker marker;
05225 marker.header.frame_id = "/map";
05226 marker.header.stamp = ros::Time::now();
05227 marker.ns = "target base footprints";
05228 marker.id = ++markerCnt;
05229 marker.type = visualization_msgs::Marker::ARROW;
05230 marker.action = visualization_msgs::Marker::ADD;
05231 marker.pose.position.x = pose.getOrigin().x();
05232 marker.pose.position.y = pose.getOrigin().y();
05233 marker.pose.position.z = pose.getOrigin().z();
05234 marker.pose.orientation.x = pose.getRotation().x();
05235 marker.pose.orientation.y = pose.getRotation().y();
05236 marker.pose.orientation.z = pose.getRotation().z();
05237 marker.pose.orientation.w = pose.getRotation().w();
05238 marker.scale.x = 0.15;
05239 marker.scale.y = 0.55;
05240 marker.scale.z = 0.55;
05241 marker.color.a = 1;
05242 marker.color.r = 1.0;
05243 marker.color.g = 0.1;
05244 marker.color.b = 0.1;
05245 vis_pub.publish( marker );
05246 ros::spinOnce();
05247 }
05248 }
05249 else
05250 {
05251 ROS_INFO("SUCCESS: %f ", (handlePos.getOrigin() - handleHint.getOrigin()).length() );
05252 {
05253 visualization_msgs::Marker marker;
05254 marker.header.frame_id = "/map";
05255 marker.header.stamp = ros::Time::now();
05256 marker.ns = "target base footprints";
05257 marker.id = ++markerCnt;
05258 marker.type = visualization_msgs::Marker::ARROW;
05259 marker.action = visualization_msgs::Marker::ADD;
05260 marker.pose.position.x = pose.getOrigin().x();
05261 marker.pose.position.y = pose.getOrigin().y();
05262 marker.pose.position.z = pose.getOrigin().z();
05263 marker.pose.orientation.x = pose.getRotation().x();
05264 marker.pose.orientation.y = pose.getRotation().y();
05265 marker.pose.orientation.z = pose.getRotation().z();
05266 marker.pose.orientation.w = pose.getRotation().w();
05267 marker.scale.x = 0.15;
05268 marker.scale.y = 0.55;
05269 marker.scale.z = 0.55;
05270 marker.color.a = 1;
05271 marker.color.r = 0.1;
05272 marker.color.g = 1.0;
05273 marker.color.b = 0.1;
05274 vis_pub.publish( marker );
05275 ros::spinOnce();
05276 }
05277
05278 }
05279
05280 }
05281 else
05282 {
05283 {
05284 visualization_msgs::Marker marker;
05285 marker.header.frame_id = "/map";
05286 marker.header.stamp = ros::Time::now();
05287 marker.ns = "target base footprints";
05288 marker.id = ++markerCnt;
05289 marker.type = visualization_msgs::Marker::ARROW;
05290 marker.action = visualization_msgs::Marker::ADD;
05291 marker.pose.position.x = pose.getOrigin().x();
05292 marker.pose.position.y = pose.getOrigin().y();
05293 marker.pose.position.z = pose.getOrigin().z();
05294 marker.pose.orientation.x = pose.getRotation().x();
05295 marker.pose.orientation.y = pose.getRotation().y();
05296 marker.pose.orientation.z = pose.getRotation().z();
05297 marker.pose.orientation.w = pose.getRotation().w();
05298 marker.scale.x = 0.15;
05299 marker.scale.y = 0.55;
05300 marker.scale.z = 0.55;
05301 marker.color.a = 1;
05302 marker.color.r = 0.1;
05303 marker.color.g = 0.1;
05304 marker.color.b = 0.1;
05305 vis_pub.publish( marker );
05306 ros::spinOnce();
05307 }
05308 }
05309
05310 }
05311
05312
05313 }
05314 }
05315
05316
05317
05318
05319
05320
05321
05322
05323
05324
05325
05326
05327
05328
05329
05330
05331
05332
05333
05334
05335
05336
05337
05338
05339
05340
05341
05342
05343
05344
05345
05346
05347
05348
05349
05350
05351
05352
05353
05354
05355
05356 if (atoi(argv[1]) == -610)
05357 {
05358
05359 double x,y,z,ox,oy,oz,ow;
05360 x = atof(argv[3]);
05361 y = atof(argv[4]);
05362 z = atof(argv[5]);
05363 ox = atof(argv[6]);
05364 oy = atof(argv[7]);
05365 oz = atof(argv[8]);
05366 ow = atof(argv[9]);
05367
05368
05369 geometry_msgs::PoseStamped stamped_pose;
05370 stamped_pose.header.frame_id = "map";
05371 stamped_pose.header.stamp = ros::Time::now();
05372 stamped_pose.pose.position.x=x;
05373 stamped_pose.pose.position.y=y;
05374 stamped_pose.pose.position.z=z;
05375 stamped_pose.pose.orientation.x=ox;
05376 stamped_pose.pose.orientation.y=oy;
05377 stamped_pose.pose.orientation.z=oz;
05378 stamped_pose.pose.orientation.w=ow;
05379
05380
05381
05382
05383
05384
05385 double stA[7];
05386 double stAs[7];
05387 RobotArm::getInstance(atoi(argv[2]))->getJointState(stA);
05388 int ret = RobotArm::getInstance(atoi(argv[2]))->run_ik(stamped_pose,stA,stAs,"r_wrist_roll_link");
05389
05390
05391
05392
05393
05394 ROS_INFO("RET : %i", ret);
05395 for (int k = 0; k < 7; ++k)
05396 {
05397 ROS_INFO("k %i: %f = %f", k, stA[k], stAs[k]);
05398 }
05399 }
05400
05401
05402 if (atoi(argv[1]) == -611)
05403 {
05404
05405 tf::Stamped<tf::Pose> start, end;
05406 geometry_msgs::PoseStamped stamped_pose;
05407 double x,y,z,ox,oy,oz,ow;
05408
05409 x = atof(argv[3]);
05410 y = atof(argv[4]);
05411 z = atof(argv[5]);
05412 ox = atof(argv[6]);
05413 oy = atof(argv[7]);
05414 oz = atof(argv[8]);
05415 ow = atof(argv[9]);
05416 stamped_pose.header.frame_id = "map";
05417 stamped_pose.header.stamp = ros::Time::now();
05418 stamped_pose.pose.position.x=x;
05419 stamped_pose.pose.position.y=y;
05420 stamped_pose.pose.position.z=z;
05421 stamped_pose.pose.orientation.x=ox;
05422 stamped_pose.pose.orientation.y=oy;
05423 stamped_pose.pose.orientation.z=oz;
05424 stamped_pose.pose.orientation.w=ow;
05425 tf::poseStampedMsgToTF(stamped_pose, start);
05426
05427 x = atof(argv[10]);
05428 y = atof(argv[11]);
05429 z = atof(argv[12]);
05430 ox = atof(argv[13]);
05431 oy = atof(argv[14]);
05432 oz = atof(argv[15]);
05433 ow = atof(argv[16]);
05434 stamped_pose.pose.position.x=x;
05435 stamped_pose.pose.position.y=y;
05436 stamped_pose.pose.position.z=z;
05437 stamped_pose.pose.orientation.x=ox;
05438 stamped_pose.pose.orientation.y=oy;
05439 stamped_pose.pose.orientation.z=oz;
05440 stamped_pose.pose.orientation.w=ow;
05441 tf::poseStampedMsgToTF(stamped_pose, end);
05442
05443 RobotArm::getInstance(atoi(argv[2]))->move_toolframe_ik_pose(start);
05444 Approach *apr = new Approach();
05445 apr->init(atoi(argv[2]),start, end, Approach::inside);
05446 double distA = (apr->increment(0,1));
05447
05448 tf::Stamped<tf::Pose> endpos = RobotArm::getInstance(atoi(argv[2]))->getToolPose("map");
05449 ROS_INFO("dist %f to end %f", distA, (endpos.getOrigin() - end.getOrigin()).length() );
05450 }
05451
05452
05453 if (atoi(argv[1]) == -612)
05454 {
05455 tf::Stamped<tf::Pose> act;
05456 act.frame_id_ = "/map";
05457 act.stamp_ = ros::Time::now();
05458 act.setOrigin(btVector3(0.305, -0.515,0));
05459 act.setRotation(btQuaternion(0,0,-0.348, 0.938));
05460
05461 act = Geometry::getPoseIn("/ias_kitchen/fridge_link", act);
05462
05463 printPose("base", act);
05464
05465
05466 double pts[][7] =
05467 {
05468 {0.478704, -1.0355, 1.18101, 0.767433, 0.639987, 0.022135, 0.0311955},
05469 {0.489086, -0.984206, 1.17956, 0.797904, 0.601535, 0.01726, 0.0347398},
05470 {0.494529, -0.937741, 1.1803, 0.830545, 0.555891, 0.0110758, 0.0325103},
05471 {0.504333, -0.909376, 1.18066, 0.849808, 0.526105, 0.00709967, 0.03147},
05472 {0.507886, -0.884252, 1.17954, 0.8814, 0.471274, 0.00699274, 0.0313926},
05473 {0.516993, -0.854729, 1.18006, 0.903026, 0.428457, 0.00859376, 0.0299171},
05474 {0.527833, -0.832331, 1.1803, 0.920176, 0.390256, 0.0125722, 0.0286066},
05475 {0.541463, -0.80644, 1.18, 0.931353, 0.362808, 0.0186723, 0.0245782},
05476 {0.571712, -0.760535, 1.17887, 0.936451, 0.349496, 0.024334, 0.017896},
05477 {0.608236, -0.715618, 1.17839, 0.944274, 0.327791, 0.0273483, 0.0123364},
05478 {0.647457, -0.676296, 1.17812, 0.954053, 0.298037, 0.0302956, 0.00623379},
05479 {0.690692, -0.638766, 1.17999, 0.964469, 0.262043, 0.0336022, 0.00195834},
05480 {0.734141, -0.609302, 1.18042, 0.974717, 0.220844, 0.0339708, -0.00102721},
05481 {0.781735, -0.583995, 1.17916, 0.983083, 0.180164, 0.0327274, -0.00426907},
05482 {0.828575, -0.564397, 1.17937, 0.990023, 0.137179, 0.0315954, -0.00617472},
05483 {0.870116, -0.550422, 1.17831, 0.995336, 0.0920069, 0.0283872, -0.00586025},
05484 {0.921693, -0.544899, 1.17853, 0.998734, 0.0415909, 0.0273629, -0.00714236},
05485 {0.971471, -0.549669, 1.17854, 0.998732, 0.0416648, 0.0273237, -0.00716123}
05486 };
05487
05488 for (int k = 0; k < 72 - 55; ++k)
05489 {
05490 act.setOrigin(btVector3(pts[k][0],pts[k][1],1.35));
05491 act.setRotation(btQuaternion(pts[k][3],pts[k][4],pts[k][5],pts[k][6]));
05492 act.frame_id_ = "/map";
05493 act = Geometry::getPoseIn("/ias_kitchen/fridge_link", act);
05494 printPose("traj", act);
05495 }
05496 }
05497
05498
05499 if (atoi(argv[1]) == -613)
05500 {
05501
05502
05503
05504
05505
05506
05507
05508
05509 }
05510
05511 if (atoi(argv[1]) == -714)
05512 {
05513
05514 tf::Stamped<tf::Pose> left, right;
05515 geometry_msgs::PoseStamped stamped_pose;
05516 double x,y,z,ox,oy,oz,ow;
05517
05518 x = atof(argv[3]);
05519 y = atof(argv[4]);
05520 z = atof(argv[5]);
05521 ox = atof(argv[6]);
05522 oy = atof(argv[7]);
05523 oz = atof(argv[8]);
05524 ow = atof(argv[9]);
05525 stamped_pose.header.frame_id = "map";
05526 stamped_pose.header.stamp = ros::Time::now();
05527 stamped_pose.pose.position.x=x;
05528 stamped_pose.pose.position.y=y;
05529 stamped_pose.pose.position.z=z;
05530 stamped_pose.pose.orientation.x=ox;
05531 stamped_pose.pose.orientation.y=oy;
05532 stamped_pose.pose.orientation.z=oz;
05533 stamped_pose.pose.orientation.w=ow;
05534 tf::poseStampedMsgToTF(stamped_pose, left);
05535 printPose("left", left);
05536
05537 x = atof(argv[10]);
05538 y = atof(argv[11]);
05539 z = atof(argv[12]);
05540 ox = atof(argv[13]);
05541 oy = atof(argv[14]);
05542 oz = atof(argv[15]);
05543 ow = atof(argv[16]);
05544 stamped_pose.header.frame_id = "map";
05545 stamped_pose.header.stamp = ros::Time::now();
05546 stamped_pose.pose.position.x=x;
05547 stamped_pose.pose.position.y=y;
05548 stamped_pose.pose.position.z=z;
05549 stamped_pose.pose.orientation.x=ox;
05550 stamped_pose.pose.orientation.y=oy;
05551 stamped_pose.pose.orientation.z=oz;
05552 stamped_pose.pose.orientation.w=ow;
05553 tf::poseStampedMsgToTF(stamped_pose, right);
05554 printPose("left", right);
05555
05556 findBothArms(left, right);
05557 }
05558
05559
05560 if (atoi(argv[1]) == -715)
05561 {
05562
05563 RobotArm::getInstance(0)->raise_elbow = true;
05564 RobotArm::getInstance(1)->raise_elbow = true;
05565
05566 tf::Stamped<tf::Pose> left, right;
05567 geometry_msgs::PoseStamped stamped_pose;
05568 double x,y,z,ox,oy,oz,ow;
05569
05570 x = atof(argv[3]);
05571 y = atof(argv[4]);
05572 z = atof(argv[5]);
05573 ox = atof(argv[6]);
05574 oy = atof(argv[7]);
05575 oz = atof(argv[8]);
05576 ow = atof(argv[9]);
05577 stamped_pose.header.frame_id = "map";
05578 stamped_pose.header.stamp = ros::Time::now();
05579 stamped_pose.pose.position.x=x;
05580 stamped_pose.pose.position.y=y;
05581 stamped_pose.pose.position.z=z;
05582 stamped_pose.pose.orientation.x=ox;
05583 stamped_pose.pose.orientation.y=oy;
05584 stamped_pose.pose.orientation.z=oz;
05585 stamped_pose.pose.orientation.w=ow;
05586 tf::poseStampedMsgToTF(stamped_pose, left);
05587 printPose("left", left);
05588
05589 x = atof(argv[10]);
05590 y = atof(argv[11]);
05591 z = atof(argv[12]);
05592 ox = atof(argv[13]);
05593 oy = atof(argv[14]);
05594 oz = atof(argv[15]);
05595 ow = atof(argv[16]);
05596 stamped_pose.header.frame_id = "map";
05597 stamped_pose.header.stamp = ros::Time::now();
05598 stamped_pose.pose.position.x=x;
05599 stamped_pose.pose.position.y=y;
05600 stamped_pose.pose.position.z=z;
05601 stamped_pose.pose.orientation.x=ox;
05602 stamped_pose.pose.orientation.y=oy;
05603 stamped_pose.pose.orientation.z=oz;
05604 stamped_pose.pose.orientation.w=ow;
05605 tf::poseStampedMsgToTF(stamped_pose, right);
05606 printPose("left", right);
05607
05608 RobotArm::moveBothArms(left, right);
05609 }
05610
05611
05612
05613 }
05614
05615
05616
05617
05618
05619
05620
05621
05622
05623
05624
05625
05626
05627
05628
05629
05630
05631
05632
05633
05634
05635
05636
05637
05638
05639
05640
05641
05642
05643
05644
05645
05646
05647
05648
05649
05650
05651
05652
05653
05654
05655
05656
05657
05658
05659
05660
05661
05662
05663
05664
05665
05666
05667
05668
05669
05670