Skip to content

Commit 6d07010

Browse files
sea-bassmergify[bot]
authored andcommitted
Fix 6DOF arm example (#804)
(cherry picked from commit 1dc20c1) # Conflicts: # example_7/controller/r6bot_controller.cpp # example_7/reference_generator/send_trajectory.cpp
1 parent 3501d75 commit 6d07010

File tree

2 files changed

+56
-12
lines changed

2 files changed

+56
-12
lines changed

example_7/controller/r6bot_controller.cpp

Lines changed: 37 additions & 4 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,32 @@ 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 = 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

example_7/reference_generator/send_trajectory.cpp

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

6464
double total_time = 3.0;
6565
int trajectory_len = 200;
66+
<<<<<<< HEAD
6667
int loop_rate = trajectory_len / total_time;
6768
double dt = 1.0 / loop_rate;
69+
=======
70+
double dt = total_time / static_cast<double>(trajectory_len - 1);
71+
>>>>>>> 1dc20c1 (Fix 6DOF arm example (#804))
6872

6973
for (int i = 0; i < trajectory_len; i++)
7074
{
7175
// 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));
76+
double t = i / (static_cast<double>(trajectory_len - 1));
77+
twist.vel.x(2 * 0.3 * cos(2 * M_PI * t));
78+
twist.vel.y(-0.3 * sin(2 * M_PI * t));
7579

7680
// convert cart to joint velocities
7781
ik_vel_solver_->CartToJnt(joint_positions, twist, joint_velocities);
@@ -88,14 +92,21 @@ int main(int argc, char ** argv)
8892
joint_positions.data += joint_velocities.data * dt;
8993

9094
// 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-
95+
double time_point = total_time * t;
96+
double time_point_sec = std::floor(time_point);
97+
trajectory_point_msg.time_from_start.sec = static_cast<int>(time_point_sec);
98+
trajectory_point_msg.time_from_start.nanosec =
99+
static_cast<int>((time_point - time_point_sec) * 1E9);
96100
trajectory_msg.points.push_back(trajectory_point_msg);
97101
}
98102

103+
<<<<<<< HEAD
104+
=======
105+
// send zero velocities in the end
106+
auto & last_point_msg = trajectory_msg.points.back();
107+
std::fill(last_point_msg.velocities.begin(), last_point_msg.velocities.end(), 0.0);
108+
109+
>>>>>>> 1dc20c1 (Fix 6DOF arm example (#804))
99110
pub->publish(trajectory_msg);
100111
while (rclcpp::ok())
101112
{

0 commit comments

Comments
 (0)