1 #include "urdf_parser/urdf_parser.h" 
    7 #include <dynamic_tf_publisher/SetDynamicTF.h> 
    8 #include <Eigen/Geometry> 
   10 #include <kdl/frames_io.hpp> 
   12 #include <jsk_topic_tools/log_utils.h> 
   13 #include <boost/filesystem.hpp> 
   20   visualization_msgs::InteractiveMarkerControl control;
 
   23     for(
int i=0; 
i<int_marker.controls.size(); 
i++) {
 
   24       int_marker.controls[
i].always_visible = 
true;
 
   29     Eigen::Vector3f origin_x(1,0,0);
 
   30     Eigen::Vector3f dest_x(parent_joint->axis.x, parent_joint->axis.y, parent_joint->axis.z);
 
   31     Eigen::Quaternionf qua;
 
   33     qua.setFromTwoVectors(origin_x, dest_x);
 
   34     control.orientation.x = qua.x();
 
   35     control.orientation.y = qua.y();
 
   36     control.orientation.z = qua.z();
 
   37     control.orientation.w = qua.w();
 
   39     int_marker.scale = 0.5;
 
   41     switch(parent_joint->type) {
 
   43     case Joint::CONTINUOUS:
 
   44       control.interaction_mode = visualization_msgs::InteractiveMarkerControl::ROTATE_AXIS;
 
   45       int_marker.controls.push_back(control);
 
   47     case Joint::PRISMATIC:
 
   48       control.interaction_mode = visualization_msgs::InteractiveMarkerControl::MOVE_AXIS;
 
   49       int_marker.controls.push_back(control);
 
   58   visualization_msgs::InteractiveMarkerControl control;
 
   60   visualization_msgs::Marker 
marker;
 
   63   marker.type = visualization_msgs::Marker::CYLINDER;
 
   72   Eigen::Vector3f origin_x(0,0,1);
 
   73   Eigen::Vector3f dest_x(parent_joint->axis.x, parent_joint->axis.y, parent_joint->axis.z);
 
   74   Eigen::Quaternionf qua;
 
   76   qua.setFromTwoVectors(origin_x, dest_x);
 
   77   marker.pose.orientation.x = qua.x();
 
   78   marker.pose.orientation.y = qua.y();
 
   79   marker.pose.orientation.z = qua.z();
 
   80   marker.pose.orientation.w = qua.w();
 
   82   control.markers.push_back(
marker);
 
   83   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
 
   84   control.always_visible = 
true;
 
   86   int_marker.controls.push_back(control);
 
   93   visualization_msgs::InteractiveMarkerControl control;
 
   94   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
 
   95   visualization_msgs::Marker 
marker;
 
   96   marker.type = visualization_msgs::Marker::SPHERE;
 
  106   control.markers.push_back(
marker);
 
  107   control.always_visible = 
true;
 
  108   int_marker.controls.push_back(control);
 
  110   if (linkMarkerMap[link_frame_name_].gp.displayMoveMarker) {
 
  117   jsk_topic_tools::ScopedTimer timer = dynamic_tf_check_time_acc_.scopedTimer();
 
  118   dynamic_tf_publisher::SetDynamicTF SetTf;
 
  120   SetTf.request.freq = 20;
 
  123   SetTf.request.cur_tf.header.frame_id = parent_frame_id;
 
  124   SetTf.request.cur_tf.child_frame_id = 
frame_id;
 
  125   SetTf.request.cur_tf.transform = transform;
 
  126   if (use_dynamic_tf_ || parent_frame_id == frame_id_) {
 
  128     dynamic_tf_publisher_client.call(SetTf);
 
  133   if (use_dynamic_tf_) {
 
  135     dynamic_tf_publisher_publish_tf_client.call(req);
 
  140   publishBasePose(feedback->pose, feedback->header);
 
  144   geometry_msgs::PoseStamped ps;
 
  147   pub_base_pose_.publish(ps);
 
  153   publishMarkerPose(feedback->pose, feedback->header, feedback->marker_name);
 
  157   jsk_interactive_marker::MarkerPose mp;
 
  160   mp.marker_name = marker_name;
 
  161   mp.type = jsk_interactive_marker::MarkerPose::GENERAL;
 
  167   jsk_interactive_marker::MarkerMenu m;
 
  168   m.marker_name = feedback->marker_name;
 
  170   pub_move_.publish(m);
 
  176   jsk_interactive_marker::MarkerMenu m;
 
  194   pub_joint_state_.publish(js);
 
  202     init_stamp_ = ps.header.stamp;
 
  203     tfl_.transformPose(frame_id_, ps, ps);
 
  205     geometry_msgs::Pose 
pose = getRootPose(ps.pose);
 
  207     string root_frame = tf_prefix_ + model->getRoot()->name;
 
  208     linkMarkerMap[frame_id_].pose = 
pose;
 
  211     addChildLinkNames(model->getRoot(), 
true, 
false);
 
  212     publishMarkerPose(
pose, ps.header, root_frame);
 
  225   boost::mutex::scoped_lock 
lock(joint_states_mutex_);
 
  226   if (is_joint_states_locked_) {
 
  229   jsk_topic_tools::ScopedTimer timer = reset_joint_states_check_time_acc_.scopedTimer();
 
  230   setJointState(model->getRoot(), 
msg);
 
  231   republishJointState(*
msg);
 
  239   resetRootForVisualization();
 
  240   server_->applyChanges();
 
  246   switch (feedback->event_type) {
 
  247   case visualization_msgs::InteractiveMarkerFeedback::POSE_UPDATE:
 
  248   case visualization_msgs::InteractiveMarkerFeedback::MOUSE_UP:
 
  249     linkMarkerMap[
frame_id].pose = feedback->pose;
 
  251     if (parent_frame_id == frame_id_) {
 
  252       root_pose_ = feedback->pose;
 
  253       publishBasePose(feedback);
 
  256     publishMarkerPose(feedback);
 
  257     publishJointState(feedback);
 
  259   case visualization_msgs::InteractiveMarkerFeedback::BUTTON_CLICK:
 
  260     cout << 
"clicked" << 
" frame:" << 
frame_id << mode_ << endl;
 
  262     if (mode_ != 
"visualization") {
 
  263       linkMarkerMap[linkMarkerMap[
frame_id].movable_link].displayMoveMarker ^= 
true;
 
  264       addChildLinkNames(model->getRoot(), 
true, 
false);
 
  267       geometry_msgs::PoseStamped ps = getOriginPoseStamped();
 
  268       pub_selected_.publish(ps);
 
  269       jsk_recognition_msgs::Int32Stamped index_msg;
 
  270       index_msg.data = index_;
 
  271       index_msg.header.stamp = init_stamp_;
 
  272       pub_selected_index_.publish(index_msg);
 
  277   diagnostic_updater_->update();
 
  287   KDL::Vector graspVec(feedback->mouse_point.x, feedback->mouse_point.y, feedback->mouse_point.z);
 
  288   KDL::Frame parentFrame;
 
  291   graspVec = parentFrame.Inverse(graspVec);
 
  293   geometry_msgs::Pose 
p;
 
  294   p.position.x = graspVec.x();
 
  295   p.position.y = graspVec.y();
 
  296   p.position.z = graspVec.z();
 
  297   p.orientation = linkMarkerMap[feedback->marker_name].gp.pose.orientation;
 
  298   linkMarkerMap[feedback->marker_name].gp.pose = 
p;
 
  300   linkMarkerMap[feedback->marker_name].gp.displayGraspPoint = 
true;
 
  301   addChildLinkNames(model->getRoot(), 
true, 
false);
 
  307   publishJointState(feedback);
 
  309   publishMarkerMenu(feedback, jsk_interactive_marker::MarkerMenu::JOINT_MOVE);
 
  314   publishJointState(feedback);
 
  315   publishMarkerMenu(feedback, jsk_interactive_marker::MarkerMenu::RESET_JOINT);
 
  328   geometry_msgs::PoseStamped ps;
 
  329   ps.header.frame_id = frame_id_;
 
  330   ps.pose = root_pose_;
 
  334   addChildLinkNames(model->getRoot(), 
true, 
false);
 
  341     geometry_msgs::TransformStamped ts_msg;
 
  342     tfl_.lookupTransform(frame_id_, model->getRoot()->name,
 
  354   if (fixed_link_.size() > 0 && (mode_ == 
"visualization" || mode_ == 
"robot")) {
 
  355     string marker_name =  tf_prefix_ + model->getRoot()->name;
 
  357     bool first_offset = 
true;
 
  358     for(
int i=0; 
i<fixed_link_.size(); 
i++) {
 
  359       std::string link = fixed_link_[
i];
 
  361         ROS_DEBUG_STREAM(
"fixed_link:" << tf_prefix_ + model->getRoot()->name << tf_prefix_ + link);
 
  362         const std::string source_frame = tf_prefix_ + link;
 
  363         const std::string 
target_frame = tf_prefix_ + model->getRoot()->name;
 
  369                                now, st_link_offset);
 
  374             first_offset = 
false;
 
  382           ROS_ERROR(
"Failed to lookup transformation from %s to %s: %s",
 
  391     geometry_msgs::TransformStamped ts_fixed_link_offset;
 
  392     ts_fixed_link_offset.transform.translation.x = fixed_link_offset_.position.x;
 
  393     ts_fixed_link_offset.transform.translation.y = fixed_link_offset_.position.y;
 
  394     ts_fixed_link_offset.transform.translation.z = fixed_link_offset_.position.z;
 
  395     ts_fixed_link_offset.transform.rotation = fixed_link_offset_.orientation;
 
  400     transform = st_offset * st_fixed_link_offset;
 
  403     geometry_msgs::Transform tf_msg;
 
  406     root_offset_.position.x = tf_msg.translation.x;
 
  407     root_offset_.position.y = tf_msg.translation.y;
 
  408     root_offset_.position.z = tf_msg.translation.z;
 
  409     root_offset_.orientation = tf_msg.rotation;
 
  412     geometry_msgs::PoseStamped ps;
 
  414     ps.header.frame_id = frame_id_;
 
  415     ps.pose.orientation.w = 1.0;
 
  417     root_pose_ = ps.pose;
 
  419     geometry_msgs::Pose 
pose = getRootPose(ps.pose);
 
  421     string root_frame = tf_prefix_ + model->getRoot()->name;
 
  422     linkMarkerMap[frame_id_].pose = 
pose;
 
  425     addChildLinkNames(model->getRoot(), 
true, 
false);
 
  434   publishJointState(feedback);
 
  439   jsk_interactive_marker::MoveModel mm;
 
  440   mm.header = feedback->header;
 
  441   mm.name = model_name_;
 
  442   mm.description = model_description_;
 
  443   mm.joint_state_origin = joint_state_origin_;
 
  444   mm.joint_state_goal = joint_state_;
 
  445   mm.pose_origin.header.frame_id = frame_id_;
 
  446   mm.pose_origin.pose = root_pose_origin_;
 
  447   mm.pose_goal.header.frame_id = frame_id_;
 
  448   mm.pose_goal.pose = root_pose_;
 
  449   pub_move_model_.publish(mm);
 
  453   jsk_interactive_marker::MoveObject mo;
 
  454   mo.origin.header = feedback->header;
 
  455   mo.origin.pose = linkMarkerMap[feedback->marker_name].origin;
 
  457   mo.goal.header = feedback->header;
 
  458   mo.goal.pose = feedback->pose;
 
  460   mo.graspPose = linkMarkerMap[feedback->marker_name].gp.pose;
 
  461   pub_move_object_.publish(mo);
 
  466   cout << 
"setPose" <<endl;
 
  467   joint_state_origin_ = joint_state_;
 
  468   root_pose_origin_ = root_pose_;
 
  469   setOriginalPose(model->getRoot());
 
  477   linkMarkerMap[linkMarkerMap[feedback->marker_name].movable_link].displayMoveMarker = 
false;
 
  478   addChildLinkNames(model->getRoot(), 
true, 
false);
 
  482   map<string, linkProperty>::iterator it = linkMarkerMap.begin();
 
  483   while (it != linkMarkerMap.end())
 
  485     (*it).second.displayMoveMarker = 
false;
 
  488   addChildLinkNames(model->getRoot(), 
true, 
false);
 
  492   map<string, linkProperty>::iterator it = linkMarkerMap.begin();
 
  493   while (it != linkMarkerMap.end())
 
  495     (*it).second.displayModelMarker = 
false;
 
  498   addChildLinkNames(model->getRoot(), 
true, 
false);
 
  502   map<string, linkProperty>::iterator it = linkMarkerMap.begin();
 
  503   while (it != linkMarkerMap.end())
 
  505     (*it).second.displayModelMarker = 
true;
 
  508   addChildLinkNames(model->getRoot(), 
true, 
false);
 
  515   linkMarkerMap.clear();
 
  517   model = parseURDF(
msg->data);
 
  519     ROS_ERROR(
"Model Parsing the xml failed");
 
  522   addChildLinkNames(model->getRoot(), 
true, 
true);
 
  531   switch (feedback->event_type) {
 
  532   case visualization_msgs::InteractiveMarkerFeedback::POSE_UPDATE:
 
  533     linkMarkerMap[
link_name].gp.pose = feedback->pose;
 
  534     publishMarkerPose(feedback);
 
  536   case visualization_msgs::InteractiveMarkerFeedback::BUTTON_CLICK:
 
  537     cout << 
"clicked" << 
" frame:" << feedback->marker_name << endl;
 
  538     linkMarkerMap[
link_name].gp.displayMoveMarker ^= 
true;
 
  539     addChildLinkNames(model->getRoot(), 
true, 
false);
 
  544 visualization_msgs::InteractiveMarkerControl 
UrdfModelMarker::makeMeshMarkerControl(
const std::string &mesh_resource, 
const geometry_msgs::PoseStamped &stamped, geometry_msgs::Vector3 scale, 
const std_msgs::ColorRGBA &color, 
bool use_color) {
 
  545   visualization_msgs::Marker meshMarker;
 
  547   if (use_color) meshMarker.color = color;
 
  549   meshMarker.mesh_use_embedded_materials = !use_color;
 
  550   meshMarker.type = visualization_msgs::Marker::MESH_RESOURCE;
 
  552   meshMarker.scale = 
scale;
 
  553   meshMarker.pose = stamped.pose;
 
  554   visualization_msgs::InteractiveMarkerControl control;
 
  555   control.markers.push_back(meshMarker);
 
  556   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
 
  557   control.always_visible = 
true;
 
  564   std_msgs::ColorRGBA color;
 
  575                                                                                     const geometry_msgs::PoseStamped &stamped, geometry_msgs::Vector3 scale, 
const std_msgs::ColorRGBA &color)
 
  581   visualization_msgs::Marker cylinderMarker;
 
  583   if (use_color) cylinderMarker.color = color;
 
  584   cylinderMarker.type = visualization_msgs::Marker::CYLINDER;
 
  585   cylinderMarker.scale.x = 
radius * 2;
 
  586   cylinderMarker.scale.y = 
radius * 2;
 
  587   cylinderMarker.scale.z = 
length;
 
  588   cylinderMarker.pose = stamped.pose;
 
  590   visualization_msgs::InteractiveMarkerControl control;
 
  591   control.markers.push_back(cylinderMarker);
 
  592   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
 
  593   control.always_visible = 
true;
 
  599   visualization_msgs::Marker boxMarker;
 
  601   fprintf(
stderr, 
"urdfModelMarker = %f %f %f\n", dim.x, dim.y, dim.z);
 
  602   if (use_color) boxMarker.color = color;
 
  603   boxMarker.type = visualization_msgs::Marker::CUBE;
 
  604   boxMarker.scale.x = dim.x;
 
  605   boxMarker.scale.y = dim.y;
 
  606   boxMarker.scale.z = dim.z;
 
  607   boxMarker.pose = stamped.pose;
 
  609   visualization_msgs::InteractiveMarkerControl control;
 
  610   control.markers.push_back(boxMarker);
 
  611   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
 
  612   control.always_visible = 
true;
 
  618   visualization_msgs::Marker sphereMarker;
 
  620   if (use_color) sphereMarker.color = color;
 
  621   sphereMarker.type = visualization_msgs::Marker::SPHERE;
 
  622   sphereMarker.scale.x = rad * 2;
 
  623   sphereMarker.scale.y = rad * 2;
 
  624   sphereMarker.scale.z = rad * 2;
 
  625   sphereMarker.pose = stamped.pose;
 
  627   visualization_msgs::InteractiveMarkerControl control;
 
  628   control.markers.push_back(sphereMarker);
 
  629   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
 
  630   control.always_visible = 
true;
 
  637   pub_joint_state_.publish(joint_state_);
 
  641   sensor_msgs::JointState new_joint_state;
 
  642   joint_state_ = new_joint_state;
 
  644   getJointState(model->getRoot());
 
  649   string link_frame_name_ =  tf_prefix_ + link->name;
 
  651   if (parent_joint != 
NULL) {
 
  652     KDL::Frame initialFrame;
 
  653     KDL::Frame presentFrame;
 
  656     KDL::Vector jointVec;
 
  658     double jointAngleAllRange;
 
  659     switch(parent_joint->type) {
 
  660     case Joint::REVOLUTE:
 
  661     case Joint::CONTINUOUS:
 
  663       linkProperty *link_property = &linkMarkerMap[link_frame_name_];
 
  666       rot = initialFrame.M.Inverse() * presentFrame.M;
 
  667       jointAngle = 
rot.GetRotAngle(rotVec);
 
  668       jointVec = KDL::Vector(link_property->
joint_axis.x,
 
  671       if (KDL::dot(rotVec,jointVec) < 0) {
 
  672         jointAngle = - jointAngle;
 
  683       if (parent_joint->type == Joint::REVOLUTE && parent_joint->limits != 
NULL) {
 
  684         bool changeMarkerAngle = 
false;
 
  685         if (jointAngleAllRange < parent_joint->limits->lower) {
 
  686           jointAngleAllRange = parent_joint->limits->lower + 0.001;
 
  687           changeMarkerAngle = 
true;
 
  689         if (jointAngleAllRange > parent_joint->limits->upper) {
 
  690           jointAngleAllRange = parent_joint->limits->upper - 0.001;
 
  691           changeMarkerAngle = 
true;
 
  694         if (changeMarkerAngle) {
 
  695           setJointAngle(link, jointAngleAllRange);
 
  699       joint_state_.position.push_back(jointAngleAllRange);
 
  700       joint_state_.name.push_back(parent_joint->name);
 
  703     case Joint::PRISMATIC:
 
  706       linkProperty *link_property = &linkMarkerMap[link_frame_name_];
 
  710       pos = presentFrame.p - initialFrame.p;
 
  712       jointVec = KDL::Vector(link_property->
joint_axis.x,
 
  715       jointVec = jointVec / jointVec.Norm(); 
 
  716       jointAngle = KDL::dot(jointVec, 
pos);
 
  719       jointAngleAllRange = jointAngle;
 
  721       if (parent_joint->type == Joint::PRISMATIC && parent_joint->limits != 
NULL) {
 
  722         bool changeMarkerAngle = 
false;
 
  723         if (jointAngleAllRange < parent_joint->limits->lower) {
 
  724           jointAngleAllRange = parent_joint->limits->lower + 0.003;
 
  725           changeMarkerAngle = 
true;
 
  727         if (jointAngleAllRange > parent_joint->limits->upper) {
 
  728           jointAngleAllRange = parent_joint->limits->upper - 0.003;
 
  729           changeMarkerAngle = 
true;
 
  731         if (changeMarkerAngle) {
 
  732           setJointAngle(link, jointAngleAllRange);
 
  736       joint_state_.position.push_back(jointAngleAllRange);
 
  737       joint_state_.name.push_back(parent_joint->name);
 
  745     server_->applyChanges();
 
  748   for (std::vector<LinkSharedPtr >::const_iterator child = link->child_links.begin(); child != link->child_links.end(); child++) {
 
  749     getJointState(*child);
 
  755   string link_frame_name_ =  tf_prefix_ + link->name;
 
  758   if (parent_joint == 
NULL) {
 
  762   KDL::Frame initialFrame;
 
  763   KDL::Frame presentFrame;
 
  766   KDL::Vector jointVec;
 
  768   std_msgs::Header link_header;
 
  770   int rotation_count = 0;
 
  772   switch(parent_joint->type) {
 
  773   case Joint::REVOLUTE:
 
  774   case Joint::CONTINUOUS:
 
  776     if (joint_angle > 
M_PI) {
 
  777       rotation_count = (int)((joint_angle + 
M_PI) / (
M_PI * 2));
 
  778       joint_angle -= rotation_count * 
M_PI * 2;
 
  780     else if (joint_angle < -
M_PI) {
 
  781       rotation_count = (int)((- joint_angle + 
M_PI) / (
M_PI * 2));
 
  782       joint_angle -= rotation_count * 
M_PI * 2;
 
  784     linkProperty *link_property = &linkMarkerMap[link_frame_name_];
 
  790     jointVec = KDL::Vector(link_property->
joint_axis.x,
 
  794     presentFrame.M = KDL::Rotation::Rot(jointVec, joint_angle) * initialFrame.M;
 
  799   case Joint::PRISMATIC:
 
  801     linkProperty *link_property = &linkMarkerMap[link_frame_name_];
 
  806     jointVec = KDL::Vector(link_property->
joint_axis.x,
 
  809     jointVec = jointVec / jointVec.Norm(); 
 
  810     presentFrame.p = joint_angle * jointVec + initialFrame.p;
 
  819   link_header.frame_id = linkMarkerMap[link_frame_name_].frame_id;
 
  821   server_->setPose(link_frame_name_, linkMarkerMap[link_frame_name_].
pose, link_header);
 
  823   callSetDynamicTf(linkMarkerMap[link_frame_name_].
frame_id, link_frame_name_, 
Pose2Transform(linkMarkerMap[link_frame_name_].
pose));
 
  828   string link_frame_name_ =  tf_prefix_ + link->name;
 
  830   if (parent_joint != 
NULL) {
 
  831     KDL::Frame initialFrame;
 
  832     KDL::Frame presentFrame;
 
  835     KDL::Vector jointVec;
 
  837     bool changeAngle = 
false;
 
  838     std_msgs::Header link_header;
 
  839     switch(parent_joint->type) {
 
  840     case Joint::REVOLUTE:
 
  841     case Joint::CONTINUOUS:
 
  842       for(
int i=0; 
i< js->name.size(); 
i++) {
 
  843         if (js->name[
i] == parent_joint->name) {
 
  844           jointAngle = js->position[
i];
 
  852       setJointAngle(link, jointAngle);
 
  854     case Joint::PRISMATIC:
 
  855       for(
int i=0; 
i< js->name.size(); 
i++) {
 
  856         if (js->name[
i] == parent_joint->name) {
 
  857           jointAngle = js->position[
i];
 
  865       setJointAngle(link, jointAngle);
 
  871   for (std::vector<LinkSharedPtr >::const_iterator child = link->child_links.begin(); child != link->child_links.end(); child++) {
 
  872     setJointState(*child, js);
 
  878   KDL::Frame pose_frame, offset_frame;
 
  881   pose_frame = pose_frame * offset_frame.Inverse();
 
  887   geometry_msgs::PoseStamped ps;
 
  888   geometry_msgs::Pose 
pose;
 
  890   KDL::Frame pose_frame, offset_frame;
 
  893   pose_frame = pose_frame * offset_frame;
 
  896   ps.header.frame_id = frame_id_;
 
  897   ps.header.stamp = init_stamp_;
 
  904   string link_frame_name_ =  tf_prefix_ + link->name;
 
  905   linkMarkerMap[link_frame_name_].origin =  linkMarkerMap[link_frame_name_].pose;
 
  907   for (std::vector<LinkSharedPtr >::const_iterator child = link->child_links.begin(); child != link->child_links.end(); child++) {
 
  908     setOriginalPose(*child);
 
  914   addChildLinkNames(link, 
root, 
init, use_visible_color_, 0);
 
  919   geometry_msgs::PoseStamped ps;
 
  921   double scale_factor = 1.02;
 
  922   string link_frame_name_ =  tf_prefix_ + link->name;
 
  923   string parent_link_frame_name_;
 
  924   ROS_INFO(
"link_frame_name: %s", link_frame_name_.c_str());
 
  926     parent_link_frame_name_ = frame_id_;
 
  928     ps.pose = getRootPose(root_pose_);
 
  931     parent_link_frame_name_ = link->parent_joint->parent_link_name;
 
  932     parent_link_frame_name_ = tf_prefix_ + parent_link_frame_name_;
 
  933     ps.pose = 
UrdfPose2Pose(link->parent_joint->parent_to_joint_origin_transform);
 
  935   ps.header.frame_id =  parent_link_frame_name_;
 
  940     callSetDynamicTf(parent_link_frame_name_, link_frame_name_, 
Pose2Transform(ps.pose));
 
  945     if (link->parent_joint !=
NULL) {
 
  950     if (link->parent_joint !=
NULL && link->parent_joint->type == Joint::FIXED) {
 
  951       lp.
movable_link = linkMarkerMap[parent_link_frame_name_].movable_link;
 
  957     linkMarkerMap.insert(map<string, linkProperty>::value_type(link_frame_name_, lp));
 
  960   linkMarkerMap[link_frame_name_].frame_id = parent_link_frame_name_;
 
  962   visualization_msgs::InteractiveMarker int_marker;
 
  963   int_marker.header = ps.header;
 
  965   int_marker.name = link_frame_name_;
 
  967     int_marker.description = model_description_;
 
  969   int_marker.scale = 1.0;
 
  970   int_marker.pose = ps.pose;
 
  974     visualization_msgs::InteractiveMarker old_marker;
 
  975     if (server_->get(link_frame_name_, old_marker)) {
 
  976       int_marker.pose = old_marker.pose;
 
  982   if (!linkMarkerMap[link_frame_name_].displayModelMarker) {
 
  983     server_->erase(link_frame_name_);
 
  984     server_->erase(tf_prefix_ + link->name + 
"/grasp"); 
 
  989     if (linkMarkerMap[link_frame_name_].displayMoveMarker) {
 
  990       addMoveMarkerControl(int_marker, link, 
root);
 
  993     std_msgs::ColorRGBA color;
 
  994     if (mode_ == 
"visualization") {
 
  995       color.r = (double)0xFF / 0xFF;
 
  996       color.g = (double)0xFF / 0xFF;
 
  997       color.b = (double)0x00 / 0xFF;
 
 1001       switch(color_index %3) {
 
 1003         color.r = (double)0xFF / 0xFF;
 
 1004         color.g = (double)0xC3 / 0xFF;
 
 1005         color.b = (double)0x00 / 0xFF;
 
 1008         color.r = (double)0x58 / 0xFF;
 
 1009         color.g = (double)0x0E / 0xFF;
 
 1010         color.b = (double)0xAD / 0xFF;
 
 1013         color.r = (double)0x0C / 0xFF;
 
 1014         color.g = (double)0x5A / 0xFF;
 
 1015         color.b = (double)0xA6 / 0xFF;
 
 1022     std::vector<VisualSharedPtr > visual_array;
 
 1023     if (link->visual_array.size() != 0) {
 
 1024       visual_array = link->visual_array;
 
 1026     else if (link->visual.get() != 
NULL) {
 
 1027       visual_array.push_back(link->visual);
 
 1029     for(
int i=0; 
i<visual_array.size(); 
i++) {
 
 1031       if (link_visual.get() != 
NULL && link_visual->geometry.get() != 
NULL) {
 
 1032         visualization_msgs::InteractiveMarkerControl meshControl;
 
 1033         if (link_visual->geometry->type == Geometry::MESH) {
 
 1034 #if ROS_VERSION_MINIMUM(1,14,0) // melodic 
 1035           MeshConstSharedPtr mesh = std::static_pointer_cast<const Mesh>(link_visual->geometry);
 
 1037           MeshConstSharedPtr mesh = boost::static_pointer_cast<const Mesh>(link_visual->geometry);
 
 1039           string model_mesh_ = mesh->filename;
 
 1040           if (linkMarkerMap[link_frame_name_].
mesh_file == 
"") {
 
 1042             linkMarkerMap[link_frame_name_].mesh_file = model_mesh_;
 
 1045             model_mesh_ = linkMarkerMap[link_frame_name_].mesh_file;
 
 1049           geometry_msgs::Vector3 mesh_scale;
 
 1050           mesh_scale.x = mesh->scale.x;
 
 1051           mesh_scale.y = mesh->scale.y;
 
 1052           mesh_scale.z = mesh->scale.z;
 
 1053           ROS_INFO(
"make mesh marker from %s", model_mesh_.c_str());
 
 1061         else if (link_visual->geometry->type == Geometry::CYLINDER) {
 
 1062 #if ROS_VERSION_MINIMUM(1,14,0) // melodic 
 1068           double length = cylinder->length;
 
 1069           double radius = cylinder->radius;
 
 1078         else if (link_visual->geometry->type == Geometry::BOX) {
 
 1079 #if ROS_VERSION_MINIMUM(1,14,0) // melodic 
 1080           BoxConstSharedPtr box = std::static_pointer_cast<const Box>(link_visual->geometry);
 
 1082           BoxConstSharedPtr box = boost::static_pointer_cast<const Box>(link_visual->geometry);
 
 1085           Vector3 dim = box->dim;
 
 1086           ROS_INFO_STREAM(
"box " << link->name << 
", dim =  " << dim.x << 
", " << dim.y << 
", " << dim.z);
 
 1094         else if (link_visual->geometry->type == Geometry::SPHERE) {
 
 1095 #if ROS_VERSION_MINIMUM(1,14,0) // melodic 
 1101           double rad = sphere->radius;
 
 1109         int_marker.controls.push_back(meshControl);
 
 1111         server_->insert(int_marker);
 
 1112         server_->setCallback(int_marker.name,
 
 1115         model_menu_.apply(*server_, link_frame_name_);
 
 1120         if (parent_joint != 
NULL) {
 
 1121           if (parent_joint->type==Joint::REVOLUTE || parent_joint->type==Joint::REVOLUTE) {
 
 1122             addInvisibleMeshMarkerControl(int_marker, link, color);
 
 1123             server_->insert(int_marker);
 
 1124             server_->setCallback(int_marker.name,
 
 1126             model_menu_.apply(*server_, link_frame_name_);
 
 1133       if (linkMarkerMap[link_frame_name_].gp.displayGraspPoint) {
 
 1134         visualization_msgs::InteractiveMarker grasp_int_marker;
 
 1135         double grasp_scale_factor = 1.02;
 
 1136         string grasp_link_frame_name_ = tf_prefix_ + link->name + 
"/grasp";
 
 1137         string grasp_parent_link_frame_name_ = tf_prefix_ + link->name;
 
 1139         geometry_msgs::PoseStamped grasp_ps;
 
 1140         grasp_ps.pose = linkMarkerMap[link_frame_name_].gp.pose;
 
 1141         grasp_ps.header.frame_id =  grasp_parent_link_frame_name_;
 
 1143         grasp_int_marker.header = grasp_ps.header;
 
 1144         grasp_int_marker.name = grasp_link_frame_name_;
 
 1145         grasp_int_marker.scale = grasp_scale_factor;
 
 1146         grasp_int_marker.pose = grasp_ps.pose;
 
 1148         addGraspPointControl(grasp_int_marker, link_frame_name_);
 
 1150         server_->insert(grasp_int_marker);
 
 1151         server_->setCallback(grasp_int_marker.name,
 
 1160     if (!
root && initial_pose_map_.count(link->parent_joint->name) != 0) {
 
 1161       setJointAngle(link, initial_pose_map_[link->parent_joint->name]);
 
 1167   for (std::vector<LinkSharedPtr >::const_iterator child = link->child_links.begin(); child != link->child_links.end(); child++) {
 
 1168     addChildLinkNames(*child, 
false, 
init, use_color, color_index + 1);
 
 1171     server_->applyChanges();
 
 1180 UrdfModelMarker::UrdfModelMarker (
string model_name, 
string model_description, 
string model_file, 
string frame_id, geometry_msgs::PoseStamped root_pose, geometry_msgs::Pose root_offset, 
double scale_factor, 
string mode, 
bool robot_mode, 
bool registration, 
vector<string> fixed_link, 
bool use_robot_description, 
bool use_visible_color, map<string, double> initial_pose_map, 
int index,  std::shared_ptr<interactive_markers::InteractiveMarkerServer> 
server) : nh_(), pnh_(
"~"), tfl_(nh_),use_dynamic_tf_(true), is_joint_states_locked_(false) {
 
 1202     ss << model_name << 
index;
 
 1262       mode_ = 
"registration";
 
 1278   if (
mode_ == 
"registration") {
 
 1282   else if (
mode_ == 
"visualization") {
 
 1285   else if (
mode_ == 
"robot") {
 
 1321   else if (
mode_ == 
"model") {
 
 1347       if (!boost::filesystem::exists(
model_file_.c_str())) {
 
 1351         std::fstream xml_file(
model_file_.c_str(), std::fstream::in);
 
 1352         while (xml_file.good())
 
 1355           std::getline(xml_file, 
line);
 
 1364       ROS_ERROR(
"Please check GAZEBO_MODEL_PATH");
 
 1371     ROS_ERROR(
"ERROR: Model Parsing the xml failed");
 
 1377   if (
mode_ == 
"robot") {
 
 1386   geometry_msgs::Pose 
pose;
 
 1387   pose.orientation.w = 1.0;
 
 1393                                       std_srvs::EmptyRequest& res)
 
 1401                                         std_srvs::EmptyRequest& res)
 
 1412   stat.
summary(diagnostic_msgs::DiagnosticStatus::OK, 
"UrdfModelMarker running");
 
 1413   stat.
add(
"Time to set dynamic tf (Avg.)",
 
 1415   stat.
add(
"Time to set dynamic tf (Max)",
 
 1417   stat.
add(
"Time to set dynamic tf (Min)",
 
 1419   stat.
add(
"Time to set dynamic tf (Var.)",
 
 1422   stat.
add(
"Time to set joint states (Avg.)",
 
 1424   stat.
add(
"Time to set joint states (Max)",
 
 1426   stat.
add(
"Time to set joint states (Min)",
 
 1428   stat.
add(
"Time to set joint states (Var.)",