Skip to content

Commit df287c4

Browse files
committed
add parameter for setting publish period
1 parent 5a6abc3 commit df287c4

File tree

8 files changed

+62
-19
lines changed

8 files changed

+62
-19
lines changed

controller_manager/include/controller_manager/controller_manager.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,13 +190,20 @@ class ControllerManager : public rclcpp::Node
190190
CONTROLLER_MANAGER_PUBLIC
191191
unsigned int get_update_rate() const;
192192

193+
// Per controller update rate support
194+
CONTROLLER_MANAGER_PUBLIC
195+
std::chrono::milliseconds distributed_interfaces_publish_period() const;
196+
193197
protected:
194198
CONTROLLER_MANAGER_PUBLIC
195199
void init_services();
196200

197201
CONTROLLER_MANAGER_PUBLIC
198202
void configure_controller_manager();
199203

204+
CONTROLLER_MANAGER_PUBLIC
205+
void init_distributed_sub_controller_manager();
206+
200207
CONTROLLER_MANAGER_PUBLIC
201208
void init_distributed_main_controller_services();
202209

@@ -422,6 +429,7 @@ class ControllerManager : public rclcpp::Node
422429

423430
bool distributed_ = false;
424431
bool sub_controller_manager_ = false;
432+
std::chrono::milliseconds distributed_interfaces_publish_period_ = std::chrono::milliseconds(12);
425433

