se2ez
collision.cpp
Go to the documentation of this file.
1 /* Author: Zachary Kingston */
2 
3 #include <iostream>
4 
5 #include <se2ez/core.h>
6 
7 using namespace se2ez;
8 
9 int main()
10 {
12  std::make_shared<Geometry>(Geometry::BOX, Eigen::Vector2d{0.5, 0.5}, Eigen::Vector3d{0, 0, 0}) //
13  };
14 
16  std::make_shared<Geometry>(Geometry::BOX, Eigen::Vector2d{0.5, 0.5}, Eigen::Vector3d{0.1, 0, 0}), //
17  std::make_shared<Geometry>(Geometry::BOX, Eigen::Vector2d{0.5, 0.5}, Eigen::Vector3d{-0.1, 0, 0}), //
18  };
19 
20  auto f_1 = std::make_shared<Frame>("l1", // name
21  Eigen::Vector3d{0, 0, 0}, // tip offset
22  Joint::FLOAT, // type
23  Eigen::Vector3d{-1, -1, math::pi}, // lower limits
24  Eigen::Vector3d{1, 1, -math::pi}, // upper limits
25  geo1); // geometry
26 
27  auto f_2 = std::make_shared<Frame>("l2", // name
28  Eigen::Vector3d{0, 0, 0}, // tip offset
29  Joint::FLOAT, // type
30  Eigen::Vector3d{-1, -1, math::pi}, // lower limits
31  Eigen::Vector3d{1, 1, -math::pi}, // upper limits
32  geo2); // geometry
33 
34  auto robot = std::make_shared<Robot>();
35  robot->attachFrame(f_1);
36  robot->attachFrame(f_2);
37  robot->compileTree();
38 
39  Box2DCollisionManager cm(robot);
40  // cm.getACM()->disable("l2", "l1");
41 
42  auto state = std::make_shared<State>(robot);
43  for (double s = 0; s <= 3; s += 0.01)
44  {
45  state->setFloatJoint(robot, "l1", Eigen::Vector3d{0, -1.5 + s, 0});
46  state->setFloatJoint(robot, "l2", Eigen::Vector3d{0, 0, 0});
47  state->fk(robot);
48 
50  auto d = cm.distance(state, distances);
51 
52  std::cout << (cm.collide(state) ? "In Collision" : "Collision Free") << std::endl;
53  std::cout << "Distance: " << d.distance << std::endl;
54  std::cout << robot->printTree([&](const Robot::FrameDataPtr &frame) -> std::string {
55  auto f = distances.find(frame->frame->getName());
56  if (f == distances.end())
57  return "ERROR";
58 
59  const CollisionManager::SignedDistance &sd = f->second;
60 
62  ss << log::format("%1% [%2%][%3%]", sd.distance, tf::printVector(sd.point), tf::printVector(sd.normal));
63  return ss.str();
64  });
66 
67  }
68 
69  return 0;
70 }
SignedDistance distance(StatePtr &state) override
Computes the signed distance of a scene to collision.
Definition: collision.cpp:457
A rectangular prism.
Definition: geometry.h:33
Eigen::Vector2d normal
Normal vector to collision.
Definition: collision.h:81
static const double pi
Definition: math.h:32
A shared pointer wrapper for se2ez::Robot::FrameData.
T endl(T... args)
T end(T... args)
A collisions manager that uses Box2D as the underlying collision checking engine. ...
Definition: collision.h:41
A class that contains all information about the signed distance of a frame to another.
Definition: collision.h:75
T str(T... args)
T find(T... args)
Eigen::Vector2d point
Point on fixture where normal begins.
Definition: collision.h:80
int main()
Definition: collision.cpp:9
std::string printVector(const Eigen::VectorXd &v, unsigned int precision=4)
Returns a string of a vector&#39;s contents.
Definition: math.cpp:90
std::string format(const std::string &fmt, Args &&... args)
Definition: log.h:25
Main namespace.
Definition: collision.h:11
SE2EZ_EIGEN_CLASS double distance
Distance to collision.
Definition: collision.h:79
bool collide(StatePtr &state) override
Check if a state is in collision.
Definition: collision.cpp:371
Floating joint, free movement in SE(2). Uses Euclidean metric.
Definition: joint.h:41