@@ -164,49 +164,32 @@ hardware_interface::CallbackReturn RRBotTransmissionsSystemPositionOnlyHardware:
164
164
reset_interfaces (joint_interfaces_);
165
165
reset_interfaces (actuator_interfaces_);
166
166
167
- RCLCPP_INFO (get_logger (), " Configuration successful" );
168
-
169
- return hardware_interface::CallbackReturn::SUCCESS;
170
- }
171
-
172
- std::vector<hardware_interface::StateInterface>
173
- RRBotTransmissionsSystemPositionOnlyHardware::export_state_interfaces ()
174
- {
175
- std::vector<hardware_interface::StateInterface> state_interfaces;
176
- for (const auto & joint : info_.joints )
167
+ // reset values always when configuring hardware
168
+ for (const auto & [name, descr] : joint_state_interfaces_)
177
169
{
178
- // / @pre all joint interfaces exist, checked in on_init()
179
- auto joint_interface = std::find_if (
180
- joint_interfaces_.begin (), joint_interfaces_.end (),
181
- [&](const InterfaceData & interface) { return interface.name_ == joint.name ; });
182
-
183
- state_interfaces.emplace_back (hardware_interface::StateInterface (
184
- joint.name , hardware_interface::HW_IF_POSITION, &joint_interface->state_ ));
170
+ set_state (name, 0.0 );
185
171
}
186
- return state_interfaces;
187
- }
188
-
189
- std::vector<hardware_interface::CommandInterface>
190
- RRBotTransmissionsSystemPositionOnlyHardware::export_command_interfaces ()
191
- {
192
- std::vector<hardware_interface::CommandInterface> command_interfaces;
193
- for (const auto & joint : info_.joints )
172
+ for (const auto & [name, descr] : joint_command_interfaces_)
194
173
{
195
- // / @pre all joint interfaces exist, checked in on_init()
196
- auto joint_interface = std::find_if (
197
- joint_interfaces_.begin (), joint_interfaces_.end (),
198
- [&](const InterfaceData & interface) { return interface.name_ == joint.name ; });
199
-
200
- command_interfaces.emplace_back (hardware_interface::CommandInterface (
201
- joint.name , hardware_interface::HW_IF_POSITION, &joint_interface->command_ ));
174
+ set_command (name, 0.0 );
202
175
}
203
- return command_interfaces;
176
+
177
+ RCLCPP_INFO (get_logger (), " Configuration successful" );
178
+
179
+ return hardware_interface::CallbackReturn::SUCCESS;
204
180
}
205
181
206
182
hardware_interface::CallbackReturn RRBotTransmissionsSystemPositionOnlyHardware::on_activate (
207
183
const rclcpp_lifecycle::State & /* previous_state*/ )
208
184
{
209
185
RCLCPP_INFO (get_logger (), " Activating..." );
186
+
187
+ // command and state should be equal when starting
188
+ for (const auto & [name, descr] : joint_state_interfaces_)
189
+ {
190
+ set_command (name, get_state (name));
191
+ }
192
+
210
193
RCLCPP_INFO (get_logger (), " Activation successful" );
211
194
212
195
return hardware_interface::CallbackReturn::SUCCESS;
@@ -263,12 +246,30 @@ hardware_interface::return_type RRBotTransmissionsSystemPositionOnlyHardware::re
263
246
}
264
247
RCLCPP_INFO_THROTTLE (get_logger (), *get_clock (), 500 , " %s" , ss.str ().c_str ());
265
248
249
+ // update internal storage from ressource_manager
250
+ std::for_each (
251
+ joint_interfaces_.begin (), joint_interfaces_.end (),
252
+ [this ](auto & joint_interface)
253
+ {
254
+ set_state (
255
+ joint_interface.name_ + " /" + hardware_interface::HW_IF_POSITION, joint_interface.state_ );
256
+ });
257
+
266
258
return hardware_interface::return_type::OK;
267
259
}
268
260
269
261
hardware_interface::return_type RRBotTransmissionsSystemPositionOnlyHardware::write (
270
262
const rclcpp::Time & /* time*/ , const rclcpp::Duration & /* period*/ )
271
263
{
264
+ // update internal storage from ressource_manager
265
+ std::for_each (
266
+ joint_interfaces_.begin (), joint_interfaces_.end (),
267
+ [this ](auto & joint_interface)
268
+ {
269
+ joint_interface.command_ =
270
+ get_command (joint_interface.name_ + " /" + hardware_interface::HW_IF_POSITION);
271
+ });
272
+
272
273
// joint: command -> transmission
273
274
std::for_each (
274
275
joint_interfaces_.begin (), joint_interfaces_.end (), [](auto & joint_interface)
0 commit comments