Robowflex  v0.1
Making MoveIt Easy
fetch_robowflex_plan.cpp
Go to the documentation of this file.
1 #include <chrono>
2 #include <thread>
3 
4 #include <ompl/geometric/planners/rrt/RRTConnect.h>
5 
12 #include <robowflex_library/tf.h>
13 #include <robowflex_library/util.h>
14 
15 #include <robowflex_dart/gui.h>
17 #include <robowflex_dart/robot.h>
18 #include <robowflex_dart/space.h>
19 #include <robowflex_dart/tsr.h>
20 #include <robowflex_dart/world.h>
21 
22 using namespace robowflex;
23 
24 static const std::string GROUP = "arm_with_torso";
25 
26 int main(int argc, char **argv)
27 {
28  // Startup ROS
29  ROS ros(argc, argv);
30 
31  //
32  // Standard Robowflex setup
33  // Create the default Fetch robot and scene.
34  //
35  auto fetch = std::make_shared<FetchRobot>();
36  fetch->initialize();
37 
38  auto scene = std::make_shared<Scene>(fetch);
39  scene->fromYAMLFile("package://robowflex_library/yaml/test_fetch_wall.yml");
40 
41  //
42  // Convert to Dart
43  //
44  auto fetch_dart = std::make_shared<darts::Robot>(fetch);
45  auto fetch_name = fetch_dart->getName();
46  auto scene_dart = std::make_shared<darts::Structure>("scene", scene);
47  auto ground = std::make_shared<darts::Structure>("ground");
48  ground->addGround(-0.2);
49 
50  // Setup world
51  auto world = std::make_shared<darts::World>();
52  world->addRobot(fetch_dart);
53  world->addStructure(scene_dart);
54  world->addStructure(ground);
55 
56  //
57  // Setup Planning
58  //
59  darts::PlanBuilder builder(world);
60  builder.addGroup(fetch_name, GROUP);
61 
62  //
63  // Sample Start from TSR
64  //
65  darts::TSR::Specification start_spec;
66  start_spec.setFrame(fetch_name, "wrist_roll_link", "base_link");
67  start_spec.setPose(-0.2, 0.6, 0.92, //
68  0.5, -0.5, 0.5, 0.5);
69 
70  darts::TSR start_tsr(world, start_spec);
71  start_tsr.useGroup(GROUP);
72  start_tsr.initialize();
73  start_tsr.solveWorld();
75 
76  //
77  // Create constraint
78  //
79  darts::TSR::Specification constraint_spec;
80  constraint_spec.setFrame(fetch_name, "wrist_roll_link", "base_link");
81  constraint_spec.setPose(0.3, 0.8, 0.92, //
82  0.5, -0.5, 0.5, 0.5);
83 
84  double table = 0.5;
85  constraint_spec.setXPosTolerance(-table, table);
86  constraint_spec.setYPosTolerance(-table, table);
87 
88  auto constraint_tsr = std::make_shared<darts::TSR>(world, constraint_spec);
89  builder.addConstraint(constraint_tsr);
90 
91  //
92  // Initialize and setup
93  //
94  builder.initialize();
95 
96  //
97  // Setup Goal
98  //
99  darts::TSR::Specification goal_spec;
100  goal_spec.setFrame(fetch_name, "wrist_roll_link", "base_link");
101  goal_spec.setPose(0.5, 0.6, 0.92, //
102  0.5, -0.5, 0.5, 0.5);
103 
104  auto goal_tsr = std::make_shared<darts::TSR>(world, goal_spec);
105  auto goal = builder.getGoalTSR(goal_tsr);
106  builder.setGoal(goal);
107 
108  //
109  // Setup Planner
110  //
111 
112  auto rrt = std::make_shared<ompl::geometric::RRTConnect>(builder.info, true);
113  rrt->setRange(2);
114  builder.ss->setPlanner(rrt);
115 
116  builder.setup();
117 
118  if (builder.ss->getOptimizationObjective())
119  builder.ss->getOptimizationObjective()->setCostThreshold(
120  ompl::base::Cost(std::numeric_limits<double>::infinity()));
121 
122  darts::Window window(world);
123  window.run([&] {
125  while (true)
126  {
127  goal->startSampling();
128  ompl::base::PlannerStatus solved = builder.ss->solve(60.0);
129  goal->stopSampling();
130 
132  if (solved)
133  {
134  RBX_INFO("Found solution!");
135  window.animatePath(builder, builder.getSolutionPath());
136  }
137  else
138  RBX_WARN("No solution found");
139 
140  builder.ss->clear();
141  }
142  });
143 
144  return 0;
145 }
RAII-pattern for starting up ROS.
Definition: util.h:52
A helper class to setup common OMPL structures for planning.
void setGoal(const ompl::base::GoalPtr &goal)
Set the goal for the problem.
void setStartConfigurationFromWorld()
Set the start configuration from the current state of the world.
void addConstraint(const TSRPtr &tsr)
Adds a TSR as a path constraint to the problem.
void setup()
Calls setup routines on OMPL structures. Call after all setup is done and builder is initialized.
void initialize()
Initialize OMPL structures. Only call this once all constraints, groups, and other parameters have be...
ompl::base::SpaceInformationPtr info
Actual Space Information.
TSRGoalPtr getGoalTSR(const TSRPtr &tsr)
Set a TSR as the goal for the planning problem (will create a TSRGoal)
ompl::geometric::PathGeometric getSolutionPath(bool simplify=true, bool interpolate=true) const
Get the solution path from a successful plan.
ompl::geometric::SimpleSetupPtr ss
Simple Setup.
void addGroup(const std::string &robot, const std::string &name, std::size_t cyclic=0)
Add a robot's planning group to the controlled DoF in the state space.
The specification of a TSR.
Definition: tsr.h:70
void setPose(const RobotPose &other)
Set the pose of the TSR.
Definition: tsr.cpp:93
void setFrame(const std::string &structure, const std::string &target, const std::string &base=magic::ROOT_FRAME)
Set the base and target frame.
Definition: tsr.cpp:48
void setYPosTolerance(double bound)
Set the Y position tolerance to (-bound, bound).
Definition: tsr.cpp:133
void setXPosTolerance(double bound)
Setting Position Tolerances.
Definition: tsr.cpp:128
A Task Space Region (TSR). TSRs are workspace regions that impose a constraints on a robot....
Definition: tsr.h:63
void initialize()
Initialize this TSR. Creates IK node attached to body node in world.
Definition: tsr.cpp:839
bool solveWorld()
Solve for a satisfying configuration given the current state of the world.
Definition: tsr.cpp:692
void useGroup(const std::string &name)
Use the joints in a robot's group. Robot used is the target frame's structure.
Definition: tsr.cpp:492
Open Scene Graph GUI for DART visualization.
Definition: gui.h:67
void run(std::function< void()> thread={})
Run the GUI. Blocks.
Definition: gui.cpp:231
void animatePath(const StateSpacePtr &space, const ompl::geometric::PathGeometric &path, std::size_t times=1, double fps=60, bool block=true)
Animate a motion plan using the world.
Definition: gui.cpp:160
int main(int argc, char **argv)
static const std::string GROUP
#define RBX_WARN(fmt,...)
Output a warning logging message.
Definition: log.h:110
#define RBX_INFO(fmt,...)
Output a info logging message.
Definition: log.h:118
Main namespace. Contains all library classes and functions.
Definition: scene.cpp:25
Functions for loading and animating scenes in Blender.
T sleep_for(T... args)