Posts

Thursday, 18 July 2019

Easy way to download KITTI raw data with the script

Easy way to download KITTI raw data with the script


1. Get the script file here
http://www.cvlibs.net/download.php?file=raw_data_downloader.zip

2. Extract it.

3. Run the script
cd raw_data_downloader
chmod +x raw_data_downloader.sh
./raw_data_downloader.sh

Some TF version errors in [Text generation using a RNN with eager execution]

Some TF version errors in [Text generation using a RNN with eager execution]


Tensorflow RNN tutorials are basically based on the TF version 1.13 or higher.
I was following this one below.
https://www.tensorflow.org/tutorials/sequences/text_generation


  • Error 1

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-70-7589cf238f4d> in <module>
----> 1 sampled_indices = tf.random.categorical(example_batch_predictions[0], num_samples=1)
      2 #sampled_indices = tf.random.multinomial(example_batch_predictions[0], num_samples=1)
      3 # use tf.random.multinomial if using TF 1.12 or lower.
      4 sampled_indices = tf.squeeze(sampled_indices,axis=-1).numpy()

AttributeError: module 'tensorflow._api.v1.random' has no attribute 'categorical'

Solution

sampled_indices = tf.random.multinomial(example_batch_predictions[0], num_samples=1)
# use tf.random.multinomial if using TF 1.12 or lower.



  • Error 2

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-72-9ea97acf159a> in <module>
      4 # if using TF 1.12 or lower, use 'tf.keras.backend.sparse_categorical_crossentropy'
      5 
----> 6 example_batch_loss  = loss(target_example_batch, example_batch_predictions)
      7 print("Prediction shape: ", example_batch_predictions.shape, " # (batch_size, sequence_length, vocab_size)")
      8 print("scalar_loss:      ", example_batch_loss.numpy().mean())

<ipython-input-72-9ea97acf159a> in loss(labels, logits)
      1 def loss(labels, logits):
----> 2   return tf.keras.losses.sparse_categorical_crossentropy(labels, logits, from_logits=True)
      3   #return tf.keras.backend.sparse_categorical_crossentropy(labels, logits, from_logits=True)
      4 # if using TF 1.12 or lower, use 'tf.keras.backend.sparse_categorical_crossentropy'
      5 

TypeError: sparse_categorical_crossentropy() got an unexpected keyword argument 'from_logits'

Solution

return tf.keras.backend.sparse_categorical_crossentropy(labels, logits, from_logits=True)
# if using TF 1.12 or lower, use 'tf.keras.backend.sparse_categorical_crossentropy'


Monday, 8 July 2019

자율주행자동차의 결정, 계획, 제어

