Skip to content

Commit 0b6b7d9

Browse files
sea-basschristophfroehlich
authored andcommitted
Fix 6DOF arm example (#804)
1 parent 926392f commit 0b6b7d9

File tree

2 files changed

+44
-23
lines changed

2 files changed

+44
-23
lines changed

example_7/controller/r6bot_controller.cpp

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

137138
void 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

example_7/reference_generator/send_trajectory.cpp

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,14 @@ int main(int argc, char ** argv)
6363

6464
double total_time = 3.0;
6565
int trajectory_len = 200;
66-
int loop_rate = static_cast<int>(std::round(trajectory_len / total_time));
67-
double dt = 1.0 / loop_rate;
66+
double dt = total_time / static_cast<double>(trajectory_len - 1);
6867

6968
for (int i = 0; i < trajectory_len; i++)
7069
{
7170
// set endpoint twist
72-
double t = i;
73-
twist.vel.x(2 * 0.3 * cos(2 * M_PI * t / trajectory_len));
74-
twist.vel.y(-0.3 * sin(2 * M_PI * t / trajectory_len));
71+
double t = i / (static_cast<double>(trajectory_len - 1));
72+
twist.vel.x(2 * 0.3 * cos(2 * M_PI * t));
73+
twist.vel.y(-0.3 * sin(2 * M_PI * t));
7574

7675
// convert cart to joint velocities
7776
ik_vel_solver_->CartToJnt(joint_positions, twist, joint_velocities);
@@ -88,22 +87,17 @@ int main(int argc, char ** argv)
8887
joint_positions.data += joint_velocities.data * dt;
8988

9089
// set timing information
91-
trajectory_point_msg.time_from_start.sec = i / loop_rate;
92-
trajectory_point_msg.time_from_start.nanosec = static_cast<int>(
93-
1E9 / loop_rate *
94-
static_cast<double>(t - loop_rate * (i / loop_rate))); // implicit integer division
95-
90+
double time_point = total_time * t;
91+
double time_point_sec = std::floor(time_point);
92+
trajectory_point_msg.time_from_start.sec = static_cast<int>(time_point_sec);
93+
trajectory_point_msg.time_from_start.nanosec =
94+
static_cast<int>((time_point - time_point_sec) * 1E9);
9695
trajectory_msg.points.push_back(trajectory_point_msg);
9796
}
9897

9998
// send zero velocities in the end
100-
std::fill(trajectory_point_msg.velocities.begin(), trajectory_point_msg.velocities.end(), 0.0);
101-
trajectory_point_msg.time_from_start.sec = trajectory_len / loop_rate;
102-
trajectory_point_msg.time_from_start.nanosec = static_cast<int>(
103-
1E9 / loop_rate *
104-
static_cast<double>(
105-
trajectory_len - loop_rate * (trajectory_len / loop_rate))); // implicit integer division
106-
trajectory_msg.points.push_back(trajectory_point_msg);
99+
auto & last_point_msg = trajectory_msg.points.back();
100+
std::fill(last_point_msg.velocities.begin(), last_point_msg.velocities.end(), 0.0);
107101

108102
pub->publish(trajectory_msg);
109103
while (rclcpp::ok())

0 commit comments

Comments
 (0)