@@ -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,32 @@ 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 = traj_msg.points .size ();
142143 auto last_time = traj_msg.points [traj_len - 1 ].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
148+ <<<<<<< HEAD
145149 size_t ind = cur_time.seconds () * (traj_len / total_time);
146150 ind = std::min (static_cast <double >(ind), traj_len - 2 );
147151 double delta = cur_time.seconds () - ind * (total_time / traj_len);
152+ =======
153+ // If we reached the end of the trajectory, set the velocities to zero.
154+ if (reached_end)
155+ {
156+ point_interp.positions = traj_msg.points .back ().positions ;
157+ std::fill (point_interp.velocities .begin (), point_interp.velocities .end (), 0.0 );
158+ return ;
159+ }
160+
161+ size_t ind =
162+ static_cast <size_t >(cur_time_sec * (traj_len / total_time)); // Assumes evenly spaced points.
163+ ind = std::min (ind, static_cast <size_t >(traj_len) - 2 );
164+ double delta = std::min (cur_time_sec - static_cast <double >(ind) * (total_time / traj_len), 1.0 );
165+ >>>>>>> 1dc20c1 (Fix 6DOF arm example (#804 ))
148166 interpolate_point (traj_msg.points [ind], traj_msg.points [ind + 1 ], point_interp, delta);
149167}
150168
@@ -160,14 +178,29 @@ controller_interface::return_type RobotController::update(
160178
161179 if (trajectory_msg_ != nullptr )
162180 {
163- interpolate_trajectory_point (*trajectory_msg_, time - start_time_, point_interp_);
181+ bool reached_end;
182+ interpolate_trajectory_point (*trajectory_msg_, time - start_time_, point_interp_, reached_end);
183+
184+ // If we have reached the end of the trajectory, reset it..
185+ if (reached_end)
186+ {
187+ RCLCPP_INFO (get_node ()->get_logger (), " Trajectory execution complete." );
188+ trajectory_msg_.reset ();
189+ }
190+
164191 for (size_t i = 0 ; i < joint_position_command_interface_.size (); i++)
165192 {
166- joint_position_command_interface_[i].get ().set_value (point_interp_.positions [i]);
193+ if (!joint_position_command_interface_[i].get ().set_value (point_interp_.positions [i]))
194+ {
195+ RCLCPP_ERROR (get_node ()->get_logger (), " Failed to set position value for index %ld" , i);
196+ }
167197 }
168198 for (size_t i = 0 ; i < joint_velocity_command_interface_.size (); i++)
169199 {
170- joint_velocity_command_interface_[i].get ().set_value (point_interp_.velocities [i]);
200+ if (!joint_velocity_command_interface_[i].get ().set_value (point_interp_.velocities [i]))
201+ {
202+ RCLCPP_ERROR (get_node ()->get_logger (), " Failed to set velocity value for index %ld" , i);
203+ }
171204 }
172205 }
173206
0 commit comments