동작 결정 decision
모션 계획 motion planning
피드백 제어 control


  1.  동작 결정 behaviour decision
    • 이 모듈은 자율주행 자동차의 계획 및 제어 모듈에서 '보조 운전자'역할을 한다.
    • 데이터(위치, 속도, 가속도, 방향, 현재 차로 정보, 특정 반경 내의 인지 개체 정보 등)을 바탕으로 동작에 관련된 결정을 내릴 수 있도록 계산
      1. 경로 계획 모듈의 출력 값
        • 원하는 출발 지점부터 목적 지점에 이르는 차로 시퀀스
      2. 자율 주행 자동차 자체에 대한 속성
        • 주어진 차로, 속도, 방향에서의 상대적 위치, 현재 GPS 위치, 현재 차로, 현재 목표 차로에 대한 정보
      3. 자율 주행 자동차에 대한 히스토리 정보
        • 동작 결정 모듈의 이전 프레임, 즉 이전 사이클의 출력값에 대한 정보
      4. 자율 주행 자동차 주위의 장애물 정보
        • 주변의 모든 객체의 속도, 차로, 방향, 그리고 예측 궤도
      5. 트래픽 정보 및 맵 개체 정보
        • HD 맵에 정의된 차로 및 차로의 관계
      6. 현재 구간의 교통 규칙
        • 시내 제한 속도, 동작이 합법적인지 여부 등
    • 목표: 모든 정보를 활용해 자동차의 안전하고 효과적인 동작을 결정하는 것
      • 문제: 데이터 성격이 다 다르고, 지역별 교통 법규 또한 다 달라 하나의 수학모델로 판단하는 것이 어려움 -> 소프트웨어 공학 개념과 교통 규칙 기반 시스템을 설계하는 방식으로 해결!
      • EXAMPLE) Baysian model, Morkov Decision Process, Partially Obsevable Markov Decision Process


  • 마르코프 결정 과정 Markov Decision Process
    • 5가지 요소로 구성된 튜플(S,A,Pa,Ra,𝛾)로 정의
      • S: 자율 주행 자동차의 상태 공간 (자동차의 위치 & 맵 요소)
      • A: 동작 결정 출력 공간. 자율 주행 자동차가 수행할 수 있는 모든 동작을 고정된 집합으로 표현한 것
        • follow: 전방에 달리는 차를 추종하는 상태
        • switch lane: 차로 변경
        • turn left / right: 교차로에서 좌/우회전 하는 상태
        • yield: 다른 자동차에게 양보
        • overtake: 다른 차를 추월하는 상태
        • stop: 신호등과 보행자 앞에서 정지하는 상태
      • Pa(s, s') = Pa(s' | s, a)는 자율 주행 자동차가 현재 상태 s에서 동작 a를 수행할 때 상태 s'에 도달할 조건부 확률
      • Ra(s, s')는 reward function으로 상태 s에서 동작 a를 수행함으로써 상태 s'로 변환할 때 보상. 여기서 보상이란 상태 변환을 종합적으로 평가. (안전성, 편안함, 목적지 도달, 난이도 등)
        • 보상함수를 만들 때 고려해야 하는 것
          1. 목적지 도달: 경로에서 이탈하면 페널티, 경로를 잘 지키면 보상 지급
          2. 안전성 및 충돌 방지: 충돌을 발생시키면 페널티를 주고, 충돌 가능성이 낮거나 충돌 가능 지점과 거리가 멀수록 보상을 지급
          3. 편안함 및 부드러움: 비슷한 속도를 유지하며 가속 또는 감속하는 동작이 급격한 가속이나 감속을 하는 동작보다 더 높은 보상을 받아야 한다.
      • 𝛾: decay factor 미래보다 현재가 더 가치있게
    • 문제: S -> A로 표현되는 최적 정책을 찾는 것
  • 시나리오 기반의 분할 정복 접근법
    • divide and conquer개념을 적용해 자율 주행 자동차 주변을 여러가지 시나리오로 분할, 각 객체에 대한 individual decision을 계산 한 다음, 자동차 자체에 대한 synthetic decision을 계산해서 individual을 모두 취합
      • Synthetic decision: 자동차 자체가 어떻게 동작해야 하는지에 대한 것. 최상위 동작 결정
      • inidividual decision: 장애물, 신호등, 횡단보도, 정지선 등




  • 시나리오 구성 및 시스템 설계
    • 독립적인 작은 시나리오에 초점을 맞춰서 계산한 뒤 같은 계층의 독립 결정을 계산할 때, 경로 계획 의도와 이전 계층의 계산 결과를 공유
    • 계산 후에는 합성 결정으로 통합 -> divide and conquer


2. 모션 계획 motion planning
  • 궤적을 생성해서 실제 물리적으로 자동차를 제어하는피드백 제어 모듈로 보낸다.
  • 2차원 평면에서 특정 공통 속성 및 제약 조건을 갖는 궤적에 대한 최적화 문제 optimization
    • 최적화 개체 optimization object
      • 보통 각기 다른 후보 솔루션에 대한 cost로 표현
        1. 동작 결정 모듈의 출력값을 반드시 따라야 함. 정확하게 도달하도록
        2. 도로를 자연스럽게 따라서 이동
    • 제약조건 constraints
  • 모션 계획 솔루션
    1. 시공간 궤적 계획 문제를 '경로 계획'과 '속도 계획' 두 가지로 나누어서 처리.
      1. 경로 계획: 주어진 동작 결정 모듈 출력 값과 비용 함수 정의로부터 2차원 평면상의 궤적 모양을 계산하는 문제만 해결
      2. 속도 계획: 경로 계획의 결과에 따라 자율 주행 자동차가 주어진 궤적을 따라가는 방식을 결정
      3. 시내 저속 주행에 적합
    2. 1처럼 나누지 않고 2개의 직교 방향에서 모션계획 처리
      1. SL coordinate system 을 따르는 s(종방향), l(횡방향)
      2. 계획한 궤적의 형태에 속도가 자연스럽게 반영된다는 것
      3. 고속도로 고속 주행에 적합



3. 피드백 제어
  • 자전거 모델
  • PID 제어



    Thursday, 4 July 2019

    자율주행을 위한 클라이언트 시스템




    자율주행시스템 = 소프트웨어 + 하드웨어
    다양한 컴포넌트들이 상호작용하려면 OS가 필요한데, 우리가 쓰는 ROS를 중심으로 알아보자.

    < 복잡한 자율주행시스템 >


    1. 센싱 - GPS/ LiDAR/ Camera
      1. 센서는 주변 환경에서 데이터를 수집
      2. 인지와 동작 연산을 수행하는 컴퓨터 플랫폼으로 전달
    2. 인지 - 로컬라이제이션/ 개체 인식/ 개체 추적
    3. 의사결정 - 예측/ 경로 계획/ 장애물 회피
      1. 동작 계획 생성
      2. 제어 플랫폼으로 전달
    이 전체를 통합하는 것은 클라이언트 시스템 위에서 이뤄지며, 클라이언트 시스템은 다시 OS와 하드웨어 플랫폼으로 구성된다. OS가 무엇을 하느냐? 데이터가 증가할 수록 시스템 자원을 할당하기 힘들어지는데 OS가 각 컴포넌트마다 사용할 수 있는 자원의 양을 제한해준다.


    <자율 주행을 위한 OS>

    • OS의 두 가지 핵심 기능
    1. 통신
    2. 자원할당
    • ROS
    1. 노드 node: 노드는 어떤 일을 수행하는 과정이다. ex. 모터 제어 노드는 모터에 대한 정보를 읽어서 모터의 회전을 제어한다. 경로 계획 노드는 모바일 플랫폼의 동작 계획(motion planning)을 구현하는데 사용된다.
    2. 노드 관리자 node manager/ 마스터 master: 다른 노드를 관리한다. 각 노드마다 자신에 대한 정보를 노드 관리자에 등록해야 한다. 노드 관리자는 노드 운영에 관련된 설정 매개변수를 중앙에 저장.
    3. 매개변수 서버 parameter server: 매개변수 서버는 시스템에 있는 노드의 운영에 관련된 설정 매개변수를 중앙에 저장
    4. 메시지 message: 노드끼리 주고받는 정보
    5. 토픽 topic: 발행-구독 방식의 통신 메커니즘, 어떤 노드가 특정 토픽에 메시지를 발행하면 이 토픽을 구독하던 다른 노드는 그 노드가 발행한 메시지를 받게 됨.
    6. 서비스 service:1 대 1 통신 메커니즘, 노드가 서비스 노드에서 제공하는 서비스를 요청하면 두 노드 사이의 통신 채널을 만들어줌.

    • 시스템 신뢰성
      • 시스템의 견고성 robustness와 신뢰성을 높이도록 마스터 노드를 분산하는 것이 필요
      • 어떻게? 주키퍼 ZooKeeper 활용
        • 여러 개의 마스터 노드를 구동해 하나는 액티브 마스터 노드로 작동하고 나머지는 백업용으로 구동
        • 액티브 마스터 노드가 뻗을 경우, 백업 마스터 노드 중 하나를 새로운 액티브 마스터 노드로 선정해서 작동시키면 됨! -> 견고성 확보
        • 모든 노드의 상태를 감시하는 모니터 노드를 추가해야 함.
          • 각 시스템에 있는 노드는 ZooKeeper에게 심박Heartbeat message를 주기적으로 보내는데, 일정 시간동안 심박 메시지를 받지 못했다면 그 노드는 죽었다고 간주
          • 그러면 ZooKeeper는 모니터 노드에게 그 노드가 죽었으니 새로 구동하라고 알려줌
          • 상태 / 무상태 두 경우가 있고, 상태를 저장하면 재구동 시 마지막 저장 상태를 이어서 시작 (-> 심박메시지를 보낼 때 상태 정보를 함께 보내기도 함)
    • 자원 관리 및 보완
      • 노드 중 하나가 공격을 당했다! -> 

    <컴퓨팅 플랫폼>

    자율 주행 자동차에 장착된 센서들은 초당 2GB 이상의 데이터를 생성 및 전송
    -> 컴퓨팅 플랫폼의 설계 방식이 실시간 성능뿐만 아니라 자율 주행 시스템의 견고성에 직접적인 영향을 미침
    * 문제는: 비용, 전력 소비량, 방열heat dissipation

    • 컴퓨팅 플랫폼 구현 [4]
      • 기존 컴퓨팅 플랫폼
    여기서 사용한 컴퓨팅 플랫폼은 1세대에 해당하며, 2개의 컴퓨팅 박스로 구성되는데, 각각 인텔 제온 E5프로세서와4~8개의엔비디아 K80GPU 가속기를 장착하고 이들을 PCI-E 버스로 연결했다. 이렇게구성한 플랫폼을 통해 최대로 발휘히는 성능은 (12개의 코어로 구성된) CPU를 통해 400GOPS/s 수준으로 400W의 전력을 사용한다. 각각의 GPU마다 8TOPS/s를 내며 전력은 300W를 소비한다. 이들을 모두 합해서 전체 시스템이 발휘하는 성능은 3,000W 전력 소비량으로 64.5TOPS/s의 성능을 발휘한다. 이렇게 구성한 컴퓨팅박스는 차량 주위에 설치된 12개의 고해상도 카메라와 연결하여 개체 감지 및 개체추적 태스크를 수행한다. 라이다 장치는 차량의 꼭대기에 장착해 차량에 대한 로컬라이제이션과 장애물 회피 기능을 담당한다. 두 번째 컴퓨팅 박스는 첫 번째 박스와 동일한 태스크를 수행하며, 시스템의 신뢰성을 보장하기 위한 용도로 장착한다. 즉, 첫 번째 박스가 죽으면 두 번째 박스가 즉시 역할을 넘겨받는다. 두 박스 모두 최고로 작동하는 최악의 경우, 5,000W의 전력을 소비하면서 엄청난 열을 발산한다. 또한 한 박스를 구축하는 데 드는 비용은 미화 20,000~30,000달러에 육박해서, 일반소비자가 솔루션을 구성하는 데 있어 감당할 수 없는 수준이다.
      • 기존 컴퓨팅 솔루션
        • 자율 주행을 위한 GPU 솔루션 중 가장 대표적인 엔비디아 PX 솔루션
          • PX2에는 2개의 테그라 Tegra SoC와 2개의 파스칼 Pascal 그래픽스 프로세서 장착
          • AlexNet을 구동할 때 초당 2800개 이미지 처리 가능
        • DSP 기반 솔루션인 텍사스 인스트러먼츠 Texas Instuments의 TDA
        • TPGA기반 솔루션
        • ASIC 기반 솔루션

    • 컴퓨터 아키텍쳐 설계 분석
      1. 부하 workload 종류에 따라 가장 적합한 컴퓨팅 장치
      2. 극단적인 경우 자율 주행에 관련된 태스크를 수행하는 데 있어 모바일 프로세서로도 충분한지 여부
      3. 자율 주행을 위한 효율적인 컴퓨팅 플랫폼을 설계하는 방법
    이 세 가지를 고려해 컴퓨팅 플랫폼을 구성해야 한다.
    • 부하 workload 종류에 따라 가장 적합한 컴퓨팅 장치
      • = convolution과 feature extration에 적합한 장치
      • CPU, GPU, DSP에서 convolution, feature extraction을 수행해보고 성능과 에너지 소비량을 비교해보겠음

        • 컨볼루션) GPU가 가장 성능이 좋고(빠름), 에너지 소비량도 적음
        • 특징 추출) DSP가 가장 성능이 좋고(빠름), 에너지 소비량도 적음
      • 로컬라이제이션, 계획, 장애물 회피같은 자율 주행 관련 태스크에 대해서는 실험하지 않았는데, 이것들은 주로 제어 연산이라 CPU가 당연히 좋을 듯
    • 모바일 프로세서 기반의 자율 주행
      • 자율주행 시스템의 한계를 알아보자. ARM모바일 SoC에서 어느 정도 성능을 보여주는지

        • 센서 데이터 처리 (특징 추출, 옵티컬 플로우) -> DSP
        • 딥러닝 (개체 인식) -> GPU
        • 로컬라이제이션 -> 2개의 CPU 스레드
          • 1 -> 실시간 경로 계획
          • 2 -> 장애물 회피
      • ARM SoC에서 그럭저럭 잘 됨
        • 로컬라이제이션 -> 25개 이미지/s
        • 딥 러닝 -> 2~3개/s
        • 계획 및 제어 -> 하나의 경로를 계획하는데 6ms 이내에 처리
        • 전체 시스템의 평균 에너지 소비량 = 11W

    • 컴퓨팅 플랫폼 설계
      • 각 태스크마다 에너지 소비량과 성능 측면에서 가장 효율적인 컴퓨팅 장치를 적용하도록 이종 컴퓨팅 자원을 최대한 활용했기 때문에 >>>좋은 성능을 낼 수 있었다.<<<

      • 컴퓨팅 플랫폼
        • I/O 서브시스템: SoC 아키텍쳐와 프론트엔드 센서 상호작용
        • DSP: 특징 추출을 위해 이미지 스트림을 전처리
        • GPU: 개체 인식과 몇 가지 딥 러닝 태스크 수행
        • CPU: 계획 및 제어와 상호작용 태스크를 수행하는 멀티코어
        • FPGA: 데이터 압축과 업로드, 개체 추적, 트래픽 예측 등을 위한 동적 재설정/ 시분할 지원










    [Real-time Depth Enhanced Monocular Odometry] Review



    Real-Time Depth Enhanced Monocular Odometry Review


    Abstract

    Depth정보는 RGB-D 카메라나 라이다를 이용하여 많이 계산되고 있다, 하지만 센서가 depth 정보를 다 알지 못해 이미지 상당 부분의 depth를 알 수 없다.
    -> 이 논문에서는 sparse한 depth에서도 camera motion 회복을 통해 depth를 활용할 수 있게 하는 방법을 제안한다.

    System Overview

    1. Sensor Hardware

    (a) Xtion Pro Live RGB-D Camera
    (b) Custom Build Camera and 3D Lidar

    2. Software System Overview

    First, feature tracking

    • Kanade Lucas Tomasi(KLT) method를 사용하여 Harris Corner를 추적하는 모듈
    • 해당 모듈에서 추적된 Visual Features는 Depth MAp Registration 모듈에서 Depth값과 결합
    초록: depth map에서 depth를 뽑아낸 점
    파랑: 추정된 camera pose와 triangulation을 통해 depth를 알아낸 점
    빨강: depth가 없는(모르는) 점

    Second, Depth Map Registration
    • Depth 데이터를 Estimated Motion에 따라 맵에 등록시키는 모듈
    • 해당 모듈에서 Visual Feature와 Depth값이 결합됨
    • Depth Map에 없는 Visual Feature들의 경우 Triangulation을 통해 Depth값을 추정하게 됨
    Third, Frame to Frame Motion Estimation
    • Visual Feature(+Depth)를 입력으로 받아서 Motion Estimation을 수행하는 모듈
    • Known Depth, Unknown Depth의 경우를 모두 처리하여 Motion Estimation
    • Visual Feature의 카메라 모션은 아래와 같이 표현한다.

    Fourth, Bundle Adjustment
    • iSAM Library를 사용하여 Estimated Motion의 누적된 오차를 제거해주는 모듈
    • User-defined Camera model을 사용할 수 있기 때문에 iSAM을 사용함
    • 0.25~1.0Hz 주기로 동작한다.
    Fifth, Transform Integration
    • Frame to Frame Motion의 High-Frequency Transform과 BA의 Low-Frequency Transform을 입력으로 받아 최종 Transform을 반환하는 모듈

    Monday, 1 July 2019

    [rospack] Error: package 'ORB_SLAM2' not found

    nvidia@tegra-ubuntu:~$ echo $ROS_PACKAGE_PATH
    /opt/ros/kinetic/share
    nvidia@tegra-ubuntu:~$ source ~/catkin_ws/devel/setup.bash
    nvidia@tegra-ubuntu:~$ echo $ROS_PACKAGE_PATH
    /home/nvidia/catkin_ws/src:/opt/ros/kinetic/share



    new... error... occurs..

    Wednesday, 19 June 2019

    ros with usb_cam on Jetson TX2

    How to use usb_cam with ros kinetic on jetson tx2

    Nvidia Jetson TX2 
    Ubuntu 16.04 
    ROS Kinetic
    1. Create a new workspace catkin_ws in the root directory
    mkdir -p ~/catkin_ws/src
    cd catkin_ws/src/
    2. Download usb_cam package
    git clone https://github.com/bosch-ros-pkg/usb_cam.git
    3. Go to the workspace directory to compile
    cd ~/catkin_ws
    catkin_make
    4. Compile the specific information:
    Base path: /home/nvidia/catkin_ws
    Source space: /home/nvidia/catkin_ws/src
    Build space: /home/nvidia/catkin_ws/build
    Devel space: /home/nvidia/catkin_ws/devel
    Install space: /home/nvidia/catkin_ws/install
    Creating symlink "/home/nvidia/catkin_ws/src/CMakeLists.txt" pointing to "/opt/ros/kinetic/share/catkin/cmake/toplevel.cmake"
    ####
    #### Running command: "cmake /home/nvidia/catkin_ws/src -DCATKIN_DEVEL_PREFIX=/home/nvidia/catkin_ws/devel -DCMAKE_INSTALL_PREFIX=/home/nvidia/catkin_ws/install -G Unix Makefiles" in "/home/nvidia/catkin_ws/build"
    ####
    -- The C compiler identification is GNU 5.4.0
    -- The CXX compiler identification is GNU 5.4.0
    -- Check for working C compiler: /usr/bin/cc
    -- Check for working C compiler: /usr/bin/cc -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Detecting C compile features
    -- Detecting C compile features - done
    -- Check for working CXX compiler: /usr/bin/c++
    -- Check for working CXX compiler: /usr/bin/c++ -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    -- Using CATKIN_DEVEL_PREFIX: /home/nvidia/catkin_ws/devel
    -- Using CMAKE_PREFIX_PATH: /opt/ros/kinetic
    -- This workspace overlays: /opt/ros/kinetic
    -- Found PythonInterp: /usr/bin/python (found version "2.7.12") 
    -- Using PYTHON_EXECUTABLE: /usr/bin/python
    -- Using Debian Python package layout
    -- Using empy: /usr/bin/empy
    -- Using CATKIN_ENABLE_TESTING: ON
    -- Call enable_testing()
    -- Using CATKIN_TEST_RESULTS_DIR: /home/nvidia/catkin_ws/build/test_results
    -- Looking for pthread.h
    -- Looking for pthread.h - found
    -- Looking for pthread_create
    -- Looking for pthread_create - not found
    -- Looking for pthread_create in pthreads
    -- Looking for pthread_create in pthreads - not found
    -- Looking for pthread_create in pthread
    -- Looking for pthread_create in pthread - found
    -- Found Threads: TRUE  
    -- Found gtest sources under '/usr/src/gtest': gtests will be built
    -- Using Python nosetests: /usr/bin/nosetests-2.7
    -- catkin 0.7.6
    -- BUILD_SHARED_LIBS is on
    -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    -- ~~  traversing 1 packages in topological order:
    -- ~~  - usb_cam
    -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    -- +++ processing catkin package: 'usb_cam'
    -- ==> add_subdirectory(usb_cam)
    -- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1") 
    -- Checking for module 'libavcodec'
    --   Found libavcodec, version 56.60.100
    -- Checking for module 'libswscale'
    --   Found libswscale, version 3.1.101
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/nvidia/catkin_ws/build
    ####
    #### Running command: "make -j4 -l4" in "/home/nvidia/catkin_ws/build"
    ####
    Scanning dependencies of target usb_cam
    [ 25%] Building CXX object usb_cam/CMakeFiles/usb_cam.dir/src/usb_cam.cpp.o
    [ 50%] Linking CXX shared library /home/nvidia/catkin_ws/devel/lib/libusb_cam.so
    [ 50%] Built target usb_cam
    Scanning dependencies of target usb_cam_node
    [ 75%] Building CXX object usb_cam/CMakeFiles/usb_cam_node.dir/nodes/usb_cam_node.cpp.o
    [100%] Linking CXX executable /home/nvidia/catkin_ws/devel/lib/usb_cam/usb_cam_node
    [100%] Built target usb_cam_node
    5. Environment variable update operation
    source ~/catkin_ws/devel/setup.bash
    6. Open the camera startup configuration file usb_cam-test.launch in the workspace directory.
    cd ~/catkin_ws/src/usb_cam/launch
    gedit usb_cam-test.launch
    7. The usb_cam-test.launch file information is as follows:
    <launch>
    <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video1" />
    <param name="image_width" value="640" />
    <param name="image_height" value="480" />
    <param name="pixel_format" value="yuyv" />
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
    </node>
    <node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
    <remap from="image" to="/usb_cam/image_raw"/>
    <param name="autosize" value="true" />
    </node>
    </launch>
    
    8. Since the TX2 comes with an onboard camera, the performance of the onboard camera ("/dev/video0") is not good, so we recommend using a take-away camera. Need to adjust the value of the video_device value to "/dev/video1" 
    9. Execute the following command to call the camera
    roslaunch usb_cam-test.launch
    10. The results of the operation:
    ... logging to /home/nvidia/.ros/log/4b9c8574-9072-11e7-bf53-00044b8caad5/roslaunch-tegra-ubuntu-3059.log
    Checking log directory for disk usage. This may take awhile.
    Press Ctrl-C to interrupt
    Done checking log file disk usage. Usage is <1GB.
    
    started roslaunch server http://tegra-ubuntu:35309/
    
    SUMMARY
    ========
    
    PARAMETERS
     * /image_view/autosize: True
     * /rosdistro: kinetic
     * /rosversion: 1.12.7
     * /usb_cam/camera_frame_id: usb_cam
     * /usb_cam/image_height: 480
     * /usb_cam/image_width: 640
     * /usb_cam/io_method: mmap
     * /usb_cam/pixel_format: yuyv
     * /usb_cam/video_device: /dev/video1
    
    NODES
      /
        image_view (image_view/image_view)
        usb_cam (usb_cam/usb_cam_node)
    
    ROS_MASTER_URI=http://localhost:11311
    
    core service [/rosout] found
    process[usb_cam-1]: started with pid [3078]
    process[image_view-2]: started with pid [3079]
    init done
    [ INFO] [1504421929.509447030]: Using transport "raw"
    [ INFO] [1504421929.756668326]: using default calibration URL
    [ INFO] [1504421929.757037809]: camera calibration URL: file:///home/nvidia/.ros/camera_info/head_camera.yaml
    [ INFO] [1504421929.757321401]: Unable to open camera calibration file [/home/nvidia/.ros/camera_info/head_camera.yaml]
    [ WARN] [1504421929.757445853]: Camera calibration file /home/nvidia/.ros/camera_info/head_camera.yaml not found.
    [ INFO] [1504421929.757588513]: Starting 'head_camera' (/dev/video1) at 640x480 via mmap (yuyv) at 30 FPS
    [ WARN] [1504421930.977394215]: unknown control 'focus_auto'
    
    The pop-up camera screen will appear on your monitor.

    Monday, 17 June 2019

    error: usleep is not declared in this scope


    Find every file which have this error and add the codes below to it:

    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>



    in case of orbslam2:
    Files that need to be added are:
    Examples/Monocular/mono_euroc.cc
    Examples/Monocular/mono_kitti.cc
    Examples/Monocular/mono_tum.cc
    Examples/RGB-D/rgbd_tum.cc
    Examples/Stereo/stereo_euroc.cc
    Examples/Stereo/stereo_kitti.cc
    src/LocalMapping.cc
    src/LoopClosing.cc
    src/System.cc
    src/Tracking.cc
    src/Viewer.cc

    Tuesday, 28 May 2019

    SIFT가 뭐냐

    [1] Scale Invariant Feature Transform - David Lowe

    1. What is SIFT?
      1. Image에서 중요한 feature points를 찾는 기술
      2. Features?: 포인트 주변을 잘 설명해주는 정보. rotation, scale과 관련 있음
    2. Motivation for SIFT
      1. Image matching
        1. 이미지들 사이의 affine transformation과 homography를 추정하는 것
        2. Fundamental matric in stereo 추정 (카메라 여러대?)
      2. Motion, tracking, motion segmentation의 구조 파악
      3. 이미지들의 중요하고 stable한 points 찾기 & 이것들 사이의 관계 결정하기
      4. Feature는 물체 위치, 자세, 스케일, 조도, 노이즈 등에 무관해야 함
      5. Individual pixel colour values are not an adequate feature to determine correspondences (?)
    SIFT는 변화(회전이나 스케일)에 관계없이 feature를 잘 찾아냄. 위의 그림에서 같은 것으로 잘 인식하는 것을 볼 수 있음. (서로 다른 두 이미지에서 SIFT특징을 각각 추출한 다음에 가장 비슷한 특징끼리 매칭해주면 두 이미지에서 대을되는 부분을 찾을 수 있음.)

    1. Steps of SIFT algorithm
      1. Step 1) Scale Space 만들기
        1. Scale Space란?
          1. 영상처리를 할 때 단 하나의 스케일을 가진 이미지가 아니라 여러 스케일로 본 이미지들을 가지고 작업하는 것 -> 이 이미지 뭉치가 바로 Scale Space
        2. 스케일이 커질수록 디테일한 것이 잘 안보임 -> 이미지 사이즈는 유지하면서 blur처리를 하면 스케일이 커진 것과 같은 효과를 볼 수 있음
          1. Blur처리를 어떻게 하는지? -> Gaussian Filter를 이용한다.
          1. 스케일 파라미터 σ가 커질수록 스케일이 커진다.
        1. 원본 이미지를 2배, 1/2배, 1/4배로 만들어서 스케일 파라미터를 다르게 총 4세트를 만든다.
        2. 이게 바로 Scale Space
      1. Step 2) DoG 연산 (Difference of Gaussian)
        1. Laplacian of Gaussian(LoG)를 이용해서 이미지 내의 key points를 찾는다.
          1. Blur -> 2차미분
          2. but, 이 녀석은 계산이 너무 많음
        2. Difference of Gaussian(DoG)
          1. 라플라시안을 구하는 것을 컨볼루션을 해야하지만, DoG는 화소값의 차이만 구하면 되므로 계산이 수십배에서 수백배로 빨라짐.
          2. 같은 옥타브 내에서 인접한 두개의 블러 이미지들끼리 빼줌
        3. Step 3) Key point들 찾기
          1. 한 픽셀에서 극대값, 극소값을 결정할 때는 동일한 octave내의 3장의 DoG이미지가 필요함. 지금 체크할 픽셀 주변의 8개 픽셀과, scale이 한단계씩 다른 위 아래 두 DoG 이미지에서 체크하려고 하는 픽셀과 가까운 9개씩, 총 26개를 검사합니다. 만약 지금 체크하는 픽셀의 값이 26개의 이웃 픽셀값 중에 가장 작거나 가장 클 때 keypoint로 인정.
          2. 테일러 2차 전개를 이용, 픽셀 사이의 정확한 키 포인트를 찾아낸다.
        4. Step 4) 나쁜 Key point들 제거하기
          1. 활용가치가 떨어지는 것들을 제거
            1. 낮은 콘트라스트를 가지고 있거나(threshold 이하)
            2. 엣지 위에 있는 것
          2. 코너에 있는 키포인트들이 좋은 것임
        5. Step 5) key points에 방향 할당해주기
          1. 지금까지 얻은 키포인트는 scale invariance를 만족, 지금부터는 rotation invariance를 위한 것.
          2. Key point 주변의 그래디언트 방향과 크기를 활용, 가장 큰 그래디언트의 방향이 키포인트의 방향이 된다.
        6. Step 6) 최종 SIFT 특징 산출
          1. 지금까지 얻은 키포인트들은 scale, rotation 불변성을 가지고 있음
          2. 이것들을 식별하기 위한 정보(지문) 부여(그래디언트의 크기와 방향)
      2. 그렇다면 SIFT로 이미지 매칭을 어떻게 하는 것일까요? 먼저 두 이미지에서 각각 keypoint들을 찾고 지문을 달아줬다면, 이 지문값들의 차이가 가장 작은 곳이 서로 매칭되는 위치인 것입니다.
    1. 장단점
      1. 장점
        1. Affine transformation에 강건
        2. Illumination changes에 강건
      2. 단점
        1. 3D 물체보다 평면에서 작동이 잘됨
        2. Several parameters in the algorithm: descriptor size, size of the region, various thresholds – theoretical treatment for their specification not clear

    [ new blog ]

    new blog https://jihyo-jeon.github.io/