Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
d433d58
fix: reset header stamps to zero in reset methods to prevent timeout …
Ishan1923 Mar 4, 2026
50b2493
fix: change reset_controller_reference_msg signature to remove unused…
Ishan1923 Mar 27, 2026
cc93ee3
style: pre-commit run
Ishan1923 Mar 27, 2026
42104e3
test: halt robot to clear wheel feedback before odometry reset test
Ishan1923 Apr 2, 2026
1eb067b
Merge branch 'master' into fix/1774-reset-header-stamps
christophfroehlich Apr 17, 2026
fad4d2e
Fix segfault in jtc if joint name not in urdf (#2321)
InigoMoreno Apr 20, 2026
7debce0
Update changelogs
christophfroehlich Apr 22, 2026
36e0276
6.6.0
christophfroehlich Apr 22, 2026
4aaf4e7
[rqt_jtc] Use urdf_parser_py (#2254)
lakhmanisahil Apr 22, 2026
6643956
Remove deprecated controller specializations (#2016)
christophfroehlich Apr 23, 2026
e8be012
fix JTC userdoc YAML indentation and stray quote (#2327)
ahmedbilal9 Apr 25, 2026
fdd51ae
diff_drive: set parameters as read_only or dynamically update them (#…
kamal2730 Apr 25, 2026
bdd8433
fix(joint_state_broadcaster): suppress confusing warning for standard…
greencookie-afk Apr 27, 2026
c794ba6
Bump C++ version to C++20 (#2331)
christophfroehlich Apr 28, 2026
8dc4de0
Remove deprecated odometry reset methods (#2252)
kuralme Apr 29, 2026
52997cb
Remove deprecated publish_rate from diff_drive_controller (#2259)
Bhavin-umatiya Apr 30, 2026
9a48b94
fix: correct ASSERT_EQ to ASSERT_NE in admittance controller load tes…
SouriRishik May 1, 2026
2b34b67
Bump version of pre-commit hooks (#2337)
github-actions[bot] May 1, 2026
83b2641
added warning messages when unable to remap the interface properly in…
sviridovm May 3, 2026
cd4e227
Suppress cppcheck errors from macros from version.h (#2346)
christophfroehlich May 7, 2026
7554821
Add lyrical workflows, update README, and fix gcc-15 issues (#2344)
christophfroehlich May 10, 2026
5d808d6
Update changelogs
christophfroehlich May 12, 2026
567c1a6
6.7.0
christophfroehlich May 12, 2026
7fdd9ea
More general initialization of state from command (#2294)
peter-mitrano-ar May 14, 2026
5e0f88c
Test fix - call appropriate lifecycle transitions in controller tests…
jsantoso91 May 14, 2026
a8bfbb0
[JSB] Remove dynamic_joint_states and use INDIVIDUAL_BEST_EFFORT for …
saikishor May 17, 2026
ee5bab0
Added velocity limiting to the mecanum controller. (#2313)
tonybaltovski May 19, 2026
d5ec4be
[JTC] Fix segfault when last trajectory segment is skipped (#2359)
dparikh79 May 21, 2026
aa4079f
Fix motion_primitive_controller TOC in docs (#2221)
SouriRishik May 21, 2026
b074eb4
Remove broken toctree entries for deleted position/velocity controlle…
bmagyar May 21, 2026
ad79f26
Add broadcaster for magnetic field values from a magnetometer (#2214)
christianrauch May 26, 2026
e89c342
Fix SPDX license expression (#2370)
ShivamMaurya14 May 26, 2026
54893c2
fix: resolve merge conflict in mecanum_drive_controller
Ishan1923 May 26, 2026
fb0b8e0
fix: resolve merge conflicts
Ishan1923 May 26, 2026
e29f848
fix: pass correct arguments for move_robot()
Ishan1923 May 27, 2026
f4ed8b0
Merge branch 'master' into fix/1774-reset-header-stamps
christophfroehlich Jun 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions admittance_controller/src/admittance_controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,9 @@ void reset_controller_reference_msg(trajectory_msgs::msg::JointTrajectoryPoint &
}

// called from RT control loop
void reset_wrench_msg(
geometry_msgs::msg::WrenchStamped & msg,
const std::shared_ptr<rclcpp_lifecycle::LifecycleNode> & node)
void reset_wrench_msg(geometry_msgs::msg::WrenchStamped & msg)
{
msg.header.stamp = node->now();
msg.header.stamp = rclcpp::Time(0);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
msg.header.stamp = rclcpp::Time(0);
msg.header.stamp = rclcpp::Time(0, node->get_clock()->get_clock_type());

Maybe this is needed, seems like default is systemtime?

msg.wrench = geometry_msgs::msg::Wrench();
}

Expand Down Expand Up @@ -403,7 +401,7 @@ controller_interface::CallbackReturn AdmittanceController::on_activate(
}
}
reset_controller_reference_msg(joint_command_msg_);
reset_wrench_msg(wrench_command_msg_, get_node());
reset_wrench_msg(wrench_command_msg_);

// Use current joint_state as a default reference
last_reference_ = joint_state_;
Expand Down Expand Up @@ -519,7 +517,7 @@ controller_interface::CallbackReturn AdmittanceController::on_deactivate(
admittance_->reset(num_joints_);

reset_controller_reference_msg(joint_command_msg_);
reset_wrench_msg(wrench_command_msg_, get_node());
reset_wrench_msg(wrench_command_msg_);

return CallbackReturn::SUCCESS;
}
Expand Down
2 changes: 1 addition & 1 deletion diff_drive_controller/src/diff_drive_controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -644,7 +644,7 @@ void DiffDriveController::reset_buffers()

// Fill RealtimeBox with NaNs so it will contain a known value
// but still indicate that no command has yet been sent.
command_msg_.header.stamp = get_node()->now();
command_msg_.header.stamp = rclcpp::Time(0);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
command_msg_.header.stamp = rclcpp::Time(0);
command_msg_.header.stamp = rclcpp::Time(0, node->get_clock()->get_clock_type());

command_msg_.twist.linear.x = std::numeric_limits<double>::quiet_NaN();
command_msg_.twist.linear.y = std::numeric_limits<double>::quiet_NaN();
command_msg_.twist.linear.z = std::numeric_limits<double>::quiet_NaN();
Expand Down
9 changes: 4 additions & 5 deletions gpio_controllers/src/gpio_command_controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,9 @@ void print_interface(const rclcpp::Logger & logger, const T & command_interfaces
}

// called from RT control loop
void reset_controller_reference_msg(
gpio_controllers::CmdType & msg, const std::shared_ptr<rclcpp_lifecycle::LifecycleNode> & node)
void reset_controller_reference_msg(gpio_controllers::CmdType & msg)
{
msg.header.stamp = node->now();
msg.header.stamp = rclcpp::Time(0);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
msg.header.stamp = rclcpp::Time(0);
msg.header.stamp = rclcpp::Time(0, node->get_clock()->get_clock_type());

msg.interface_groups.clear();
msg.interface_values.clear();
}
Expand Down Expand Up @@ -147,7 +146,7 @@ CallbackReturn GpioCommandController::on_activate(const rclcpp_lifecycle::State

initialize_gpio_state_msg();
// Set default value in command
reset_controller_reference_msg(gpio_commands_, get_node());
reset_controller_reference_msg(gpio_commands_);
rt_command_.try_set(gpio_commands_);
RCLCPP_INFO(get_node()->get_logger(), "activate successful");
return CallbackReturn::SUCCESS;
Expand All @@ -156,7 +155,7 @@ CallbackReturn GpioCommandController::on_activate(const rclcpp_lifecycle::State
CallbackReturn GpioCommandController::on_deactivate(const rclcpp_lifecycle::State &)
{
// Set default value in command
reset_controller_reference_msg(gpio_commands_, get_node());
reset_controller_reference_msg(gpio_commands_);
rt_command_.try_set(gpio_commands_);
return CallbackReturn::SUCCESS;
}
Expand Down
17 changes: 11 additions & 6 deletions mecanum_drive_controller/src/mecanum_drive_controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,9 @@ using ControllerReferenceMsg =
mecanum_drive_controller::MecanumDriveController::ControllerReferenceMsg;

// called from RT control loop
void reset_controller_reference_msg(
ControllerReferenceMsg & msg, const std::shared_ptr<rclcpp_lifecycle::LifecycleNode> & node)
void reset_controller_reference_msg(ControllerReferenceMsg & msg)
{
msg.header.stamp = node->now();
msg.header.stamp = rclcpp::Time(0);
msg.twist.linear.x = std::numeric_limits<double>::quiet_NaN();
msg.twist.linear.y = std::numeric_limits<double>::quiet_NaN();
msg.twist.linear.z = std::numeric_limits<double>::quiet_NaN();
Expand Down Expand Up @@ -131,7 +130,7 @@ controller_interface::CallbackReturn MecanumDriveController::on_configure(
"~/reference", subscribers_qos,
std::bind(&MecanumDriveController::reference_callback, this, std::placeholders::_1));

reset_controller_reference_msg(current_ref_, get_node());
reset_controller_reference_msg(current_ref_);
input_ref_.set(current_ref_);

// deprecation warning if tf_frame_prefix_enable set to non-default value
Expand Down Expand Up @@ -346,7 +345,7 @@ void MecanumDriveController::reference_callback(const std::shared_ptr<Controller
ref_timeout_.seconds());

ControllerReferenceMsg emtpy_msg;
reset_controller_reference_msg(emtpy_msg, get_node());
reset_controller_reference_msg(emtpy_msg);
input_ref_.set(emtpy_msg);
}
}
Expand Down Expand Up @@ -413,6 +412,12 @@ controller_interface::CallbackReturn MecanumDriveController::on_activate(
// influence the behavior of the controller after a deactivate->activate cycle.
reset_buffers();

// Try to set default value in command.
// If this fails, then another command will be received soon anyways.
ControllerReferenceMsg emtpy_msg;
reset_controller_reference_msg(emtpy_msg);
input_ref_.try_set(emtpy_msg);

return controller_interface::CallbackReturn::SUCCESS;
}

Expand Down Expand Up @@ -450,7 +455,7 @@ void MecanumDriveController::reset_buffers()
std::deque<std::array<double, 3>>{{{0.0, 0.0, 0.0}}, {{0.0, 0.0, 0.0}}});

// Reset the latest received reference back to NaN so no stale command is applied.
reset_controller_reference_msg(current_ref_, get_node());
reset_controller_reference_msg(current_ref_);
input_ref_.set(current_ref_);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,7 @@ TEST_F(
controller_->wait_for_commands(executor);
reference = controller_->input_ref_.get();

ASSERT_EQ(old_timestamp.sec, reference.header.stamp.sec);
EXPECT_GT(reference.header.stamp.sec, old_timestamp.sec);
EXPECT_FALSE(std::isnan(reference.twist.linear.x));
EXPECT_FALSE(std::isnan(reference.twist.angular.z));
EXPECT_EQ(reference.twist.linear.x, 1.5);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -566,7 +566,7 @@ void OmniWheelDriveController::reset_buffers()

// Fill RealtimeBox with NaNs so it will contain a known value
// but still indicate that no command has yet been sent.
command_msg_.header.stamp = get_node()->now();
command_msg_.header.stamp = rclcpp::Time(0);
command_msg_.twist.linear.x = std::numeric_limits<double>::quiet_NaN();
command_msg_.twist.linear.y = std::numeric_limits<double>::quiet_NaN();
command_msg_.twist.linear.z = std::numeric_limits<double>::quiet_NaN();
Expand Down
32 changes: 25 additions & 7 deletions steering_controllers_library/src/steering_controllers_library.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

#include "steering_controllers_library/steering_controllers_library.hpp"

#include <cmath>
#include <limits>
#include <memory>
#include <string>
Expand All @@ -31,10 +32,9 @@ using ControllerTwistReferenceMsg =
steering_controllers_library::SteeringControllersLibrary::ControllerTwistReferenceMsg;

// called from RT control loop
void reset_controller_reference_msg(
ControllerTwistReferenceMsg & msg, const std::shared_ptr<rclcpp_lifecycle::LifecycleNode> & node)
void reset_controller_reference_msg(ControllerTwistReferenceMsg & msg)
{
msg.header.stamp = node->now();
msg.header.stamp = rclcpp::Time(0);
msg.twist.linear.x = std::numeric_limits<double>::quiet_NaN();
msg.twist.linear.y = std::numeric_limits<double>::quiet_NaN();
msg.twist.linear.z = std::numeric_limits<double>::quiet_NaN();
Expand Down Expand Up @@ -263,7 +263,7 @@ controller_interface::CallbackReturn SteeringControllersLibrary::on_configure(
"~/reference", subscribers_qos,
std::bind(&SteeringControllersLibrary::reference_callback, this, std::placeholders::_1));

reset_controller_reference_msg(current_ref_, get_node());
reset_controller_reference_msg(current_ref_);
input_ref_.set(current_ref_);

try
Expand Down Expand Up @@ -470,7 +470,7 @@ controller_interface::CallbackReturn SteeringControllersLibrary::on_activate(
{
// Try to set default value in command.
// If this fails, then another command will be received soon anyways.
reset_controller_reference_msg(current_ref_, get_node());
reset_controller_reference_msg(current_ref_);
input_ref_.try_set(current_ref_);

return controller_interface::CallbackReturn::SUCCESS;
Expand Down Expand Up @@ -727,10 +727,28 @@ controller_interface::return_type SteeringControllersLibrary::update_and_write_c
controller_state_msg_.steering_angle_command.push_back(command_interface_value_op.value());
}
}

controller_state_publisher_->try_publish(controller_state_msg_);
}

// store current ref (for open loop odometry) and update odometry
Comment thread
Ishan1923 marked this conversation as resolved.
if (std::isfinite(reference_interfaces_[0]))
{
last_linear_velocity_ = reference_interfaces_[0];
}
else
{
last_linear_velocity_ = 0.0;
}
if (std::isfinite(reference_interfaces_[1]))
{
last_angular_velocity_ = reference_interfaces_[1];
}
else
{
last_angular_velocity_ = 0.0;
}
update_odometry(period);

reference_interfaces_[0] = std::numeric_limits<double>::quiet_NaN();
reference_interfaces_[1] = std::numeric_limits<double>::quiet_NaN();

Expand Down Expand Up @@ -763,7 +781,7 @@ bool SteeringControllersLibrary::reset()
{
odometry_.set_odometry(0.0, 0.0, 0.0);

reset_controller_reference_msg(current_ref_, get_node());
reset_controller_reference_msg(current_ref_);
input_ref_.set(current_ref_);

last_linear_velocity_ = std::numeric_limits<double>::quiet_NaN();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,8 @@ TEST_F(SteeringControllersLibraryTest, odometry_set_service)
for (int i = 0; i < 10; ++i) move_robot(1.0, 0.0);
ASSERT_GT(controller_->odometry_.get_x(), 0.0);

move_robot(0.0, 0.0);

// 2. Call the odometry set service
auto set_request = std::make_shared<control_msgs::srv::SetOdometry::Request>();
auto set_response = std::make_shared<control_msgs::srv::SetOdometry::Response>();
Expand Down
Loading