joint_state_interface_provider.cpp
Go to the documentation of this file.
1 // Copyright (C) 2013, PAL Robotics S.L.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met:
6 // * Redistributions of source code must retain the above copyright notice,
7 // this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above copyright
9 // notice, this list of conditions and the following disclaimer in the
10 // documentation and/or other materials provided with the distribution.
11 // * Neither the name of PAL Robotics S.L. nor the names of its
12 // contributors may be used to endorse or promote products derived from
13 // this software without specific prior written permission.
14 //
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 // POSSIBILITY OF SUCH DAMAGE.
27 
28 
29 // Pluginlib
31 
32 // ros_control
34 
35 namespace transmission_interface
36 {
37 
40  JointInterfaces& joint_interfaces,
41  RawJointDataMap& raw_joint_data_map)
42 {
43  // If interface does not yet exist in robot hardware abstraction, add it and use internal data structures
45  if (!robot_hw->get<JointStateInterface>())
46  {
47  robot_hw->registerInterface(&joint_interfaces.joint_state_interface);
48  }
49  JointStateInterface& interface = *(robot_hw->get<JointStateInterface>());
50 
51  // Register joints on the hardware interface
52  for (const auto& joint_info : transmission_info.joints_)
53  {
54  const std::string& name = joint_info.name_;
55 
56  // Do nothing if joint already exists on the hardware interface
57  if (hasResource(name, interface)) {continue;}
58 
59  // Update hardware interface
61  RawJointData& raw_joint_data = raw_joint_data_map[name]; // Add joint if it does not yet exist
62  if(raw_joint_data.hasAbsolutePosition && raw_joint_data.hasTorqueSensor)
63  {
64  JointStateHandle handle(name,
65  &raw_joint_data.position,
66  &raw_joint_data.velocity,
67  &raw_joint_data.effort,
68  &raw_joint_data.absolute_position,
69  &raw_joint_data.torque_sensor);
70  interface.registerHandle(handle);
71  }
72  else if(raw_joint_data.hasAbsolutePosition)
73  {
74  JointStateHandle handle(name,
75  &raw_joint_data.position,
76  &raw_joint_data.velocity,
77  &raw_joint_data.effort,
78  &raw_joint_data.absolute_position);
79  interface.registerHandle(handle);
80  }
81  else if(raw_joint_data.hasTorqueSensor)
82  {
83  JointStateHandle handle(name,
84  &raw_joint_data.position,
85  &raw_joint_data.velocity,
86  &raw_joint_data.effort,
87  &raw_joint_data.torque_sensor, true);
88  interface.registerHandle(handle);
89  }
90  else
91  {
92  JointStateHandle handle(name,
93  &raw_joint_data.position,
94  &raw_joint_data.velocity,
95  &raw_joint_data.effort);
96  interface.registerHandle(handle);
97  }
98 
99  }
100  return true;
101 }
102 
104  const RawJointDataMap& raw_joint_data_map,
105  JointData& jnt_state_data)
106 {
107  const unsigned int dim = transmission_info.joints_.size();
108  jnt_state_data.position.resize(dim);
109  jnt_state_data.velocity.resize(dim);
110  jnt_state_data.effort.resize(dim);
111 
112  bool hasAbsolutePosition = true;
113  bool hasTorqueSensor = true;
114 
115  for (unsigned int i = 0; i < dim; ++i)
116  {
117  const std::string& joint_name = transmission_info.joints_[i].name_;
118  RawJointDataMap::const_iterator raw_joint_data_it = raw_joint_data_map.find(joint_name);
119  if (raw_joint_data_it == raw_joint_data_map.end()) {return false;} // Joint name not found!
120  const RawJointData& raw_joint_data = raw_joint_data_it->second;
121 
122  hasAbsolutePosition = hasAbsolutePosition && raw_joint_data.hasAbsolutePosition;
123  hasTorqueSensor = hasTorqueSensor && raw_joint_data.hasTorqueSensor;
124  }
125 
126  if(hasAbsolutePosition)
127  {
128  jnt_state_data.absolute_position.resize(dim);
129  }
130 
131  if(hasTorqueSensor)
132  {
133  jnt_state_data.torque_sensor.resize(dim);
134  }
135 
136  for (unsigned int i = 0; i < dim; ++i)
137  {
138  const std::string& joint_name = transmission_info.joints_[i].name_;
139  RawJointDataMap::const_iterator raw_joint_data_it = raw_joint_data_map.find(joint_name);
140  if (raw_joint_data_it == raw_joint_data_map.end()) {return false;} // Joint name not found!
141  const RawJointData& raw_joint_data = raw_joint_data_it->second;
142 
143  // TODO: Get rid of these const casts!
144  jnt_state_data.position[i] = const_cast<double*>(&(raw_joint_data.position));
145  jnt_state_data.velocity[i] = const_cast<double*>(&(raw_joint_data.velocity));
146  jnt_state_data.effort[i] = const_cast<double*>(&(raw_joint_data.effort));
147  if(hasAbsolutePosition)
148  {
149  jnt_state_data.absolute_position[i] = const_cast<double*>(&(raw_joint_data.absolute_position));
150  }
151  if(hasTorqueSensor)
152  {
153  jnt_state_data.torque_sensor[i] = const_cast<double*>(&(raw_joint_data.torque_sensor));
154  }
155  }
156 
157  return true;
158 }
159 
161  hardware_interface::RobotHW* robot_hw,
162  ActuatorData& act_state_data)
163 {
166 
167  // Get handles to all required actuators
168  std::vector<ActuatorStateHandle> handles;
169  if (!this->getActuatorHandles<ActuatorStateInterface, ActuatorStateHandle>(transmission_info.actuators_,
170  robot_hw,
171  handles)) {return false;}
172 
173  // Populate actuator data
174  const unsigned int dim = transmission_info.actuators_.size();
175  act_state_data.position.resize(dim);
176  act_state_data.velocity.resize(dim);
177  act_state_data.effort.resize(dim);
178 
179  bool hasAbsolutePositionInterface = true;
180  bool hasTorqueSensorInterface = true;
181 
182  for (unsigned int i = 0; i < dim; ++i)
183  {
184  hasAbsolutePositionInterface = hasAbsolutePositionInterface && handles[i].hasAbsolutePosition();
185  hasTorqueSensorInterface = hasTorqueSensorInterface && handles[i].hasTorqueSensor();
186  }
187 
188  if(hasAbsolutePositionInterface)
189  {
190  act_state_data.absolute_position.resize(dim);
191  }
192 
193  if(hasTorqueSensorInterface)
194  {
195  act_state_data.torque_sensor.resize(dim);
196  }
197 
198  for (unsigned int i = 0; i < dim; ++i)
199  {
200  // TODO: Get rid of these const casts!
201  act_state_data.position[i] = const_cast<double*>(handles[i].getPositionPtr());
202  act_state_data.velocity[i] = const_cast<double*>(handles[i].getVelocityPtr());
203  act_state_data.effort[i] = const_cast<double*>(handles[i].getEffortPtr());
204  if(hasAbsolutePositionInterface)
205  {
206  act_state_data.absolute_position[i] = const_cast<double*>(handles[i].getAbsolutePositionPtr());
207  }
208  if(hasTorqueSensorInterface)
209  {
210  act_state_data.torque_sensor[i] = const_cast<double*>(handles[i].getTorqueSensorPtr());
211  }
212  }
213  return true;
214 }
215 
217  TransmissionHandleData& handle_data)
218 {
219  // If interface does not yet exist in the robot transmissions, add it and use internal data structures
221  {
223  }
225 
226  // Update transmission interface
227  ActuatorToJointStateHandle handle(handle_data.name,
228  handle_data.transmission.get(),
229  handle_data.act_state_data,
230  handle_data.jnt_state_data);
231  interface.registerHandle(handle);
232  return true;
233 }
234 
235 } // namespace
236 
transmission_interface::RawJointData::absolute_position
double absolute_position
Definition: transmission_interface_loader.h:81
transmission_interface::RawJointData::hasTorqueSensor
bool hasTorqueSensor
Definition: transmission_interface_loader.h:85
transmission_interface::JointStateInterfaceProvider
Definition: joint_state_interface_provider.h:40
transmission_interface::ActuatorData::velocity
std::vector< double * > velocity
Definition: transmission.h:53
transmission_interface::JointInterfaces
Joint interfaces of a robot. Only used interfaces need to be populated.
Definition: transmission_interface_loader.h:93
transmission_interface::ActuatorToJointStateHandle
Handle for propagating actuator state (position, velocity and effort) to joint state for a given tran...
Definition: transmission_interface.h:194
transmission_interface::RequisiteProvider::TransmissionHandleData::name
std::string name
Definition: transmission_interface_loader.h:158
transmission_interface::ForwardTransmissionInterfaces::act_to_jnt_state
ActuatorToJointStateInterface act_to_jnt_state
Definition: transmission_interface_loader.h:103
transmission_interface::RawJointData::position
double position
Definition: transmission_interface_loader.h:75
hardware_interface::JointStateInterface
hardware_interface::InterfaceManager::get
T * get()
transmission_interface
Definition: bidirectional_effort_joint_interface_provider.h:36
hardware_interface::InterfaceManager::registerInterface
void registerInterface(T *iface)
hardware_interface::ActuatorStateHandle
transmission_interface::RawJointData::effort
double effort
Definition: transmission_interface_loader.h:77
transmission_interface::TransmissionLoaderData
Definition: transmission_interface_loader.h:117
transmission_interface::RequisiteProvider
Definition: transmission_interface_loader.h:128
transmission_interface::TransmissionLoaderData::robot_transmissions
RobotTransmissions * robot_transmissions
Lifecycle is externally controlled (ie. hardware abstraction)
Definition: transmission_interface_loader.h:120
transmission_interface::RawJointData::hasAbsolutePosition
bool hasAbsolutePosition
Definition: transmission_interface_loader.h:84
transmission_interface::JointStateInterfaceProvider::registerTransmission
bool registerTransmission(TransmissionLoaderData &loader_data, TransmissionHandleData &handle_data) override
Definition: joint_state_interface_provider.cpp:216
transmission_interface::TransmissionInfo::joints_
std::vector< JointInfo > joints_
Definition: transmission_info.h:82
transmission_interface::ActuatorToJointStateInterface
Definition: transmission_interface.h:417
transmission_interface::RequisiteProvider::TransmissionHandleData
Definition: transmission_interface_loader.h:156
transmission_interface::TransmissionInfo::actuators_
std::vector< ActuatorInfo > actuators_
Definition: transmission_info.h:83
transmission_interface::JointData::position
std::vector< double * > position
Definition: transmission.h:65
joint_state_interface_provider.h
transmission_interface::JointStateInterfaceProvider::updateJointInterfaces
bool updateJointInterfaces(const TransmissionInfo &transmission_info, hardware_interface::RobotHW *robot_hw, JointInterfaces &joint_interfaces, RawJointDataMap &raw_joint_data_map) override
Update a robot's joint interfaces with joint information contained in a transmission.
Definition: joint_state_interface_provider.cpp:38
transmission_interface::JointStateInterfaceProvider::getActuatorStateData
bool getActuatorStateData(const TransmissionInfo &transmission_info, hardware_interface::RobotHW *robot_hw, ActuatorData &act_state_data) override
Definition: joint_state_interface_provider.cpp:160
transmission_interface::JointData
Contains pointers to raw data representing the position, velocity and acceleration of a transmission'...
Definition: transmission.h:63
transmission_interface::RawJointDataMap
std::map< std::string, RawJointData > RawJointDataMap
Definition: transmission_interface_loader.h:88
PLUGINLIB_EXPORT_CLASS
#define PLUGINLIB_EXPORT_CLASS(class_type, base_class_type)
hardware_interface::RobotHW
hardware_interface::ActuatorStateInterface
transmission_interface::JointData::torque_sensor
std::vector< double * > torque_sensor
Definition: transmission.h:69
transmission_interface::ActuatorData::effort
std::vector< double * > effort
Definition: transmission.h:54
hardware_interface::JointStateHandle
transmission_interface::ActuatorData::position
std::vector< double * > position
Definition: transmission.h:52
transmission_interface::JointData::absolute_position
std::vector< double * > absolute_position
Definition: transmission.h:68
transmission_interface::JointInterfaces::joint_state_interface
hardware_interface::JointStateInterface joint_state_interface
Definition: transmission_interface_loader.h:95
transmission_interface::JointData::effort
std::vector< double * > effort
Definition: transmission.h:67
transmission_interface::ActuatorData::torque_sensor
std::vector< double * > torque_sensor
Definition: transmission.h:56
transmission_interface::JointData::velocity
std::vector< double * > velocity
Definition: transmission.h:66
transmission_interface::JointStateInterfaceProvider::getJointStateData
bool getJointStateData(const TransmissionInfo &transmission_info, const RawJointDataMap &raw_joint_data_map, JointData &jnt_state_data) override
Definition: joint_state_interface_provider.cpp:103
transmission_interface::RequisiteProvider::TransmissionHandleData::act_state_data
ActuatorData act_state_data
Definition: transmission_interface_loader.h:159
transmission_interface::RequisiteProvider::TransmissionHandleData::transmission
TransmissionSharedPtr transmission
Definition: transmission_interface_loader.h:163
transmission_interface::RequisiteProvider::TransmissionHandleData::jnt_state_data
JointData jnt_state_data
Definition: transmission_interface_loader.h:161
transmission_interface::ActuatorData::absolute_position
std::vector< double * > absolute_position
Definition: transmission.h:55
class_list_macros.hpp
transmission_interface::ActuatorData
Contains pointers to raw data representing the position, velocity and acceleration of a transmission'...
Definition: transmission.h:50
transmission_interface::RawJointData
Raw data for a set of joints.
Definition: transmission_interface_loader.h:73
transmission_interface::TransmissionLoaderData::transmission_interfaces
ForwardTransmissionInterfaces transmission_interfaces
Definition: transmission_interface_loader.h:123
transmission_interface::RawJointData::velocity
double velocity
Definition: transmission_interface_loader.h:76
transmission_interface::RawJointData::torque_sensor
double torque_sensor
Definition: transmission_interface_loader.h:82
transmission_interface::RequisiteProvider::hasResource
static bool hasResource(const std::string &name, const Interface &iface)
Definition: transmission_interface_loader.h:186
transmission_interface::TransmissionInfo
Contains semantic info about a given transmission loaded from XML (URDF)
Definition: transmission_info.h:78


transmission_interface
Author(s): Adolfo Rodriguez Tsouroukdissian
autogenerated on Fri Nov 3 2023 02:08:09