Skip to content

Commit c0d5ff4

Browse files
committed
3DOF vel/accel ctrl for holonomic 4w-mecanum drive robots
- linearised 2nd order system with non-linear wheel-speeds - symmetric parallel wheels with 45deg free rollers - support for selecting 1st order control - msg format for wheel speeds - basic handler for robomaster interfaces
1 parent 11d7a09 commit c0d5ff4

File tree

12 files changed

+243
-78
lines changed

12 files changed

+243
-78
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
cmake_minimum_required(VERSION 3.8)
2+
project(robomaster_handler)
3+
4+
## Compile as C++11, supported in ROS Kinetic and newer
5+
add_compile_options(-std=c++14)
6+
7+
# find dependencies
8+
find_package(ament_cmake REQUIRED)
9+
find_package(rclcpp REQUIRED)
10+
find_package(std_msgs REQUIRED)
11+
find_package(freyja_msgs REQUIRED)
12+
find_package(robomaster_interfaces REQUIRED)
13+
14+
find_package(rosidl_default_generators REQUIRED)
15+
16+
17+
# handler node
18+
add_executable( s1_interface src/s1_handler.cpp )
19+
20+
ament_target_dependencies( s1_interface
21+
rclcpp
22+
std_msgs
23+
freyja_msgs
24+
robomaster_interfaces
25+
)
26+
27+
install(TARGETS
28+
s1_interface
29+
DESTINATION lib/${PROJECT_NAME})
30+
31+
32+
ament_package()
33+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0"?>
2+
<package format="3">
3+
<name>robomaster_handler</name>
4+
<version>2.0.0</version>
5+
<description>Freyja's robomaster translation package</description>
6+
<maintainer email="ashankar@cse.unl.edu">aj</maintainer>
7+
<license>GPLv3</license>
8+
9+
<buildtool_depend>ament_cmake</buildtool_depend>
10+
11+
<depend>rclcpp</depend>
12+
<depend>freyja_msgs</depend>
13+
<depend>std_msgs</depend>
14+
<depend>robomaster_interfaces</depend>
15+
16+
17+
<export>
18+
<build_type>ament_cmake</build_type>
19+
</export>
20+
</package>
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#include "rclcpp/rclcpp.hpp"
2+
3+
#include "robomaster_interfaces/msg/wheel_speed.hpp"
4+
#include <freyja_msgs/msg/wheel_command.hpp>
5+
6+
typedef freyja_msgs::msg::WheelCommand WheelCommand; // rad/s from controller
7+
typedef robomaster_interfaces::msg::WheelSpeed WheelSpeed; // rpm or normalised to vehicle
8+
9+
using std::placeholders::_1;
10+
11+
class S1Handler : public rclcpp::Node
12+
{
13+
WheelSpeed target_wheel_rpm_;
14+
15+
public:
16+
S1Handler();
17+
18+
rclcpp::Subscription<WheelCommand>::SharedPtr speed_cmd_sub_;
19+
void wheelSpeedCallback( const WheelCommand::ConstSharedPtr );
20+
21+
rclcpp::Publisher<WheelSpeed>::SharedPtr speed_rpm_pub_;
22+
23+
};
24+
25+
S1Handler::S1Handler() : rclcpp::Node( "s1_handler" )
26+
{
27+
// associate callback for controller's commands
28+
speed_cmd_sub_ = create_subscription<WheelCommand> ( "controller_command", 1,
29+
std::bind(&S1Handler::wheelSpeedCallback, this, _1) );
30+
31+
// declare publisher for sending out RPM commands
32+
speed_rpm_pub_ = create_publisher<WheelSpeed> ( "target_rpm", 1 );
33+
}
34+
35+
void S1Handler::wheelSpeedCallback( const WheelCommand::ConstSharedPtr msg )
36+
{
37+
/* The controller outputs target wheel speeds in rad/s. We must convert them into
38+
RPMs in the range [-1000, 1000] (int16_t) for DJI
39+
*/
40+
target_wheel_rpm_.fl = std::round( msg -> w1 );
41+
target_wheel_rpm_.fr = std::round( msg -> w2 );
42+
target_wheel_rpm_.rr = std::round( msg -> w3 );
43+
target_wheel_rpm_.rl = std::round( msg -> w4 );
44+
45+
speed_rpm_pub_ -> publish( target_wheel_rpm_ );
46+
}
47+
48+
49+
int main( int argc, char** argv )
50+
{
51+
rclcpp::init( argc, argv );
52+
rclcpp::spin( std::make_shared<S1Handler>() );
53+
rclcpp::shutdown();
54+
return 0;
55+
}

freyja_msgs/CMakeLists.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ add_compile_options(-std=c++14)
66

77
# find dependencies
88
find_package(ament_cmake REQUIRED)
9+
find_package(std_msgs REQUIRED)
10+
find_package(geometry_msgs REQUIRED)
11+
find_package(builtin_interfaces REQUIRED)
912

1013
find_package(rosidl_default_generators REQUIRED)
1114

@@ -19,9 +22,18 @@ rosidl_generate_interfaces(${PROJECT_NAME}
1922
"msg/trajectory_provider/WaypointTarget.msg"
2023
"msg/lqr_ctrl/CtrlCommand.msg"
2124
"msg/lqr_ctrl/ControllerDebug.msg"
25+
"msg/lqr_ctrl/WheelCommand.msg"
2226
"msg/state_manager/CurrentState.msg"
2327
"msg/state_manager/CurrentStateBiasEst.msg"
28+
DEPENDENCIES std_msgs geometry_msgs builtin_interfaces
2429
)
2530

