155 const std::vector<obstacleInput>& obstacles,
156 std::vector<distanceResult>& distances)
164 int robot_geom_num = geom_model.ngeoms;
166 geom_model.removeAllCollisionPairs();
167 broad_phase_geom_model.removeAllCollisionPairs();
172 for (
const auto& obstacle : obstacles)
175 pinocchio::GeometryObject::CollisionGeometryPtr collision_geometry;
176 pinocchio::GeometryObject::CollisionGeometryPtr collision_geometry_broad;
177 std::string mesh_path =
"";
178 Eigen::Vector3d mesh_scale = Eigen::Vector3d::Ones();
181 std::visit([&collision_geometry, &collision_geometry_broad, &mesh_path, &mesh_scale, &broad_phase_collision_padding](
auto&& arg) {
182 using T = std::decay_t<
decltype(arg)>;
183 if constexpr (std::is_same_v<T, coal::Sphere>) {
184 collision_geometry = std::make_shared<coal::Sphere>(arg);
185 collision_geometry_broad = std::make_shared<coal::Sphere>(arg.radius + broad_phase_collision_padding);
186 mesh_path =
"SPHERE";
187 mesh_scale = Eigen::Vector3d::Ones() * arg.radius;
189 }, obstacle.obstacle);
192 pinocchio::GeometryObject geom_object(
193 "Obstacle_" + std::to_string(i_obstacle),
195 pinocchio::SE3(obstacle.obstacle_pose),
200 Eigen::Vector4d(0.5, 0.5, 0.5, 1.0)
202 geom_model.addGeometryObject(geom_object);
205 pinocchio::GeometryObject broad_geom_object(
206 "Obstacle_" + std::to_string(i_obstacle),
208 pinocchio::SE3(obstacle.obstacle_pose),
209 collision_geometry_broad,
213 Eigen::Vector4d(0.5, 0.5, 0.5, 1.0)
215 broad_phase_geom_model.addGeometryObject(broad_geom_object);
220 for(
int i = 0; i < robot_geom_num; i++){
221 if(broad_phase_geom_model.geometryObjects[i].disableCollision ==
false){
222 broad_phase_geom_model.addCollisionPair(pinocchio::CollisionPair(robot_geom_num + i_obstacle, i));
230 pinocchio::GeometryData broad_phase_geom_data(broad_phase_geom_model);
233 pinocchio::updateGeometryPlacements(
model_,
data_, broad_phase_geom_model, broad_phase_geom_data);
234 pinocchio::computeCollisions(broad_phase_geom_model, broad_phase_geom_data);
236 for (
size_t i = 0; i < broad_phase_geom_data.collisionResults.size(); ++i) {
237 const auto& result = broad_phase_geom_data.collisionResults[i];
238 if (result.isCollision()) {
239 geom_model.addCollisionPair(pinocchio::CollisionPair(
240 broad_phase_geom_model.collisionPairs[i].first,
241 broad_phase_geom_model.collisionPairs[i].second));
245 for(
int j_obstacle = 0; j_obstacle < i_obstacle; j_obstacle++)
247 for(
int i = 0; i < robot_geom_num; i++){
248 if(geom_model.geometryObjects[i].disableCollision ==
false){
249 geom_model.addCollisionPair(pinocchio::CollisionPair(robot_geom_num + j_obstacle, i));
256 pinocchio::GeometryData geom_data(geom_model);
257 pinocchio::updateGeometryPlacements(
model_,
data_, geom_model, geom_data);
258 pinocchio::computeDistances(geom_model, geom_data);
261 for (
int i = 0; i < geom_data.distanceResults.size(); i++)
263 const auto& distance = geom_data.distanceResults[i];
264 const auto& robot_geom = geom_model.geometryObjects[geom_model.collisionPairs[i].second];
265 Eigen::Vector3d seperation_vector = (distance.nearest_points[1] - distance.nearest_points[0]).normalized();
266 Eigen::MatrixXd jacobian_matrix;
267 this->
jacobianFrame(q, robot_geom.parentFrame, jacobian_matrix);
268 Eigen::VectorXd projector_control_to_dist = seperation_vector.transpose() * jacobian_matrix.topRows(3);
269 Eigen::VectorXd projector_dist_to_control;
272 projector_dist_to_control = (1.0 / projector_control_to_dist.norm() / projector_control_to_dist.norm()) * projector_control_to_dist.transpose();
275 Eigen::VectorXd seperation_twist = Eigen::VectorXd::Zero(6);
276 seperation_twist.head(3) = seperation_vector;
277 Eigen::MatrixXd JJt = jacobian_matrix * jacobian_matrix.transpose();
280 projector_dist_to_control = jacobian_matrix.transpose() * (JJt + damped_identity).ldlt().solve(seperation_twist);
281 projector_control_to_dist = (1.0 / projector_dist_to_control.norm() * projector_dist_to_control.norm()) * projector_dist_to_control.transpose();
287 distance.min_distance,
289 distance.nearest_points[1],
290 distance.nearest_points[0],
292 projector_control_to_dist,
293 projector_dist_to_control