@@ -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