Go to the documentation of this file.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
00027
00028
00029
00030 #include <pluginlib/class_list_macros.h>
00031
00032
00033 #include <transmission_interface/position_joint_interface_provider.h>
00034
00035 namespace transmission_interface
00036 {
00037
00038 bool PositionJointInterfaceProvider::updateJointInterfaces(const TransmissionInfo& transmission_info,
00039 hardware_interface::RobotHW* robot_hw,
00040 JointInterfaces& joint_interfaces,
00041 RawJointDataMap& raw_joint_data_map)
00042 {
00043
00044 if (!JointStateInterfaceProvider::updateJointInterfaces(transmission_info,
00045 robot_hw,
00046 joint_interfaces,
00047 raw_joint_data_map)) {return false;}
00048
00049
00050 using hardware_interface::PositionJointInterface;
00051 if (!robot_hw->get<PositionJointInterface>())
00052 {
00053 robot_hw->registerInterface(&joint_interfaces.position_joint_interface);
00054 }
00055 PositionJointInterface& interface = *(robot_hw->get<PositionJointInterface>());
00056
00057
00058 BOOST_FOREACH(const JointInfo& joint_info, transmission_info.joints_)
00059 {
00060 const std::string& name = joint_info.name_;
00061
00062
00063 if (hasResource(name, interface)) {continue;}
00064
00065
00066 using hardware_interface::JointHandle;
00067 RawJointData& raw_joint_data = raw_joint_data_map[name];
00068 JointHandle handle(joint_interfaces.joint_state_interface.getHandle(joint_info.name_),
00069 &raw_joint_data.position_cmd);
00070 interface.registerHandle(handle);
00071 }
00072 return true;
00073 }
00074
00075 bool PositionJointInterfaceProvider::getJointCommandData(const TransmissionInfo& transmission_info,
00076 const RawJointDataMap& raw_joint_data_map,
00077 JointData& jnt_cmd_data)
00078 {
00079 const unsigned int dim = transmission_info.joints_.size();
00080 jnt_cmd_data.position.resize(dim);
00081
00082 for (unsigned int i = 0; i < dim; ++i)
00083 {
00084 const std::string& joint_name = transmission_info.joints_[i].name_;
00085 RawJointDataMap::const_iterator raw_joint_data_it = raw_joint_data_map.find(joint_name);
00086 if (raw_joint_data_it == raw_joint_data_map.end()) {return false;}
00087 const RawJointData& raw_joint_data = raw_joint_data_it->second;
00088
00089
00090 jnt_cmd_data.position[i] = const_cast<double*>(&(raw_joint_data.position_cmd));
00091 }
00092
00093 return true;
00094 }
00095
00096 bool PositionJointInterfaceProvider::getActuatorCommandData(const TransmissionInfo& transmission_info,
00097 hardware_interface::RobotHW* robot_hw,
00098 ActuatorData& act_cmd_data)
00099 {
00100 using hardware_interface::PositionActuatorInterface;
00101 using hardware_interface::ActuatorHandle;
00102
00103
00104 std::vector<ActuatorHandle> handles;
00105 if (!this->getActuatorHandles<PositionActuatorInterface, ActuatorHandle>(transmission_info.actuators_,
00106 robot_hw,
00107 handles)) {return false;}
00108
00109
00110 const unsigned int dim = transmission_info.actuators_.size();
00111 act_cmd_data.position.resize(dim);
00112
00113 for (unsigned int i = 0; i < dim; ++i)
00114 {
00115
00116 act_cmd_data.position[i] = const_cast<double*>(handles[i].getCommandPtr());
00117 }
00118 return true;
00119 }
00120
00121 bool PositionJointInterfaceProvider::registerTransmission(TransmissionLoaderData& loader_data,
00122 TransmissionHandleData& handle_data)
00123 {
00124
00125 if (!hasResource(handle_data.name, loader_data.transmission_interfaces.act_to_jnt_state))
00126 {
00127 if (!JointStateInterfaceProvider::registerTransmission(loader_data, handle_data)) {return false;}
00128 }
00129
00130
00131 if (!loader_data.robot_transmissions->get<JointToActuatorPositionInterface>())
00132 {
00133 loader_data.robot_transmissions->registerInterface(&loader_data.transmission_interfaces.jnt_to_act_pos_cmd);
00134 }
00135 JointToActuatorPositionInterface& interface = *(loader_data.robot_transmissions->get<JointToActuatorPositionInterface>());
00136
00137
00138 JointToActuatorPositionHandle handle(handle_data.name,
00139 handle_data.transmission.get(),
00140 handle_data.act_cmd_data,
00141 handle_data.jnt_cmd_data);
00142 interface.registerHandle(handle);
00143 return true;
00144 }
00145
00146 }
00147
00148 PLUGINLIB_EXPORT_CLASS(transmission_interface::PositionJointInterfaceProvider,
00149 transmission_interface::RequisiteProvider)