Skip to content

Commit 2868b46

Browse files
authored
Merge pull request #14 from nice-mee/master
Fix AGV chassis
2 parents b562ef1 + a48cb8e commit 2868b46

File tree

11 files changed

+92
-120
lines changed

11 files changed

+92
-120
lines changed

decomposition/meta_chassis_controller/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)")
55
add_compile_options(-Wall -Wextra -Werror=conversion -Werror=unused-but-set-variable -Werror=return-type -Werror=shadow)
66
endif()
77

8+
set(CMAKE_CXX_STANDARD 20)
9+
810
find_package(ament_cmake REQUIRED)
911
find_package(ament_cmake_auto REQUIRED)
1012
ament_auto_find_build_dependencies()

decomposition/meta_chassis_controller/include/meta_chassis_controller/agv_chassis_controller.hpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
#include "control_toolbox/pid_ros.hpp"
1010
#include "controller_interface/chainable_controller_interface.hpp"
1111
#include "meta_chassis_controller/agv_wheel_kinematics.hpp"
12-
#include "agv_chassis_controller_parameters.hpp"
12+
#include "meta_chassis_controller/agv_chassis_controller_parameters.hpp"
1313
#include "rclcpp/duration.hpp"
1414
#include "rclcpp_lifecycle/node_interfaces/lifecycle_node_interface.hpp"
1515
#include "rclcpp_lifecycle/state.hpp"
16-
#include "realtime_tools/realtime_buffer.h"
17-
#include "realtime_tools/realtime_publisher.h"
16+
#include "realtime_tools/realtime_buffer.hpp"
17+
#include "realtime_tools/realtime_publisher.hpp"
1818

1919
#include "control_msgs/msg/joint_controller_state.hpp"
2020
#include "geometry_msgs/msg/twist.hpp"
@@ -63,9 +63,6 @@ class AgvChassisController : public controller_interface::ChainableControllerInt
6363
std::shared_ptr<agv_chassis_controller::ParamListener> param_listener_;
6464
agv_chassis_controller::Params params_;
6565

66-
std::vector<double> wheels_vel_;
67-
std::vector<double> wheels_pos_;
68-
6966
std::shared_ptr<control_toolbox::PidROS> follow_pid_;
7067

7168
std::vector<std::shared_ptr<control_toolbox::PidROS>> steer_pos2vel_pid_;

decomposition/meta_chassis_controller/include/meta_chassis_controller/agv_wheel_kinematics.hpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,12 @@ class AgvWheelKinematics {
1010
AgvWheelKinematics(const double agv_wheel_center_x, const double agv_wheel_center_y, const double agv_wheel_radius);
1111
~AgvWheelKinematics() = default;
1212

13-
// std::vector<double> forward(const std::vector<double> &wheels_vel);
14-
void inverse(Eigen::VectorXd, std::vector<double> & curr_pos, std::vector<double> & curr_vel);
15-
13+
std::pair<std::array<double, 4>, std::array<double, 4>> inverse(Eigen::VectorXd twist, const std::array<double, 4> & curr_pos);
14+
1615
private:
1716
void init();
1817
double agv_wheel_center_x_, agv_wheel_center_y_, agv_wheel_radius_, agv_radius_;
19-
std::tuple<double, double> get_output(double curr_pos, double curr_vel, double target_pos, double target_vel);
20-
// Eigen::MatrixXd motion_mat_;
18+
std::pair<double, double> xy2polar(double curr_pos, double target_x, double target_y);
2119
};
2220

2321
} // namespace meta_chassis_controller

decomposition/meta_chassis_controller/include/meta_chassis_controller/omni_chassis_controller.hpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,22 @@
22
#define OMNI_CHASSIS_CONTROLLER__OMNI_CHASSIS_CONTROLLER_HPP_
33

44
#include <memory>
5-
#include <string>
65
#include <vector>
76

8-
#include "behavior_interface/msg/chassis.hpp"
7+
#include <behavior_interface/msg/chassis.hpp>
98
#include "control_toolbox/pid_ros.hpp"
109
#include "controller_interface/chainable_controller_interface.hpp"
1110
#include "meta_chassis_controller/omni_wheel_kinematics.hpp"
12-
#include "omni_chassis_controller_parameters.hpp"
11+
#include <meta_chassis_controller/omni_chassis_controller_parameters.hpp>
1312
#include "rclcpp/duration.hpp"
14-
#include "rclcpp_lifecycle/node_interfaces/lifecycle_node_interface.hpp"
13+
#include <rclcpp_lifecycle/node_interfaces/lifecycle_node_interface.hpp>
1514
#include "rclcpp_lifecycle/state.hpp"
16-
#include "realtime_tools/realtime_buffer.h"
17-
#include "realtime_tools/realtime_publisher.h"
15+
#include "realtime_tools/realtime_buffer.hpp"
16+
#include "realtime_tools/realtime_publisher.hpp"
1817

