@@ -84,6 +84,7 @@ controller_interface::CallbackReturn RobotController::on_configure(const rclcpp_
84
84
auto callback =
85
85
[this ](const std::shared_ptr<trajectory_msgs::msg::JointTrajectory> traj_msg) -> void
86
86
{
87
+ RCLCPP_INFO (get_node ()->get_logger (), " Received new trajectory." );
87
88
traj_msg_external_point_ptr_.writeFromNonRT (traj_msg);
88
89
new_msg_ = true ;
89
90
};
@@ -136,15 +137,32 @@ void interpolate_point(
136
137
137
138
void interpolate_trajectory_point (
138
139
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 )
140
141
{
141
142
double traj_len = traj_msg.points .size ();
142
143
auto last_time = traj_msg.points [traj_len - 1 ].time_from_start ;
143
144
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);
144
147
148
+ <<<<<<< HEAD
145
149
size_t ind = cur_time.seconds () * (traj_len / total_time);
146
150
ind = std::min (static_cast <double >(ind), traj_len - 2 );
147
151
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 ))
148
166
interpolate_point (traj_msg.points [ind], traj_msg.points [ind + 1 ], point_interp, delta);
149
167
}
150
168
@@ -160,14 +178,29 @@ controller_interface::return_type RobotController::update(
160
178
161
179
if (trajectory_msg_ != nullptr )
162
180
{
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
+
164
191
for (size_t i = 0 ; i < joint_position_command_interface_.size (); i++)
165
192
{
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
+ }
167
197
}
168
198
for (size_t i = 0 ; i < joint_velocity_command_interface_.size (); i++)
169
199
{
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
+ }
171
204
}
172
205
}
173
206
0 commit comments