Quad-SDK
Loading...
Searching...
No Matches
ros_utils.h
1#ifndef SPIRIT_ROS_UTILS_H
2#define SPIRIT_ROS_UTILS_H
3
4#include <geometry_msgs/Point.h>
5#include <geometry_msgs/Vector3.h>
6#include <quad_utils/math_utils.h>
7#include <ros/ros.h>
8#include <std_msgs/Header.h>
9
10namespace quad_utils {
17inline double getROSMessageAgeInMs(std_msgs::Header header,
18 ros::Time t_compare) {
19 return (t_compare - header.stamp).toSec() * 1000.0;
20}
21
27inline double getROSMessageAgeInMs(std_msgs::Header header) {
28 ros::Time t_compare = ros::Time::now();
29 return quad_utils::getROSMessageAgeInMs(header, t_compare);
30}
31
37inline double getDurationSinceTime(ros::Time plan_start) {
38 return (ros::Time::now() - plan_start).toSec();
39}
40
49inline void getPlanIndex(ros::Time plan_start, double dt, int &index,
50 double &first_element_duration) {
51 double duration = getDurationSinceTime(plan_start);
52 index = std::floor(duration / dt);
53 first_element_duration = (index + 1) * dt - duration;
54}
55
63template <class ParamType>
64inline bool loadROSParam(ros::NodeHandle nh, std::string paramName,
65 ParamType &varName) {
66 if (!nh.getParam(paramName, varName)) {
67 ROS_ERROR("Can't find param %s from parameter server", paramName.c_str());
68 return false;
69 }
70 return true;
71}
72
82template <class ParamType>
83inline bool loadROSParamDefault(ros::NodeHandle nh, std::string paramName,
84 ParamType &varName, ParamType defaultVal) {
85 if (!nh.getParam(paramName, varName)) {
86 varName = defaultVal;
87 ROS_INFO("Can't find param %s on rosparam server, loading default value.",
88 paramName.c_str());
89 return false;
90 }
91 return true;
92}
93
94// /**
95// * @brief Interpolate two headers
96// * @param[out] msg State message to popluate
97// * @param[in] stamp Timestamp for the state message
98// * @param[in] frame Frame_id for the state message
99// */
100// void updateStateHeaders(quad_msgs::RobotState &msg, ros::Time stamp,
101// std::string frame);
102
110void updateStateHeaders(quad_msgs::RobotState &msg, ros::Time stamp,
111 std::string frame, int traj_index);
112
120void interpHeader(std_msgs::Header header_1, std_msgs::Header header_2,
121 double t_interp, std_msgs::Header &interp_header);
122
130void interpOdometry(quad_msgs::BodyState state_1, quad_msgs::BodyState state_2,
131 double t_interp, quad_msgs::BodyState &interp_state);
132
140void interpJointState(sensor_msgs::JointState state_1,
141 sensor_msgs::JointState state_2, double t_interp,
142 sensor_msgs::JointState &interp_state);
143
151void interpMultiFootState(quad_msgs::MultiFootState state_1,
152 quad_msgs::MultiFootState state_2, double t_interp,
153 quad_msgs::MultiFootState &interp_state);
154
162void interpGRFArray(quad_msgs::GRFArray state_1, quad_msgs::GRFArray state_2,
163 double t_interp, quad_msgs::GRFArray &interp_state);
164
172void interpRobotState(quad_msgs::RobotState state_1,
173 quad_msgs::RobotState state_2, double t_interp,
174 quad_msgs::RobotState &interp_state);
175
185void interpRobotPlan(quad_msgs::RobotPlan msg, double t,
186 quad_msgs::RobotState &interp_state,
187 int &interp_primitive_id, quad_msgs::GRFArray &interp_grf);
188
196quad_msgs::MultiFootState interpMultiFootPlanContinuous(
197 quad_msgs::MultiFootPlanContinuous msg, double t);
198
199// /**
200// * @brief Interpolate data from a robot state trajectory message.
201// * @param[in] msg robot state trajectory message
202// * @param[in] t Time since beginning of trajectory (will return last state if
203// * too large)
204// * @return Robot state message
205// */
206// quad_msgs::RobotState interpRobotStateTraj(quad_msgs::RobotStateTrajectory
207// msg,
208// double t);
209
218void ikRobotState(const quad_utils::QuadKD &kinematics,
219 quad_msgs::BodyState body_state,
220 quad_msgs::MultiFootState multi_foot_state,
221 sensor_msgs::JointState &joint_state);
222
228void ikRobotState(const quad_utils::QuadKD &kinematics,
229 quad_msgs::RobotState &state);
230
239void fkRobotState(const quad_utils::QuadKD &kinematics,
240 quad_msgs::BodyState body_state,
241 sensor_msgs::JointState joint_state,
242 quad_msgs::MultiFootState &multi_foot_state);
243
249void fkRobotState(const quad_utils::QuadKD &kinematics,
250 quad_msgs::RobotState &state);
251
257quad_msgs::BodyState eigenToBodyStateMsg(const Eigen::VectorXd &state);
258
264Eigen::VectorXd bodyStateMsgToEigen(const quad_msgs::BodyState &body);
265
273void eigenToGRFArrayMsg(Eigen::VectorXd grf_array,
274 quad_msgs::MultiFootState multi_foot_state_msg,
275 quad_msgs::GRFArray &grf_msg);
276
282Eigen::VectorXd grfArrayMsgToEigen(const quad_msgs::GRFArray &grf_array_msg_);
283
290void footStateMsgToEigen(const quad_msgs::FootState &foot_state_msg,
291 Eigen::Vector3d &foot_position);
292
299void multiFootStateMsgToEigen(
300 const quad_msgs::MultiFootState &multi_foot_state_msg,
301 Eigen::VectorXd &foot_positions);
302
310void multiFootStateMsgToEigen(
311 const quad_msgs::MultiFootState &multi_foot_state_msg,
312 Eigen::VectorXd &foot_positions, Eigen::VectorXd &foot_velocities);
313
322void multiFootStateMsgToEigen(
323 const quad_msgs::MultiFootState &multi_foot_state_msg,
324 Eigen::VectorXd &foot_positions, Eigen::VectorXd &foot_velocities,
325 Eigen::VectorXd &foot_acceleration);
326
334void eigenToFootStateMsg(Eigen::VectorXd foot_position,
335 Eigen::VectorXd foot_velocity,
336 quad_msgs::FootState &foot_state_msg);
337
346void eigenToFootStateMsg(Eigen::VectorXd foot_position,
347 Eigen::VectorXd foot_velocity,
348 Eigen::VectorXd foot_acceleration,
349 quad_msgs::FootState &foot_state_msg);
350
356void eigenToVector(const Eigen::VectorXd &eigen_vec, std::vector<double> &vec);
357
363void vectorToEigen(const std::vector<double> &vec, Eigen::VectorXd &eigen_vec);
364
370void Eigen3ToVector3Msg(const Eigen::Vector3d &eigen_vec,
371 geometry_msgs::Vector3 &vec);
372
378void vector3MsgToEigen(const geometry_msgs::Vector3 &vec,
379 Eigen::Vector3d &eigen_vec);
380
386void Eigen3ToPointMsg(const Eigen::Vector3d &eigen_vec,
387 geometry_msgs::Point &vec);
388
394void pointMsgToEigen(const geometry_msgs::Point &vec,
395 Eigen::Vector3d &eigen_vec);
396} // namespace quad_utils
397
398#endif
A lightweight library for quad kinematic functions.
Definition quad_kd.h:28