Skip to content

Commit 5c8a8b4

Browse files
committed
!Not working! Add registration of DistributedCommandInterfaces
* Its not working, since the storage type of command interfaces needs to be changed to std::shared_ptr. This is done in follow_up since should change a lot.
1 parent 2dd8f38 commit 5c8a8b4

File tree

13 files changed

+547
-158
lines changed

13 files changed

+547
-158
lines changed

controller_manager/include/controller_manager/controller_manager.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
#include "controller_manager_msgs/srv/unload_controller.hpp"
4343

4444
#include "diagnostic_updater/diagnostic_updater.hpp"
45-
#include "hardware_interface/distributed_control_interface/state_publisher.hpp"
4645
#include "hardware_interface/handle.hpp"
4746
#include "hardware_interface/resource_manager.hpp"
4847

@@ -206,6 +205,9 @@ class ControllerManager : public rclcpp::Node
206205
CONTROLLER_MANAGER_PUBLIC
207206
void add_hardware_state_publishers();
208207

208+
CONTROLLER_MANAGER_PUBLIC
209+
void add_hardware_command_forwarders();
210+
209211
CONTROLLER_MANAGER_PUBLIC
210212
void register_sub_controller_manager();
211213

controller_manager/src/controller_manager.cpp

Lines changed: 82 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
#include "controller_interface/controller_interface_base.hpp"
2525
#include "controller_manager_msgs/msg/hardware_component_state.hpp"
2626

27+
#include "hardware_interface/distributed_control_interface/command_forwarder.hpp"
28+
#include "hardware_interface/distributed_control_interface/state_publisher.hpp"
2729
#include "hardware_interface/handle.hpp"
2830
#include "hardware_interface/types/lifecycle_state_names.hpp"
2931

@@ -311,6 +313,7 @@ void ControllerManager::configure_controller_manager()
311313
if (distributed_sub_controller_manager)
312314
{
313315
add_hardware_state_publishers();
316+
add_hardware_command_forwarders();
314317
register_sub_controller_manager();
315318
}
316319
// This means we are the central controller manager
@@ -353,13 +356,16 @@ void ControllerManager::register_sub_controller_manager_srv_cb(
353356

354357
auto sub_ctrl_mng_wrapper = std::make_shared<distributed_control::SubControllerManagerWrapper>(
355358
request->sub_controller_manager_namespace, request->sub_controller_manager_name,
356-
request->state_publishers);
359+
request->state_publishers, request->command_state_publishers);
357360

358-
std::vector<std::shared_ptr<hardware_interface::DistributedReadOnlyHandle>> state_interfaces;
359-
state_interfaces.reserve(sub_ctrl_mng_wrapper->get_state_publisher_count());
360-
state_interfaces = resource_manager_->register_sub_controller_manager(sub_ctrl_mng_wrapper);
361+
resource_manager_->register_sub_controller_manager(sub_ctrl_mng_wrapper);
361362

362-
for (const auto & state_interface : state_interfaces)
363+
std::vector<std::shared_ptr<hardware_interface::DistributedReadOnlyHandle>>
364+
distributed_state_interfaces;
365+
distributed_state_interfaces =
366+
resource_manager_->import_state_interfaces_of_sub_controller_manager(sub_ctrl_mng_wrapper);
367+
368+
for (const auto & state_interface : distributed_state_interfaces)
363369
{
364370
try
365371
{
@@ -376,6 +382,36 @@ void ControllerManager::register_sub_controller_manager_srv_cb(
376382
}
377383
}
378384

385+
std::vector<std::shared_ptr<hardware_interface::DistributedReadWriteHandle>>
386+
distributed_command_interfaces;
387+
distributed_command_interfaces =
388+
resource_manager_->import_command_interfaces_of_sub_controller_manager(sub_ctrl_mng_wrapper);
389+
390+
for (const auto & command_interface : distributed_command_interfaces)
391+
{
392+
try
393+
{
394+
executor_->add_node(command_interface->get_node()->get_node_base_interface());
395+
auto msg = controller_manager_msgs::msg::PublisherDescription();
396+
msg.ns = get_namespace();
397+
msg.name.prefix_name = command_interface->get_prefix_name();
398+
msg.name.interface_name = command_interface->get_interface_name();
399+
// want topic name relative to namespace
400+
msg.publisher_topic = std::string(get_namespace()) + std::string("/") +
401+
command_interface->forward_command_topic_name();
402+
response->command_state_publishers.push_back(msg);
403+
}
404+
catch (const std::runtime_error & e)
405+
{
406+
response->ok = false;
407+
RCLCPP_WARN_STREAM(
408+
get_logger(),
409+
"ControllerManager: Caught exception while trying to register sub controller manager. "
410+
"Exception:"
411+
<< e.what());
412+
}
413+
}
414+
379415
response->ok = true;
380416
RCLCPP_INFO_STREAM(
381417
get_logger(), "ControllerManager: Registered sub controller manager <"
@@ -403,6 +439,27 @@ void ControllerManager::add_hardware_state_publishers()
403439
}
404440
}
405441

