1#ifndef WBC_ROS_BIPED_CONTROLLER_HPP
2#define WBC_ROS_BIPED_CONTROLLER_HPP
4#include <rclcpp_lifecycle/lifecycle_node.hpp>
6#include <realtime_tools/realtime_buffer.hpp>
7#include <realtime_tools/realtime_publisher.hpp>
8#include <wbc_msgs/msg/wbc_timing_stats.hpp>
9#include <std_msgs/msg/float64_multi_array.hpp>
10#include <std_msgs/msg/float64.hpp>
12#include <wbc/core/RobotModel.hpp>
13#include <wbc/core/Scene.hpp>
14#include <wbc/core/QPSolver.hpp>
15#include <wbc/tools/JointIntegrator.hpp>
16#include <wbc/core/QuadraticProgram.hpp>
17#include <wbc/controllers/CartesianPosPDController.hpp>
18#include <wbc/controllers/JointPosPDController.hpp>
19#include <wbc/tasks/SpatialAccelerationTask.hpp>
20#include <wbc/tasks/JointAccelerationTask.hpp>
21#include <wbc/tasks/ContactForceTask.hpp>
24#include "biped_controller_parameters.hpp"
101 using JointCommandMsg = robot_control_msgs::msg::JointCommand;
102 using JointCommandMsgPtr = robot_control_msgs::msg::JointCommand::SharedPtr;
103 using JointCommandPublisher = rclcpp::Publisher<JointCommandMsg>;
104 using RTJointCommandPublisher = realtime_tools::RealtimePublisher<JointCommandMsg>;
105 using JointCommandSubscription = rclcpp::Subscription<JointCommandMsg>::SharedPtr;
106 using RTJointCommandBuffer = realtime_tools::RealtimeBuffer<JointCommandMsgPtr>;
108 using JointStateMsg = robot_control_msgs::msg::JointState;
109 using JointStateMsgPtr = std::shared_ptr<JointStateMsg>;
110 using JointStateSubscription = rclcpp::Subscription<JointStateMsg>::SharedPtr;
111 using RTJointStateBuffer = realtime_tools::RealtimeBuffer<JointStateMsgPtr>;
113 using RobotStateMsg = robot_control_msgs::msg::RobotState;
114 using RobotStateMsgPtr = std::shared_ptr<RobotStateMsg>;
115 using RobotStateSubscription = rclcpp::Subscription<RobotStateMsg>::SharedPtr;
116 using RTRobotStateBuffer = realtime_tools::RealtimeBuffer<RobotStateMsgPtr>;
118 using ContactsMsg = robot_control_msgs::msg::Contacts;
119 using ContactsMsgPtr = std::shared_ptr<ContactsMsg>;
120 using ContactsSubscription = rclcpp::Subscription<ContactsMsg>::SharedPtr;
121 using RTContactsBuffer = realtime_tools::RealtimeBuffer<ContactsMsgPtr>;
123 using DoubleArrayMsg = std_msgs::msg::Float64MultiArray;
124 using DoubleArrayMsgPtr = std::shared_ptr<DoubleArrayMsg>;
125 using DoubleArraySubscription = rclcpp::Subscription<DoubleArrayMsg>::SharedPtr;
126 using RTDoubleArrayBuffer = realtime_tools::RealtimeBuffer<DoubleArrayMsgPtr>;
128 using TimingStatsMsg = wbc_msgs::msg::WbcTimingStats;
129 using TimingStatsPublisher = rclcpp::Publisher<TimingStatsMsg>;
130 using RTTimingStatsPublisher = realtime_tools::RealtimePublisher<TimingStatsMsg>;
132 using RigidBodyStateMsg = robot_control_msgs::msg::RigidBodyState;
133 using RigidBodyStateMsgPtr = std::shared_ptr<RigidBodyStateMsg>;
134 using RigidBodyStateSubscription = rclcpp::Subscription<RigidBodyStateMsg>::SharedPtr;
135 using RTRigidBodyStateBuffer = realtime_tools::RealtimeBuffer<RigidBodyStateMsgPtr>;
137 using RigidBodyStatePublisher = rclcpp::Publisher<RigidBodyStateMsg>;
138 using RTRigidBodyStatePublisher = realtime_tools::RealtimePublisher<RigidBodyStateMsg>;
144 virtual void update(wbc::RobotModelPtr
robot_model) = 0;
145 virtual void reset() = 0;
147 using TaskInterfacePtr = std::shared_ptr<TaskInterface>;
149 class RbsTaskInterface :
public TaskInterface{
150 RigidBodyStateSubscription setpoint_subscriber;
151 RTRigidBodyStateBuffer rt_setpoint_buffer;
152 RigidBodyStateMsgPtr setpoint_msg;
154 RigidBodyStatePublisher::SharedPtr feedback_publisher;
155 std::unique_ptr<RTRigidBodyStatePublisher> rt_feedback_publisher;
158 RbsTaskInterface(std::string task_name, std::shared_ptr<rclcpp_lifecycle::LifecycleNode> node) :
161 setpoint_subscriber = node->create_subscription<RigidBodyStateMsg>(
"~/" + task_name +
"/setpoint", rclcpp::SystemDefaultsQoS(),
162 bind(&RbsTaskInterface::setpoint_callback,
this, std::placeholders::_1));
163 feedback_publisher = node->create_publisher<RigidBodyStateMsg>(
"~/" + task_name +
"/feedback", rclcpp::SystemDefaultsQoS());
164 rt_feedback_publisher = std::make_unique<RTRigidBodyStatePublisher>(feedback_publisher);
166 void setpoint_callback(
const RigidBodyStateMsgPtr msg){
167 rt_setpoint_buffer.writeFromNonRT(msg);
170 virtual void update(wbc::RobotModelPtr
robot_model){
173 setpoint_msg = *rt_setpoint_buffer.readFromRT();
174 if(setpoint_msg.get()){
175 fromROS(*setpoint_msg, setpoint);
176 wbc::types::SpatialAcceleration ctrl_out = controller.update(setpoint.pose,
178 setpoint.acceleration,
181 task->setReference(ctrl_out);
183 rt_feedback_publisher->lock();
187 rt_feedback_publisher->msg_);
188 rt_feedback_publisher->unlockAndPublish();
191 virtual void reset(){
195 wbc::types::RigidBodyState setpoint;
196 wbc::CartesianPosPDController controller;
197 wbc::SpatialAccelerationTaskPtr task;
199 using RbsTaskInterfacePtr = std::shared_ptr<RbsTaskInterface>;
201 class JointPositionTaskInterface :
public TaskInterface{
202 JointCommandSubscription setpoint_subscriber;
203 RTJointCommandBuffer rt_setpoint_buffer;
204 JointCommandMsgPtr setpoint_msg;
206 JointPositionTaskInterface(std::string task_name, std::shared_ptr<rclcpp_lifecycle::LifecycleNode> node) :
209 setpoint_subscriber = node->create_subscription<JointCommandMsg>(
"~/" + task_name +
"/setpoint", rclcpp::SystemDefaultsQoS(),
210 bind(&JointPositionTaskInterface::setpoint_callback,
this, std::placeholders::_1));
213 void setpoint_callback(
const JointCommandMsgPtr msg){
214 rt_setpoint_buffer.writeFromNonRT(msg);
217 virtual void update(wbc::RobotModelPtr
robot_model){
219 for(
auto n : task->jointNames())
224 setpoint_msg = *rt_setpoint_buffer.readFromRT();
225 if(setpoint_msg.get()){
227 Eigen::VectorXd ctrl_out = controller->update(setpoint.position,
229 setpoint.acceleration,
232 task->setReference(ctrl_out);
235 virtual void reset(){
239 wbc::types::JointCommand setpoint;
240 wbc::JointPosPDControllerPtr controller;
241 wbc::JointAccelerationTaskPtr task;
244 using JointPositionTaskInterfacePtr = std::shared_ptr<JointPositionTaskInterface>;
250 virtual CallbackReturn
on_configure(
const rclcpp_lifecycle::State & previous_state)
override;
251 virtual CallbackReturn
on_activate(
const rclcpp_lifecycle::State & previous_state)
override;
252 virtual CallbackReturn
on_deactivate(
const rclcpp_lifecycle::State & previous_state)
override;
253 virtual CallbackReturn
on_cleanup(
const rclcpp_lifecycle::State & previous_state)
override;
254 virtual CallbackReturn
on_error(
const rclcpp_lifecycle::State & previous_state)
override;
255 virtual CallbackReturn
on_shutdown(
const rclcpp_lifecycle::State & previous_state)
override;
284 wbc::HierarchicalQP
qp;
wbc::ContactForceTaskPtr force_l_task
Definition biped_controller.hpp:271
virtual CallbackReturn on_error(const rclcpp_lifecycle::State &previous_state) override
Definition biped_controller.cpp:374
std::vector< double > d_gain
Definition biped_controller.hpp:292
wbc::JointIntegrator joint_integrator
Definition biped_controller.hpp:285
std::shared_ptr< biped_controller::ParamListener > param_listener
Definition biped_controller.hpp:321
DoubleArrayMsgPtr joint_weight_msg
Definition biped_controller.hpp:304
TimingStatsPublisher::SharedPtr timing_stats_publisher
Definition biped_controller.hpp:299
wbc::types::JointState joint_state
Definition biped_controller.hpp:277
virtual CallbackReturn on_activate(const rclcpp_lifecycle::State &previous_state) override
Definition biped_controller.cpp:331
wbc::types::RigidBodyState floating_base_state
Definition biped_controller.hpp:278
std::unique_ptr< RTTimingStatsPublisher > rt_timing_stats_publisher
Definition biped_controller.hpp:300
virtual CallbackReturn on_shutdown(const rclcpp_lifecycle::State &previous_state) override
Definition biped_controller.cpp:378
virtual CallbackReturn on_deactivate(const rclcpp_lifecycle::State &previous_state) override
Definition biped_controller.cpp:343
wbc::ScenePtr scene
Definition biped_controller.hpp:274
void updateController()
Definition biped_controller.cpp:263
BipedController(const rclcpp::NodeOptions &options)
Definition biped_controller.cpp:11
wbc::types::JointCommand solver_output
Definition biped_controller.hpp:283
JointCommandMsg solver_output_msg
Definition biped_controller.hpp:294
std::vector< wbc::types::Contact > contacts
Definition biped_controller.hpp:279
virtual CallbackReturn on_configure(const rclcpp_lifecycle::State &previous_state) override
Definition biped_controller.cpp:35
std::vector< double > d_gain_stance
Definition biped_controller.hpp:288
wbc::HierarchicalQP qp
Definition biped_controller.hpp:284
void contacts_callback(const ContactsMsgPtr msg)
Definition biped_controller.cpp:31
wbc::QPSolverPtr solver
Definition biped_controller.hpp:276
ContactsMsgPtr contacts_msg
Definition biped_controller.hpp:312
std::vector< double > p_gain
Definition biped_controller.hpp:291
JointPositionTaskInterfacePtr joint_pos_iface
Definition biped_controller.hpp:268
RbsTaskInterfacePtr foot_r_iface
Definition biped_controller.hpp:267
std::vector< double > p_gain_swing
Definition biped_controller.hpp:289
std::vector< double > d_gain_swing
Definition biped_controller.hpp:290
RTJointStateBuffer rt_joint_state_buffer
Definition biped_controller.hpp:315
bool integrate_from_current_state
Definition biped_controller.hpp:286
RTDoubleArrayBuffer rt_joint_weight_buffer
Definition biped_controller.hpp:303
bool has_joint_state
Definition biped_controller.hpp:281
wbc::RobotModelPtr robot_model
Definition biped_controller.hpp:275
ContactsSubscription contacts_subscriber
Definition biped_controller.hpp:310
DoubleArraySubscription joint_weight_subscriber
Definition biped_controller.hpp:302
RTRobotStateBuffer rt_robot_state_buffer
Definition biped_controller.hpp:307
JointCommandPublisher::SharedPtr solver_output_publisher
Definition biped_controller.hpp:295
void joint_weight_callback(const DoubleArrayMsgPtr msg)
Definition biped_controller.cpp:17
int update_rate
Definition biped_controller.hpp:282
~BipedController()
Definition biped_controller.hpp:248
TimingStatsMsg timing_stats
Definition biped_controller.hpp:298
std::vector< double > p_gain_stance
Definition biped_controller.hpp:287
std::vector< TaskInterfacePtr > task_interfaces
Definition biped_controller.hpp:269
rclcpp::TimerBase::SharedPtr timer
Definition biped_controller.hpp:319
std::vector< int > joint_idx_map_right_leg
Definition biped_controller.hpp:326
biped_controller::Params params
Definition biped_controller.hpp:322
RbsTaskInterfacePtr body_task_iface
Definition biped_controller.hpp:265
wbc::types::Wrench contact_force_r
Definition biped_controller.hpp:280
bool has_robot_state
Definition biped_controller.hpp:281
void joint_state_callback(const JointStateMsgPtr msg)
Definition biped_controller.cpp:26
std::vector< int > joint_idx_map_left_leg
Definition biped_controller.hpp:325
JointStateMsgPtr joint_state_msg
Definition biped_controller.hpp:316
void handleContacts(const ContactsMsgPtr msg)
Definition biped_controller.cpp:214
rclcpp::Time stamp
Definition biped_controller.hpp:318
RTContactsBuffer rt_contacts_buffer
Definition biped_controller.hpp:311
wbc::ContactForceTaskPtr force_r_task
Definition biped_controller.hpp:272
RbsTaskInterfacePtr foot_l_iface
Definition biped_controller.hpp:266
wbc::types::Wrench contact_force_l
Definition biped_controller.hpp:280
std::vector< int > joint_idx_map
Definition biped_controller.hpp:324
RobotStateSubscription robot_state_subscriber
Definition biped_controller.hpp:306
void robot_state_callback(const RobotStateMsgPtr msg)
Definition biped_controller.cpp:21
RobotStateMsgPtr robot_state_msg
Definition biped_controller.hpp:308
JointStateSubscription joint_state_subscriber
Definition biped_controller.hpp:314
std::unique_ptr< RTJointCommandPublisher > rt_solver_output_publisher
Definition biped_controller.hpp:296
virtual CallbackReturn on_cleanup(const rclcpp_lifecycle::State &previous_state) override
Definition biped_controller.cpp:348
void toROS(const wbc::types::RigidBodyState &in, robot_control_msgs::msg::RigidBodyState &out)
Definition conversions.cpp:78
void fromROS(const geometry_msgs::msg::Pose &in, wbc::types::Pose &out)
Definition conversions.cpp:7
Definition biped_controller.cpp:9