rm_controllers
Loading...
Searching...
No Matches
series_legged_vmc_controller.h
Go to the documentation of this file.
1//
2// Created by wiselook on 7/27/25.
3//
4
5#pragma once
6
7#include <controller_interface/multi_interface_controller.h>
8#include <dynamic_reconfigure/server.h>
9#include <effort_controllers/joint_position_controller.h>
10#include <hardware_interface/joint_command_interface.h>
11#include <realtime_tools/realtime_publisher.h>
12#include <rm_common/hardware_interface/robot_state_interface.h>
13#include <rm_common/ros_utilities.h>
14#include <std_msgs/Float64MultiArray.h>
15#include <rm_common/DebugDataPublisher.h>
16
18
19#include <utility>
20
22{
23class VMCController : public controller_interface::MultiInterfaceController<hardware_interface::EffortJointInterface,
24 rm_control::RobotStateInterface>
25{
26public:
27 VMCController() = default;
28 bool init(hardware_interface::RobotHW* robot_hw, ros::NodeHandle& root_nh, ros::NodeHandle& controller_nh) override;
29 void update(const ros::Time& time, const ros::Duration& period) override;
30 void starting(const ros::Time& /*time*/) override;
31
32private:
33 void commandLegLengthCB(const std_msgs::Float64ConstPtr& msg)
34 {
35 lengthCmd_ = msg->data;
36 }
37
38 void commandLegAngleCB(const std_msgs::Float64ConstPtr& msg)
39 {
40 angleCmd_ = msg->data;
41 }
42
43 static inline double get_LM(const double& l)
44 {
45 return 0.218f * l + 0.075f;
46 };
47
48 static inline double get_theta_leg_offset(const double& l)
49 {
50 return M_PI_4 / 2;
51 }
52
53 const double g_{ 9.81 };
54
55 double f_spring_force(double L0);
56 double s2_{}, s3_{}, alpha_s_{};
57
58 bool leg_gravity_compensation_debug_{ false };
59 double leg_mass_{ 1.5 };
60
61 hardware_interface::JointHandle jointThigh_, jointKnee_;
62 control_toolbox::Pid pidLength_, pidAngle_;
63
64 double vmcBiasAngle_, spring_force_;
65 double lengthCmd_, angleCmd_;
66
67 std::unique_ptr<VMC> vmcPtr_;
68
69 ros::Publisher statePublisher_, jointCmdStatePublisher_;
70 ros::Subscriber cmdLegLengthSubscriber_, cmdLegAngleSubscriber_;
71 std::shared_ptr<DebugDataPublisher> debugPub_;
72};
73
74} // namespace rm_chassis_controllers
Definition series_legged_vmc_controller.h:25
bool init(hardware_interface::RobotHW *robot_hw, ros::NodeHandle &root_nh, ros::NodeHandle &controller_nh) override
Definition series_legged_vmc_controller.cpp:14
void starting(const ros::Time &) override
Definition series_legged_vmc_controller.cpp:75
void update(const ros::Time &time, const ros::Duration &period) override
Definition series_legged_vmc_controller.cpp:81
Definition active_suspension.h:16