@@ -84,6 +84,7 @@ controller_interface::CallbackReturn RobotController::on_configure(const rclcpp_
8484 auto callback =
8585 [this ](const std::shared_ptr<trajectory_msgs::msg::JointTrajectory> traj_msg) -> void
8686 {
87+ RCLCPP_INFO (get_node ()->get_logger (), " Received new trajectory." );
8788 traj_msg_external_point_ptr_.writeFromNonRT (traj_msg);
8889 new_msg_ = true ;
8990 };
@@ -136,15 +137,26 @@ void interpolate_point(
136137
137138void interpolate_trajectory_point (
138139 const trajectory_msgs::msg::JointTrajectory & traj_msg, const rclcpp::Duration & cur_time,
139- trajectory_msgs::msg::JointTrajectoryPoint & point_interp)
140+ trajectory_msgs::msg::JointTrajectoryPoint & point_interp, bool & reached_end )
140141{
141142 double traj_len = static_cast <double >(traj_msg.points .size ());
142143 auto last_time = traj_msg.points .back ().time_from_start ;
143144 double total_time = last_time.sec + last_time.nanosec * 1E-9 ;
145+ double cur_time_sec = cur_time.seconds ();
146+ reached_end = (cur_time_sec >= total_time);
144147
145- size_t ind = static_cast <size_t >(cur_time.seconds () * (traj_len / total_time));
148+ // If we reached the end of the trajectory, set the velocities to zero.
149+ if (reached_end)
150+ {
151+ point_interp.positions = traj_msg.points .back ().positions ;
152+ std::fill (point_interp.velocities .begin (), point_interp.velocities .end (), 0.0 );
153+ return ;
154+ }
155+
156+ size_t ind =
157+ static_cast <size_t >(cur_time_sec * (traj_len / total_time)); // Assumes evenly spaced points.
146158 ind = std::min (ind, static_cast <size_t >(traj_len) - 2 );
147- double delta = cur_time. seconds () - static_cast <double >(ind) * (total_time / traj_len);
159+ double delta = std::min (cur_time_sec - static_cast <double >(ind) * (total_time / traj_len), 1.0 );
148160 interpolate_point (traj_msg.points [ind], traj_msg.points [ind + 1 ], point_interp, delta);
149161}
150162
@@ -160,14 +172,29 @@ controller_interface::return_type RobotController::update(
160172
161173 if (trajectory_msg_ != nullptr )
162174 {
163- interpolate_trajectory_point (*trajectory_msg_, time - start_time_, point_interp_);
175+ bool reached_end;
176+ interpolate_trajectory_point (*trajectory_msg_, time - start_time_, point_interp_, reached_end);
177+
178+ // If we have reached the end of the trajectory, reset it..
179+ if (reached_end)
180+ {
181+ RCLCPP_INFO (get_node ()->get_logger (), " Trajectory execution complete." );
182+ trajectory_msg_.reset ();
183+ }
184+
164185 for (size_t i = 0 ; i < joint_position_command_interface_.size (); i++)
165186 {
166- joint_position_command_interface_[i].get ().set_value (point_interp_.positions [i]);
187+ if (!joint_position_command_interface_[i].get ().set_value (point_interp_.positions [i]))
188+ {
189+ RCLCPP_ERROR (get_node ()->get_logger (), " Failed to set position value for index %ld" , i);
190+ }
167191 }
168192 for (size_t i = 0 ; i < joint_velocity_command_interface_.size (); i++)
169193 {
170- joint_velocity_command_interface_[i].get ().set_value (point_interp_.velocities [i]);
194+ if (!joint_velocity_command_interface_[i].get ().set_value (point_interp_.velocities [i]))
195+ {
196+ RCLCPP_ERROR (get_node ()->get_logger (), " Failed to set velocity value for index %ld" , i);
197+ }
171198 }
172199 }
173200
0 commit comments