442+
void ControllerManager::add_hardware_command_forwarders()
443+
{
444+
std::vector<std::shared_ptr<distributed_control::CommandForwarder>> command_forwarder_vec;
445+
command_forwarder_vec.reserve(resource_manager_->available_command_interfaces().size());
446+
command_forwarder_vec = resource_manager_->create_hardware_command_forwarders(get_namespace());
447+
448+
for (auto const & command_forwarder : command_forwarder_vec)
449+
{
450+
try
451+
{
452+
executor_->add_node(command_forwarder->get_node()->get_node_base_interface());
453+
}
454+
catch (const std::runtime_error & e)
455+
{
456+
RCLCPP_WARN_STREAM(
457+
get_logger(), "ControllerManager: Can't create StatePublishers<"
458+
<< command_forwarder->command_interface_name() << ">." << e.what());
459+
}
460+
}
461+
}
462+
406463
void ControllerManager::register_sub_controller_manager()
407464
{
408465
RCLCPP_INFO(get_logger(), "SubControllerManager:Trying to register StatePublishers.");
@@ -421,7 +478,17 @@ void ControllerManager::register_sub_controller_manager()
421478
// create description of StatePublisher including: prefix_name, interface_name and topic.
422479
// So that receiver is able to create a DistributedStateInterface which subscribes to the
423480
// topics provided by this sub controller manager
424-
request->state_publishers.push_back(state_publisher->create_description_msg());
481+
request->state_publishers.push_back(state_publisher->create_publisher_description_msg());
482+
}
483+
484+
// export the provided CommandForwarders
485+
for (auto const & command_forwarders : resource_manager_->get_command_forwarders())
486+
{
487+
// create description of StatePublisher including: prefix_name, interface_name and topic.
488+
// So that receiver is able to create a DistributedStateInterface which subscribes to the
489+
// topics provided by this sub controller manager
490+
request->command_state_publishers.push_back(
491+
command_forwarders->create_publisher_description_msg());
425492
}
426493

427494
using namespace std::chrono_literals;
@@ -447,6 +514,15 @@ void ControllerManager::register_sub_controller_manager()
447514
rclcpp::FutureReturnCode::SUCCESS) &&
448515
result.get()->ok)
449516
{
517+
// TODO(Manuel) we should probably make the keys explicit (add key_generation function to handles)
518+
// send keys with request
519+
for (auto command_state_publisher : result.get()->command_state_publishers)
520+
{
521+
std::string key = command_state_publisher.name.prefix_name + "/" +
522+
command_state_publisher.name.interface_name;
523+
// auto command_forwarder = resource_manager_->find_command_forwarder(key);
524+
// command_forwarder->subscribe_to_command(command_state_publisher);
525+
}
450526
RCLCPP_INFO(get_logger(), "SubControllerManager: Successfully registered StatePublishers.");
451527
}
452528
else

