53 cmdVelPub_ =
getNode()->create_publisher<geometry_msgs::msg::Twist>(
"/cmd_vel", rclcpp::QoS(1));
55 rclcpp::Duration linearRamp = rclcpp::Duration::from_seconds(spiralMotionDuration.seconds());
56 float linearAceleration = (maxLinearVelocity - linearVelocity) / linearRamp.seconds();
57 float dt = 1.0f / rate;
60 float finalAngularVelocity = maxLinearVelocity / finalRadius;
62 float angularAcceleration =
63 (initialAngularVelocity - finalAngularVelocity) / spiralMotionDuration.seconds();
65 geometry_msgs::msg::Twist cmd_vel;
67 cmd_vel.linear.x = linearVelocity;
68 cmd_vel.angular.z = initialAngularVelocity;
69 auto start_time =
getNode()->now();
72 getLogger(),
"[CbSpiralMotion]: initialAngularVelocity: "
73 << initialAngularVelocity <<
", finalAngularVelocity: " << finalAngularVelocity
74 <<
", angularAcceleration: " << angularAcceleration);
76 getLogger(),
"[CbSpiralMotion]: linearAceleration: "
77 << linearAceleration <<
", maxLinearVelocity: " << maxLinearVelocity);
79 bool end_condition =
false;
81 while (!end_condition)
83 auto current_time =
getNode()->now() - start_time;
85 cmd_vel.linear.x +=
static_cast<double>(linearAceleration) * dt;
86 if (cmd_vel.linear.x > maxLinearVelocity)
88 cmd_vel.linear.x = maxLinearVelocity;
91 float elapsedTimeFactor = current_time.seconds() / spiralMotionDuration.seconds();
92 cmd_vel.angular.z = initialAngularVelocity * (1.0f - elapsedTimeFactor) +
93 finalAngularVelocity * elapsedTimeFactor;
96 getLogger(),
"[CbSpiralMotion] cmd_vel.linear.x = %f, cmd_vel.angular.z = %f",
97 cmd_vel.linear.x, cmd_vel.angular.z);
104 rclcpp::Duration elapsed = now - start_time;
106 getLogger(),
"[CbSpiralMotion] elapsed time: " << elapsed.seconds() <<
", total duration: "
107 << spiralMotionDuration.seconds());
108 if (elapsed > spiralMotionDuration)
110 RCLCPP_INFO_STREAM(
getLogger(),
"[CbSpiralMotion] spiralMotionDuration reached");
111 end_condition =
true;