Skip to content

Commit 71f8f3e

Browse files
committed
Added parameters to handle the overruns behaviour and prints
1 parent 32ee77b commit 71f8f3e

File tree

4 files changed

+19
-4
lines changed

4 files changed

+19
-4
lines changed

controller_manager/doc/userdoc.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,12 @@ thread_priority (optional; int; default: 50)
383383
use_sim_time (optional; bool; default: false)
384384
Enables the use of simulation time in the ``controller_manager`` node.
385385

386+
overruns.manage (optional; bool; default: true)
387+
Enables or disables the handling of overruns in the real-time loop of the ``controller_manager`` node.
388+
If set to true, the controller manager will detect overruns caused by system time changes or longer execution times of the controllers and hardware components.
389+
If an overrun is detected, the controller manager will print a warning message to the console.
390+
When used with ``use_sim_time`` set to true, this parameter is ignored and the overrun handling is disabled.
391+
386392
Concepts
387393
-----------
388394

controller_manager/src/controller_manager.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -591,11 +591,12 @@ void ControllerManager::initialize_parameters()
591591
// Initialize parameters
592592
try
593593
{
594+
use_sim_time_ = this->get_parameter("use_sim_time").as_bool();
595+
this->declare_parameter("overruns.print_warnings", !use_sim_time_);
594596
cm_param_listener_ = std::make_shared<controller_manager::ParamListener>(
595597
this->get_node_parameters_interface(), this->get_logger());
596598
params_ = std::make_shared<controller_manager::Params>(cm_param_listener_->get_params());
597599
update_rate_ = static_cast<unsigned int>(params_->update_rate);
598-
use_sim_time_ = this->get_parameter("use_sim_time").as_bool();
599600
trigger_clock_ =
600601
use_sim_time_ ? this->get_clock() : std::make_shared<rclcpp::Clock>(RCL_STEADY_TIME);
601602
RCLCPP_INFO(
@@ -3181,7 +3182,7 @@ void ControllerManager::write(const rclcpp::Time & time, const rclcpp::Duration
31813182
execution_time_.total_time =
31823183
execution_time_.write_time + execution_time_.update_time + execution_time_.read_time;
31833184
const double expected_cycle_time = 1.e6 / static_cast<double>(get_update_rate());
3184-
if (execution_time_.total_time > expected_cycle_time && !use_sim_time_)
3185+
if (params_->overruns.print_warnings && execution_time_.total_time > expected_cycle_time)
31853186
{
31863187
if (execution_time_.switch_time > 0.0)
31873188
{

controller_manager/src/controller_manager_parameters.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,3 +234,8 @@ controller_manager:
234234
gt<>: 0.0,
235235
}
236236
}
237+
overruns:
238+
print_warnings: {
239+
type: bool,
240+
description: "If true, the controller manager will print a warning message to the console if an overrun is detected in its real-time loop (``read``, ``update`` and ``write``). By default, it is set to true, except when used with ``use_sim_time`` parameter set to true.",
241+
}

controller_manager/src/ros2_control_node.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,16 @@ int main(int argc, char ** argv)
7575
cm->get_clock()->sleep_for(rclcpp::Duration::from_seconds(1.0 / cm->get_update_rate()));
7676

7777
RCLCPP_INFO(cm->get_logger(), "update rate is %d Hz", cm->get_update_rate());
78+
const bool manage_overruns = cm->get_parameter_or<bool>("overruns.manage", true);
79+
RCLCPP_INFO(
80+
cm->get_logger(), "Overruns handling is : %s", manage_overruns ? "enabled" : "disabled");
7881
const int thread_priority = cm->get_parameter_or<int>("thread_priority", kSchedPriority);
7982
RCLCPP_INFO(
8083
cm->get_logger(), "Spawning %s RT thread with scheduler priority: %d", cm->get_name(),
8184
thread_priority);
8285

8386
std::thread cm_thread(
84-
[cm, thread_priority, use_sim_time]()
87+
[cm, thread_priority, use_sim_time, manage_overruns]()
8588
{
8689
rclcpp::Parameter cpu_affinity_param;
8790
if (cm->get_parameter("cpu_affinity", cpu_affinity_param))
@@ -153,7 +156,7 @@ int main(int argc, char ** argv)
153156
{
154157
next_iteration_time += period;
155158
const auto time_now = std::chrono::steady_clock::now();
156-
if (next_iteration_time < time_now)
159+
if (manage_overruns && next_iteration_time < time_now)
157160
{
158161
const double time_diff =
159162
static_cast<double>(

0 commit comments

Comments
 (0)