Skip to content

Commit 1068cda

Browse files
Ex8
1 parent ceacf0c commit 1068cda

File tree

2 files changed

+34
-37
lines changed

2 files changed

+34
-37
lines changed

example_8/hardware/include/ros2_control_demo_example_8/rrbot_transmissions_system_position_only.hpp

-4
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,6 @@ class RRBotTransmissionsSystemPositionOnlyHardware : public hardware_interface::
4141
hardware_interface::CallbackReturn on_configure(
4242
const rclcpp_lifecycle::State & previous_state) override;
4343

44-
std::vector<hardware_interface::StateInterface> export_state_interfaces() override;
45-
46-
std::vector<hardware_interface::CommandInterface> export_command_interfaces() override;
47-
4844
hardware_interface::CallbackReturn on_activate(
4945
const rclcpp_lifecycle::State & previous_state) override;
5046

example_8/hardware/rrbot_transmissions_system_position_only.cpp

+34-33
Original file line numberDiff line numberDiff line change
@@ -164,49 +164,32 @@ hardware_interface::CallbackReturn RRBotTransmissionsSystemPositionOnlyHardware:
164164
reset_interfaces(joint_interfaces_);
165165
reset_interfaces(actuator_interfaces_);
166166

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_)
177169
{
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);
185171
}
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_)
194173
{
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);
202175
}
203-
return command_interfaces;
176+
177+
RCLCPP_INFO(get_logger(), "Configuration successful");
178+
179+
return hardware_interface::CallbackReturn::SUCCESS;
204180
}
205181

206182
hardware_interface::CallbackReturn RRBotTransmissionsSystemPositionOnlyHardware::on_activate(
207183
const rclcpp_lifecycle::State & /*previous_state*/)
208184
{
209185
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+
210193
RCLCPP_INFO(get_logger(), "Activation successful");
211194

212195
return hardware_interface::CallbackReturn::SUCCESS;
@@ -263,12 +246,30 @@ hardware_interface::return_type RRBotTransmissionsSystemPositionOnlyHardware::re
263246
}
264247
RCLCPP_INFO_THROTTLE(get_logger(), *get_clock(), 500, "%s", ss.str().c_str());
265248

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+
266258
return hardware_interface::return_type::OK;
267259
}
268260

269261
hardware_interface::return_type RRBotTransmissionsSystemPositionOnlyHardware::write(
270262
const rclcpp::Time & /*time*/, const rclcpp::Duration & /*period*/)
271263
{
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+
272273
// joint: command -> transmission
273274
std::for_each(
274275
joint_interfaces_.begin(), joint_interfaces_.end(), [](auto & joint_interface)

0 commit comments

Comments
 (0)