19-
#include "control_msgs/msg/joint_controller_state.hpp"
20-
#include "geometry_msgs/msg/twist.hpp"
21-
#include "geometry_msgs/msg/twist_stamped.hpp"
18+
#include <control_msgs/msg/joint_controller_state.hpp>
19+
#include <geometry_msgs/msg/twist.hpp>
20+
#include <geometry_msgs/msg/twist_stamped.hpp>
2221

2322
namespace meta_chassis_controller {
2423

decomposition/meta_chassis_controller/src/agv_chassis_controller.cpp

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "meta_chassis_controller/agv_chassis_controller.hpp"
22

3+
#include <Eigen/LU>
34
#include <Eigen/src/Core/Matrix.h>
45
#include <behavior_interface/msg/detail/chassis__struct.hpp>
56
#include <limits>
@@ -8,7 +9,7 @@
89
#include <vector>
910

1011
#include "angles/angles.h"
11-
#include "controller_interface/helpers.hpp"
12+
#include <controller_interface/helpers.hpp>
1213
#include "hardware_interface/types/hardware_interface_type_values.hpp"
1314
#include "rclcpp/logging.hpp"
1415

@@ -62,11 +63,6 @@ AgvChassisController::on_configure(const rclcpp_lifecycle::State & /*previous_st
6263
params_ = param_listener_->get_params();
6364

6465
agv_wheel_kinematics_ = std::make_unique<AgvWheelKinematics>(params_.agv_wheel_center_x, params_.agv_wheel_center_y, params_.agv_wheel_radius);
65-
// Set Wheels Velocities and Positions
66-
wheels_vel_.resize(4);
67-
wheels_pos_.resize(4);
68-
std::fill(wheels_vel_.begin(), wheels_vel_.end(), 0);
69-
std::fill(wheels_pos_.begin(), wheels_pos_.end(), 0);
7066

7167
// Initialize PIDs
7268

@@ -80,7 +76,7 @@ AgvChassisController::on_configure(const rclcpp_lifecycle::State & /*previous_st
8076
steer_pos2vel_pid_[3] = std::make_shared<control_toolbox::PidROS>(
8177
get_node(), "right_back_steer_pos2vel_gains", true);
8278

83-
for (int i = 0; i < steer_pos2vel_pid_.size(); i++) {
79+
for (size_t i = 0; i < steer_pos2vel_pid_.size(); i++) {
8480
if (!steer_pos2vel_pid_[i]->initPid()) {
8581
RCLCPP_ERROR(get_node()->get_logger(), "Failed to initialize PID for pos2vel");
8682
return controller_interface::CallbackReturn::FAILURE;
@@ -97,7 +93,7 @@ AgvChassisController::on_configure(const rclcpp_lifecycle::State & /*previous_st
9793
steer_vel2eff_pid_[3] = std::make_shared<control_toolbox::PidROS>(
9894
get_node(), "right_back_steer_vel2eff_gains", true);
9995

100-
for (int i = 0; i < steer_vel2eff_pid_.size(); i++) {
96+
for (size_t i = 0; i < steer_vel2eff_pid_.size(); i++) {
10197
if (!steer_vel2eff_pid_[i]->initPid()) {
10298
RCLCPP_ERROR(get_node()->get_logger(), "Failed to initialize PID for pos2vel");
10399
return controller_interface::CallbackReturn::FAILURE;
@@ -317,23 +313,27 @@ AgvChassisController::update_and_write_commands(const rclcpp::Time &time,
317313
return controller_interface::return_type::ERROR;
318314
}
319315

320-
agv_wheel_kinematics_->inverse(twist, wheels_pos_, wheels_vel_);
316+
std::array<double, 4> curr_wheels_pos = {
317+
state_interfaces_[1].get_value(),
318+
state_interfaces_[2].get_value(),
319+
state_interfaces_[3].get_value(),
320+
state_interfaces_[4].get_value()
321+
};
322+
const auto [wheels_pos, wheels_vel] = agv_wheel_kinematics_->inverse(twist, curr_wheels_pos);
321323

322-
for(int i = 0; i < params_.agv_pos_joints.size(); i++){ // FIXME: Magical Number
323-
double steer_pos_ref = wheels_pos_[static_cast<Eigen::Index>(i)];
324+
for(size_t i = 0; i < 4; i++){
325+
double steer_pos_ref = wheels_pos[i];
324326
double steer_pos_fb = state_interfaces_[1 + i].get_value();
325-
double steer_vel_fb = state_interfaces_[1 + i + params_.agv_pos_joints.size()].get_value();
327+
double steer_vel_fb = state_interfaces_[1 + i + 4].get_value();
326328
double steer_pos_err = angles::shortest_angular_distance(steer_pos_fb, steer_pos_ref);
327329
double steer_vel_ref = steer_pos2vel_pid_[i]->computeCommand(steer_pos_err, period);
328-
steer_vel_ref = 8.0;
329330
double steer_vel_err = steer_vel_ref - steer_vel_fb;
330331
double steer_eff_cmd = steer_vel2eff_pid_[i]->computeCommand(steer_vel_err, period);
331-
command_interfaces_[i + params_.agv_vel_joints.size()].set_value(steer_eff_cmd);
332+
command_interfaces_[i + 4].set_value(steer_eff_cmd);
332333
}
333-
334-
for (size_t i = 0; i < params_.agv_pos_joints.size(); i++) {
335-
command_interfaces_[i].set_value(wheels_vel_[static_cast<Eigen::Index>(i)]);
336-
334+
335+
for (size_t i = 0; i < 4; i++) {
336+
command_interfaces_[i].set_value(wheels_vel[i]);
337337
}
338338
}
339339

decomposition/meta_chassis_controller/src/agv_wheel_kinematics.cpp

Lines changed: 21 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -13,43 +13,36 @@ namespace meta_chassis_controller {
1313
AgvWheelKinematics::AgvWheelKinematics(const double agv_wheel_center_x, const double agv_wheel_center_y, const double agv_wheel_radius) :
1414
agv_wheel_center_x_(agv_wheel_center_x), agv_wheel_center_y_(agv_wheel_center_y), agv_wheel_radius_(agv_wheel_radius) {
1515
agv_radius_ = sqrt(agv_wheel_center_x * agv_wheel_center_x + agv_wheel_center_y * agv_wheel_center_y);
16-
// init();
1716
}
1817

19-
// void AgvWheelKinematics::init() {
20-
21-
// }
18+
std::pair<double,double> AgvWheelKinematics::xy2polar(double curr_pos, double target_x, double target_y) {
19+
double target_vel = sqrt(target_x * target_x + target_y * target_y) / agv_wheel_radius_;
2220

23-
std::tuple<double,double> AgvWheelKinematics::get_output(double curr_pos, double curr_vel, double target_pos, double target_vel){
24-
if(target_vel == 0.0){
21+
// If the target velocity is zero, atan2 is meaningless, we should preserve current position
22+
if (target_vel == 0.0) {
2523
return {curr_pos, 0.0};
2624
}
2725

28-
double angle_diff = angles::shortest_angular_distance(curr_pos, target_pos);
29-
if(curr_vel > 0 && angle_diff < M_PI / 2 && angle_diff > - M_PI / 2){ // FIXME: This is not correct here
30-
return {target_pos, target_vel};
31-
}else if(curr_vel < 0 && (angle_diff > M_PI / 2 || angle_diff < - M_PI / 2)){
32-
return {target_pos, target_vel};
33-
}else{
34-
return {angles::normalize_angle(M_PI * 2 - target_pos), -target_vel};
26+
double target_angle = atan2(target_y, target_x);
27+
double angle_diff = angles::shortest_angular_distance(curr_pos, target_angle);
28+
29+
if (angle_diff < (M_PI / 2) && angle_diff > -(M_PI / 2) ) { // FIXME: This is not correct here
30+
return {target_angle, target_vel};
31+
} else {
32+
return {angles::normalize_angle(M_PI + target_angle), -target_vel};
3533
}
3634
}
3735

38-
void AgvWheelKinematics::inverse(Eigen::VectorXd twist, std::vector<double> & curr_pos, std::vector<double> & curr_vel){
36+
std::pair<std::array<double, 4>, std::array<double, 4>> AgvWheelKinematics::inverse(Eigen::VectorXd twist, const std::array<double, 4> & curr_pos) {
3937
// twist: [vx, vy, wz]
4038
// curr_pos: [left_forward, left_back, right_forward, right_back]
4139
// curr_vel: [left_forward, left_back, right_forward, right_back]
4240

43-
if ( curr_pos.size() != 4 || curr_pos.size() != 4){
44-
// RCLCPP_ERROR();
45-
// std::raise(ERROR); // Raise an error
46-
}
4741
double vx = twist[0];
4842
double vy = twist[1];
4943
double wz = twist[2];
50-
double v = sqrt(vx * vx + vy * vy) / agv_wheel_radius_;
5144
double rot_vel = wz * agv_radius_;
52-
45+
5346
double left_foward_x = vx - rot_vel;
5447
double left_foward_y = vy + rot_vel;
5548
double left_back_x = vx - rot_vel;
@@ -59,32 +52,15 @@ void AgvWheelKinematics::inverse(Eigen::VectorXd twist, std::vector<double> & cu
5952
double right_back_x = vx + rot_vel;
6053
double right_back_y = vy - rot_vel;
6154

62-
double left_forward_angle = atan2(left_foward_y, left_foward_x);
63-
double left_back_angle = atan2(left_back_y, left_back_x);
64-
double right_forward_angle = atan2(right_forward_y, right_forward_x);
65-
double right_back_angle = atan2(right_back_y, right_back_x);
66-
67-
// const auto& [curr_pos[0], curr_vel[0]] = get_output(curr_pos[0], curr_vel[0], left_forward_angle, v);
68-
// const auto& [curr_pos[1], curr_vel[1]] = get_output(curr_pos[1], curr_vel[1], left_back_angle, v);
69-
// const auto& [curr_pos[2], curr_vel[2]] = get_output(curr_pos[2], curr_vel[2], right_forward_angle, v);
70-
// const auto& [curr_pos[3], curr_vel[3]] = get_output(curr_pos[3], curr_vel[3], right_back_angle, v);
55+
const auto [left_forward_pos, left_forward_vel] = xy2polar(curr_pos[0], left_foward_x, left_foward_y);
56+
const auto [left_back_pos, left_back_vel] = xy2polar(curr_pos[1], left_back_x, left_back_y);
57+
const auto [right_forward_pos, right_forward_vel] = xy2polar(curr_pos[2], right_forward_x, right_forward_y);
58+
const auto [right_back_pos, right_back_vel] = xy2polar(curr_pos[3], right_back_x, right_back_y);
7159

72-
const auto& [left_forward_pos, left_forward_vel] = get_output(curr_pos[0], curr_vel[0], left_forward_angle, v);
73-
const auto& [left_back_pos, left_back_vel] = get_output(curr_pos[1], curr_vel[1], left_back_angle, v);
74-
const auto& [right_forward_pos, right_forward_vel] = get_output(curr_pos[2], curr_vel[2], right_forward_angle, v);
75-
const auto& [right_back_pos, right_back_vel] = get_output(curr_pos[3], curr_vel[3], right_back_angle, v);
60+
std::array<double, 4> target_pos = {left_forward_pos, left_back_pos, right_forward_pos, right_back_pos};
61+
std::array<double, 4> target_vel = {left_forward_vel, left_back_vel, right_forward_vel, right_back_vel};
7662

77-
curr_pos[0] = left_forward_pos;
78-
curr_pos[1] = left_back_pos;
79-
curr_pos[2] = right_forward_pos;
80-
curr_pos[3] = right_back_pos;
81-
curr_vel[0] = left_forward_vel;
82-
curr_vel[1] = left_back_vel;
83-
curr_vel[2] = right_forward_vel;
84-
curr_vel[3] = right_back_vel;
85-
86-
87-
88-
}
63+
return {target_pos, target_vel};
64+
}
8965

9066
} // namespace meta_chassis_controller

decomposition/meta_chassis_controller/src/omni_chassis_controller.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include <vector>
99

1010
#include "angles/angles.h"
11-
#include "controller_interface/helpers.hpp"
11+
#include <controller_interface/helpers.hpp>
1212
#include "hardware_interface/types/hardware_interface_type_values.hpp"
1313
#include "rclcpp/logging.hpp"
1414

decomposition/metav_description/urdf/sentry25/sentry.xacro

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,12 @@
3939
<ros2_control name="dji_motors" type="system">
4040
<hardware>
4141
<plugin>meta_hardware/MetaRobotDjiMotorNetwork</plugin>
42-
<param name="can_network_name">can0</param>
42+
<param name="can_network_name">can3</param>
4343
</hardware>
44-
<xacro:wheel_transmission prefix="left_forward" mechanical_reduction="20.0" vel_motor_id="3" pos_motor_id="3" pos_offset="-0.0609"/>
45-
<xacro:wheel_transmission prefix="left_back" mechanical_reduction="20.0" vel_motor_id="2" pos_motor_id = "1" pos_offset="0.1227"/>
46-
<xacro:wheel_transmission prefix="right_forward" mechanical_reduction="20.0" vel_motor_id="4" pos_motor_id = "2" pos_offset="-0.0356"/>
47-
<xacro:wheel_transmission prefix="right_back" mechanical_reduction="20.0" vel_motor_id="1" pos_motor_id = "4" pos_offset="-0.0694"/>
44+
<xacro:wheel_transmission prefix="left_forward" mechanical_reduction="20.0" vel_motor_id="3" pos_motor_id="3" pos_offset="-1.9967"/>
45+
<xacro:wheel_transmission prefix="left_back" mechanical_reduction="20.0" vel_motor_id="1" pos_motor_id = "1" pos_offset="0.6881"/>
46+
<xacro:wheel_transmission prefix="right_forward" mechanical_reduction="20.0" vel_motor_id="4" pos_motor_id = "4" pos_offset="-2.2759"/>
47+
<xacro:wheel_transmission prefix="right_back" mechanical_reduction="20.0" vel_motor_id="2" pos_motor_id = "2" pos_offset="-1.7896"/>
4848
<xacro:gimbal_transmission prefix="yaw" mechanical_reduction="1.0" offset="0.25"
4949
motor_id="5" />
5050
<xacro:gimbal_transmission prefix="pitch" mechanical_reduction="-1.0" offset="0.0"
@@ -77,4 +77,4 @@
7777
<xacro:if value="$(arg is_simulation)">
7878
<xacro:include filename="$(find metav_description)/urdf/sentry/sentry.gazebo.xacro" />
7979
</xacro:if>
80-
</robot>
80+
</robot>

meta_bringup/config/sentry25.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,9 @@ shoot_controller:
188188
bullet_loader_joint_vel2eff:
189189
{ p: 1.0e-1, i: 5.0e-1, d: 0.0e-2, i_clamp_max: 1.0, i_clamp_min: -1.0, antiwindup: true }
190190

191-
dbus_control:
191+
wfly_control:
192192
ros__parameters:
193-
dbus_port: "dbus_control"
193+
sbus_port: "/dev/wfly_receiver"
194194

195195
dbus_vehicle:
196196
ros__parameters:

meta_bringup/launch/sentry25.launch.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -101,23 +101,23 @@ def generate_launch_description():
101101
# load_controller('shoot_controller')
102102
]
103103

104-
dbus_control = Node(
105-
package='dbus_control',
106-
executable='dbus_control_node',
107-
name='dbus_control',
104+
wfly_control = Node(
105+
package='wfly_control',
106+
executable='wfly_control_node',
107+
name='wfly_control',
108108
parameters=[robot_config],
109109
output='both',
110110
emulate_tty=True
111111
)
112112

113-
# dbus_vehicle = Node(
114-
# package='dbus_vehicle',
115-
# executable='dbus_vehicle_node',
116-
# name='dbus_vehicle',
117-
# output='both',
118-
# parameters=[robot_config],
119-
# emulate_tty=True
120-
# )
113+
dbus_vehicle = Node(
114+
package='dbus_vehicle',
115+
executable='dbus_vehicle_node',
116+
name='dbus_vehicle',
117+
output='both',
118+
parameters=[robot_config],
119+
emulate_tty=True
120+
)
121121

122122
# ahrs_launch = IncludeLaunchDescription(
123123
# PythonLaunchDescriptionSource(
@@ -141,7 +141,7 @@ def generate_launch_description():
141141
# Load controllers
142142
*register_sequential_loading(load_joint_state_broadcaster, *load_controllers),
143143
# dbus_container,
144-
# dbus_control,
145-
# dbus_vehicle,
144+
wfly_control,
145+
dbus_vehicle,
146146
# ahrs_launch,
147147
])

0 commit comments

Comments
 (0)