본문 바로가기
Programming/Sensors

Camera and lidar calibration and visualization in ROS

by OKOK 2017. 8. 7.

ROS를 vagrant 에서 셋팅합니다. 환경설정 -> 패스


한번 배그 파일을 저장해봅니다. 그리고 그 배그 파일에서 topic 이 어떤것들이 들어있는지 확인합니다. 제시된 예시해서는 카메라인포, 이미지칼라, 포인트 이렇게 3가지가 있습니다. 이것들을 받을 수 있는지 확인합니다. 


자 지금까지 점검도 잘하고 토픽설정도 잘 했습니다.


이미지 수정하기

칼리브레이션 정보를 배그 파일에 더합니다.

bag_tools 설치하고 새로운 배그파일을 만듭니다. 여기서 토픽부분만 수정해서 사용하면 되겠습니다.


python change_camera_info.py ../2017-08-06-18-31-54.orig.bag ../2017-08-06-1-31-54.cameracalibrator.bag /camera_info=../Results/calibrationdata_cameracalibrator.yaml


vagrant 와 노드에 대한 것의 관계를 읽어나가야 합니다. 내부에 있는 파일 2개를 변경하여서 다른 파일을 만드는 것 같습니다. 그리고 3개의 동영상을 재생하여서 비교를 시행합니다.



태스크2 라이더를 이미지 칼리브레이션에 담기

로스 패키지는 만들어졌습니다. 스크립트를 유지하기 위해서 캘리브레이션에 사용되는, 그것들을 사용하기 위해서 먼저 스크립트 폴더에 ros-package_phat 를 더합니다. 


스크립트는 요구합니다 .json 파일을 포함하는 점 대응점 3디와 2디 좌표. 그 점은 일치합니다. 사용되는 발생하기 위해서 결과 data/lidar_iage_calibration_data.json 선턱적 파라미터는 포함될 수 있습니다. 만들기 위해서 하나의 이미지 사용하는 기되되고 만들어진 이미지 좌표 제공된 3D 포인트를 위해서. 


칼리브레이션 스크립트는 의존합니다. scipy.optimize.minimize 함수 찾기 위해서 병진운동, 회전운동 사이에 카메라 프레임과 라이더 프래임. minimize는 수행합니다. 바운딩된 최적화를 제한하기 위해 사태 변수들을. 그 변동은 각 측 제한됨 5.0 미터. 그 회전 각도는 제한됨 0 에서 360 도 아하 아래의 최초 변동은 어떤 것을 나타내고, 바운드는 어떠한 것을 나타냅니다. 


몇 최초 상태 벡터는 포함하는 0, 0, 0, 0, 0, 0 가지다 긍정적인 gradient 를 이웃에 그것을 둘러싸는. 이것의 결과는 실패한 최적화입니다. 이것과 비교하여 새로운 최초 상태 벡터는 임의적으로 . minia 가까운 찾기 위해서 알지못하는 global minumum, 새 최초 상태 벡터는 픽됩니다. 까지 성공적인 최적화 결과. 50 픽셀보다 적은 에러.



새로운 복합적, 합성적 라이더 이미지

일단 최적화된 상태 벡터, uvs 는 무엇인가요. 일단 최적화된 상태 벡터는 이전 상태에서 찾았습니다. 상태 벡터는 더해질 수 있습니다. static_transform_provider 노드에 launch/part2-cameralidar.launch 에 있는. 

라운치 이런 것들을 확인하면 좋습니다. param name=use_sim_time 값은 true. node name =rosbag pkg=rosbag type=play args= -r 0.25 --clock /vagrant/2016.. node name = image_proc pak=image_proc respawn ns remap from image_raw to image_color 이런것들이 있습니다. 


이러한 라운치 파일은 제공합니다 옵션을 봅니다. composite 이미지 안에서 리얼타임 통해서 image_view 또는 기록하기 위해서 비디오 포함하는 이미지 전체적인 데이터 스트림을 위한. 이 이미지는 아래의 composite 이미지의 예시입니다.


어떻게 작동하는가.

lidar_image.py 가 송신하는 데이터 소스는 The recified camera image, teh calibration transform, camera calibration information for projecting the lidar points, velodyne data scan 입니다. 이 각각의 lidar 스캔은 받으집닏, 이 scan data 는 풀립니다. 메시지 스트럭트로 부터, 사용하여, struct.unpack. 이 각각의 스캔 포인터는 포함합니다. 이 x, y, 그리고 z coordinate를 미터안에, 이것은 intensity 밀도, 반사되는 레이저 빔


이것은 요구됩니다. 왜냐하면 그것에는 공식적인 파이선 라이브러리가 지원되지 않기 때문입니다. 이 python_pcl 패키지는 만들어집니다. 이것은 가능합니다. 이 모듈은 컴파일과 테스트 되는 동안 이 단순한 풀림 스트럽트는 수동적으로 선택됩니다. importing 외부 모듈에 임포팅에 대해서 선택됩니다. as 각각의 이미지가 받아지면, cv_bridge는 사용됩니다. 변환하기 위해서 ROS Image 센서 메세지 OpenCV 에 맞는 format 이 /world/velodyne 변형은 얻어집니다. 각 프레임에서. 이것은 입증합니다. 유용함. 시도 수동 캘리브레이션. 이 변환은 affine 변환 매트릭스 행렬 포함합니다. 프레임사이에서 roation 과 translation을.


