2 #include <gtest/gtest.h> 4 #include <play_motion_builder_msgs/BuildMotionAction.h> 5 #include <play_motion_builder_msgs/RunMotionAction.h> 6 #include <play_motion_builder_msgs/EditMotion.h> 7 #include <play_motion_builder_msgs/StoreMotion.h> 8 #include <play_motion_builder_msgs/ChangeJoints.h> 11 #include <sensor_msgs/JointState.h> 13 #include <unordered_map> 26 joints_[
"arm_left_joint"] = 0.0;
27 joints_[
"arm_right_joint"] = 0.0;
40 joints_[
"arm_left_joint"] = left_arm;
41 joints_[
"arm_right_joint"] = right_arm;
53 std::unordered_map<std::string, double>
joints_;
58 sensor_msgs::JointState js;
61 std::lock_guard<std::mutex> lock(joint_mutex_);
62 for (
const auto& joint : joints_)
64 js.name.push_back(joint.first);
65 js.position.push_back(joint.second);
72 template <
typename InputIterator1,
typename InputIterator2>
73 bool range_equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
76 while (first1 != last1 && first2 != last2)
78 if (*first1 != *first2)
83 return (first1 == last1) && (first2 == last2);
86 bool compare_files(
const std::string& filename1,
const std::string& filename2)
88 std::ifstream file1(filename1);
89 std::ifstream file2(filename2);
91 std::istreambuf_iterator<char> begin1(file1);
92 std::istreambuf_iterator<char> begin2(file2);
94 std::istreambuf_iterator<char> end;
100 TEST(MotionBuilderTest, actionNotStartedTest)
103 play_motion_builder_msgs::EditMotion srv_edit;
106 ros::service::call<play_motion_builder_msgs::EditMotion>(
107 "play_motion_builder_node/edit_motion", srv_edit);
108 EXPECT_FALSE(srv_edit.response.ok);
109 EXPECT_EQ(
"No motion being built", srv_edit.response.message);
112 play_motion_builder_msgs::StoreMotion srv_store;
115 ros::service::call<play_motion_builder_msgs::StoreMotion>(
116 "play_motion_builder_node/store_motion", srv_store);
117 EXPECT_FALSE(srv_store.response.ok);
118 EXPECT_EQ(
"No motion being built, could not store.", srv_store.response.message);
121 play_motion_builder_msgs::ChangeJoints srv_change_joints;
124 ros::service::call<play_motion_builder_msgs::ChangeJoints>(
125 "play_motion_builder_node/change_joints", srv_change_joints);
126 EXPECT_FALSE(srv_change_joints.response.ok);
127 EXPECT_EQ(
"No motion being built", srv_change_joints.response.message);
131 play_motion_builder_msgs::RunMotionGoal rmg;
133 nh,
"play_motion_builder_node/run");
140 TEST(MotionBuilderTest, buildNewMotion)
146 nh,
"play_motion_builder_node/build");
151 play_motion_builder_msgs::BuildMotionGoal goal;
157 play_motion_builder_msgs::EditMotion srv_edit;
158 srv_edit.request.action = play_motion_builder_msgs::EditMotion::Request::LIST;
159 ros::service::call<play_motion_builder_msgs::EditMotion>(
160 "play_motion_builder_node/edit_motion", srv_edit);
162 EXPECT_TRUE(srv_edit.response.ok) << srv_edit.response.message;
163 EXPECT_EQ(0, srv_edit.response.motion.keyframes.size());
166 srv_edit.request.action = play_motion_builder_msgs::EditMotion::Request::APPEND;
167 ros::service::call<play_motion_builder_msgs::EditMotion>(
168 "play_motion_builder_node/edit_motion", srv_edit);
170 EXPECT_TRUE(srv_edit.response.ok) << srv_edit.response.message;
171 EXPECT_EQ(1, srv_edit.response.motion.keyframes.size());
173 EXPECT_EQ(3, srv_edit.response.motion.joints.size());
174 EXPECT_EQ(3, srv_edit.response.motion.keyframes[0].pose.size());
175 for (
size_t i = 0; i < srv_edit.response.motion.joints.size(); ++i)
177 if (srv_edit.response.motion.joints[i] ==
"arm_left_joint" ||
178 srv_edit.response.motion.joints[i] ==
"arm_right_joint" ||
179 srv_edit.response.motion.joints[i] ==
"head_joint")
181 EXPECT_NEAR(0.0, srv_edit.response.motion.keyframes[0].pose[i], 0.001);
185 EXPECT_TRUE(
false) <<
"Unknown joint added " << srv_edit.response.motion.joints[i];
188 EXPECT_NEAR(0.0, srv_edit.response.motion.keyframes[0].time_from_last, 0.001);
193 srv_edit.request.action = play_motion_builder_msgs::EditMotion::Request::APPEND;
194 ros::service::call<play_motion_builder_msgs::EditMotion>(
195 "play_motion_builder_node/edit_motion", srv_edit);
197 EXPECT_TRUE(srv_edit.response.ok) << srv_edit.response.message;
198 EXPECT_EQ(2, srv_edit.response.motion.keyframes.size());
200 EXPECT_EQ(3, srv_edit.response.motion.joints.size());
201 EXPECT_EQ(3, srv_edit.response.motion.keyframes[0].pose.size());
202 for (
size_t i = 0; i < srv_edit.response.motion.joints.size(); ++i)
204 if (srv_edit.response.motion.joints[i] ==
"arm_left_joint")
206 EXPECT_NEAR(0.1, srv_edit.response.motion.keyframes[1].pose[i], 0.001);
208 else if (srv_edit.response.motion.joints[i] ==
"arm_right_joint")
210 EXPECT_NEAR(0.2, srv_edit.response.motion.keyframes[1].pose[i], 0.001);
212 else if (srv_edit.response.motion.joints[i] ==
"head_joint")
214 EXPECT_NEAR(0.3, srv_edit.response.motion.keyframes[1].pose[i], 0.001);
218 EXPECT_TRUE(
false) <<
"Unknown joint added " << srv_edit.response.motion.joints[i];
221 EXPECT_NEAR(5.0, srv_edit.response.motion.keyframes[1].time_from_last, 0.001);
226 srv_edit.request.action = play_motion_builder_msgs::EditMotion::Request::EDIT;
227 srv_edit.request.step_id = 0;
228 ros::service::call<play_motion_builder_msgs::EditMotion>(
229 "play_motion_builder_node/edit_motion", srv_edit);
231 EXPECT_TRUE(srv_edit.response.ok) << srv_edit.response.message;
232 EXPECT_EQ(2, srv_edit.response.motion.keyframes.size());
234 EXPECT_EQ(3, srv_edit.response.motion.joints.size());
235 EXPECT_EQ(3, srv_edit.response.motion.keyframes[0].pose.size());
236 for (
size_t i = 0; i < srv_edit.response.motion.joints.size(); ++i)
238 if (srv_edit.response.motion.joints[i] ==
"arm_left_joint")
240 EXPECT_NEAR(0.4, srv_edit.response.motion.keyframes[0].pose[i], 0.001);
242 else if (srv_edit.response.motion.joints[i] ==
"arm_right_joint")
244 EXPECT_NEAR(0.5, srv_edit.response.motion.keyframes[0].pose[i], 0.001);
246 else if (srv_edit.response.motion.joints[i] ==
"head_joint")
248 EXPECT_NEAR(0.6, srv_edit.response.motion.keyframes[0].pose[i], 0.001);
252 EXPECT_TRUE(
false) <<
"Unknown joint added " << srv_edit.response.motion.joints[i];
255 EXPECT_NEAR(5.0, srv_edit.response.motion.keyframes[1].time_from_last, 0.001);
258 srv_edit.request.action = play_motion_builder_msgs::EditMotion::Request::COPY_AS_LAST;
259 srv_edit.request.step_id = 0;
260 ros::service::call<play_motion_builder_msgs::EditMotion>(
261 "play_motion_builder_node/edit_motion", srv_edit);
263 EXPECT_TRUE(srv_edit.response.ok) << srv_edit.response.message;
264 EXPECT_EQ(3, srv_edit.response.motion.keyframes.size());
266 EXPECT_EQ(3, srv_edit.response.motion.joints.size());
267 EXPECT_EQ(3, srv_edit.response.motion.keyframes[2].pose.size());
268 for (
size_t i = 0; i < srv_edit.response.motion.joints.size(); ++i)
270 if (srv_edit.response.motion.joints[i] ==
"arm_left_joint")
272 EXPECT_NEAR(0.4, srv_edit.response.motion.keyframes[2].pose[i], 0.001);
274 else if (srv_edit.response.motion.joints[i] ==
"arm_right_joint")
276 EXPECT_NEAR(0.5, srv_edit.response.motion.keyframes[2].pose[i], 0.001);
278 else if (srv_edit.response.motion.joints[i] ==
"head_joint")
280 EXPECT_NEAR(0.6, srv_edit.response.motion.keyframes[2].pose[i], 0.001);
284 EXPECT_TRUE(
false) <<
"Unknown joint added " << srv_edit.response.motion.joints[i];
287 EXPECT_NEAR(5.0, srv_edit.response.motion.keyframes[2].time_from_last, 0.001);
290 srv_edit.request.action = play_motion_builder_msgs::EditMotion::Request::COPY_AS_NEXT;
291 srv_edit.request.step_id = 1;
292 ros::service::call<play_motion_builder_msgs::EditMotion>(
293 "play_motion_builder_node/edit_motion", srv_edit);
295 EXPECT_TRUE(srv_edit.response.ok) << srv_edit.response.message;
296 EXPECT_EQ(4, srv_edit.response.motion.keyframes.size());
298 EXPECT_EQ(3, srv_edit.response.motion.joints.size());
299 EXPECT_EQ(3, srv_edit.response.motion.keyframes[2].pose.size());
300 for (
size_t i = 0; i < srv_edit.response.motion.joints.size(); ++i)
302 if (srv_edit.response.motion.joints[i] ==
"arm_left_joint")
304 EXPECT_NEAR(0.1, srv_edit.response.motion.keyframes[2].pose[i], 0.001);
306 else if (srv_edit.response.motion.joints[i] ==
"arm_right_joint")
308 EXPECT_NEAR(0.2, srv_edit.response.motion.keyframes[2].pose[i], 0.001);
310 else if (srv_edit.response.motion.joints[i] ==
"head_joint")
312 EXPECT_NEAR(0.3, srv_edit.response.motion.keyframes[2].pose[i], 0.001);
316 EXPECT_TRUE(
false) <<
"Unknown joint added " << srv_edit.response.motion.joints[i];
319 EXPECT_NEAR(5.0, srv_edit.response.motion.keyframes[2].time_from_last, 0.001);
322 srv_edit.request.action = play_motion_builder_msgs::EditMotion::Request::REMOVE;
323 srv_edit.request.step_id = 2;
324 ros::service::call<play_motion_builder_msgs::EditMotion>(
325 "play_motion_builder_node/edit_motion", srv_edit);
327 EXPECT_TRUE(srv_edit.response.ok) << srv_edit.response.message;
328 EXPECT_EQ(3, srv_edit.response.motion.keyframes.size());
330 EXPECT_EQ(3, srv_edit.response.motion.joints.size());
331 EXPECT_EQ(3, srv_edit.response.motion.keyframes[2].pose.size());
332 for (
size_t i = 0; i < srv_edit.response.motion.joints.size(); ++i)
334 if (srv_edit.response.motion.joints[i] ==
"arm_left_joint")
336 EXPECT_NEAR(0.4, srv_edit.response.motion.keyframes[2].pose[i], 0.001);
338 else if (srv_edit.response.motion.joints[i] ==
"arm_right_joint")
340 EXPECT_NEAR(0.5, srv_edit.response.motion.keyframes[2].pose[i], 0.001);
342 else if (srv_edit.response.motion.joints[i] ==
"head_joint")
344 EXPECT_NEAR(0.6, srv_edit.response.motion.keyframes[2].pose[i], 0.001);
348 EXPECT_TRUE(
false) <<
"Unknown joint added " << srv_edit.response.motion.joints[i];
351 EXPECT_NEAR(5.0, srv_edit.response.motion.keyframes[2].time_from_last, 0.001);
354 play_motion_builder_msgs::StoreMotion srv_store;
355 srv_store.request.file_path =
"/tmp/test_motion_new.yaml";
356 srv_store.request.ros_name =
"test_motion_new";
357 srv_store.request.meta.name =
"Test Motion New";
358 srv_store.request.meta.usage =
"Test";
359 srv_store.request.meta.description =
"Motion created to test the system";
360 ros::service::call<play_motion_builder_msgs::StoreMotion>(
361 "play_motion_builder_node/store_motion", srv_store);
362 EXPECT_TRUE(srv_store.response.ok) << srv_store.response.message;
365 std::string filepath;
366 nh.
getParam(
"test_file_path_new", filepath);
367 EXPECT_TRUE(
compare_files(srv_store.request.file_path, filepath));
374 srv_edit.request.action = play_motion_builder_msgs::EditMotion::Request::LIST;
375 ros::service::call<play_motion_builder_msgs::EditMotion>(
376 "play_motion_builder_node/edit_motion", srv_edit);
377 EXPECT_FALSE(srv_edit.response.ok);
378 EXPECT_EQ(
"No motion being built", srv_edit.response.message);
381 TEST(MotionBuilderTest, editExistingMotion)
387 nh,
"play_motion_builder_node/build");
392 play_motion_builder_msgs::BuildMotionGoal goal;
393 goal.motion =
"test_motion_edit";
399 play_motion_builder_msgs::EditMotion srv_edit;
400 srv_edit.request.action = play_motion_builder_msgs::EditMotion::Request::LIST;
401 ros::service::call<play_motion_builder_msgs::EditMotion>(
402 "play_motion_builder_node/edit_motion", srv_edit);
404 EXPECT_TRUE(srv_edit.response.ok) << srv_edit.response.message;
405 EXPECT_EQ(3, srv_edit.response.motion.keyframes.size());
406 EXPECT_EQ(2, srv_edit.response.motion.joints.size());
408 size_t head_index, arm_left_index;
409 for (
size_t i = 0; i < srv_edit.response.motion.joints.size(); ++i)
411 if (srv_edit.response.motion.joints[i] ==
"head_joint")
413 else if (srv_edit.response.motion.joints[i] ==
"arm_left_joint")
417 EXPECT_NEAR(0.0, srv_edit.response.motion.keyframes[0].time_from_last, 0.001);
418 EXPECT_NEAR(0.1, srv_edit.response.motion.keyframes[0].pose[head_index], 0.001);
419 EXPECT_NEAR(0.2, srv_edit.response.motion.keyframes[0].pose[arm_left_index], 0.001);
421 EXPECT_NEAR(1.0, srv_edit.response.motion.keyframes[1].time_from_last, 0.001);
422 EXPECT_NEAR(0.11, srv_edit.response.motion.keyframes[1].pose[head_index], 0.001);
423 EXPECT_NEAR(0.21, srv_edit.response.motion.keyframes[1].pose[arm_left_index], 0.001);
425 EXPECT_NEAR(2.0, srv_edit.response.motion.keyframes[2].time_from_last, 0.001);
426 EXPECT_NEAR(0.12, srv_edit.response.motion.keyframes[2].pose[head_index], 0.001);
427 EXPECT_NEAR(0.22, srv_edit.response.motion.keyframes[2].pose[arm_left_index], 0.001);
430 play_motion_builder_msgs::ChangeJoints srv_change;
432 srv_change.request.joints_to_add.push_back(
"arm_right_joint");
433 ros::service::call<play_motion_builder_msgs::ChangeJoints>(
434 "play_motion_builder_node/change_joints", srv_change);
435 ASSERT_FALSE(srv_change.response.ok) << srv_change.response.message;
436 EXPECT_EQ(2, srv_change.response.used_joints.size());
437 EXPECT_EQ(
"arm_left", srv_change.response.current_group);
440 srv_change.request.joints_to_add.clear();
441 srv_change.request.group =
"both_arms";
442 ros::service::call<play_motion_builder_msgs::ChangeJoints>(
443 "play_motion_builder_node/change_joints", srv_change);
444 ASSERT_TRUE(srv_change.response.ok) << srv_change.response.message;
445 EXPECT_EQ(3, srv_change.response.used_joints.size());
446 EXPECT_EQ(
"both_arms", srv_change.response.current_group);
449 srv_change.request.joints_to_remove.push_back(
"head_joint");
450 srv_change.request.group =
"";
451 ros::service::call<play_motion_builder_msgs::ChangeJoints>(
452 "play_motion_builder_node/change_joints", srv_change);
453 ASSERT_TRUE(srv_change.response.ok) << srv_change.response.message;
454 EXPECT_EQ(2, srv_change.response.used_joints.size());
455 EXPECT_EQ(
"both_arms", srv_change.response.current_group);
458 srv_edit.request.action = play_motion_builder_msgs::EditMotion::Request::EDIT_TIME;
459 srv_edit.request.step_id = 1;
460 srv_edit.request.time = 5.5;
461 ros::service::call<play_motion_builder_msgs::EditMotion>(
462 "play_motion_builder_node/edit_motion", srv_edit);
463 EXPECT_TRUE(srv_edit.response.ok) << srv_edit.response.message;
464 EXPECT_NEAR(5.5, srv_edit.response.motion.keyframes[1].time_from_last, 0.001);
467 play_motion_builder_msgs::StoreMotion srv_store;
468 srv_store.request.file_path =
"/tmp/test_motion_edit.yaml";
469 srv_store.request.ros_name =
"test_motion_edit";
470 ros::service::call<play_motion_builder_msgs::StoreMotion>(
471 "play_motion_builder_node/store_motion", srv_store);
472 EXPECT_TRUE(srv_store.response.ok) << srv_store.response.message;
475 std::string filepath;
476 nh.
getParam(
"test_file_path_edit", filepath);
477 EXPECT_TRUE(
compare_files(srv_store.request.file_path, filepath));
484 srv_edit.request.action = play_motion_builder_msgs::EditMotion::Request::LIST;
485 ros::service::call<play_motion_builder_msgs::EditMotion>(
486 "play_motion_builder_node/edit_motion", srv_edit);
487 EXPECT_FALSE(srv_edit.response.ok);
488 EXPECT_EQ(
"No motion being built", srv_edit.response.message);
493 int main(
int argc,
char** argv)
495 ros::init(argc, argv,
"test_motion_builder");
497 testing::InitGoogleTest(&argc, argv);
498 return RUN_ALL_TESTS();
Timer createTimer(Rate r, Handler h, Obj o, bool oneshot=false, bool autostart=true) const
ros::CallbackQueue queue_
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
bool compare_files(const std::string &filename1, const std::string &filename2)
int main(int argc, char **argv)
bool waitForServer(const ros::Duration &timeout=ros::Duration(0, 0)) const
void publish(const boost::shared_ptr< M > &message) const
std::unordered_map< std::string, double > joints_
SimpleClientGoalState getState() const
bool getParam(const std::string &key, std::string &s) const
void setCallbackQueue(CallbackQueueInterface *queue)
SimpleClientGoalState sendGoalAndWait(const Goal &goal, const ros::Duration &execute_timeout=ros::Duration(0, 0), const ros::Duration &preempt_timeout=ros::Duration(0, 0))
void changeJointPos(double left_arm, double right_arm, double head)
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
bool range_equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2)
void sendGoal(const Goal &goal, SimpleDoneCallback done_cb=SimpleDoneCallback(), SimpleActiveCallback active_cb=SimpleActiveCallback(), SimpleFeedbackCallback feedback_cb=SimpleFeedbackCallback())
void timerCb(const ros::TimerEvent &)
TEST(MotionBuilderTest, actionNotStartedTest)
ROSCPP_DECL void spinOnce()
ROSCPP_DECL bool waitForService(const std::string &service_name, int32_t timeout)
ros::Publisher joint_pub_