| 602 | } |
| 603 | |
| 604 | double SDFMap::getDistWithGrad(const Eigen::Vector3d& pos, Eigen::Vector3d& grad) |
| 605 | { |
| 606 | if (!isInMap(pos)) { |
| 607 | grad.setZero(); |
| 608 | return 0; |
| 609 | } |
| 610 | |
| 611 | /* trilinear interpolation */ |
| 612 | Eigen::Vector3d pos_m = pos - 0.5 * mp_->resolution_ * Eigen::Vector3d::Ones(); |
| 613 | Eigen::Vector3i idx; |
| 614 | posToIndex(pos_m, idx); |
| 615 | Eigen::Vector3d idx_pos, diff; |
| 616 | indexToPos(idx, idx_pos); |
| 617 | diff = (pos - idx_pos) * mp_->resolution_inv_; |
| 618 | |
| 619 | double values[2][2][2]; |
| 620 | for (int x = 0; x < 2; x++) |
| 621 | for (int y = 0; y < 2; y++) |
| 622 | for (int z = 0; z < 2; z++) { |
| 623 | Eigen::Vector3i current_idx = idx + Eigen::Vector3i(x, y, z); |
| 624 | values[x][y][z] = getDistance(current_idx); |
| 625 | } |
| 626 | |
| 627 | double v00 = (1 - diff[0]) * values[0][0][0] + diff[0] * values[1][0][0]; |
| 628 | double v01 = (1 - diff[0]) * values[0][0][1] + diff[0] * values[1][0][1]; |
| 629 | double v10 = (1 - diff[0]) * values[0][1][0] + diff[0] * values[1][1][0]; |
| 630 | double v11 = (1 - diff[0]) * values[0][1][1] + diff[0] * values[1][1][1]; |
| 631 | double v0 = (1 - diff[1]) * v00 + diff[1] * v10; |
| 632 | double v1 = (1 - diff[1]) * v01 + diff[1] * v11; |
| 633 | double dist = (1 - diff[2]) * v0 + diff[2] * v1; |
| 634 | |
| 635 | grad[2] = (v1 - v0) * mp_->resolution_inv_; |
| 636 | grad[1] = ((1 - diff[2]) * (v10 - v00) + diff[2] * (v11 - v01)) * mp_->resolution_inv_; |
| 637 | grad[0] = (1 - diff[2]) * (1 - diff[1]) * (values[1][0][0] - values[0][0][0]); |
| 638 | grad[0] += (1 - diff[2]) * diff[1] * (values[1][1][0] - values[0][1][0]); |
| 639 | grad[0] += diff[2] * (1 - diff[1]) * (values[1][0][1] - values[0][0][1]); |
| 640 | grad[0] += diff[2] * diff[1] * (values[1][1][1] - values[0][1][1]); |
| 641 | grad[0] *= mp_->resolution_inv_; |
| 642 | |
| 643 | return dist; |
| 644 | } |
| 645 | |
| 646 | vector<Eigen::Vector3i> SDFMap::allNeighbors(const Eigen::Vector3i& voxel) |
| 647 | { |