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