반응형

 

논문 링크입니다.

https://arxiv.org/pdf/1502.00956v2.pdf

2015년 2월 발행

 

0. Title

ORB-SLAM: a Versatile and Accurate Monocular SLAM System 

=> ORB SLAM에 대한 논문인 것 같다..

다용도의(혹은 변하기 쉬운) 정확한 단안 SLAM 시스템

 

1. Abstract

이 논문은 ORB-SLAM에 대해 소개하고 있다.

ORB-SLAM은 피쳐 베이스의 단안 SLAM 시스템이다.

ORB-SLAM은 실시간에서도, 좁거나 넓은 환경에서도, 실내나 실외 환경에서도 작동한다.

 

이 시스템은 심각한 motion clutter(움직임이 정돈되지 않고 어지러운 현상?)에 강하고

다양한 loop closing과 relocalization 베이스라인을 허용하고

완전 자동 초기화를 포함한다.  

 

우리는 모든 SLAM 과정(tracking, mapping, relocalization, and loop closing)에서 동일한 피쳐를 사용하는 새로운 시스템을 만들었다.

reconstruction의 포인트와 키프레임을 선택하는 전략으로 인해

어려운 상황에서도 잘 동작하며(robustness), 간결하고 추적 가능한 map을 생성할 수 있었다.

 

 

2. Conclusion and Decision

- 1) Conclusions

