test_hand_finder.cpp
Go to the documentation of this file.
1 /*
2 * Copyright 2011 Shadow Robot Company Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the Free
6 * Software Foundation version 2 of the License.
7 *
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 *
13 * You should have received a copy of the GNU General Public License along
14 * with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16 
17 /*
18  * File: test_hand_finder.cpp
19  * Author: Vahid Aminzadeh <vahid@shadowrobot.com>
20  * Copyright:
21  *
22  * @brief see README.md
23  */
24 #include <gtest/gtest.h>
25 #include "ros/ros.h"
26 #include <ros/package.h>
27 #include <utility>
28 #include <iostream>
29 #include <map>
30 #include <vector>
31 #include <string>
33 #include <boost/foreach.hpp>
34 
35 using std::vector;
36 using std::map;
37 using std::string;
38 using std::pair;
39 
40 void ASSERT_MAP_HAS_VALUE(const map<string, string> &map, const string &value)
41 {
42  bool found = false;
43  pair<string, string> item;
44  BOOST_FOREACH(item, map)
45  {
46  if (value == item.second)
47  {
48  found = true;
49  }
50  }
51 
52  ASSERT_TRUE(found);
53 }
54 
55 TEST(SrHandFinder, hand_absent_test)
56 {
57  if (ros::param::has("/hand"))
58  {
59  ros::param::del("/hand");
60  }
61 
62  if (ros::param::has("robot_description"))
63  {
64  ros::param::del("robot_description");
65  }
66 
67  shadow_robot::SrHandFinder hand_finder;
68  map<string, vector<string> > hand_joints(hand_finder.get_joints());
69  ASSERT_EQ(hand_joints.size(), 0);
70  map<string, string> calibration_path(hand_finder.get_calibration_path());
71  ASSERT_EQ(calibration_path.size(), 0);
72  shadow_robot::HandControllerTuning controller_tuning(hand_finder.get_hand_controller_tuning());
73  ASSERT_EQ(controller_tuning.friction_compensation_.size(), 0);
74  ASSERT_EQ(controller_tuning.host_control_.size(), 0);
75  ASSERT_EQ(controller_tuning.motor_control_.size(), 0);
76 }
77 
78 TEST(SrHandFinder, one_hand_no_robot_description_finder_test)
79 {
80  if (ros::param::has("/hand"))
81  {
82  ros::param::del("/hand");
83  }
84 
85  if (ros::param::has("robot_description"))
86  {
87  ros::param::del("robot_description");
88  }
89 
90  ros::param::set("/hand/mapping/1", "right");
91  ros::param::set("/hand/joint_prefix/1", "rh_");
92 
93  string ethercat_path = ros::package::getPath("sr_ethercat_hand_config");
94  const string joint_names[] =
95  {
96  "FFJ1", "FFJ2", "FFJ3", "FFJ4", "MFJ1", "MFJ2", "MFJ3", "MFJ4",
97  "RFJ1", "RFJ2", "RFJ3", "RFJ4", "LFJ1", "LFJ2", "LFJ3", "LFJ4", "LFJ5",
98  "THJ1", "THJ2", "THJ3", "THJ4", "THJ5", "WRJ1", "WRJ2"
99  };
100 
101  shadow_robot::SrHandFinder hand_finder;
102  // hand parameters
103  ASSERT_GT(hand_finder.get_hand_parameters().mapping_.size(), 0);
104  ASSERT_GT(hand_finder.get_hand_parameters().joint_prefix_.size(), 0);
105  ASSERT_EQ(hand_finder.get_hand_parameters().mapping_["1"], "right");
106  ASSERT_EQ(hand_finder.get_hand_parameters().joint_prefix_["1"], "rh_");
107 
108  // hand joints
109  ASSERT_EQ(hand_finder.get_joints().size(), 1);
110  ASSERT_GT(hand_finder.get_joints().count("right"), 0);
111  const vector<string> rh_joints = hand_finder.get_joints().at("right");
112  ASSERT_EQ(rh_joints.size(), 24);
113  for (size_t i = 0; i < rh_joints.size(); ++i)
114  {
115  ROS_DEBUG_STREAM(rh_joints[i]);
116  ASSERT_STREQ(rh_joints[i].c_str(), ("rh_" + joint_names[i]).c_str());
117  }
118 
119  // calibration
120  ASSERT_GT(hand_finder.get_calibration_path().size(), 0);
121  const string calibration_path = hand_finder.get_calibration_path().at("right");
122  ROS_DEBUG_STREAM(calibration_path.c_str());
123  ASSERT_STREQ(calibration_path.c_str(), (ethercat_path + "/calibrations/right/" + "calibration.yaml").c_str());
124 
125  // tuning
126  shadow_robot::HandControllerTuning controller_tuning(hand_finder.get_hand_controller_tuning());
127 
128  for (map<string, string>::const_iterator iter = controller_tuning.friction_compensation_.begin();
129  iter != controller_tuning.friction_compensation_.end(); ++iter)
130  {
131  ASSERT_STREQ(iter->second.c_str(), (ethercat_path + "/controls/friction_compensation.yaml").c_str());
132  ROS_DEBUG_STREAM(iter->second);
133  }
134  for (map<string, string>::const_iterator iter = controller_tuning.motor_control_.begin();
135  iter != controller_tuning.motor_control_.end(); ++iter)
136  {
137  ASSERT_STREQ(iter->second.c_str(),
138  (ethercat_path + "/controls/motors/right/motor_board_effort_controllers.yaml").c_str());
139  ROS_DEBUG_STREAM(iter->second);
140  }
141  for (map<string, vector<string> >::const_iterator iter = controller_tuning.host_control_.begin();
142  iter != controller_tuning.host_control_.end(); ++iter)
143  {
144  string host_array[] =
145  {
146  "sr_edc_calibration_controllers.yaml",
147  "sr_edc_joint_velocity_controllers_PWM.yaml",
148  "sr_edc_effort_controllers_PWM.yaml",
149  "sr_edc_joint_velocity_controllers.yaml",
150  "sr_edc_effort_controllers.yaml",
151  "sr_edc_mixed_position_velocity_joint_controllers_PWM.yaml",
152  "sr_edc_joint_position_controllers_PWM.yaml",
153  "sr_edc_mixed_position_velocity_joint_controllers.yaml",
154  "sr_edc_joint_position_controllers.yaml"
155  };
156  vector<string> host_controller_files(host_array, host_array + 9);
157  ASSERT_EQ(host_controller_files.size(), iter->second.size());
158  for (size_t i = 0; i != iter->second.size(); ++i)
159  {
160  ASSERT_STREQ(iter->second[i].c_str(), (ethercat_path + "/controls/host/right/" +
161  host_controller_files[i]).c_str());
162  ROS_DEBUG_STREAM(iter->second[i]);
163  }
164  }
165 }
166 
167 TEST(SrHandFinder, one_hand_no_mapping_no_robot_description_finder_test)
168 {
169  if (ros::param::has("/hand"))
170  {
171  ros::param::del("/hand");
172  }
173 
174  if (ros::param::has("robot_description"))
175  {
176  ros::param::del("robot_description");
177  }
178 
179  ros::param::set("/hand/mapping/1", "");
180  ros::param::set("/hand/joint_prefix/1", "rh_");
181 
182  string ethercat_path = ros::package::getPath("sr_ethercat_hand_config");
183  const string joint_names[] =
184  {
185  "FFJ1", "FFJ2", "FFJ3", "FFJ4", "MFJ1", "MFJ2", "MFJ3", "MFJ4",
186  "RFJ1", "RFJ2", "RFJ3", "RFJ4", "LFJ1", "LFJ2", "LFJ3", "LFJ4", "LFJ5",
187  "THJ1", "THJ2", "THJ3", "THJ4", "THJ5", "WRJ1", "WRJ2"
188  };
189 
190  shadow_robot::SrHandFinder hand_finder;
191  // hand parameters
192  ASSERT_GT(hand_finder.get_hand_parameters().mapping_.size(), 0);
193  ASSERT_GT(hand_finder.get_hand_parameters().joint_prefix_.size(), 0);
194  ASSERT_EQ(hand_finder.get_hand_parameters().mapping_["1"], "1");
195  ASSERT_EQ(hand_finder.get_hand_parameters().joint_prefix_["1"], "rh_");
196 
197  // hand joints
198  ASSERT_EQ(hand_finder.get_joints().size(), 1);
199  ASSERT_GT(hand_finder.get_joints().count("1"), 0);
200  const vector<string> rh_joints = hand_finder.get_joints().at("1");
201  ASSERT_EQ(rh_joints.size(), 24);
202  for (size_t i = 0; i < rh_joints.size(); ++i)
203  {
204  ROS_DEBUG_STREAM(rh_joints[i]);
205  ASSERT_STREQ(rh_joints[i].c_str(), ("rh_" + joint_names[i]).c_str());
206  }
207 
208  // calibration
209  ASSERT_GT(hand_finder.get_calibration_path().size(), 0);
210  const string calibration_path = hand_finder.get_calibration_path().at("1");
211  ROS_DEBUG_STREAM(calibration_path.c_str());
212  ASSERT_STREQ(calibration_path.c_str(), (ethercat_path + "/calibrations/1/" + "calibration.yaml").c_str());
213 
214  // tuning
215  shadow_robot::HandControllerTuning controller_tuning(hand_finder.get_hand_controller_tuning());
216 
217  for (map<string, string>::const_iterator iter = controller_tuning.friction_compensation_.begin();
218  iter != controller_tuning.friction_compensation_.end(); ++iter)
219  {
220  ASSERT_STREQ(iter->second.c_str(), (ethercat_path + "/controls/friction_compensation.yaml").c_str());
221  ROS_DEBUG_STREAM(iter->second);
222  }
223  for (map<string, string>::const_iterator iter = controller_tuning.motor_control_.begin();
224  iter != controller_tuning.motor_control_.end(); ++iter)
225  {
226  ASSERT_STREQ(iter->second.c_str(),
227  (ethercat_path + "/controls/motors/1/motor_board_effort_controllers.yaml").c_str());
228  ROS_DEBUG_STREAM(iter->second);
229  }
230  for (map<string, vector<string> >::const_iterator iter = controller_tuning.host_control_.begin();
231  iter != controller_tuning.host_control_.end(); ++iter)
232  {
233  string host_array[] =
234  {
235  "sr_edc_calibration_controllers.yaml",
236  "sr_edc_joint_velocity_controllers_PWM.yaml",
237  "sr_edc_effort_controllers_PWM.yaml",
238  "sr_edc_joint_velocity_controllers.yaml",
239  "sr_edc_effort_controllers.yaml",
240  "sr_edc_mixed_position_velocity_joint_controllers_PWM.yaml",
241  "sr_edc_joint_position_controllers_PWM.yaml",
242  "sr_edc_mixed_position_velocity_joint_controllers.yaml",
243  "sr_edc_joint_position_controllers.yaml"
244  };
245  vector<string> host_controller_files(host_array, host_array + 9);
246  ASSERT_EQ(host_controller_files.size(), iter->second.size());
247  for (size_t i = 0; i != iter->second.size(); ++i)
248  {
249  ASSERT_STREQ(iter->second[i].c_str(), (ethercat_path + "/controls/host/1/" + host_controller_files[i]).c_str());
250  ROS_DEBUG_STREAM(iter->second[i]);
251  }
252  }
253 }
254 
255 TEST(SrHandFinder, one_hand_no_prefix_no_robot_description_finder_test)
256 {
257  if (ros::param::has("/hand"))
258  {
259  ros::param::del("/hand");
260  }
261 
262  if (ros::param::has("robot_description"))
263  {
264  ros::param::del("robot_description");
265  }
266 
267  ros::param::set("/hand/mapping/1", "rh");
268  ros::param::set("/hand/joint_prefix/1", "");
269 
270  string ethercat_path = ros::package::getPath("sr_ethercat_hand_config");
271  const string joint_names[] =
272  {
273  "FFJ1", "FFJ2", "FFJ3", "FFJ4", "MFJ1", "MFJ2", "MFJ3", "MFJ4",
274  "RFJ1", "RFJ2", "RFJ3", "RFJ4", "LFJ1", "LFJ2", "LFJ3", "LFJ4", "LFJ5",
275  "THJ1", "THJ2", "THJ3", "THJ4", "THJ5", "WRJ1", "WRJ2"
276  };
277 
278  shadow_robot::SrHandFinder hand_finder;
279  // hand parameters
280  ASSERT_GT(hand_finder.get_hand_parameters().mapping_.size(), 0);
281  ASSERT_GT(hand_finder.get_hand_parameters().joint_prefix_.size(), 0);
282  ASSERT_EQ(hand_finder.get_hand_parameters().mapping_["1"], "rh");
283  ASSERT_EQ(hand_finder.get_hand_parameters().joint_prefix_["1"], "");
284 
285  // hand joints
286  ASSERT_EQ(hand_finder.get_joints().size(), 1);
287  ASSERT_GT(hand_finder.get_joints().count("rh"), 0);
288  const vector<string> rh_joints = hand_finder.get_joints().at("rh");
289  ASSERT_EQ(rh_joints.size(), 24);
290  for (size_t i = 0; i < rh_joints.size(); ++i)
291  {
292  ROS_DEBUG_STREAM(rh_joints[i]);
293  ASSERT_STREQ(rh_joints[i].c_str(), (joint_names[i]).c_str());
294  }
295 
296  // calibration
297  ASSERT_GT(hand_finder.get_calibration_path().size(), 0);
298  const string calibration_path = hand_finder.get_calibration_path().at("rh");
299  ROS_DEBUG_STREAM(calibration_path.c_str());
300  ASSERT_STREQ(calibration_path.c_str(), (ethercat_path + "/calibrations/rh/" + "calibration.yaml").c_str());
301 
302  // tuning
303  shadow_robot::HandControllerTuning controller_tuning(hand_finder.get_hand_controller_tuning());
304 
305  for (map<string, string>::const_iterator iter = controller_tuning.friction_compensation_.begin();
306  iter != controller_tuning.friction_compensation_.end(); ++iter)
307  {
308  ASSERT_STREQ(iter->second.c_str(), (ethercat_path + "/controls/friction_compensation.yaml").c_str());
309  ROS_DEBUG_STREAM(iter->second);
310  }
311  for (map<string, string>::const_iterator iter = controller_tuning.motor_control_.begin();
312  iter != controller_tuning.motor_control_.end(); ++iter)
313  {
314  ASSERT_STREQ(iter->second.c_str(),
315  (ethercat_path + "/controls/motors/rh/motor_board_effort_controllers.yaml").c_str());
316  ROS_DEBUG_STREAM(iter->second);
317  }
318  for (map<string, vector<string> >::const_iterator iter = controller_tuning.host_control_.begin();
319  iter != controller_tuning.host_control_.end(); ++iter)
320  {
321  string host_array[] =
322  {
323  "sr_edc_calibration_controllers.yaml",
324  "sr_edc_joint_velocity_controllers_PWM.yaml",
325  "sr_edc_effort_controllers_PWM.yaml",
326  "sr_edc_joint_velocity_controllers.yaml",
327  "sr_edc_effort_controllers.yaml",
328  "sr_edc_mixed_position_velocity_joint_controllers_PWM.yaml",
329  "sr_edc_joint_position_controllers_PWM.yaml",
330  "sr_edc_mixed_position_velocity_joint_controllers.yaml",
331  "sr_edc_joint_position_controllers.yaml"
332  };
333  vector<string> host_controller_files(host_array, host_array + 9);
334  ASSERT_EQ(host_controller_files.size(), iter->second.size());
335  for (size_t i = 0; i != iter->second.size(); ++i)
336  {
337  ASSERT_STREQ(iter->second[i].c_str(), (ethercat_path + "/controls/host/rh/" + host_controller_files[i]).c_str());
338  ROS_DEBUG_STREAM(iter->second[i]);
339  }
340  }
341 }
342 
343 TEST(SrHandFinder, one_hand_no_mapping_no_prefix_no_robot_description_finder_test)
344 {
345  if (ros::param::has("/hand"))
346  {
347  ros::param::del("/hand");
348  }
349 
350  if (ros::param::has("robot_description"))
351  {
352  ros::param::del("robot_description");
353  }
354 
355  ros::param::set("/hand/mapping/1", "");
356  ros::param::set("/hand/joint_prefix/1", "");
357 
358  string ethercat_path = ros::package::getPath("sr_ethercat_hand_config");
359  const string joint_names[] =
360  {
361  "FFJ1", "FFJ2", "FFJ3", "FFJ4", "MFJ1", "MFJ2", "MFJ3", "MFJ4",
362  "RFJ1", "RFJ2", "RFJ3", "RFJ4", "LFJ1", "LFJ2", "LFJ3", "LFJ4", "LFJ5",
363  "THJ1", "THJ2", "THJ3", "THJ4", "THJ5", "WRJ1", "WRJ2"
364  };
365 
366  shadow_robot::SrHandFinder hand_finder;
367  // hand parameters
368  ASSERT_GT(hand_finder.get_hand_parameters().mapping_.size(), 0);
369  ASSERT_GT(hand_finder.get_hand_parameters().joint_prefix_.size(), 0);
370  ASSERT_EQ(hand_finder.get_hand_parameters().mapping_["1"], "1");
371  ASSERT_EQ(hand_finder.get_hand_parameters().joint_prefix_["1"], "");
372 
373  // hand joints
374  ASSERT_EQ(hand_finder.get_joints().size(), 1);
375  ASSERT_GT(hand_finder.get_joints().count("1"), 0);
376  const vector<string> rh_joints = hand_finder.get_joints().at("1");
377  ASSERT_EQ(rh_joints.size(), 24);
378  for (size_t i = 0; i < rh_joints.size(); ++i)
379  {
380  ROS_DEBUG_STREAM(rh_joints[i]);
381  ASSERT_STREQ(rh_joints[i].c_str(), (joint_names[i]).c_str());
382  }
383 
384  // calibration
385  ASSERT_GT(hand_finder.get_calibration_path().size(), 0);
386  const string calibration_path = hand_finder.get_calibration_path().at("1");
387  ROS_DEBUG_STREAM(calibration_path.c_str());
388  ASSERT_STREQ(calibration_path.c_str(), (ethercat_path + "/calibrations/1/" + "calibration.yaml").c_str());
389 
390  // tuning
391  shadow_robot::HandControllerTuning controller_tuning(hand_finder.get_hand_controller_tuning());
392 
393  for (map<string, string>::const_iterator iter = controller_tuning.friction_compensation_.begin();
394  iter != controller_tuning.friction_compensation_.end(); ++iter)
395  {
396  ASSERT_STREQ(iter->second.c_str(), (ethercat_path + "/controls/friction_compensation.yaml").c_str());
397  ROS_DEBUG_STREAM(iter->second);
398  }
399  for (map<string, string>::const_iterator iter = controller_tuning.motor_control_.begin();
400  iter != controller_tuning.motor_control_.end(); ++iter)
401  {
402  ASSERT_STREQ(iter->second.c_str(),
403  (ethercat_path + "/controls/motors/1/motor_board_effort_controllers.yaml").c_str());
404  ROS_DEBUG_STREAM(iter->second);
405  }
406  for (map<string, vector<string> >::const_iterator iter = controller_tuning.host_control_.begin();
407  iter != controller_tuning.host_control_.end(); ++iter)
408  {
409  string host_array[] =
410  {
411  "sr_edc_calibration_controllers.yaml",
412  "sr_edc_joint_velocity_controllers_PWM.yaml",
413  "sr_edc_effort_controllers_PWM.yaml",
414  "sr_edc_joint_velocity_controllers.yaml",
415  "sr_edc_effort_controllers.yaml",
416  "sr_edc_mixed_position_velocity_joint_controllers_PWM.yaml",
417  "sr_edc_joint_position_controllers_PWM.yaml",
418  "sr_edc_mixed_position_velocity_joint_controllers.yaml",
419  "sr_edc_joint_position_controllers.yaml"
420  };
421  vector<string> host_controller_files(host_array, host_array + 9);
422  ASSERT_EQ(host_controller_files.size(), iter->second.size());
423  for (size_t i = 0; i != iter->second.size(); ++i)
424  {
425  ASSERT_STREQ(iter->second[i].c_str(), (ethercat_path + "/controls/host/1/" + host_controller_files[i]).c_str());
426  ROS_DEBUG_STREAM(iter->second[i]);
427  }
428  }
429 }
430 
431 TEST(SrHandFinder, one_hand_robot_description_exists_finger_test)
432 {
433  if (ros::param::has("/hand"))
434  {
435  ros::param::del("/hand");
436  }
437 
438  if (ros::param::has("robot_description"))
439  {
440  ros::param::del("robot_description");
441  }
442 
443  string right_hand_description;
444  ros::param::get("/right_hand_description", right_hand_description);
445  ros::param::set("robot_description", right_hand_description);
446 
447  ros::param::set("/hand/mapping/1", "right");
448  ros::param::set("/hand/joint_prefix/1", "rh_");
449  string ethercat_path = ros::package::getPath("sr_ethercat_hand_config");
450  const string joint_names[] =
451  {
452  "FFJ1", "FFJ2", "FFJ3", "FFJ4", "MFJ1", "MFJ2", "MFJ3", "MFJ4",
453  "RFJ1", "RFJ2", "RFJ3", "RFJ4", "LFJ1", "LFJ2", "LFJ3", "LFJ4", "LFJ5",
454  "THJ1", "THJ2", "THJ3", "THJ4", "THJ5", "WRJ1", "WRJ2"
455  };
456 
457  shadow_robot::SrHandFinder hand_finder;
458  // hand parameters
459  ASSERT_GT(hand_finder.get_hand_parameters().mapping_.size(), 0);
460  ASSERT_GT(hand_finder.get_hand_parameters().joint_prefix_.size(), 0);
461  ASSERT_EQ(hand_finder.get_hand_parameters().mapping_["1"], "right");
462  ASSERT_EQ(hand_finder.get_hand_parameters().joint_prefix_["1"], "rh_");
463 
464  // hand joints
465  ASSERT_EQ(hand_finder.get_joints().size(), 1);
466  ASSERT_GT(hand_finder.get_joints().count("right"), 0);
467  const vector<string> rh_joints = hand_finder.get_joints().at("right");
468  ASSERT_EQ(rh_joints.size(), 1); // only RFJ4 is there
469  ASSERT_EQ(std::find(rh_joints.begin(), rh_joints.end(), "rh_FFJ3"), rh_joints.end());
470  ASSERT_NE(std::find(rh_joints.begin(), rh_joints.end(), "rh_RFJ4"), rh_joints.end());
471 
472  // calibration
473  ASSERT_GT(hand_finder.get_calibration_path().size(), 0);
474  const string calibration_path = hand_finder.get_calibration_path().at("right");
475  ROS_DEBUG_STREAM(calibration_path.c_str());
476  ASSERT_STREQ(calibration_path.c_str(), (ethercat_path + "/calibrations/right/" + "calibration.yaml").c_str());
477 
478  // tuning
479  shadow_robot::HandControllerTuning controller_tuning(hand_finder.get_hand_controller_tuning());
480 
481  for (map<string, string>::const_iterator iter = controller_tuning.friction_compensation_.begin();
482  iter != controller_tuning.friction_compensation_.end(); ++iter)
483  {
484  ASSERT_STREQ(iter->second.c_str(), (ethercat_path + "/controls/friction_compensation.yaml").c_str());
485  ROS_DEBUG_STREAM(iter->second);
486  }
487  for (map<string, string>::const_iterator iter = controller_tuning.motor_control_.begin();
488  iter != controller_tuning.motor_control_.end(); ++iter)
489  {
490  ASSERT_STREQ(iter->second.c_str(),
491  (ethercat_path + "/controls/motors/right/motor_board_effort_controllers.yaml").c_str());
492  ROS_DEBUG_STREAM(iter->second);
493  }
494  for (map<string, vector<string> >::const_iterator iter = controller_tuning.host_control_.begin();
495  iter != controller_tuning.host_control_.end(); ++iter)
496  {
497  string host_array[] =
498  {
499  "sr_edc_calibration_controllers.yaml",
500  "sr_edc_joint_velocity_controllers_PWM.yaml",
501  "sr_edc_effort_controllers_PWM.yaml",
502  "sr_edc_joint_velocity_controllers.yaml",
503  "sr_edc_effort_controllers.yaml",
504  "sr_edc_mixed_position_velocity_joint_controllers_PWM.yaml",
505  "sr_edc_joint_position_controllers_PWM.yaml",
506  "sr_edc_mixed_position_velocity_joint_controllers.yaml",
507  "sr_edc_joint_position_controllers.yaml"
508  };
509  vector<string> host_controller_files(host_array, host_array + 9);
510  ASSERT_EQ(host_controller_files.size(), iter->second.size());
511  for (size_t i = 0; i != iter->second.size(); ++i)
512  {
513  ASSERT_STREQ(iter->second[i].c_str(), (ethercat_path + "/controls/host/right/"
514  + host_controller_files[i]).c_str());
515  ROS_DEBUG_STREAM(iter->second[i]);
516  }
517  }
518 }
519 
520 TEST(SrHandFinder, two_hand_robot_description_exists_finder_test)
521 {
522  if (ros::param::has("/hand"))
523  {
524  ros::param::del("/hand");
525  }
526 
527  if (ros::param::has("robot_description"))
528  {
529  ros::param::del("robot_description");
530  }
531 
532  ros::param::set("/hand/mapping/1", "right");
533  ros::param::set("/hand/joint_prefix/1", "rh_");
534  ros::param::set("/hand/mapping/2", "left");
535  ros::param::set("/hand/joint_prefix/2", "lh_");
536 
537  string two_hands_description;
538  ros::param::get("/two_hands_description", two_hands_description);
539  ros::param::set("robot_description", two_hands_description);
540 
541  const string joint_names[] =
542  {
543  "FFJ1", "FFJ2", "FFJ3", "FFJ4", "MFJ1", "MFJ2", "MFJ3", "MFJ4",
544  "RFJ1", "RFJ2", "RFJ3", "RFJ4", "LFJ1", "LFJ2", "LFJ3", "LFJ4", "LFJ5",
545  "THJ1", "THJ2", "THJ3", "THJ4", "THJ5", "WRJ1", "WRJ2"
546  };
547 
548  unsigned idx = 0;
549  const string dir[] = {"left", "right"};
550 
551  shadow_robot::SrHandFinder hand_finder;
552 
553  ASSERT_EQ(hand_finder.get_hand_parameters().mapping_.size(), 2);
554  ASSERT_EQ(hand_finder.get_hand_parameters().joint_prefix_.size(), 2);
555  ASSERT_EQ(hand_finder.get_joints().size(), 2);
556  ASSERT_GT(hand_finder.get_calibration_path().size(), 0);
557 
558  ASSERT_MAP_HAS_VALUE(hand_finder.get_hand_parameters().mapping_, "right");
559  ASSERT_MAP_HAS_VALUE(hand_finder.get_hand_parameters().mapping_, "left");
560 
563 
564  ASSERT_GT(hand_finder.get_joints().count("right"), 0);
565  const vector<string> rh_joints = hand_finder.get_joints().at("right");
566  ASSERT_EQ(std::find(rh_joints.begin(), rh_joints.end(), "rh_FFJ3"), rh_joints.end());
567  ASSERT_NE(std::find(rh_joints.begin(), rh_joints.end(), "rh_RFJ4"), rh_joints.end());
568 
569  ASSERT_GT(hand_finder.get_joints().count("left"), 0);
570  const vector<string> lh_joints = hand_finder.get_joints().at("left");
571  ASSERT_EQ(std::find(lh_joints.begin(), lh_joints.end(), "lh_FFJ1"), lh_joints.end());
572  ASSERT_NE(std::find(lh_joints.begin(), lh_joints.end(), "lh_LFJ4"), lh_joints.end());
573 
574  string ethercat_path = ros::package::getPath("sr_ethercat_hand_config");
575  map<string, string> calibration_path(hand_finder.get_calibration_path());
576  idx = 0;
577  for (map<string, string>::const_iterator iter = calibration_path.begin(); iter != calibration_path.end(); ++iter)
578  {
579  ROS_DEBUG_STREAM(iter->first << ":" << iter->second);
580  ASSERT_STREQ(iter->second.c_str(), (ethercat_path + "/calibrations/"
581  + dir[idx] + "/" + "calibration.yaml").c_str());
582  idx++;
583  }
584  shadow_robot::HandControllerTuning controller_tuning(hand_finder.get_hand_controller_tuning());
585 
586  for (map<string, string>::const_iterator iter = controller_tuning.friction_compensation_.begin();
587  iter != controller_tuning.friction_compensation_.end(); ++iter)
588  {
589  ASSERT_STREQ(iter->second.c_str(), (ethercat_path + "/controls/friction_compensation.yaml").c_str());
590  ROS_DEBUG_STREAM(iter->second);
591  }
592 
593  idx = 0;
594  for (map<string, string>::const_iterator iter = controller_tuning.motor_control_.begin();
595  iter != controller_tuning.motor_control_.end(); ++iter)
596  {
597  ASSERT_STREQ(iter->second.c_str(),
598  (ethercat_path + "/controls/motors/" + dir[idx] + "/motor_board_effort_controllers.yaml").c_str());
599  ROS_DEBUG_STREAM(iter->second);
600  idx++;
601  }
602 
603  idx = 0;
604  for (map<string, vector<string> >::const_iterator iter = controller_tuning.host_control_.begin();
605  iter != controller_tuning.host_control_.end(); ++iter)
606  {
607  string host_array[] =
608  {
609  "sr_edc_calibration_controllers.yaml",
610  "sr_edc_joint_velocity_controllers_PWM.yaml",
611  "sr_edc_effort_controllers_PWM.yaml",
612  "sr_edc_joint_velocity_controllers.yaml",
613  "sr_edc_effort_controllers.yaml",
614  "sr_edc_mixed_position_velocity_joint_controllers_PWM.yaml",
615  "sr_edc_joint_position_controllers_PWM.yaml",
616  "sr_edc_mixed_position_velocity_joint_controllers.yaml",
617  "sr_edc_joint_position_controllers.yaml"
618  };
619  vector<string> host_controller_files(host_array, host_array + 9);
620  ASSERT_EQ(host_controller_files.size(), iter->second.size());
621  for (size_t i = 0; i != iter->second.size(); ++i)
622  {
623  ASSERT_STREQ(iter->second[i].c_str(), (ethercat_path + "/controls/host/"
624  + dir[idx] + "/" + host_controller_files[i]).c_str());
625  ROS_DEBUG_STREAM(iter->second[i]);
626  }
627  idx++;
628  }
629 }
630 
631 
632 int main(int argc, char **argv)
633 {
634  ros::init(argc, argv, "test_hand_finder");
635  ros::NodeHandle nh;
636  testing::InitGoogleTest(&argc, argv);
637  return RUN_ALL_TESTS();
638 }
639 
TEST(SrHandFinder, hand_absent_test)
HandControllerTuning get_hand_controller_tuning()
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
void ASSERT_MAP_HAS_VALUE(const map< string, string > &map, const string &value)
std::map< std::string, std::string > mapping_
ROSCPP_DECL void set(const std::string &key, const XmlRpc::XmlRpcValue &v)
ROSCPP_DECL bool get(const std::string &key, std::string &s)
int main(int argc, char **argv)
ROSCPP_DECL bool has(const std::string &key)
std::map< std::string, std::string > get_calibration_path()
#define ROS_DEBUG_STREAM(args)
std::map< std::string, std::vector< std::string > > get_joints()
ROSLIB_DECL std::string getPath(const std::string &package_name)
ROSCPP_DECL bool del(const std::string &key)
std::map< std::string, std::string > joint_prefix_


sr_utilities
Author(s): Ugo Cupcic
autogenerated on Mon Feb 28 2022 23:52:19