hardware_interface/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ add_library(
2929
SHARED
3030
src/actuator.cpp
3131
src/component_parser.cpp
32+
src/hardware_interface/distributed_control_interface/command_forwarder.cpp
3233
src/hardware_interface/distributed_control_interface/state_publisher.cpp
3334
src/resource_manager.cpp
3435
src/sensor.cpp
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#ifndef DISTRIBUTED_CONTROL__COMMAND_FORWARDER_HPP_
2+
#define DISTRIBUTED_CONTROL__COMMAND_FORWARDER_HPP_
3+
4+
#include <memory>
5+
#include <string>
6+
#include <vector>
7+
8+
#include "hardware_interface/distributed_control_interface/publisher_description.hpp"
9+
#include "hardware_interface/loaned_command_interface.hpp"
10+
11+
#include "controller_manager_msgs/msg/publisher_description.hpp"
12+
13+
#include "rclcpp/rclcpp.hpp"
14+
#include "rclcpp_lifecycle/lifecycle_node.hpp"
15+
#include "rclcpp_lifecycle/state.hpp"
16+
#include "std_msgs/msg/float64.hpp"
17+
18+
namespace distributed_control
19+
{
20+
21+
class CommandForwarder final
22+
{
23+
public:
24+
explicit CommandForwarder(
25+
std::unique_ptr<hardware_interface::LoanedCommandInterface> loaned_command_interface_ptr_,
26+
const std::string & ns = "");
27+
28+
CommandForwarder() = delete;
29+
30+
~CommandForwarder() {}
31+
32+
std::shared_ptr<rclcpp_lifecycle::LifecycleNode> get_node() const;
33+
34+
std::string get_namespace() const;
35+
36+
std::string topic_name() const;
37+
38+
std::string topic_name_relative_to_namespace() const;
39+
40+
std::string command_interface_name() const;
41+
42+
std::string command_interface_prefix_name() const;
43+
44+
std::string command_interface_interface_name() const;
45+
46+
controller_manager_msgs::msg::PublisherDescription create_publisher_description_msg() const;
47+
48+
void subscribe_to_command(const distributed_control::PublisherDescription & description);
49+
50+
private:
51+
void publish_value_on_timer();
52+
void forward_command(const std_msgs::msg::Float64 & msg);
53+
54+
std::unique_ptr<hardware_interface::LoanedCommandInterface> loaned_command_interface_ptr_;
55+
const std::string namespace_;
56+
const std::string topic_name_;
57+
std::string subscription_topic_name_;
58+
std::shared_ptr<rclcpp_lifecycle::LifecycleNode> node_;
59+
rclcpp::Publisher<std_msgs::msg::Float64>::SharedPtr state_value_pub_;
60+
rclcpp::Subscription<std_msgs::msg::Float64>::SharedPtr command_subscription_;
61+
rclcpp::TimerBase::SharedPtr timer_;
62+
};
63+
64+
} // namespace distributed_control
65+
66+
#endif // DISTRIBUTED_CONTROL__COMMAND_FORWARDER_HPP_

hardware_interface/include/hardware_interface/distributed_control_interface/state_publisher.hpp

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
#include <string>
66
#include <vector>
77

8-
#include "visibility_control.h"
9-
108
#include "hardware_interface/loaned_state_interface.hpp"
119

1210
#include "controller_manager_msgs/msg/publisher_description.hpp"
@@ -23,40 +21,34 @@ class StatePublisher final
2321
{
2422
public:
2523
explicit StatePublisher(
26-
const std::string & ns = "",
27-
std::unique_ptr<hardware_interface::LoanedStateInterface> loaned_state_interface_ptr = nullptr);
24+
std::unique_ptr<hardware_interface::LoanedStateInterface> loaned_state_interface_ptr,
25+
const std::string & ns = "");
26+
27+
StatePublisher() = delete;
2828

2929
~StatePublisher() {}
3030

31-
STATE_PUBLISHER_PUBLIC
3231
std::shared_ptr<rclcpp_lifecycle::LifecycleNode> get_node() const;
3332

34-
STATE_PUBLISHER_PUBLIC
3533
std::string get_namespace() const;
3634

37-
STATE_PUBLISHER_PUBLIC
3835
std::string topic_name() const;
3936

40-
STATE_PUBLISHER_PUBLIC
4137
std::string topic_name_relative_to_namespace() const;
4238

43-
STATE_PUBLISHER_PUBLIC
4439
std::string state_interface_name() const;
4540

46-
STATE_PUBLISHER_PUBLIC
4741
std::string state_interface_prefix_name() const;
4842

49-
STATE_PUBLISHER_PUBLIC
5043
std::string state_interface_interface_name() const;
5144

52-
STATE_PUBLISHER_PUBLIC
53-
controller_manager_msgs::msg::PublisherDescription create_description_msg() const;
45+
controller_manager_msgs::msg::PublisherDescription create_publisher_description_msg() const;
5446

5547
private:
5648
void publish_value_on_timer();
5749

58-
const std::string namespace_;
5950
std::unique_ptr<hardware_interface::LoanedStateInterface> loaned_state_interface_ptr_;
51+
const std::string namespace_;
6052
const std::string topic_name_;
6153
std::shared_ptr<rclcpp_lifecycle::LifecycleNode> node_;
6254
rclcpp::Publisher<std_msgs::msg::Float64>::SharedPtr state_value_pub_;

hardware_interface/include/hardware_interface/distributed_control_interface/sub_controller_manager_wrapper.hpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ class SubControllerManagerWrapper final
1717
public:
1818
explicit SubControllerManagerWrapper(
1919
const std::string & ns, const std::string & name,
20-
const std::vector<controller_manager_msgs::msg::PublisherDescription> & state_publishers)
20+
const std::vector<controller_manager_msgs::msg::PublisherDescription> & state_publishers,
21+
std::vector<controller_manager_msgs::msg::PublisherDescription> & command_forwarders)
2122
: NAMESPACE_(ns),
2223
NAME_(name),
23-
state_publisher_descriptions_({state_publishers.begin(), state_publishers.end()})
24+
state_publisher_descriptions_({state_publishers.begin(), state_publishers.end()}),
25+
command_forwarder_descriptions_({command_forwarders.begin(), command_forwarders.end()})
2426
{
2527
}
2628

@@ -41,12 +43,20 @@ class SubControllerManagerWrapper final
4143
return state_publisher_descriptions_;
4244
}
4345

46+
std::vector<PublisherDescription> get_command_forwarder_descriptions() const
47+
{
48+
return command_forwarder_descriptions_;
49+
}
50+
4451
size_t get_state_publisher_count() const { return state_publisher_descriptions_.size(); }
4552

53+
size_t get_command_forwarder_count() const { return command_forwarder_descriptions_.size(); }
54+
4655
private:
4756
const std::string NAMESPACE_;
4857
const std::string NAME_;
4958
std::vector<PublisherDescription> state_publisher_descriptions_;
59+
std::vector<PublisherDescription> command_forwarder_descriptions_;
5060
};
5161

5262
} // namespace distributed_control

hardware_interface/include/hardware_interface/distributed_control_interface/visibility_control.h

Lines changed: 0 additions & 49 deletions
This file was deleted.

0 commit comments

Comments
 (0)