6 #include <unsupported/Eigen/MatrixFunctions>
9 #include <geometry_msgs/Quaternion.h>
12 #include <rm_msgs/BalanceState.h>
23 getParam(controller_nh,
"imu_name", std::string(
"base_imu")));
24 std::string left_wheel_joint, right_wheel_joint, left_momentum_block_joint, right_momentum_block_joint;
25 if (!controller_nh.
getParam(
"left/wheel_joint", left_wheel_joint) ||
26 !controller_nh.
getParam(
"left/block_joint", left_momentum_block_joint) ||
27 !controller_nh.
getParam(
"right/wheel_joint", right_wheel_joint) ||
28 !controller_nh.
getParam(
"right/block_joint", right_momentum_block_joint))
50 double m_w, m, m_b, i_w, l, y_b, z_b, g, i_m;
52 if (!controller_nh.
getParam(
"m_w", m_w))
62 if (!controller_nh.
getParam(
"m_b", m_b))
67 if (!controller_nh.
getParam(
"i_w", i_w))
77 if (!controller_nh.
getParam(
"y_b", y_b))
82 if (!controller_nh.
getParam(
"z_b", z_b))
92 if (!controller_nh.
getParam(
"i_m", i_m))
109 ROS_ERROR(
"Params block_duration doesn't given (namespace: %s)", controller_nh.
getNamespace().c_str());
124 ROS_ERROR(
"Params block_velocity doesn't given (namespace: %s)", controller_nh.
getNamespace().c_str());
129 ROS_ERROR(
"Params anti_block_effort doesn't given (namespace: %s)", controller_nh.
getNamespace().c_str());
134 ROS_ERROR(
"Params block_overtime doesn't given (namespace: %s)", controller_nh.
getNamespace().c_str());
153 q_(i, i) =
static_cast<double>(q[i]);
157 q_(i, i) =
static_cast<int>(q[i]);
168 r_(i, i) =
static_cast<double>(r[i]);
172 r_(i, i) =
static_cast<int>(r[i]);
177 double a_5_2 = -(pow(
wheel_radius_, 2) * g * (pow(l, 2) * pow(m, 2) + 2 * m_b * pow(l, 2) * m + 2 * i_m * m_b)) /
178 (2 * i_m * i_w + 2 * i_w * pow(l, 2) * m + pow(
wheel_radius_, 2) * i_m * m +
181 (2 * i_m * i_w + 2 * i_w * pow(l, 2) * m + pow(
wheel_radius_, 2) * i_m * m +
183 double a_5_4 = a_5_3;
187 (2 * i_m * i_w + 2 * i_w * pow(l, 2) * m + pow(
wheel_radius_, 2) * i_m * m +
190 (2 * i_m * i_w + 2 * i_w * pow(l, 2) * m + pow(
wheel_radius_, 2) * i_m * m +
192 double a_7_4 = a_7_3;
194 (g * (i_m - l * m * z_b) *
196 (2 * i_m * i_w + 2 * i_w * pow(l, 2) * m + pow(
wheel_radius_, 2) * i_m * m +
198 double a_8_3 = -(g * m_b *
199 (2 * i_w * l + 2 * i_w * z_b + 2 * pow(
wheel_radius_, 2) * l * m_w +
201 (2 * i_m * i_w + 2 * i_w * pow(l, 2) * m + pow(
wheel_radius_, 2) * i_m * m +
203 double a_8_4 = a_8_3;
204 double a_9_2 = a_8_2;
205 double a_9_3 = a_8_3;
206 double a_9_4 = a_8_4;
209 (2 * i_m * i_w + 2 * i_w * pow(l, 2) * m + pow(
wheel_radius_, 2) * i_m * m +
211 double b_5_1 = b_5_0;
213 (2 * i_m * i_w + 2 * i_w * pow(l, 2) * m + pow(
wheel_radius_, 2) * i_m * m +
215 double b_5_3 = b_5_2;
217 double b_6_1 = -b_6_0;
219 double b_6_3 = -b_6_2;
221 (2 * i_m * i_w + 2 * i_w * pow(l, 2) * m + pow(
wheel_radius_, 2) * i_m * m +
223 double b_7_1 = b_7_0;
225 (2 * i_m * i_w + 2 * i_w * pow(l, 2) * m + pow(
wheel_radius_, 2) * i_m * m +
227 double b_7_3 = b_7_2;
239 (2 * i_m * i_w + 2 * i_w * pow(l, 2) * m + pow(
wheel_radius_, 2) * i_m * m +
252 (2 * i_m * i_w + 2 * i_w * pow(l, 2) * m + pow(
wheel_radius_, 2) * i_m * m +
255 (-4 * m * pow(
wheel_radius_, 4) * pow(l, 2) * m_w * pow(y_b, 2) +
260 4 * m * pow(
wheel_radius_, 2) * i_w * pow(l, 2) * pow(y_b, 2) +
265 2 * pow(i_w, 2) * pow(
wheel_base_, 2) * pow(z_b, 2)) /
267 (2 * i_m * i_w + 2 * i_w * pow(l, 2) * m + pow(
wheel_radius_, 2) * i_m * m +
271 4 * m * m_b * pow(
wheel_radius_, 4) * pow(l, 2) * m_w * pow(y_b, 2) +
280 4 * m * m_b * pow(
wheel_radius_, 2) * i_w * pow(l, 2) * pow(y_b, 2) +
287 2 * m * pow(i_w, 2) * pow(l, 2) * pow(
wheel_base_, 2) + 2 * m_b * pow(i_w, 2) * l * pow(
wheel_base_, 2) * z_b +
288 2 * m_b * pow(i_w, 2) * pow(
wheel_base_, 2) * pow(z_b, 2) + 2 * i_m * pow(i_w, 2) * pow(
wheel_base_, 2)) /
290 (2 * i_m * i_w + 2 * i_w * pow(l, 2) * m + pow(
wheel_radius_, 2) * i_m * m +
292 double b_8_0 = b_9_1;
293 double b_8_1 = b_9_0;
294 double b_8_2 = b_9_3;
295 double b_8_3 = b_9_2;
297 a_ << 0., 0., 0., 0., 0., 1.0, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.0, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
298 1.0, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.0, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.0, 0., 0., a_5_2,
299 a_5_3, a_5_4, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., a_7_2, a_7_3, a_7_4, 0., 0., 0.,
300 0., 0., 0., 0., a_8_2, a_8_3, a_8_4, 0., 0., 0., 0., 0., 0., 0., a_9_2, a_9_3, a_9_4, 0., 0., 0., 0., 0.;
301 b_ << 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., b_5_0, b_5_1, b_5_2, b_5_3,
302 b_6_0, b_6_1, b_6_2, b_6_3, b_7_0, b_7_1, b_7_2, b_7_3, b_8_0, b_8_1, b_8_2, b_8_3, b_9_0, b_9_1, b_9_2, b_9_3;
309 ROS_ERROR(
"Failed to compute K of LQR.");
324 geometry_msgs::Vector3 gyro;
341 geometry_msgs::TransformStamped tf_msg;
355 tf2::Vector3 odom2imu_origin;
358 odom2imu_origin.setValue(0, 0, 0);
361 odom2base = odom2imu * imu2base;
394 case BalanceMode::NORMAL:
399 case BalanceMode::BLOCK:
429 Eigen::Matrix<double, CONTROL_DIM, 1> u;
494 geometry_msgs::Twist
twist;