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
00032
00033
00034
00035
00036
00037
00038
00039 #include <ros/ros.h>
00040 #include <tf/tf.h>
00041 #include <actionlib/client/simple_action_client.h>
00042
00043 #include <stdio.h>
00044 #include <stdlib.h>
00045 #include <time.h>
00046 #include <boost/thread.hpp>
00047 #include <ros/ros.h>
00048 #include <gtest/gtest.h>
00049 #include <iostream>
00050
00051 #include "regression_test_arm_helpers.h"
00052
00053 void spinThread()
00054 {
00055 ros::spin();
00056 }
00057
00058 TEST(MoveArm, goToPoseGoal)
00059 {
00060 ros::NodeHandle nh;
00061 actionlib::SimpleActionClient<move_arm::MoveArmAction> move_arm(nh, "move_right_arm");
00062 boost::thread spin_thread(&spinThread);
00063
00064 move_arm.waitForServer();
00065 ROS_INFO("Connected to server");
00066 move_arm::MoveArmGoal goalA;
00067
00068
00069 planning_environment::RobotModels rm("robot_description");
00070 EXPECT_TRUE(rm.loadedModels());
00071
00072 tf::TransformListener tf;
00073 planning_environment::KinematicModelStateMonitor km(&rm, &tf);
00074 km.waitForState();
00075
00076
00077 goalA.goal_constraints.set_pose_constraint_size(1);
00078 goalA.goal_constraints.pose_constraint[0].pose.header.stamp = ros::Time::now();
00079 goalA.goal_constraints.pose_constraint[0].pose.header.frame_id = "base_link";
00080
00081
00082
00083
00084
00085 goalA.goal_constraints.pose_constraint[0].type = motion_planning_msgs::PoseConstraint::POSITION_X
00086 + motion_planning_msgs::PoseConstraint::POSITION_Y
00087 + motion_planning_msgs::PoseConstraint::POSITION_Z
00088 + motion_planning_msgs::PoseConstraint::ORIENTATION_R
00089 + motion_planning_msgs::PoseConstraint::ORIENTATION_P
00090 + motion_planning_msgs::PoseConstraint::ORIENTATION_Y;
00091
00092 goalA.goal_constraints.pose_constraint[0].link_name = "r_wrist_roll_link";
00093 goalA.goal_constraints.pose_constraint[0].pose.pose.position.x = 0.60;
00094 goalA.goal_constraints.pose_constraint[0].pose.pose.position.y = -0.25;
00095 goalA.goal_constraints.pose_constraint[0].pose.pose.position.z = 0.84;
00096
00097 goalA.goal_constraints.pose_constraint[0].pose.pose.orientation.x = 0;
00098 goalA.goal_constraints.pose_constraint[0].pose.pose.orientation.y = 0;
00099 goalA.goal_constraints.pose_constraint[0].pose.pose.orientation.z = 0;
00100 goalA.goal_constraints.pose_constraint[0].pose.pose.orientation.w = 1.0;
00101
00102 goalA.goal_constraints.pose_constraint[0].position_tolerance_above.x = 0.01;
00103 goalA.goal_constraints.pose_constraint[0].position_tolerance_above.y = 0.01;
00104 goalA.goal_constraints.pose_constraint[0].position_tolerance_above.z = 0.01;
00105 goalA.goal_constraints.pose_constraint[0].position_tolerance_below.x = 0.01;
00106 goalA.goal_constraints.pose_constraint[0].position_tolerance_below.y = 0.01;
00107 goalA.goal_constraints.pose_constraint[0].position_tolerance_below.z = 0.01;
00108
00109 goalA.goal_constraints.pose_constraint[0].orientation_tolerance_above.x = 0.01;
00110 goalA.goal_constraints.pose_constraint[0].orientation_tolerance_above.y = 0.01;
00111 goalA.goal_constraints.pose_constraint[0].orientation_tolerance_above.z = 0.01;
00112 goalA.goal_constraints.pose_constraint[0].orientation_tolerance_below.x = 0.01;
00113 goalA.goal_constraints.pose_constraint[0].orientation_tolerance_below.y = 0.01;
00114 goalA.goal_constraints.pose_constraint[0].orientation_tolerance_below.z = 0.01;
00115
00116 goalA.goal_constraints.pose_constraint[0].orientation_importance = 0.2;
00117
00118 goalA.contacts.resize(2);
00119 goalA.contacts[0].links.push_back("r_gripper_l_finger_link");
00120 goalA.contacts[0].links.push_back("r_gripper_r_finger_link");
00121 goalA.contacts[0].links.push_back("r_gripper_l_finger_tip_link");
00122 goalA.contacts[0].links.push_back("r_gripper_r_finger_tip_link");
00123
00124 goalA.contacts[0].depth = 0.04;
00125 goalA.contacts[0].bound.type = mapping_msgs::Object::SPHERE;
00126 goalA.contacts[0].bound.dimensions.push_back(0.3);
00127 goalA.contacts[0].pose = goalA.goal_constraints.pose_constraint[0].pose;
00128
00129 goalA.contacts[1].links.push_back("r_gripper_palm_link");
00130 goalA.contacts[1].links.push_back("r_wrist_roll_link");
00131 goalA.contacts[1].depth = 0.02;
00132 goalA.contacts[1].bound.type = mapping_msgs::Object::SPHERE;
00133 goalA.contacts[1].bound.dimensions.push_back(0.2);
00134 goalA.contacts[1].pose = goalA.goal_constraints.pose_constraint[0].pose;
00135
00136 if (nh.ok())
00137 {
00138 bool finished_within_time = false;
00139 move_arm.sendGoal(goalA);
00140 finished_within_time = move_arm.waitForResult(ros::Duration(10.0));
00141
00142 EXPECT_TRUE(finished_within_time);
00143 if (!finished_within_time)
00144 {
00145 move_arm.cancelGoal();
00146 ROS_INFO("Timed out achieving goal A");
00147 }
00148 else
00149 {
00150 actionlib::SimpleClientGoalState state = move_arm.getState();
00151 ROS_INFO("Action finished: %s",state.toString().c_str());
00152 EXPECT_TRUE(state == actionlib::SimpleClientGoalState::SUCCEEDED);
00153
00154 double dist_pose;
00155 double dist_angle;
00156
00157 diffConfig(km,goalA,dist_pose,dist_angle);
00158
00159
00160 EXPECT_TRUE(dist_pose < .005+.005+.01);
00161 EXPECT_TRUE(dist_angle < .005*3);
00162
00163 EXPECT_TRUE(finalStateMatchesGoal(km,goalA));
00164
00165 }
00166 }
00167
00168 nh.setParam( "/move_right_arm/long_range_only", true);
00169
00170 move_arm::MoveArmGoal goalB;
00171
00172
00173
00174
00175
00176 goalB.goal_constraints.set_pose_constraint_size(1);
00177 goalB.goal_constraints.pose_constraint[0].pose.header.stamp = ros::Time::now();
00178 goalB.goal_constraints.pose_constraint[0].pose.header.frame_id = "base_link";
00179 goalB.goal_constraints.pose_constraint[0].type = motion_planning_msgs::PoseConstraint::POSITION_X
00180 + motion_planning_msgs::PoseConstraint::POSITION_Y
00181 + motion_planning_msgs::PoseConstraint::POSITION_Z
00182 + motion_planning_msgs::PoseConstraint::ORIENTATION_R
00183 + motion_planning_msgs::PoseConstraint::ORIENTATION_P
00184 + motion_planning_msgs::PoseConstraint::ORIENTATION_Y;
00185
00186 goalB.goal_constraints.pose_constraint[0].link_name = "r_wrist_roll_link";
00187 goalB.goal_constraints.pose_constraint[0].pose.pose.position.x = 0.60;
00188 goalB.goal_constraints.pose_constraint[0].pose.pose.position.y = -0.25;
00189 goalB.goal_constraints.pose_constraint[0].pose.pose.position.z = 0.5;
00190
00191 goalB.goal_constraints.pose_constraint[0].pose.pose.orientation.x = 0;
00192 goalB.goal_constraints.pose_constraint[0].pose.pose.orientation.y = 0;
00193 goalB.goal_constraints.pose_constraint[0].pose.pose.orientation.z = 0;
00194 goalB.goal_constraints.pose_constraint[0].pose.pose.orientation.w = 1.0;
00195
00196 goalB.goal_constraints.pose_constraint[0].position_tolerance_above.x = 0.05;
00197 goalB.goal_constraints.pose_constraint[0].position_tolerance_above.y = 0.05;
00198 goalB.goal_constraints.pose_constraint[0].position_tolerance_above.z = 0.05;
00199 goalB.goal_constraints.pose_constraint[0].position_tolerance_below.x = 0.05;
00200 goalB.goal_constraints.pose_constraint[0].position_tolerance_below.y = 0.05;
00201 goalB.goal_constraints.pose_constraint[0].position_tolerance_below.z = 0.05;
00202
00203 goalB.goal_constraints.pose_constraint[0].orientation_tolerance_above.x = 0.05;
00204 goalB.goal_constraints.pose_constraint[0].orientation_tolerance_above.y = 0.05;
00205 goalB.goal_constraints.pose_constraint[0].orientation_tolerance_above.z = 0.05;
00206 goalB.goal_constraints.pose_constraint[0].orientation_tolerance_below.x = 0.05;
00207 goalB.goal_constraints.pose_constraint[0].orientation_tolerance_below.y = 0.05;
00208 goalB.goal_constraints.pose_constraint[0].orientation_tolerance_below.z = 0.05;
00209
00210 goalB.goal_constraints.pose_constraint[0].orientation_importance = 0.2;
00211
00212 goalB.path_constraints.set_pose_constraint_size(1);
00213 goalB.path_constraints.pose_constraint[0].pose.header.stamp = ros::Time::now();
00214 goalB.path_constraints.pose_constraint[0].pose.header.frame_id = "base_link";
00215 goalB.path_constraints.pose_constraint[0].type = motion_planning_msgs::PoseConstraint::POSITION_X
00216 + motion_planning_msgs::PoseConstraint::POSITION_Y
00217 + motion_planning_msgs::PoseConstraint::POSITION_Z
00218 + motion_planning_msgs::PoseConstraint::ORIENTATION_R
00219 + motion_planning_msgs::PoseConstraint::ORIENTATION_P;
00220
00221 goalB.path_constraints.pose_constraint[0].link_name = "r_wrist_roll_link";
00222 goalB.path_constraints.pose_constraint[0].pose.pose.position.x = 0.60;
00223 goalB.path_constraints.pose_constraint[0].pose.pose.position.y = -0.25;
00224 goalB.path_constraints.pose_constraint[0].pose.pose.position.z = .45;
00225
00226 goalB.path_constraints.pose_constraint[0].pose.pose.orientation.x = 0;
00227 goalB.path_constraints.pose_constraint[0].pose.pose.orientation.y = 0;
00228 goalB.path_constraints.pose_constraint[0].pose.pose.orientation.z = 0;
00229 goalB.path_constraints.pose_constraint[0].pose.pose.orientation.w = 1.0;
00230
00231 goalB.path_constraints.pose_constraint[0].position_tolerance_above.x = 0.1;
00232 goalB.path_constraints.pose_constraint[0].position_tolerance_above.y = 0.1;
00233 goalB.path_constraints.pose_constraint[0].position_tolerance_below.x = 0.1;
00234 goalB.path_constraints.pose_constraint[0].position_tolerance_below.y = 0.1;
00235 goalB.path_constraints.pose_constraint[0].position_tolerance_above.z = 10.0;
00236 goalB.path_constraints.pose_constraint[0].position_tolerance_below.z = 0.1;
00237
00238 goalB.path_constraints.pose_constraint[0].orientation_tolerance_above.x = 0.1;
00239 goalB.path_constraints.pose_constraint[0].orientation_tolerance_above.y = 0.1;
00240
00241 goalB.path_constraints.pose_constraint[0].orientation_tolerance_below.x = 0.1;
00242 goalB.path_constraints.pose_constraint[0].orientation_tolerance_below.y = 0.1;
00243
00244
00245 goalB.path_constraints.pose_constraint[0].orientation_importance = 0.4;
00246
00247 goalB.contacts.resize(2);
00248 goalB.contacts[0].links.push_back("r_gripper_l_finger_link");
00249 goalB.contacts[0].links.push_back("r_gripper_r_finger_link");
00250 goalB.contacts[0].links.push_back("r_gripper_l_finger_tip_link");
00251 goalB.contacts[0].links.push_back("r_gripper_r_finger_tip_link");
00252
00253 goalB.contacts[0].depth = 0.04;
00254 goalB.contacts[0].bound.type = mapping_msgs::Object::SPHERE;
00255 goalB.contacts[0].bound.dimensions.push_back(0.3);
00256 goalB.contacts[0].pose = goalB.goal_constraints.pose_constraint[0].pose;
00257
00258 goalB.contacts[1].links.push_back("r_gripper_palm_link");
00259 goalB.contacts[1].links.push_back("r_wrist_roll_link");
00260 goalB.contacts[1].depth = 0.02;
00261 goalB.contacts[1].bound.type = mapping_msgs::Object::SPHERE;
00262 goalB.contacts[1].bound.dimensions.push_back(0.2);
00263 goalB.contacts[1].pose = goalB.goal_constraints.pose_constraint[0].pose;
00264
00265 if (nh.ok())
00266 {
00267 move_arm.sendGoal(goalB);
00268
00269 ros::Time start_time = ros::Time::now();
00270 ros::Duration elapsed(0.0);
00271
00272
00273 unsigned int ticks=0;
00274
00275 while(1) {
00276
00277 bool result_during_cycle = move_arm.waitForResult(ros::Duration(.2));
00278
00279
00280 if(result_during_cycle) {
00281 break;
00282 }
00283
00284 elapsed = ros::Time::now()-start_time;
00285
00286 std::cout << "Time " << elapsed.toSec() << std::endl;
00287
00288
00289 if(elapsed.toSec() > 10.0 || ticks++ > 50) break;
00290
00291 goalB.path_constraints.pose_constraint[0].pose.pose.orientation.x = 0;
00292 goalB.path_constraints.pose_constraint[0].pose.pose.orientation.y = 0;
00293
00294
00295 EXPECT_TRUE(currentStateSatisfiesPathConstraints(km,goalB));
00296
00297 }
00298
00299 if (elapsed.toSec() > 10.0)
00300 {
00301 move_arm.cancelGoal();
00302 ROS_INFO("Timed out achieving goal A");
00303 EXPECT_TRUE(elapsed.toSec() < 10.0);
00304 }
00305 else
00306 {
00307 actionlib::SimpleClientGoalState state = move_arm.getState();
00308 ROS_INFO("Action finished: %s",state.toString().c_str());
00309 EXPECT_TRUE(state == actionlib::SimpleClientGoalState::SUCCEEDED);
00310
00311 double dist_pose;
00312 double dist_angle;
00313
00314 diffConfig(km,goalA,dist_pose,dist_angle);
00315
00316
00317 EXPECT_TRUE(dist_pose < .01+.01+.002);
00318 EXPECT_TRUE(dist_angle < .05*3);
00319
00320 EXPECT_TRUE(finalStateMatchesGoal(km,goalB));
00321 }
00322 }
00323
00324 ros::shutdown();
00325 spin_thread.join();
00326 }
00327
00328 int main(int argc, char **argv){
00329 testing::InitGoogleTest(&argc, argv);
00330 ros::init (argc, argv, "move_arm_regression_test");
00331 return RUN_ALL_TESTS();
00332 }