각각의 포인터는 레이저 스캔은 변형됩니다. 카메라 프래임으로. 포인터는 4.0 미터 멀리 카메라는 구조하다 delutter  복잡한 이미지를 해결합니다. 포인터는 음의 지값과은 버려집니다. 그것은 나타냅니다. 스캔 포인터 카메라이 field of view


핀홀 카메라 모델은 사용됩니다. 투영하기위해서 rotated 3D 포인터를 이미지 좌표에. 빨간 원은 만들어집니다. 각각의 포인터를 위해서 이것은 투영됩니다. 이미지 바운드 내에. 


결과.

6개의 점을 찍습니다. rviz를 사용해서. rviz를 사용해서 이미지도 받아들이수 있는지. 궁금합니다. 아하 센서를 나타낸 것처럼 image_raw를 켜서 화면에 나타낼 수 있는 것인가. 아니면 단순 엠팔 센서의 데이터를 받아들이라는 소리인지 궁금합니다. 


최적화된 변환은 얻어집니다. 다음과 같이 offsetX, offsetY, offsetZ, yaw, pitch, roll 이렇게 그리고 Angles in degrees 이렇게 얻어집니다. 


What's  the Difference Between Pitch, Roll, and Yaw?

Vehicles that are free to operate in three dimensions, such as aircraft and submarines, can change their attitude and rotation about the three orthogonal axes centered on the vehicle's center of gravity - thoe longitudinal, vertical, and horizontal axes. Motion about the longitudinal axis is termed roll and in aircraft determines how much the wings are banked. Motion about the perpendicular axes is called yaw and for aircraft it determines which way the nose is pointed. Motion aobut the lateral axis is called pitch and it's measure of how far an airplane's nose is tilted up or down.


보는바와 같이 대부분의 에러는 포인트 얼굴, 오른쪽 상단 캘리브레이션 그리드에서 나옵니다. 그러나, 그 전체 에러는 얻어집니다. 약 35 픽셀에 관해서. 이 변형을 사용하여 이 비디오는 만들어집니다. 보이다 어떻게 잘 라이더 포인터. 할당되는지 이미지에. 왜냐하면 이 코드는 돌아갑니다. 가상 머신과 라이더 스캔 그리고 높은 주파수에서. 이 이미지와 라이더 스캔은 동기화되지 않습니다. 그러나, 사람 이미지 스탑 잠시. 당신은 볼 수 있습니다. 얼마나 캘리브레이션 작동하는지. 


이 비디오는 2배 낮은 주파수 배그파일이 플레이 되도록.

먼저 이해가지 않더라도 다시 한번 읽고 어떤 부분이 부족한지 확실히 하는 것이 중요합니다. 여기서 호환이 중요하므로, 정독하도록 합니다.



RGB 점 구름 라이더와 이미지 값으로부터의

이미지에 관해서 투사되는 대신에, 당신은 투영할 수 있습니다. 이미지를 3D 포인터 클라우드에 사용하여 같은 정보를. 이 스크립트는 만들어 집니다. 전송합니다 새로운 포인트 클라우드 포함하여 RGB 데이터 위해서 각각의 포인터는 투사할 수 있습니다. 


각각의 받은 이미지는 저장됩니다. 사용을 위해서 모든 포인트 클라우드가 받아질 때. 각각의 포인터 cloud에서는 pcl2.read_points(data)를 사용하여 대신에 수동적으로 풀다 데이터를 lidar_image.py.pcl2.craete_cloud 는 사용됩니다. 


rviz 에서의 RGB 포인트 클라우드에 담았습니다. 이 결과는 대단하지 않습니다. 왜냐하면 많은 계산이 포함되어 있기 때문입니다. 이 이미지와 포인트 클라우드는 받습니다. 다른 주파수 그리고 테스트는 수행됩니다. 가상 머신에서. 오차가 발생하는 이유에 대해서.


For cameracalibrator.py 의 파일이 bag 파일과 동일해야 하는 것 같다는 생각이 듭니다. 이 bag 파일이 칼리브레이션 하는 장면을 저장한 bag 파일이어야 하는가? 



launch file 만들기 기록하기 위해서 수저된 이미지를.

image_proc는 사용됩니다. 이미지를 수정하기 위해서 새로운 칼리브레이션 정보를 가지고. .launch 파일은 다른 결과를 만들기 위해서 만들어집니다. 이 파일은 수정된 이미지를 위해서 비슷합니다. 와 함께 오직 다른 rosbag 에 팻되는 배그파일. 




Image_proc

싱글 이미지 수정과 색 처리

http://wiki.ros.org/image_proc


간단한 ros 와 launch 그리고 topic, node 의 관계를 정리하는 것이 필요해보입니다.