From cd1c64ab23940f10b4143991bf64c6d3837859c0 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 19:45:28 +0000 Subject: [PATCH 1/3] Add rqt_JTC to docs (#950) (#952) --- joint_trajectory_controller/doc/userdoc.rst | 1 + .../doc/rqt_joint_trajectory_controller.png | Bin 0 -> 29746 bytes rqt_joint_trajectory_controller/doc/userdoc.rst | 12 ++++++++++++ 3 files changed, 13 insertions(+) create mode 100644 rqt_joint_trajectory_controller/doc/rqt_joint_trajectory_controller.png create mode 100644 rqt_joint_trajectory_controller/doc/userdoc.rst diff --git a/joint_trajectory_controller/doc/userdoc.rst b/joint_trajectory_controller/doc/userdoc.rst index 79919c7426..8b7fcc3041 100644 --- a/joint_trajectory_controller/doc/userdoc.rst +++ b/joint_trajectory_controller/doc/userdoc.rst @@ -194,6 +194,7 @@ Further information Trajectory Representation <trajectory.rst> joint_trajectory_controller Parameters <parameters.rst> + rqt_joint_trajectory_controller <../../rqt_joint_trajectory_controller/doc/userdoc.rst> .. rubric:: Footnote diff --git a/rqt_joint_trajectory_controller/doc/rqt_joint_trajectory_controller.png b/rqt_joint_trajectory_controller/doc/rqt_joint_trajectory_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..cb86f4620bcc091f87db272c7868d16966b091b6 GIT binary patch literal 29746 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 RjEG;=P}M%1p<;FAKLC>7-W&h` literal 0 HcmV?d00001 diff --git a/rqt_joint_trajectory_controller/doc/userdoc.rst b/rqt_joint_trajectory_controller/doc/userdoc.rst new file mode 100644 index 0000000000..197a7afb30 --- /dev/null +++ b/rqt_joint_trajectory_controller/doc/userdoc.rst @@ -0,0 +1,12 @@ +:github_url: https://github.com/ros-controls/ros2_controllers/blob/{REPOS_FILE_BRANCH}/rqt_joint_trajectory_controller/doc/userdoc.rst + +.. _rqt_joint_trajectory_controller_userdoc: + +rqt_joint_trajectory_controller +=============================== + +rqt_joint_trajectory_controller is a GUI plugin for rqt that allows to command a joint_trajectory_controller. + +.. image:: rqt_joint_trajectory_controller.png + :width: 400 + :alt: rqt_joint_trajectory_controller From 5fdee99fd6e7e959953d46bdf8f0df5db0d50722 Mon Sep 17 00:00:00 2001 From: Bence Magyar <bence.magyar.robotics@gmail.com> Date: Wed, 3 Jan 2024 19:47:54 +0000 Subject: [PATCH 2/3] Fix whitespace --- joint_trajectory_controller/CHANGELOG.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/joint_trajectory_controller/CHANGELOG.rst b/joint_trajectory_controller/CHANGELOG.rst index 418324b5ac..54e3b6d5e0 100644 --- a/joint_trajectory_controller/CHANGELOG.rst +++ b/joint_trajectory_controller/CHANGELOG.rst @@ -26,7 +26,7 @@ Changelog for package joint_trajectory_controller * [JTC] Tolerance tests + Hold on time violation (backport `#613 <https://github.com/ros-controls/ros2_controllers/issues/613>`_) * [JTC] Explicitly set hold position (backport `#558 <https://github.com/ros-controls/ros2_controllers/issues/558>`_) * [Doc] Fix links (backport `#715 <https://github.com/ros-controls/ros2_controllers/issues/715>`_) -* Contributors: Christoph Fröhlich, Dr Denis Stogl, Bence Magyar, Abishalini Sivaraman +* Contributors: Christoph Fröhlich, Dr Denis Stogl, Bence Magyar, Abishalini Sivaraman 2.29.0 (2023-12-05) ------------------- From cb10e3e23af6c5088cde334bc001c7c266e717f2 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 19:48:49 +0000 Subject: [PATCH 3/3] Fix ackermann steering odometry (#921) (#955) --- steering_controllers_library/CMakeLists.txt | 3 + .../src/steering_odometry.cpp | 4 +- .../test/test_steering_odometry.cpp | 110 ++++++++++++++++++ 3 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 steering_controllers_library/test/test_steering_odometry.cpp diff --git a/steering_controllers_library/CMakeLists.txt b/steering_controllers_library/CMakeLists.txt index 4a98dbf320..6b99416d9f 100644 --- a/steering_controllers_library/CMakeLists.txt +++ b/steering_controllers_library/CMakeLists.txt @@ -67,6 +67,9 @@ if(BUILD_TESTING) controller_interface hardware_interface ) + ament_add_gmock(test_steering_odometry test/test_steering_odometry.cpp) + target_link_libraries(test_steering_odometry steering_controllers_library) + endif() install( diff --git a/steering_controllers_library/src/steering_odometry.cpp b/steering_controllers_library/src/steering_odometry.cpp index e8c3965b3f..26322684d2 100644 --- a/steering_controllers_library/src/steering_odometry.cpp +++ b/steering_controllers_library/src/steering_odometry.cpp @@ -272,8 +272,8 @@ std::tuple<std::vector<double>, std::vector<double>> SteeringOdometry::get_comma double denominator_first_member = 2 * wheelbase_ * std::cos(alpha); double denominator_second_member = wheel_track_ * std::sin(alpha); - double alpha_r = std::atan2(numerator, denominator_first_member - denominator_second_member); - double alpha_l = std::atan2(numerator, denominator_first_member + denominator_second_member); + double alpha_r = std::atan2(numerator, denominator_first_member + denominator_second_member); + double alpha_l = std::atan2(numerator, denominator_first_member - denominator_second_member); steering_commands = {alpha_r, alpha_l}; } return std::make_tuple(traction_commands, steering_commands); diff --git a/steering_controllers_library/test/test_steering_odometry.cpp b/steering_controllers_library/test/test_steering_odometry.cpp new file mode 100644 index 0000000000..173c76baef --- /dev/null +++ b/steering_controllers_library/test/test_steering_odometry.cpp @@ -0,0 +1,110 @@ +// Copyright (c) 2023, Virtual Vehicle Research GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "gmock/gmock.h" + +#include "steering_controllers_library/steering_odometry.hpp" + +TEST(TestSteeringOdometry, initialize) +{ + EXPECT_NO_THROW(steering_odometry::SteeringOdometry()); + + steering_odometry::SteeringOdometry odom(1); + odom.set_wheel_params(1., 2., 3.); + odom.set_odometry_type(steering_odometry::ACKERMANN_CONFIG); + EXPECT_DOUBLE_EQ(odom.get_heading(), 0.); + EXPECT_DOUBLE_EQ(odom.get_x(), 0.); + EXPECT_DOUBLE_EQ(odom.get_y(), 0.); +} + +TEST(TestSteeringOdometry, ackermann_fwd_kin_linear) +{ + steering_odometry::SteeringOdometry odom(1); + odom.set_wheel_params(1., 2., 1.); + odom.set_odometry_type(steering_odometry::ACKERMANN_CONFIG); + odom.update_open_loop(2., 0., 0.5); + EXPECT_DOUBLE_EQ(odom.get_linear(), 2.); + EXPECT_DOUBLE_EQ(odom.get_x(), 1.); + EXPECT_DOUBLE_EQ(odom.get_y(), 0.); +} + +TEST(TestSteeringOdometry, ackermann_fwd_kin_angular_left) +{ + steering_odometry::SteeringOdometry odom(1); + odom.set_wheel_params(1., 2., 1.); + odom.set_odometry_type(steering_odometry::ACKERMANN_CONFIG); + odom.update_open_loop(1., 1., 1.); + EXPECT_DOUBLE_EQ(odom.get_linear(), 1.); + EXPECT_DOUBLE_EQ(odom.get_angular(), 1.); + + EXPECT_GT(odom.get_x(), 0); // pos x + EXPECT_GT(odom.get_y(), 0); // pos y, ie. left +} + +TEST(TestSteeringOdometry, ackermann_fwd_kin_angular_right) +{ + steering_odometry::SteeringOdometry odom(1); + odom.set_wheel_params(1., 2., 1.); + odom.set_odometry_type(steering_odometry::ACKERMANN_CONFIG); + odom.update_open_loop(1., -1., 1.); + EXPECT_DOUBLE_EQ(odom.get_linear(), 1.); + EXPECT_DOUBLE_EQ(odom.get_angular(), -1.); + EXPECT_GT(odom.get_x(), 0); // pos x + EXPECT_LT(odom.get_y(), 0); // neg y ie. right +} + +TEST(TestSteeringOdometry, ackermann_back_kin_linear) +{ + steering_odometry::SteeringOdometry odom(1); + odom.set_wheel_params(1., 2., 1.); + odom.set_odometry_type(steering_odometry::ACKERMANN_CONFIG); + odom.update_open_loop(1., 0., 1.); + auto cmd = odom.get_commands(1., 0.); + auto cmd0 = std::get<0>(cmd); // vel + EXPECT_EQ(cmd0[0], cmd0[1]); // linear + EXPECT_GT(cmd0[0], 0); + auto cmd1 = std::get<1>(cmd); // steer + EXPECT_EQ(cmd1[0], cmd1[1]); // no steering + EXPECT_EQ(cmd1[0], 0); +} + +TEST(TestSteeringOdometry, ackermann_back_kin_left) +{ + steering_odometry::SteeringOdometry odom(1); + odom.set_wheel_params(1., 2., 1.); + odom.set_odometry_type(steering_odometry::ACKERMANN_CONFIG); + odom.update_from_position(0., 0.2, 1.); // assume already turn + auto cmd = odom.get_commands(1., 0.1); + auto cmd0 = std::get<0>(cmd); // vel + EXPECT_GT(cmd0[0], cmd0[1]); // right (outer) > left (inner) + EXPECT_GT(cmd0[0], 0); + auto cmd1 = std::get<1>(cmd); // steer + EXPECT_LT(cmd1[0], cmd1[1]); // right (outer) < left (inner) + EXPECT_GT(cmd1[0], 0); +} + +TEST(TestSteeringOdometry, ackermann_back_kin_right) +{ + steering_odometry::SteeringOdometry odom(1); + odom.set_wheel_params(1., 2., 1.); + odom.set_odometry_type(steering_odometry::ACKERMANN_CONFIG); + odom.update_from_position(0., -0.2, 1.); // assume already turn + auto cmd = odom.get_commands(1., -0.1); + auto cmd0 = std::get<0>(cmd); // vel + EXPECT_LT(cmd0[0], cmd0[1]); // right (inner) < left outer) + EXPECT_GT(cmd0[0], 0); + auto cmd1 = std::get<1>(cmd); // steer + EXPECT_GT(std::abs(cmd1[0]), std::abs(cmd1[1])); // abs right (inner) > abs left (outer) + EXPECT_LT(cmd1[0], 0); +}