wbc_ros
biped_controller.hpp
Go to the documentation of this file.
1#ifndef WBC_ROS_BIPED_CONTROLLER_HPP
2#define WBC_ROS_BIPED_CONTROLLER_HPP
3
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>
11
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>
22
23// auto-generated by generate_parameter_library
24#include "biped_controller_parameters.hpp"
25
26namespace wbc_ros{
27
99 class BipedController : public rclcpp_lifecycle::LifecycleNode{
100
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>;
107
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>;
112
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>;
117
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>;
122
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>;
127
128 using TimingStatsMsg = wbc_msgs::msg::WbcTimingStats;
129 using TimingStatsPublisher = rclcpp::Publisher<TimingStatsMsg>;
130 using RTTimingStatsPublisher = realtime_tools::RealtimePublisher<TimingStatsMsg>;
131
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>;
136
137 using RigidBodyStatePublisher = rclcpp::Publisher<RigidBodyStateMsg>;
138 using RTRigidBodyStatePublisher = realtime_tools::RealtimePublisher<RigidBodyStateMsg>;
139
140 class TaskInterface{
141 public:
142 TaskInterface(){
143 }
144 virtual void update(wbc::RobotModelPtr robot_model) = 0;
145 virtual void reset() = 0;
146 };
147 using TaskInterfacePtr = std::shared_ptr<TaskInterface>;
148
149 class RbsTaskInterface : public TaskInterface{
150 RigidBodyStateSubscription setpoint_subscriber;
151 RTRigidBodyStateBuffer rt_setpoint_buffer;
152 RigidBodyStateMsgPtr setpoint_msg;
153
154 RigidBodyStatePublisher::SharedPtr feedback_publisher;
155 std::unique_ptr<RTRigidBodyStatePublisher> rt_feedback_publisher;
156
157 public:
158 RbsTaskInterface(std::string task_name, std::shared_ptr<rclcpp_lifecycle::LifecycleNode> node) :
159 TaskInterface(),
160 has_setpoint(false){
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);
165 }
166 void setpoint_callback(const RigidBodyStateMsgPtr msg){
167 rt_setpoint_buffer.writeFromNonRT(msg);
168 has_setpoint = true;
169 }
170 virtual void update(wbc::RobotModelPtr robot_model){
171 if(!has_setpoint)
172 return;
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,
177 setpoint.twist,
178 setpoint.acceleration,
179 robot_model->pose(task->tipFrame()),
180 robot_model->twist(task->tipFrame()));
181 task->setReference(ctrl_out);
182 }
183 rt_feedback_publisher->lock();
184 toROS(robot_model->pose(task->tipFrame()),
185 robot_model->twist(task->tipFrame()),
186 robot_model->acceleration(task->tipFrame()),
187 rt_feedback_publisher->msg_);
188 rt_feedback_publisher->unlockAndPublish();
189
190 }
191 virtual void reset(){
192 task->reset();
193 }
194 bool has_setpoint;
195 wbc::types::RigidBodyState setpoint;
196 wbc::CartesianPosPDController controller;
197 wbc::SpatialAccelerationTaskPtr task;
198 };
199 using RbsTaskInterfacePtr = std::shared_ptr<RbsTaskInterface>;
200
201 class JointPositionTaskInterface : public TaskInterface{
202 JointCommandSubscription setpoint_subscriber;
203 RTJointCommandBuffer rt_setpoint_buffer;
204 JointCommandMsgPtr setpoint_msg;
205 public:
206 JointPositionTaskInterface(std::string task_name, std::shared_ptr<rclcpp_lifecycle::LifecycleNode> node) :
207 TaskInterface(),
208 has_setpoint(false){
209 setpoint_subscriber = node->create_subscription<JointCommandMsg>("~/" + task_name + "/setpoint", rclcpp::SystemDefaultsQoS(),
210 bind(&JointPositionTaskInterface::setpoint_callback, this, std::placeholders::_1));
211
212 }
213 void setpoint_callback(const JointCommandMsgPtr msg){
214 rt_setpoint_buffer.writeFromNonRT(msg);
215 has_setpoint = true;
216 }
217 virtual void update(wbc::RobotModelPtr robot_model){
218 if(joint_idx_map.empty()){
219 for(auto n : task->jointNames())
220 joint_idx_map.push_back(robot_model->jointIndex(n));
221 }
222 if(!has_setpoint)
223 return;
224 setpoint_msg = *rt_setpoint_buffer.readFromRT();
225 if(setpoint_msg.get()){
226 fromROS(*setpoint_msg, joint_idx_map, setpoint);
227 Eigen::VectorXd ctrl_out = controller->update(setpoint.position,
228 setpoint.velocity,
229 setpoint.acceleration,
230 robot_model->jointState().position,
231 robot_model->jointState().velocity);
232 task->setReference(ctrl_out);
233 }
234 }
235 virtual void reset(){
236 task->reset();
237 }
238 bool has_setpoint;
239 wbc::types::JointCommand setpoint;
240 wbc::JointPosPDControllerPtr controller;
241 wbc::JointAccelerationTaskPtr task;
242 std::vector<int> joint_idx_map;
243 };
244 using JointPositionTaskInterfacePtr = std::shared_ptr<JointPositionTaskInterface>;
245
246 public:
247 BipedController(const rclcpp::NodeOptions & options);
249
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;
256
257 void updateController();
258 void handleContacts(const ContactsMsgPtr msg);
259 void joint_weight_callback(const DoubleArrayMsgPtr msg);
260 void robot_state_callback(const RobotStateMsgPtr msg);
261 void joint_state_callback(const JointStateMsgPtr msg);
262 void contacts_callback(const ContactsMsgPtr msg);
263
264 protected:
265 RbsTaskInterfacePtr body_task_iface;
266 RbsTaskInterfacePtr foot_l_iface;
267 RbsTaskInterfacePtr foot_r_iface;
268 JointPositionTaskInterfacePtr joint_pos_iface;
269 std::vector<TaskInterfacePtr> task_interfaces;
270
271 wbc::ContactForceTaskPtr force_l_task;
272 wbc::ContactForceTaskPtr force_r_task;
273
274 wbc::ScenePtr scene;
275 wbc::RobotModelPtr robot_model;
276 wbc::QPSolverPtr solver;
277 wbc::types::JointState joint_state;
278 wbc::types::RigidBodyState floating_base_state;
279 std::vector<wbc::types::Contact> contacts;
280 wbc::types::Wrench contact_force_l, contact_force_r;
283 wbc::types::JointCommand solver_output;
284 wbc::HierarchicalQP qp;
285 wbc::JointIntegrator joint_integrator;
287 std::vector<double> p_gain_stance;
288 std::vector<double> d_gain_stance;
289 std::vector<double> p_gain_swing;
290 std::vector<double> d_gain_swing;
291 std::vector<double> p_gain;
292 std::vector<double> d_gain;
293
294 JointCommandMsg solver_output_msg;
295 JointCommandPublisher::SharedPtr solver_output_publisher;
296 std::unique_ptr<RTJointCommandPublisher> rt_solver_output_publisher;
297
298 TimingStatsMsg timing_stats;
299 TimingStatsPublisher::SharedPtr timing_stats_publisher;
300 std::unique_ptr<RTTimingStatsPublisher> rt_timing_stats_publisher;
301
302 DoubleArraySubscription joint_weight_subscriber;
303 RTDoubleArrayBuffer rt_joint_weight_buffer;
304 DoubleArrayMsgPtr joint_weight_msg;
305
306 RobotStateSubscription robot_state_subscriber;
307 RTRobotStateBuffer rt_robot_state_buffer;
308 RobotStateMsgPtr robot_state_msg;
309
310 ContactsSubscription contacts_subscriber;
311 RTContactsBuffer rt_contacts_buffer;
312 ContactsMsgPtr contacts_msg;
313
314 JointStateSubscription joint_state_subscriber;
315 RTJointStateBuffer rt_joint_state_buffer;
316 JointStateMsgPtr joint_state_msg;
317
318 rclcpp::Time stamp;
319 rclcpp::TimerBase::SharedPtr timer;
320
321 std::shared_ptr<biped_controller::ParamListener> param_listener;
322 biped_controller::Params params;
323
324 std::vector<int> joint_idx_map;
325 std::vector<int> joint_idx_map_left_leg;
326 std::vector<int> joint_idx_map_right_leg;
327
328 };
329}
330
331#endif
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