Skip to content

Commit 58d4ed7

Browse files
committed
Update move group interface tutorial to move the simulated robot
1 parent 41688c4 commit 58d4ed7

File tree

2 files changed

+58
-74
lines changed

2 files changed

+58
-74
lines changed

doc/move_group_interface/move_group_interface_tutorial.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ Expected Output
3030
---------------
3131
See the `YouTube video <https://youtu.be/_5siHkFQPBQ>`_ at the top of this tutorial for expected output. In RViz, we should be able to see the following:
3232
1. The robot moves its arm to the pose goal to its front.
33-
2. The robot moves its arm to the joint goal at its side.
34-
3. The robot moves its arm back to a new pose goal while maintaining the end-effector level.
35-
4. The robot moves its arm along the desired Cartesian path (a triangle down, right, up+left).
33+
2. The robot moves its arm back to a new pose goal while maintaining the end-effector level.
34+
3. The robot moves its arm along the desired Cartesian path (a triangle down, right, up+left).
35+
4. The robot moves its arm to the joint goal back at it's starting position.
3636
5. A box object is added into the environment to the right of the arm.
3737
|B|
3838

doc/move_group_interface/src/move_group_interface_tutorial.cpp

Lines changed: 55 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ int main(int argc, char** argv)
116116
std::copy(move_group_interface.getJointModelGroupNames().begin(),
117117
move_group_interface.getJointModelGroupNames().end(), std::ostream_iterator<std::string>(std::cout, ", "));
118118

119+
// We can get the current state of the robot as well
120+
moveit::core::RobotStatePtr initial_state = move_group_interface.getCurrentState();
121+
119122
// Start the demo
120123
// ^^^^^^^^^^^^^^^^^^^^^^^^^
121124
visual_tools.prompt("Press 'next' in the RvizVisualToolsGui window to start the demo");
@@ -152,56 +155,11 @@ int main(int argc, char** argv)
152155
visual_tools.trigger();
153156
visual_tools.prompt("Press 'next' in the RvizVisualToolsGui window to continue the demo");
154157

155-
// Finally, to execute the trajectory stored in my_plan, you could use the following method call.
156-
// Note that this can lead to problems if the robot moved in the meanwhile.
157-
// This tutorial does not actually move the robot, so this line is commented out
158-
159-
/* move_group_interface.execute(my_plan); */
160-
161158
// Moving to a pose goal
162159
// ^^^^^^^^^^^^^^^^^^^^^
163-
//
164-
// If you do not want to inspect the planned trajectory,
165-
// the following is a more robust combination of the two-step plan+execute pattern shown above
166-
// and should be preferred. Note that the pose goal we had set earlier is still active,
167-
// so the robot will try to move to that goal.
168-
// This tutorial does not actually move the robot, so this line is commented out
169-
170-
/* move_group_interface.move(); */
171-
172-
// Planning to a joint-space goal
173-
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
174-
//
175-
// Let's set a joint space goal and move towards it. This will replace the
176-
// pose target we set above.
177-
//
178-
// To start, we'll create an pointer that references the current robot's state.
179-
// RobotState is the object that contains all the current position/velocity/acceleration data.
180-
moveit::core::RobotStatePtr current_state = move_group_interface.getCurrentState();
181-
//
182-
// Next get the current set of joint values for the group.
183-
std::vector<double> joint_group_positions;
184-
current_state->copyJointGroupPositions(joint_model_group, joint_group_positions);
185-
186-
// Now, let's modify one of the joints, plan to the new joint space goal and visualize the plan.
187-
joint_group_positions[0] = -tau / 6; // -1/6 turn in radians
188-
move_group_interface.setJointValueTarget(joint_group_positions);
189-
190-
// We lower the allowed maximum velocity and acceleration to 5% of their maximum.
191-
// The default values are 10% (0.1).
192-
// Set your preferred defaults in the joint_limits.yaml file of your robot's moveit_config
193-
// or set explicit factors in your code if you need your robot to move faster.
194-
move_group_interface.setMaxVelocityScalingFactor(0.05);
195-
move_group_interface.setMaxAccelerationScalingFactor(0.05);
196-
197-
success = (move_group_interface.plan(my_plan) == moveit::planning_interface::MoveItErrorCode::SUCCESS);
198-
ROS_INFO_NAMED("tutorial", "Visualizing plan 2 (joint space goal) %s", success ? "" : "FAILED");
199-
200-
// Visualize the plan in RViz
201-
visual_tools.deleteAllMarkers();
202-
visual_tools.publishText(text_pose, "Joint Space Goal", rvt::WHITE, rvt::XLARGE);
203-
visual_tools.publishTrajectoryLine(my_plan.trajectory_, joint_model_group);
204-
visual_tools.trigger();
160+
// Finally, to execute the trajectory stored in :code:`my_plan`, you can use the following method call.
161+
// Note that this can lead to problems if the robot moved between planning and this call.
162+
move_group_interface.execute(my_plan);
205163
visual_tools.prompt("Press 'next' in the RvizVisualToolsGui window to continue the demo");
206164

