64 cmdVelPub_ =
getNode()->create_publisher<geometry_msgs::msg::Twist>(
"/cmd_vel", rclcpp::QoS(1));
66 rclcpp::Duration linearRamp = rclcpp::Duration::from_seconds(spiralMotionDuration.seconds());
67 float linearAceleration = (maxLinearVelocity - linearVelocity) / linearRamp.seconds();
68 float dt = 1.0f / rate;
71 float finalAngularVelocity = maxLinearVelocity / finalRadius;
73 float angularAcceleration =
74 (initialAngularVelocity - finalAngularVelocity) / spiralMotionDuration.seconds();
76 geometry_msgs::msg::Twist cmd_vel;
78 cmd_vel.linear.x = linearVelocity;
79 cmd_vel.angular.z = initialAngularVelocity;
80 auto start_time =
getNode()->now();
83 getLogger(),
"[CbSpiralMotion]: initialAngularVelocity: "
84 << initialAngularVelocity <<
", finalAngularVelocity: " << finalAngularVelocity
85 <<
", angularAcceleration: " << angularAcceleration);
87 getLogger(),
"[CbSpiralMotion]: linearAceleration: "
88 << linearAceleration <<
", maxLinearVelocity: " << maxLinearVelocity);
90 bool end_condition =
false;
92 while (!end_condition)
94 auto current_time =
getNode()->now() - start_time;
96 cmd_vel.linear.x += linearAceleration * dt;
97 if (cmd_vel.linear.x > maxLinearVelocity)
99 cmd_vel.linear.x = maxLinearVelocity;
102 float signVal = (cmd_vel.angular.z >= 0.0f) ? 1.0f : -1.0f;
105 float ellapsedTimeFactor = current_time.seconds() / spiralMotionDuration.seconds();
106 cmd_vel.angular.z = initialAngularVelocity * (1.0f - ellapsedTimeFactor) +
107 finalAngularVelocity * ellapsedTimeFactor;
110 getLogger(),
"[CbSpiralMotion] cmd_vel.linear.x = %f, cmd_vel.angular.z = %f",
111 cmd_vel.linear.x, cmd_vel.angular.z);
118 rclcpp::Duration ellapsed = now - start_time;
120 getLogger(),
"[CbSpiralMotion] ellapsed time: " << ellapsed.seconds() <<
", total duration: "
121 << spiralMotionDuration.seconds());
122 if (ellapsed > spiralMotionDuration)
124 RCLCPP_INFO_STREAM(
getLogger(),
"[CbSpiralMotion] spiralMotionDuration reached");
125 end_condition =
true;