51 controller_nh.
getParam(
"modules", modules);
53 for (
const auto& module : modules)
55 ROS_ASSERT(module.second.hasMember(
"position"));
57 ROS_ASSERT(module.second[
"position"].size() == 2);
62 ROS_ASSERT(module.second[
"wheel"].hasMember(
"radius"));
64 Module m{ .position_ =
Vec2<double>((
double)module.second[
"position"][0], (
double)module.second[
"position"][1]),
65 .pivot_offset_ = module.second[
"pivot"][
"offset"],
66 .wheel_radius_ = module.second[
"wheel"][
"radius"],
74 if (module.second[
"pivot"].hasMember(
"offset"))
75 m.pivot_offset_ = module.second[
"pivot"][
"offset"];
91 double vel_angle = std::atan2(vel.y(), vel.x()) + module.pivot_offset_;
95 module.ctrl_pivot_->setCommand(std::abs(a) < std::abs(b) ? vel_angle : vel_angle + M_PI);
96 module.ctrl_wheel_->setCommand(vel.norm() / module.wheel_radius_ * std::cos(a));
97 module.ctrl_pivot_->update(time, period);
98 module.ctrl_wheel_->update(time, period);
104 geometry_msgs::Twist vel_data{};
105 geometry_msgs::Twist vel_modules{};
108 geometry_msgs::Twist vel;
109 vel.linear.x = module.ctrl_wheel_->joint_.getVelocity() * module.wheel_radius_ *
110 std::cos(module.ctrl_pivot_->joint_.getPosition());
111 vel.linear.y = module.ctrl_wheel_->joint_.getVelocity() * module.wheel_radius_ *
112 std::sin(module.ctrl_pivot_->joint_.getPosition());
114 module.ctrl_wheel_->joint_.getVelocity() * module.wheel_radius_ *
115 std::cos(module.ctrl_pivot_->joint_.getPosition() - std::atan2(module.position_.x(), -module.position_.y()));
116 vel_modules.linear.x += vel.linear.x;
117 vel_modules.linear.y += vel.linear.y;
118 vel_modules.angular.z += vel.angular.z;
120 vel_data.linear.x = vel_modules.linear.x /
modules_.size();
121 vel_data.linear.y = vel_modules.linear.y /
modules_.size();
123 vel_modules.angular.z /
modules_.size() /
124 std::sqrt(std::pow(
modules_.begin()->position_.x(), 2) + std::pow(
modules_.begin()->position_.y(), 2));