일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ROS
- 인공지능
- U-blox
- 젯슨
- Gazebo
- WSL2
- GUI
- QT
- 자율탐사
- RTK
- 아두이노
- GPS
- Jetson
- ubuntu
- Simulation
- turtlesim
- Puck LITE
- C++
- ROS2
- 자율주행
- turtlebot3
- 티스토리챌린지
- 강화학습
- SLAM
- 로봇
- 터틀심
- Visual SLAM
- WSL
- ZED2
- 오블완
- Today
- Total
직관적인느낌
자동으로 지형을 그려보자 본문
장애물과 부딪히지 않으며 로봇 맵핑하기: 라이다 기반 자동 맵핑 기법
로봇이 환경을 탐색하고 맵을 생성하는 과정에서 가장 큰 과제 중 하나는 **장애물 회피(Obstacle Avoidance)**입니다. 특히 로봇 청소기와 같은 자율 이동 로봇의 경우, 주변의 장애물을 피하면서 실시간으로 맵을 만들어야 합니다. 이번 포스팅에서는 2D 라이다(LiDAR)와 엔코더만을 사용해 로봇이 장애물과 충돌하지 않고 안전하게 맵을 생성하는 방법에 대해 설명드리겠습니다.
라이다와 엔코더를 이용한 맵핑의 기본 원리
로봇이 실내나 실외의 환경을 자동으로 탐색하면서 맵을 만드는 것을 **SLAM (Simultaneous Localization and Mapping)**이라고 합니다. SLAM은 로봇이 자신의 위치를 파악하면서 주변 지도를 동시에 작성하는 기술입니다. 이를 위해 라이다 센서와 엔코더를 활용합니다.
- 라이다(LiDAR): 주변 환경의 거리를 측정해 2D 점 클라우드를 생성합니다. 이를 통해 로봇은 벽이나 장애물의 위치를 파악할 수 있습니다.
- 엔코더: 로봇의 바퀴 회전수를 측정해 로봇의 이동 거리와 방향을 추정합니다. 엔코더 데이터를 통해 로봇의 상대적인 이동을 계산할 수 있습니다.
라이다와 엔코더 데이터를 통합하여 로봇은 자신이 있는 위치와 주변의 환경 정보를 지속적으로 업데이트합니다. 이를 통해 로봇은 점차적으로 지도를 작성하고 자신의 위치를 정교하게 파악하게 됩니다.
장애물 회피를 위한 접근 방식
장애물과 부딪히지 않으면서 맵을 생성하기 위해서는 **경로 계획(Path Planning)**과 장애물 회피(Obstacle Avoidance) 기법이 필수적입니다. 여기서는 이러한 장애물 회피 전략들을 소개합니다.
1. 벽을 따라 움직이기 (Wall Following)
로봇이 환경을 탐색할 때, 벽을 따라 이동하는 방식으로 장애물에 부딪히지 않도록 할 수 있습니다. 라이다 센서로 벽과의 거리를 지속적으로 측정하면서 안전 거리를 유지하는 방식입니다. 이를 위해 PID 제어기를 사용하여 벽과의 거리를 일정하게 유지하면서 로봇이 자연스럽게 움직이도록 할 수 있습니다.
- PID 제어기를 통해 벽과의 간격을 유지하며 로봇의 회전과 이동 속도를 조절합니다. 벽을 따라 이동함으로써 로봇은 주변의 환경을 안정적으로 스캔하고, 점차 맵을 작성해 나갑니다.
2. 인공 잠재장 (Artificial Potential Field, APF) 사용
인공 잠재장(APF) 기법은 로봇이 목표 지점을 향해 이동하면서 장애물을 회피하도록 돕는 기법입니다.
- 목표 지점 인력: 로봇은 목표 지점에 의해 끌리는 것처럼 움직입니다.
- 장애물 반발력: 로봇이 장애물에 가까워지면 장애물로부터 밀려나는 힘을 받습니다.
라이다 데이터를 통해 주변 장애물의 위치를 파악하고, 목표 지점으로 가는 방향과 장애물 회피 방향을 조합해 최적의 이동 경로를 계산합니다. 이를 통해 로봇은 목표에 끌리면서도 장애물에 부딪히지 않도록 움직입니다.
**인공 잠재장 (Artificial Potential Field, APF)**는 로봇 공학에서 **장애물 회피(Obstacle Avoidance)**와 목표 지향 이동을 위해 사용하는 대표적인 방법 중 하나입니다. 이 접근법은 로봇이 움직이는 동안 장애물과 목표물 사이에서 균형을 유지하도록 설계되었습니다. 마치 로봇이 주변 환경에 의해 '끌리거나 밀리는' 힘을 받으며 움직이는 것처럼 동작합니다.
인공 잠재장의 기본 개념
인공 잠재장 방법에서는 로봇을 목표 지점까지 안내하고 장애물을 피하기 위해 두 가지 힘이 가해진다고 생각합니다:
- 인력 (Attractive Force): 로봇을 목표 지점으로 끌어당기는 힘입니다.
- 반발력 (Repulsive Force): 장애물로부터 로봇을 밀어내는 힘입니다.
이 두 가지 힘의 조합을 통해 로봇은 안전한 경로로 목표를 향해 이동하게 됩니다.
인공 잠재장을 비유로 이해하기
- 목표 지점은 자석과 같다고 생각할 수 있습니다. 로봇은 목표 지점에 의해 끌어당겨지는 것처럼 느껴집니다.
- 장애물들은 밀어내는 벽과 같아서, 로봇이 너무 가까워지면 강한 밀어내는 힘을 느껴 회피하게 됩니다.
- 로봇은 목표 지점의 인력과 장애물의 반발력을 동시에 고려하여 그 결과로 최적의 경로를 따라 이동하게 됩니다.
수학적 설명
인공 잠재장은 수학적으로 **잠재장 함수(Potential Field Function)**로 정의되며, 로봇의 현재 위치와 목표 및 장애물의 상대적인 위치를 기준으로 계산됩니다.
- 목표로부터의 인력 (Attractive Potential): 목표 지점에 가까워질수록 인력은 강해지며, 이는 로봇이 목표에 접근하도록 유도합니다. 일반적으로 인력은 목표와의 거리로 정의됩니다.
- 예를 들어, 인력 F_a는 다음과 같이 정의될 수 있습니다:
- 여기서 k_a는 인력의 세기를 조절하는 상수, x는 로봇의 현재 위치, x_goa은 목표 지점의 위치입니다.
- 예를 들어, 인력 F_a는 다음과 같이 정의될 수 있습니다:
- 장애물로부터의 반발력 (Repulsive Potential): 장애물에 가까워질수록 반발력은 커져서 로봇이 장애물과의 충돌을 피하도록 합니다. 반발력은 장애물로부터의 거리의 역수로 정의되어, 가까워질수록 힘이 급격히 커집니다.
- 예를 들어, 반발력 F_r는 다음과 같이 정의될 수 있습니다:
- 여기서 kr는 반발력의 세기를 조절하는 상수, d는 로봇과 장애물 사이의 거리, d0는 반발력이 작용하기 시작하는 임계 거리입니다. d가 d0보다 크면 반발력이 0으로 설정됩니다.
- 예를 들어, 반발력 F_r는 다음과 같이 정의될 수 있습니다:
- 총 합력 (Total Force): 로봇이 받는 총 합력은 인력과 반발력의 벡터 합으로 결정됩니다.
로봇은 이 총 합력의 방향으로 이동하게 됩니다.
인공 잠재장의 특징
- 장점:
- 구현이 비교적 간단합니다. 로봇의 현재 위치, 목표, 그리고 장애물의 위치를 이용해 힘의 벡터를 계산하여 이동 방향을 정합니다.
- 실시간으로 장애물과의 거리와 목표 지점을 고려하여 로봇의 경로를 계산하기 때문에 빠른 대응이 가능합니다.
- 단점:
- 지역 최소점(Local Minimum) 문제: 인공 잠재장 방식은 종종 로봇이 목표에 도달하기 전에 지역 최소점에 갇히는 문제가 발생합니다. 예를 들어, 목표로 가는 길에 장애물들이 특정 모양으로 놓여 있으면 로봇이 이들 사이에서 더 이상 진행하지 못하게 될 수 있습니다.
- 복잡한 환경에서 경로가 매끄럽지 않거나 비효율적인 경로를 생성할 수 있습니다.
인공 잠재장 방법의 적용
인공 잠재장을 사용해 라이다와 같은 센서만으로 장애물을 피하면서 맵핑하는 경우, 다음과 같은 방법으로 적용할 수 있습니다:
- 라이다를 통한 장애물 탐지: 라이다 센서를 통해 주변 장애물의 위치와 거리를 실시간으로 측정합니다.
- 장애물로부터의 반발력 계산: 장애물들의 위치를 기준으로 반발력을 계산하고, 로봇이 각 장애물로부터 밀리는 방향과 세기를 결정합니다.
- 목표 지점 인력 계산: 목표 지점을 향한 인력을 계산하여 로봇이 목표로 이동하는 방향을 결정합니다.
- 합력 계산 및 이동: 각 방향에서의 반발력과 인력을 합하여 최종적인 이동 방향과 세기를 결정합니다. 이를 바탕으로 로봇의 속도와 회전 방향을 설정합니다.
예시
로봇이 방 안을 이동하며 맵핑을 하는 상황에서:
- 목표: 방의 다른 구역을 탐색하여 맵을 완성하는 것.
- 장애물: 가구, 벽 등.
- 로봇은 목표 지점을 설정한 뒤 장애물을 감지하면 즉시 반발력을 계산하여 방향을 변경하면서 충돌을 피합니다.
- 로봇의 움직임은 마치 장애물에서 멀어지면서 동시에 목표에 끌려가는 것처럼 보입니다.
결론
인공 잠재장 (APF) 방법은 로봇이 목표 지점으로 이동하면서 장애물을 피할 수 있도록 인력과 반발력을 적용하여 제어하는 방식입니다. 이 방법은 구현이 간단하고 실시간 성능이 뛰어나지만, 환경의 복잡도에 따라 지역 최소점에 갇히는 문제가 있을 수 있습니다. 이러한 특성 때문에 APF는 종종 장애물 회피의 기초 방법으로 많이 사용되며, 로봇 청소기나 모바일 로봇이 장애물을 피하면서 환경을 탐색하는 데 유용하게 적용됩니다.
라이다 데이터를 사용하여 인공 잠재장(Artificial Potential Field, APF)을 구현하는 것은 라이다로부터 얻은 거리 데이터를 바탕으로 실시간으로 인력과 반발력을 계산하고, 이를 통해 로봇의 움직임을 제어하는 것입니다. 여기서는 라이다 데이터를 바탕으로 인공 잠재장을 구현하는 구체적인 방법을 단계별로 설명드리겠습니다.
1. 라이다 데이터 수집
- **라이다(LiDAR)**는 주기적으로 주변의 거리 정보를 제공하며, 이 정보는 특정 각도에서 측정된 거리의 배열로 나타납니다.
- 예를 들어, 라이다가 360도 스캔을 할 경우, 로봇 주위의 각도(0도에서 360도)에 대해 각 장애물까지의 거리 정보를 제공하게 됩니다.
- 이 거리 데이터는 로봇의 현재 위치를 기준으로 주변에 있는 장애물의 위치를 추정하는 데 사용됩니다.
2. 장애물로부터의 반발력 계산
- **반발력(Repulsive Force)**은 장애물과의 거리 dd가 가까워질수록 커져서 로봇을 밀어내는 역할을 합니다.
- 각 라이다 데이터 포인트에 대해 다음과 같은 과정을 거칩니다:
- 라이다에서 측정된 각도와 거리를 이용해 장애물의 위치를 **극좌표(polar coordinate)**에서 **직교좌표(cartesian coordinate)**로 변환합니다.
- 장애물과의 거리가 dd일 때, 반발력 FrF_r는 다음과 같이 정의됩니다: Fr=kr⋅(1d−1d0)⋅1d2F_r = k_r \cdot \left( \frac{1}{d} - \frac{1}{d_0} \right) \cdot \frac{1}{d^2} 여기서:
- krk_r는 반발력의 세기 조절 상수입니다.
- dd는 로봇과 장애물 간의 거리입니다.
- d0d_0는 반발력이 작용하기 시작하는 임계 거리입니다. d>d0d > d_0일 때는 Fr=0F_r = 0으로 설정하여 반발력이 작용하지 않도록 합니다.
- 각 장애물로부터 오는 반발력을 벡터 합으로 표현합니다.
- 장애물 각각에 대해 계산된 반발력의 벡터를 모두 합하여 로봇에 가해지는 총 반발력을 구합니다.
3. 목표 지점으로의 인력 계산
- 목표 지점은 로봇이 향해야 할 지점으로, 인력(Attractive Force)을 통해 로봇을 그 방향으로 끌어당깁니다.
- 목표 지점의 위치를 알고 있다면, 인력은 다음과 같이 계산할 수 있습니다: Fa=−ka⋅(x−xgoal)F_a = -k_a \cdot (x - x_{goal}) 여기서:
- kak_a는 인력의 세기 조절 상수입니다.
- xx는 로봇의 현재 위치이고, xgoalx_{goal}은 목표 지점의 위치입니다.
- 목표 지점까지의 직선 벡터를 구한 후, 그 방향으로 로봇이 끌려가도록 힘을 적용합니다.
4. 총 합력 계산 및 이동 방향 결정
- 로봇에 작용하는 총 합력은 인력과 반발력의 합으로 결정됩니다. Ftotal=Fa+∑FrF_{total} = F_a + \sum F_r
- 여기서 FaF_a는 목표로부터의 인력, FrF_r는 장애물로부터의 반발력입니다.
- 총합 벡터를 계산하면 로봇은 이 벡터의 방향과 크기를 바탕으로 움직이게 됩니다.
- 이 힘을 바탕으로 로봇의 방향과 속도를 설정합니다. 예를 들어:
- 총 합력의 벡터가 양의 방향이라면, 로봇은 그 방향으로 회전 및 전진하게 됩니다.
- 벡터의 크기에 따라 로봇의 이동 속도를 조절합니다. 장애물이 많아 반발력이 큰 경우 속도를 줄여 움직임을 조심스럽게 조정합니다.
5. 로봇 동작 제어 알고리즘
라이다 데이터와 인공 잠재장을 바탕으로 로봇이 어떻게 동작할지 제어하는 알고리즘의 흐름은 다음과 같습니다.
- 라이다 데이터 수집: 라이다 센서를 통해 로봇 주변의 장애물 거리 정보를 수집합니다.
- 각 장애물에 대해 반발력 계산: 장애물의 위치를 이용해 각 장애물로부터 오는 반발력을 계산합니다.
- 목표 지점 인력 계산: 목표 지점의 위치를 바탕으로 목표에서 오는 인력을 계산합니다.
- 총 합력 계산: 인력과 모든 반발력의 합을 계산하여 로봇의 이동 방향과 속도를 결정합니다.
- 로봇 제어: 총 합력 벡터의 방향으로 로봇을 제어합니다.
- 루프 반복: 실시간으로 라이다 데이터를 수집하여 위 과정을 반복합니다.
#include <iostream>
#include <vector>
#include <cmath>
#include <utility>
struct Point {
double x;
double y;
};
// 반발력 계산 함수
Point calculateRepulsiveForce(const std::vector<std::pair<double, double>>& lidarData, double d0, double kr) {
Point totalForce = {0.0, 0.0};
for (const auto& data : lidarData) {
double angle = data.first;
double distance = data.second;
if (distance < d0) {
double repulsiveStrength = kr * (1.0 / distance - 1.0 / d0) * (1.0 / (distance * distance));
totalForce.x += repulsiveStrength * cos(angle);
totalForce.y += repulsiveStrength * sin(angle);
}
}
return totalForce;
}
// 인력 계산 함수
Point calculateAttractiveForce(const Point& currentPosition, const Point& goalPosition, double ka) {
Point attractiveForce;
attractiveForce.x = -ka * (currentPosition.x - goalPosition.x);
attractiveForce.y = -ka * (currentPosition.y - goalPosition.y);
return attractiveForce;
}
// 총합 계산 및 로봇 제어
Point controlRobot(const Point& currentPosition, const Point& goalPosition, const std::vector<std::pair<double, double>>& lidarData, double d0, double ka, double kr) {
Point repulsiveForce = calculateRepulsiveForce(lidarData, d0, kr);
Point attractiveForce = calculateAttractiveForce(currentPosition, goalPosition, ka);
Point totalForce;
totalForce.x = repulsiveForce.x + attractiveForce.x;
totalForce.y = repulsiveForce.y + attractiveForce.y;
return totalForce;
}
int main() {
// 라이다 데이터: 각도(라디안)와 거리의 쌍 (예시 데이터)
std::vector<std::pair<double, double>> lidarData = {
{0.0, 1.0}, {M_PI / 4, 0.5}, {M_PI / 2, 1.2}, {3 * M_PI / 4, 0.8}
};
// 로봇의 현재 위치와 목표 위치
Point currentPosition = {0.0, 0.0};
Point goalPosition = {5.0, 5.0};
// 인력과 반발력의 세기 설정
double d0 = 1.0; // 반발력이 작용하는 임계 거리
double ka = 1.0; // 인력의 세기
double kr = 0.5; // 반발력의 세기
// 총합 힘 계산
Point totalForce = controlRobot(currentPosition, goalPosition, lidarData, d0, ka, kr);
// 결과 출력
std::cout << "Total Force - X: " << totalForce.x << ", Y: " << totalForce.y << std::endl;
return 0;
}
3. 벡터 필드 히스토그램 (Vector Field Histogram, VFH)
VFH(Vector Field Histogram) 기법은 라이다 데이터를 기반으로 주변의 장애물 밀도를 계산하고, 가장 안전한 방향을 찾아내는 방식입니다.
- 라이다로 수집된 데이터를 바탕으로 각 방향에서의 장애물 밀도를 분석합니다.
- 안전한 경로를 선택해 로봇을 이동시키며, 이 과정에서 로봇이 장애물에 충돌하지 않도록 합니다.
VFH는 실시간으로 장애물의 위치를 분석하며, 로봇이 안전하게 탐색을 이어나갈 수 있도록 경로를 설정합니다.
장애물 회피와 SLAM 통합
장애물 회피 알고리즘을 SLAM과 통합하면 로봇은 맵을 작성하면서도 장애물을 회피할 수 있습니다. 예를 들어 GMapping, Cartographer와 같은 SLAM 알고리즘을 활용해 맵을 생성하면서도 라이다 데이터를 통해 장애물을 감지하고 회피 경로를 설정할 수 있습니다.
- 로봇이 이동하면서 라이다로 장애물을 감지하면, 경로 계획 알고리즘을 통해 회피 경로를 결정합니다.
- 회피 동작을 수행하면서 SLAM 알고리즘을 통해 로봇의 위치와 주변 맵을 지속적으로 업데이트합니다.
이와 같은 과정을 통해 로봇은 실시간으로 장애물을 피하면서 새로운 맵을 생성할 수 있습니다.
로봇 제어의 구현 예시
아래는 간단한 로봇 제어의 흐름입니다:
- 라이다 데이터 수집: 로봇이 주변 환경을 스캔해 거리 데이터를 수집합니다.
- 안전 경로 계산: 라이다 데이터를 바탕으로 장애물과의 거리 정보를 분석해 안전한 이동 방향을 계산합니다.
- 로봇의 회전과 이동: 계산된 안전한 방향으로 회전하고, 속도를 조절하여 로봇을 이동시킵니다.
- 맵 업데이트: 이동하면서 라이다 데이터로 맵을 지속적으로 업데이트해 환경을 완성합니다.
이 과정을 반복하면서 로봇은 안전하게 환경을 탐색하고, 장애물에 부딪히지 않으며 맵을 작성할 수 있게 됩니다.
결론
라이다와 엔코더를 사용해 장애물과 부딪히지 않으면서 맵을 생성하는 것은 자율 로봇의 핵심 기술 중 하나입니다. 라이다를 통해 실시간으로 주변 환경을 인식하고, 다양한 장애물 회피 기법(APF, VFH, 벽 따라가기 등)을 활용하여 로봇은 안전하게 목표 지점으로 이동하며 맵을 작성할 수 있습니다.
SLAM 알고리즘과 장애물 회피 기법을 통합하여 로봇이 스스로 위치를 파악하고 환경을 탐색하는 것은 로봇 공학의 중요한 발전 방향입니다. 이러한 기법을 이용해 로봇이 더욱 스마트하게 움직이고, 다양한 환경에서 자율적으로 동작할 수 있도록 구현해 보세요!
'자율주행' 카테고리의 다른 글
자율탐사와 Wall Following은 뭐가 다른걸까? (1) | 2024.11.21 |
---|---|
자율 탐사 알고리즘의 심층 분석 (0) | 2024.11.21 |
모듈 간 통합 및 데이터 흐름 - 도식 (0) | 2024.09.13 |
ACS 구조 설계 (0) | 2024.09.13 |
공장 자동화를 위한 로봇 솔루션 - 개념 및 접근, 개발 (1) | 2024.09.13 |