207165
// Planning with Path Constraints
@@ -240,22 +198,18 @@ int main(int argc, char** argv)
240198
// sampling to find valid requests. Please note that this might
241199
// increase planning time considerably.
242200
//
243-
// We will reuse the old goal that we had and plan to it.
201+
// We will plan to a new pose goal.
244202
// Note that this will only work if the current state already
245-
// satisfies the path constraints. So we need to set the start
246-
// state to a new pose.
247-
moveit::core::RobotState start_state(*move_group_interface.getCurrentState());
248-
geometry_msgs::Pose start_pose2;
249-
start_pose2.orientation.w = 1.0;
250-
start_pose2.position.x = 0.55;
251-
start_pose2.position.y = -0.05;
252-
start_pose2.position.z = 0.8;
253-
start_state.setFromIK(joint_model_group, start_pose2);
254-
move_group_interface.setStartState(start_state);
255-
256-
// Now we will plan to the earlier pose target from the new
257-
// start state that we have just created.
258-
move_group_interface.setPoseTarget(target_pose1);
203+
// satisfies the path constraints.
204+
geometry_msgs::Pose target_pose2;
205+
target_pose2.orientation.w = 1.0;
206+
target_pose2.position.x = 0.55;
207+
target_pose2.position.y = -0.05;
208+
target_pose2.position.z = 0.8;
209+
210+
// Now we will plan from the current state to the new target pose that we have just created.
211+
move_group_interface.setStartStateToCurrentState();
212+
move_group_interface.setPoseTarget(target_pose2);
259213

260214
// Planning with constraints can be slow because every sample must call an inverse kinematics solver.
261215
// Lets increase the planning time from the default 5 seconds to be sure the planner has enough time to succeed.
@@ -266,12 +220,16 @@ int main(int argc, char** argv)
266220

267221
// Visualize the plan in RViz
268222
visual_tools.deleteAllMarkers();
269-
visual_tools.publishAxisLabeled(start_pose2, "start");
223+
visual_tools.publishAxisLabeled(target_pose2, "start");
270224
visual_tools.publishAxisLabeled(target_pose1, "goal");
271225
visual_tools.publishText(text_pose, "Constrained Goal", rvt::WHITE, rvt::XLARGE);
272226
visual_tools.publishTrajectoryLine(my_plan.trajectory_, joint_model_group);
273227
visual_tools.trigger();
274-
visual_tools.prompt("next step");
228+
visual_tools.prompt("Press 'next' in the RvizVisualToolsGui window to continue the demo");
229+
230+
// Execute the previous plan
231+
move_group_interface.execute(my_plan);
232+
visual_tools.prompt("Press 'next' in the RvizVisualToolsGui window to continue the demo");
275233

276234
// When done with the path constraint be sure to clear it.
277235
move_group_interface.clearPathConstraints();
@@ -280,12 +238,10 @@ int main(int argc, char** argv)
280238
// ^^^^^^^^^^^^^^^
281239
// You can plan a Cartesian path directly by specifying a list of waypoints
282240
// for the end-effector to go through. Note that we are starting
283-
// from the new start state above. The initial pose (start state) does not
241+
// from the new start target above. The initial pose (start state) does not
284242
// need to be added to the waypoint list but adding it can help with visualizations
285243
std::vector<geometry_msgs::Pose> waypoints;
286-
waypoints.push_back(start_pose2);
287-
288-
geometry_msgs::Pose target_pose3 = start_pose2;
244+
geometry_msgs::Pose target_pose3 = target_pose2;
289245

290246
target_pose3.position.z -= 0.2;
291247
waypoints.push_back(target_pose3); // down
@@ -322,10 +278,38 @@ int main(int argc, char** argv)
322278
// plans cannot currently be set through the maxVelocityScalingFactor, but requires you to time
323279
// the trajectory manually, as described `here <https://groups.google.com/forum/#!topic/moveit-users/MOoFxy2exT4>`_.
324280
// Pull requests are welcome.
281+
move_group_interface.execute(trajectory);
282+
visual_tools.prompt("Press 'next' in the RvizVisualToolsGui window to continue the demo");
283+
284+
// Planning to a joint-space goal
285+
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
325286
//
326-
// You can execute a trajectory like this. This tutorial does not actually move the robot, so this line is commented out
287+
// Let's set a joint space goal and move towards it. We will pick the initial state the robot started in at the
288+
// beginning of the tutorial
289+
std::vector<double> joint_group_positions;
290+
initial_state->copyJointGroupPositions(joint_model_group, joint_group_positions);
291+
292+
// We can directly set a joint state target
293+
move_group_interface.setJointValueTarget(joint_group_positions);
294+
move_group_interface.setStartStateToCurrentState();
295+
296+
// We lower the allowed maximum velocity and acceleration to 5% of their maximum.
297+
// The default values are 10% (0.1).
298+
// Set your preferred defaults in the joint_limits.yaml file of your robot's moveit_config
299+
// or set explicit factors in your code if you need your robot to move faster.
300+
move_group_interface.setMaxVelocityScalingFactor(0.05);
301+
move_group_interface.setMaxAccelerationScalingFactor(0.05);
327302

328-
/* move_group_interface.execute(trajectory); */
303+
// Visualize the plan in RViz
304+
visual_tools.deleteAllMarkers();
305+
visual_tools.publishText(text_pose, "Joint Space Move", rvt::WHITE, rvt::XLARGE);
306+
visual_tools.trigger();
307+
visual_tools.prompt("Press 'next' in the RvizVisualToolsGui window to continue the demo");
308+
309+
// If you do not want to inspect the planned trajectory, the following is a more robust combination of the two-step
310+
// plan+execute pattern shown above and should be preferred.
311+
move_group_interface.move();
312+
visual_tools.prompt("Press 'next' in the RvizVisualToolsGui window to continue the demo");
329313

330314
// Adding objects to the environment
331315
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0 commit comments

Comments
 (0)