현재까지는 실시간 단안 SLAM 기법 중에 PTAM 이 가장 정확하다고 여겨진다. (https://www.robots.ox.ac.uk/~gk/publications/KleinMurray2007ISMAR.pdf)

PTAM의 백엔드가 bundle adjustment(ba)인 것은 우연이 아니다.

BA는 오프라인 Structure from Motion(SFM) 문제에서 표준으로 잘 알려져 있다.

 

PTAM의 가장 큰 성공 요인 중 하나는,

BA를 SLAM에 가져오고 실시간 환경에서 적용했다는 것이다.

 

우리 연구의 주요한 기여는 PTAM의 versatility를 확장시킴으로써 

다루기 힘든 환경에서 사용할 수 있게 만든 것이다. 

이를 위해, 아래의 요소들을 제외한 알고리즘을 바닥부터 설계하였다.

- Loop Detection (http://doriangalvez.com/papers/GalvezTRO12.pdf)

- Loop Closure procedure (http://www.roboticsproceedings.org/rss06/p10.pdf)  and Covisibility Graph (https://www.doc.ic.ac.uk/~ajd/Publications/strasdat_etal_iccv2011.pdf)

- the Optimization framework g2o (https://mengwenhe-cmu.github.io/Reading-Reports/Research/Localization/Graph_Optimization/g2o_A_General_Framework_for_Graph_Optimization/paper.pdf)

- ORB features (http://www.gwylab.com/download/ORB_2012.pdf)

 

 

우리는 spawn과 cull keyframes으로 매 프레임마다 키프레임을 생성할 수 있도록 하였다.

이것은 불필요하다면 결과적으로 제거되도록 설계되어 있다.

이렇게 유동적으로 map을 다룰 수 있는 기능

공회전이나 빠른 움직임과 같은 조건이 좋지 않은 상황에 매우 유리하다.

왜냐하면 동일한 곳에서 반복적으로 운영했을 때,

장면이 바뀔 때에만 map이 확장하기 때문이다.

 

 

- 2) Sparse/Feature-based vs. Dense/Direct Methods

최근의 실시간 단안 SLAM 알고리즘(DTAM, LSD-SLAM)들은 

환경의 dense나 semi-dense reconstruction를 수행할 수 있다.

동시에 카메라는 이미지 픽셀 intensity에 따라 직접적으로 최적화되며 localize 된다.

이러한 direct method는 피쳐 추출을 필요로 하지 않고, 이는 대응되는 결과물을 반영하지 못한다.

이들은 블러 되고, low-texture나 아스팔트처럼  high-frequency 환경에서 잘 작동한다.

 

하지만, direct method는 고유의 한계가 있다.

첫째, direct method는 표면 반사율 모델을 가정하여 실제 장면에서 그 결과물을 스스로 추출한다고 여긴다.

 이러한 광도계의 일관성은 매칭들의 베이스라인을 제한한다.

일반적으로 피쳐들이 허용하는 것보다 베이스라인이 좁다.

이것은 넓은 베이스라인을 요구하는 reconstruction 정확도에 큰 영향을 끼친다.

둘째, direct method는 일반적으로 컴퓨팅 비용을 많이 요구한다.

일례로 DTAM에서는 map의 크기가 점진적으로 증가한다.

 

반대로, feature-based method는 넓은 베이스라인을 허용하고, 

BA가 모든 센서 측정치를 사용하면서 카메라 포즈와 포인트를 공동으로 최적화시킨다.

(또한, sparse 한 map을 통해 메모리 효율성이 높아질 것으로 예상된다.) 

 

 

 

 

3. Introduction

- Bundle Adjustment

BA는 카메라 localization의 정확한 예측을 할 뿐만 아니라, sparse한 기하학적 reconstruction이 가능한 것으로 알려져 있다.

하지만 오랜 시간동안, 이 접근법은 Visual SLAM과 같은 실시간 동작에는 적합하지 않다고 여겨졌다.

Visual SLAM은 환경을 reconstruction하는 동시에 카메라 궤적을 추정해야하기 때문이었다.

하지만 최근에 더 정확한 결과를 위해서 다음과 같은 환경에서 BA의 적용이 불가피해졌다.

: 선택된 프레임들 중에 포인트를 대응시키는 것

: 키프레임의 개수가 늘어남에 따라 선택적으로 선별하여 불필요한 프레임을 줄여야 함

: 키프레임과 포인트들의 강력한 네트워크 설정 

: 키프레임 포즈와 포인트 위치의 non-linear한 초기의 추정

: 실시간에서 빠른 global optimization을 할 수 있는 능력

 

 

 

 

 

 

 

반응형
반응형

 

 

논문 링크입니다.

https://arxiv.org/pdf/1610.05949v2.pdf

(2016년 10월 16일 발행)

 

 

 

0. Title

Visual-Inertial Monocular SLAM with Map Reuse

=> 시각과 관성 데이터를 활용하여,

한 가지의 카메라를 사용하여(Mono) SLAM 을 하나보다,,

Map을 재사용 하나보다,,

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

 

 

 

제가 이때까지 카페 24 호스팅 하면서 배포 후 오류 났던 원인을 정리해보려 합니다.

1. 용량이 꽉차서

-> 대부분 로그 파일 때문이므로, 로그 파일 정리해주시면 됩니다.

 

2. 서버가 꺼져서

-> 터미널로 서버에 접근해서 tomcat을 다시 켜줍니다.

 

3. 자바 버전 차이

-> 8 버전만 가능하다고 합니다.

 

4. 기타

-> log 확인하기 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'Programming > Spring' 카테고리의 다른 글

Restful하게 API를 구성하자 !  (0) 2021.11.25
12. Spring & JPA  (0) 2021.06.08
11. Transaction Management  (0) 2021.06.08
10. Spring 기반 RESTful service  (0) 2021.06.07
09. Spring JDBC  (0) 2021.06.01
반응형

 

 

 

# 행렬 이용하기

출처 https://myjamong.tistory.com/305

 

 

파이썬 구현 예제

import numpy as np

def fibo(n):
    A = np.matrix( [ [1,1], [1,0] ] )
    vec = np.array([[1],[0]])

    return (np.matmul(A**n, vec))[1, 0]

num = int(input())
print(fibo(num))

 

 

 

 

 

 

반응형
반응형

 

 

https://www.acmicpc.net/problem/18870

 

18870번: 좌표 압축

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌

www.acmicpc.net



import java.util.*;
import java.util.Map.Entry;

public class CoordinateCompression_18870_me {

    public static void main(String [] args){
        Scanner sc = new Scanner(System.in);
        Integer N = sc.nextInt();
        Integer [] arr = new Integer[N];
        Map<Integer, Integer> orderedMap = new HashMap<>();


        for (int i=0; i<N; i++){
            arr[i] = sc.nextInt();
        }

        Integer [] sortedArr = arr.clone();
        Arrays.sort(sortedArr);


        Integer cnt = 0;
        for(int num : sortedArr){
            if (!orderedMap.containsKey(num)){
                orderedMap.put(num, cnt++);
            }
        };


        StringBuilder sb = new StringBuilder();    
        // 하나씩 출력하다가 StringBuiler 객체에 넣어서 한번에 출력하니까 성공뜸
        for(int num : arr){
            sb.append(orderedMap.get(num)).append(' ');
        }

        System.out.println(sb.toString());

    }
}

 

 

 

 

반응형
반응형

 

 

https://www.acmicpc.net/problem/14889

 

14889번: 스타트와 링크

예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.

www.acmicpc.net

package com.company;
import java.util.Scanner;

public class StartAndLink_14889_me {


    static int min_diff = Integer.MAX_VALUE;;
    static int N;
    static boolean[] ans;
    static int[][] arr;


    public static void main(String [] args){

        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        arr = new int[N][N];
        ans = new boolean[N];

        for (int i=0; i<N; i++){
            for (int j=0; j<N; j++){
                arr[i][j] = sc.nextInt();
            }
        }

        startLink(0, 0);

        System.out.print(min_diff);
    }

    static void startLink(int idx, int count){

        if(count == N/2){
            int start_sum = 0;
            int link_sum = 0;
            for (int j=0; j<N-1; j++){
                for (int k=j+1; k<N; k++){
                    if (ans[j] == true && ans[k] == true){
                        start_sum += arr[j][k];
                        start_sum += arr[k][j];

                    } else if (ans[j] == false && ans[k] == false){
                        link_sum += arr[j][k];
                        link_sum += arr[k][j];

                    }
                }
            }

            int min_tmp = Math.abs(start_sum - link_sum);
            if(min_tmp == 0){
                System.out.print(0);
                System.exit(0);
            }

            min_diff = Math.min(min_tmp, min_diff);
            return;
        }

        for(int i = idx; i < N; i++) {  // 이 부분 때문에 계속 시간초과 났었음
            if(!ans[i]) {
                ans[i] = true; 
                startLink(i + 1, count + 1);   // 이 부분 때문에 계속 시간초과 났었음
                ans[i] = false;    
            }
        }
    }
}
반응형

+ Recent posts