31+
# install(DIRECTORY include/${PROJECT_NAME}/
32+
# DESTINATION include/${PROJECT_NAME}
33+
# )
34+
35+
ament_export_dependencies(rosidl_default_runtime)
36+
37+
2638
ament_package()
2739

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Control commands for the wheel speed controller.
2+
3+
# ctrl_mode is:
4+
# unused
5+
float64 w1
6+
float64 w2
7+
float64 w3
8+
float64 w4
9+
uint8 ctrl_mode
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Control commands (rad/s) for the wheel speed controller.
2+
## Wheel numbering is clockwise from front-left.
3+
4+
# ctrl_mode is:
5+
# unused
6+
float64 w1
7+
float64 w2
8+
float64 w3
9+
float64 w4
10+
uint8 ctrl_mode

freyja_msgs/package.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
<license>GPLv3</license>
88

99
<buildtool_depend>ament_cmake</buildtool_depend>
10+
11+
<depend>std_msgs</depend>
12+
<depend>geometry_msgs</depend>
13+
<depend>builtin_interfaces</depend>
1014

1115
<build_depend>rosidl_default_generators</build_depend>
1216
<exec_depend>rosidl_default_runtime</exec_depend>

lqg_controller/include/lqr_control_bias.h

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#include "std_msgs/msg/float32.hpp"
2323

2424
#include "freyja_msgs/msg/current_state.hpp"
25-
#include "freyja_msgs/msg/ctrl_command.hpp"
25+
#include "freyja_msgs/msg/wheel_command.hpp"
2626
#include <freyja_msgs/msg/controller_debug.hpp>
2727
#include <freyja_msgs/msg/reference_state.hpp>
2828

@@ -33,7 +33,7 @@
3333
typedef freyja_msgs::msg::ReferenceState TrajRef;
3434
typedef freyja_msgs::msg::CurrentState CurrentState;
3535
typedef std_srvs::srv::SetBool BoolServ;
36-
typedef freyja_msgs::msg::CtrlCommand RPYT_Command;
36+
typedef freyja_msgs::msg::WheelCommand Wheel_Command;
3737
typedef freyja_msgs::msg::ControllerDebug CTRL_Debug;
3838

3939
typedef Eigen::Matrix<double, 6, 1> PosVelNED;
@@ -45,11 +45,11 @@ using std::placeholders::_2;
4545
class LQRController : public rclcpp::Node
4646
{
4747
CurrentState state_vector_;
48-
Eigen::Matrix<double, 7, 1> reduced_state_;
48+
Eigen::Matrix<double, 6, 1> reduced_state_;
4949

5050
/* Reference state vector */
51-
Eigen::Matrix<double, 7, 1> reference_state_;
52-
Eigen::Matrix<double, 4, 1> reference_ff_;
51+
Eigen::Matrix<double, 6, 1> reference_state_;
52+
Eigen::Matrix<double, 3, 1> reference_ff_;
5353
bool enable_flatness_ff_;
5454

5555
/* Rate of execution for LQR's feedback */
@@ -58,8 +58,11 @@ class LQRController : public rclcpp::Node
5858
/* System matrices */
5959
Eigen::MatrixXf sys_A_, sys_B_;
6060
Eigen::MatrixXf lqr_Q_, lqr_R_;
61-
Eigen::Matrix<double, 4, 7> lqr_K_;
61+
Eigen::Matrix<double, 3, 6> lqr_K_;
62+
Eigen::Matrix<double, 4, 3> wheel_geometry_matrix_;
63+
double wheel_rad_;
6264
bool use_stricter_gains_;
65+
std::string controller_type_;
6366

6467
/* Vehicle properties */
6568
float total_mass_;
@@ -97,7 +100,7 @@ class LQRController : public rclcpp::Node
97100
void biasEnableServer( const BoolServ::Request::SharedPtr,
98101
const BoolServ::Response::SharedPtr );
99102

100-
rclcpp::Publisher<RPYT_Command>::SharedPtr atti_cmd_pub_;
103+
rclcpp::Publisher<Wheel_Command>::SharedPtr wheel_cmd_pub_;
101104
rclcpp::Publisher<CTRL_Debug>::SharedPtr controller_debug_pub_;
102105

103106
rclcpp::TimerBase::SharedPtr controller_timer_;
@@ -110,6 +113,6 @@ class LQRController : public rclcpp::Node
110113
static constexpr inline double calcYawError( const double&, const double& ) __attribute__((always_inline));
111114

112115
/* estimate actual mass in flight */
113-
void estimateMass( const Eigen::Matrix<double, 4, 1> &, rclcpp::Time & );
116+
void estimateMass( const double &, rclcpp::Time & );
114117
rclcpp::Publisher<std_msgs::msg::Float32>::SharedPtr est_mass_pub_;
115118
};

lqg_controller/src/bias_estimator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ BiasEstimator::BiasEstimator() : Node( ROS_NODE_NAME )
2323

2424
/* Used for debug and such */
2525
bias_pub_ = create_publisher <EstimatedState>
26-
( "/bias_estimates", 1 );
26+
( "bias_estimates", 1 );
2727

2828
/* Parameters for thread */
2929
get_parameter( "estimator_rate", estimator_rate_ );

0 commit comments

Comments
 (0)