426434
rclcpp::CallbackGroup::SharedPtr distributed_system_srv_callback_group_;
427435
/**

controller_manager/src/controller_manager.cpp

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -329,9 +329,7 @@ void ControllerManager::configure_controller_manager()
329329
bool central_controller_manager = distributed_ && !sub_controller_manager_;
330330
if (distributed_sub_controller_manager)
331331
{
332-
add_hardware_state_publishers();
333-
add_hardware_command_forwarders();
334-
register_sub_controller_manager();
332+
init_distributed_sub_controller_manager();
335333
}
336334
// This means we are the central controller manager
337335
else if (central_controller_manager)
@@ -350,6 +348,25 @@ void ControllerManager::configure_controller_manager()
350348
}
351349
}
352350

351+
void ControllerManager::init_distributed_sub_controller_manager()
352+
{
353+
int64_t distributed_interfaces_publish_period;
354+
if (get_parameter("distributed_interfaces_publish_period", distributed_interfaces_publish_period))
355+
{
356+
distributed_interfaces_publish_period_ =
357+
std::chrono::milliseconds(distributed_interfaces_publish_period);
358+
}
359+
else
360+
{
361+
RCLCPP_WARN(
362+
get_logger(),
363+
"'distributed_interfaces_publish_period' parameter not set, using default value.");
364+
}
365+
add_hardware_state_publishers();
366+
add_hardware_command_forwarders();
367+
register_sub_controller_manager();
368+
}
369+
353370
void ControllerManager::init_distributed_main_controller_services()
354371
{
355372
distributed_system_srv_callback_group_ =
@@ -440,7 +457,8 @@ void ControllerManager::add_hardware_state_publishers()
440457
{
441458
std::vector<std::shared_ptr<distributed_control::StatePublisher>> state_publishers_vec;
442459
state_publishers_vec.reserve(resource_manager_->available_state_interfaces().size());
443-
state_publishers_vec = resource_manager_->create_hardware_state_publishers(get_namespace());
460+
state_publishers_vec = resource_manager_->create_hardware_state_publishers(
461+
get_namespace(), distributed_interfaces_publish_period());
444462

445463
for (auto const & state_publisher : state_publishers_vec)
446464
{
@@ -461,7 +479,8 @@ void ControllerManager::add_hardware_command_forwarders()
461479
{
462480
std::vector<std::shared_ptr<distributed_control::CommandForwarder>> command_forwarder_vec;
463481
command_forwarder_vec.reserve(resource_manager_->available_command_interfaces().size());
464-
command_forwarder_vec = resource_manager_->create_hardware_command_forwarders(get_namespace());
482+
command_forwarder_vec = resource_manager_->create_hardware_command_forwarders(
483+
get_namespace(), distributed_interfaces_publish_period());
465484

466485
for (auto const & command_forwarder : command_forwarder_vec)
467486
{
@@ -2185,6 +2204,11 @@ std::pair<std::string, std::string> ControllerManager::split_command_interface(
21852204

21862205
unsigned int ControllerManager::get_update_rate() const { return update_rate_; }
21872206

2207+
std::chrono::milliseconds ControllerManager::distributed_interfaces_publish_period() const
2208+
{
2209+
return distributed_interfaces_publish_period_;
2210+
}
2211+
21882212
void ControllerManager::propagate_deactivation_of_chained_mode(
21892213
const std::vector<ControllerSpec> & controllers)
21902214
{

hardware_interface/include/hardware_interface/distributed_control_interface/command_forwarder.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#ifndef DISTRIBUTED_CONTROL__COMMAND_FORWARDER_HPP_
22
#define DISTRIBUTED_CONTROL__COMMAND_FORWARDER_HPP_
33

4+
#include <chrono>
45
#include <memory>
56
#include <string>
67
#include <vector>
@@ -22,8 +23,8 @@ class CommandForwarder final
2223
{
2324
public:
2425
explicit CommandForwarder(
25-
std::unique_ptr<hardware_interface::LoanedCommandInterface> loaned_command_interface_ptr_,
26-
const std::string & ns = "");
26+
std::unique_ptr<hardware_interface::LoanedCommandInterface> loaned_command_interface_ptr,
27+
std::chrono::milliseconds period_in_ms, const std::string & ns = "");
2728

2829
CommandForwarder() = delete;
2930

@@ -53,6 +54,8 @@ class CommandForwarder final
5354

5455
std::unique_ptr<hardware_interface::LoanedCommandInterface> loaned_command_interface_ptr_;
5556
const std::string namespace_;
57+
const std::chrono::milliseconds period_in_ms_;
58+
5659
const std::string topic_name_;
5760
std::string subscription_topic_name_;
5861
std::shared_ptr<rclcpp_lifecycle::LifecycleNode> node_;

hardware_interface/include/hardware_interface/distributed_control_interface/state_publisher.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class StatePublisher final
2222
public:
2323
explicit StatePublisher(
2424
std::unique_ptr<hardware_interface::LoanedStateInterface> loaned_state_interface_ptr,
25-
const std::string & ns = "");
25+
std::chrono::milliseconds period_in_ms, const std::string & ns = "");
2626

2727
StatePublisher() = delete;
2828

@@ -49,6 +49,8 @@ class StatePublisher final
4949

5050
std::unique_ptr<hardware_interface::LoanedStateInterface> loaned_state_interface_ptr_;
5151
const std::string namespace_;
52+
std::chrono::milliseconds period_in_ms_;
53+
5254
const std::string topic_name_;
5355
std::shared_ptr<rclcpp_lifecycle::LifecycleNode> node_;
5456
rclcpp::Publisher<std_msgs::msg::Float64>::SharedPtr state_value_pub_;

hardware_interface/include/hardware_interface/resource_manager.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,11 @@ class HARDWARE_INTERFACE_PUBLIC ResourceManager
131131
std::shared_ptr<distributed_control::SubControllerManagerWrapper> sub_controller_manager);
132132

133133
std::vector<std::shared_ptr<distributed_control::StatePublisher>>
134-
create_hardware_state_publishers(const std::string & ns);
134+
create_hardware_state_publishers(const std::string & ns, std::chrono::milliseconds update_period);
135135

136136
std::vector<std::shared_ptr<distributed_control::CommandForwarder>>
137-
create_hardware_command_forwarders(const std::string & ns);
137+
create_hardware_command_forwarders(
138+
const std::string & ns, std::chrono::milliseconds update_period);
138139

139140
std::pair<bool, std::shared_ptr<distributed_control::CommandForwarder>> find_command_forwarder(
140141
const std::string & key);

hardware_interface/src/hardware_interface/distributed_control_interface/command_forwarder.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ namespace distributed_control
1313

1414
CommandForwarder::CommandForwarder(
1515
std::unique_ptr<hardware_interface::LoanedCommandInterface> loaned_command_interface_ptr,
16-
const std::string & ns)
16+
std::chrono::milliseconds period_in_ms, const std::string & ns)
1717
: loaned_command_interface_ptr_(std::move(loaned_command_interface_ptr)),
18+
period_in_ms_(period_in_ms),
1819
namespace_(ns),
1920
topic_name_(loaned_command_interface_ptr_->get_underscore_separated_name() + "_command_state")
2021
{
@@ -25,8 +26,8 @@ CommandForwarder::CommandForwarder(
2526

2627
state_value_pub_ = node_->create_publisher<std_msgs::msg::Float64>(topic_name_, 10);
2728
// TODO(Manuel): We should check if we cannot detect changes to LoanedStateInterface's value and only publish then
28-
timer_ =
29-
node_->create_wall_timer(50ms, std::bind(&CommandForwarder::publish_value_on_timer, this));
29+
timer_ = node_->create_wall_timer(
30+
period_in_ms_, std::bind(&CommandForwarder::publish_value_on_timer, this));
3031
RCLCPP_INFO(node_->get_logger(), "Creating CommandForwarder<%s>.", topic_name_.c_str());
3132
}
3233

hardware_interface/src/hardware_interface/distributed_control_interface/state_publisher.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ namespace distributed_control
1313

1414
StatePublisher::StatePublisher(
1515
std::unique_ptr<hardware_interface::LoanedStateInterface> loaned_state_interface_ptr,
16-
const std::string & ns)
16+
std::chrono::milliseconds period_in_ms, const std::string & ns)
1717
: loaned_state_interface_ptr_(std::move(loaned_state_interface_ptr)),
18+
period_in_ms_(period_in_ms),
1819
namespace_(ns),
1920
topic_name_(loaned_state_interface_ptr_->get_underscore_separated_name() + "_state")
2021
{
@@ -25,7 +26,8 @@ StatePublisher::StatePublisher(
2526

2627
state_value_pub_ = node_->create_publisher<std_msgs::msg::Float64>(topic_name_, 10);
2728
// TODO(Manuel): We should check if we cannot detect changes to LoanedStateInterface's value and only publish then
28-
timer_ = node_->create_wall_timer(50ms, std::bind(&StatePublisher::publish_value_on_timer, this));
29+
timer_ = node_->create_wall_timer(
30+
period_in_ms_, std::bind(&StatePublisher::publish_value_on_timer, this));
2931
RCLCPP_INFO(node_->get_logger(), "Creating StatePublisher<%s>.", topic_name_.c_str());
3032
}
3133

hardware_interface/src/resource_manager.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -951,7 +951,8 @@ ResourceManager::import_command_interfaces_of_sub_controller_manager(
951951
}
952952

953953
std::vector<std::shared_ptr<distributed_control::StatePublisher>>
954-
ResourceManager::create_hardware_state_publishers(const std::string & ns)
954+
ResourceManager::create_hardware_state_publishers(
955+
const std::string & ns, std::chrono::milliseconds update_period)
955956
{
956957
std::lock_guard<std::recursive_mutex> guard(resource_interfaces_lock_);
957958
std::vector<std::shared_ptr<distributed_control::StatePublisher>> state_publishers_vec;
@@ -962,7 +963,7 @@ ResourceManager::create_hardware_state_publishers(const std::string & ns)
962963
auto state_publisher = std::make_shared<distributed_control::StatePublisher>(
963964
std::move(std::make_unique<hardware_interface::LoanedStateInterface>(
964965
claim_state_interface(state_interface))),
965-
ns);
966+
update_period, ns);
966967

967968
resource_storage_->add_state_publisher(state_publisher);
968969
state_publishers_vec.push_back(state_publisher);
@@ -972,7 +973,8 @@ ResourceManager::create_hardware_state_publishers(const std::string & ns)
972973
}
973974

974975
std::vector<std::shared_ptr<distributed_control::CommandForwarder>>
975-
ResourceManager::create_hardware_command_forwarders(const std::string & ns)
976+
ResourceManager::create_hardware_command_forwarders(
977+
const std::string & ns, std::chrono::milliseconds update_period)
976978
{
977979
std::lock_guard<std::recursive_mutex> guard(resource_interfaces_lock_);
978980
std::vector<std::shared_ptr<distributed_control::CommandForwarder>> command_forwarders_vec;
@@ -983,7 +985,7 @@ ResourceManager::create_hardware_command_forwarders(const std::string & ns)
983985
auto command_forwarder = std::make_shared<distributed_control::CommandForwarder>(
984986
std::move(std::make_unique<hardware_interface::LoanedCommandInterface>(
985987
claim_command_interface(command_interface))),
986-
ns);
988+
update_period, ns);
987989

988990
resource_storage_->add_command_forwarder(command_forwarder);
989991
command_forwarders_vec.push_back(command_forwarder);

0 commit comments

Comments
 (0)