Copter 3.4(이상)에서는 AUTO, Guided, RTL, Land 비행모드에서 "지형추적(Terrain Following)"을 지원한다. (참고 : 비행모드 한글 문서는 여기 참조) 이 기능은 기체가 지형위로 지정한 거리를 유지하며 상승 또는 하강하는 기능으로, 하방 Lidar 또는 초음파 거리측정기(Sonar) 또는 구글맵과 같은 매핑 서비스를 이용하는 지상국(ground station)에서 제공하는 지형 고도 데이터를 사용한다. 구글맵 데이터가 어떻게 사용되는지에 대한 자세한 내용은 비행기 지형 추적 페이지를 참고하라.
Mission Planner (혹은 지형추적기능을 지원하는 다른 GCS) 최신 버전을 사용하여, 비행계획(Flight Plan) 화면에서 고도 유형을 "Terrain"으로 설정. 이렇게 설정하면 "Alt" 필드가 있는 모든 미션명령들은 고도를 지형을 기준으로 한 고도(altitudes-above-terrain)로 해석함
Upload the mission to the vehicle and execute the mission as you normally would in AUTO
집으로(RTL) 모드와 착륙(Land)모드에서 지형데이터를 사용하려면 TERRAIN_FOLLOW 변수를 1로 설정한다. 이렇게 설정하면 RTL_ALT를 지형을 기준으로 한 고도(altitute-above-terrain)로 해석하여, 일반적으로 출발지점으로 돌아오는 길에 언덕 위로 올라가게 된다. 이와 비슷하게 착륙(Land) 모드는 (출발지점보다 10m 높은 게 아니라) 지형보다 10m 이상 높이 있을 때 LAND_SPEED(일반적으로 초속 50cm) 로 떨어뜨린다. 현재 이들 변수는 추천되지 않는다. 아래에서 언급할 경계조건에 걸리게 되면, 자주 발생하는 것은 아니지만, 기체가 RTL 귀환 때 지형데이터를 불러올 수 없는 경우가 발생하기 때문이다. 이 경우, RTL_ALT는 출발지를 기준으로 한 고도(alt-above-home)로 해석된다.
지형데이터가 없을 경우의 비상대책(Failsafe)
기체가 지형데이터가 필요한 미션명령을 수행중이나, 지형데이터를 2초이상 수신하지 못했을 경우(range finder가 고장났거나, 통신범위를 벗어났거나, 지상국에서 지형데이터를 공급할 수 없을 때) 기체는 집으로(RTL) 모드로 바뀐다. 참고로 이경우 지형데이터를 즉시 접근할 수 없기 때문에, TERRAIN_FOLLOW가 1로 설정되었든 아니든, RTL_ALT를 출발지점을 기준으로 한 고도(altitude-above-home)로 해석하여, 일반 RTL을 수행한다.
지형 간격과 정확도
TERRAIN_SPACING 변수는 지상국으로부터 지형 고도를 요청할 때(Lidar가 있을 경우 사용하지 않음) 사용되는 격자의 크기를 조절할 때 사용된다. 100미터가 기본값이지만, 30미터로 줄이면, GCS와 비행콘트롤간 텔레메트리 송수신을 줄이면서 정확도를 올리는 효과가 있다. TERRAIN_SPAING은 최소 30미터 이상으로 사용하는 것이 좋다.
지상국에서 기체에서 요청한 해상도의 지형데이터가 없을 경우, 지상국에서는 요청한 격자 크기에 맞춰 데이터를 내삽하게 된다.
지형 정확도
SRTM 데이터베이스의 정확도는 지구상의 위치에 따라 다르다. 일반적으로는 10-20미터 정도이지만, 개발자에 따라선 35미터에 달하는 경우도 있다고 한다. 따라서 지형추적 기능은 고도 60미터 이상에서 날려야 한다. 저고도에서 정확한 지형추적기능을 사용하려면 하향 Lidar나 초음파거리측정기를 사용해야 한다.
쿼드콥터에 사진기를 장착하고, 자동미션을 이용해 항공사진을 촬영하면, 일련의 사진이 촬영됩니다.
이 사진들은 물론 그냥 사용할 수도 있지만, 대부분의 경우, 특히 항공사진측량의 경우에는 촬영된 위치와 방향이 중요합니다.
그런데, 제가 조립한 기체는 GPS가 따로 달려있지 않은 일반 똑딱이(Canon IXUS 870 IX)를 사용하여 촬영했기 때문에 촬영된 위치나 자세한 정보가 전혀 없습니다. 하지만, Pixhawk의 경우에는 모든 촬영중 발생하는 상황이 LOG 파일로 저장됩니다. 이 정보를 사용하면 사진에 촬영 위치를 넣을 수 있습니다. (이 과정을 Geotagging 이라고 합니다.) 이 글은 ardupilot.org/copter의 글을 참고하여 정리한 것입니다.
먼저 아래 좌측은 제가 맨 처음 시범 촬영한 사진들을 적당한 위치로 배열해 본 것입니다. 오른쪽은 다음 지도에서 동일한 지역을 복사한 것이고요.
Mission Planner를 이용한 Geotagging 은 두 가지 방법이 있습니다. 하나는 로그에 들어 있는 CAM 메시지를 사용하는 방법이고, 다른 하나는 드론과 카메라의 시간을 동일하게 맞춘 뒤 이를 기준으로 위치를 끌어오는 방법입니다.
먼저 미션 플래너에서 Ctrl+F를 누르면 아래와 같은 화면이 뜹니다. (메뉴에는 없습니다.) 이중에서 맨 위에 있는 메뉴인 [Geo ref Images]를 사용하면 됩니다.
아래는 [Geo ref Images]를 눌렀을 때 나오는 화면입니다. 맨위에 있는 [Browse Log]는 촬영당시의 Log 파일을 찾아서 넣어주고, [Browse Pictures] 에는 촬영된 사진들을 넣어주면 됩니다. 이때 촬영때의 사진만 따로 넣어둔 폴더를 지정하면 됩니다. 이 폴더에는 다른 종류의 파일은 들어있어도 되지만, 사진은 오직 촬영당시의 사진만 존재해야 합니다. 그리고 사진들은 알파벳으로 정렬했을 때 처음 촬영된 사진이 맨 위로 올라오고 순서여야 합니다.
그 아래에 있는 Time offset 과 CAM Message Synchro 가 Geotagging 방식을 선택하는 겁니다. Pixhawk와 연동하여 촬영하면 CAM Message Synchro를 눌러주면 됩니다.
다 준비가 되면 Pre-Process를 눌러줍니다. 그러면 한참 계산을 하고 맨 아래에 Done 이라고 나타납니다.
다음으로 [Location KML] 을 누르면 촬영된 위치가 맞는지 구글어스에서 확인할 수 있습니다. 아래는 시범 촬영한 사진을 확인해본 모습입니다. 여기에서 하얀줄은 드론의 비행 코스, 노란 핀은 촬영한 위치입니다.
마지막으로 [Geo Tag Images] 를 눌러주면 원본 사진이 있는 폴더 속에 Geotagged 라는 폴더가 생겨 있습니다.
===
위 촬영은 보시는 것처럼 3코스만 촬영했기 때문에 아무래도 부족하여 새로 촬영을 나갔습니다. 이 영상을 사용하여 위의 방법대로 지오태깅을 하려고 했는데 문제가 발생했습니다. Preprocessing을 누르면 아래처럼 사진 매수가 일치하지 않는다고 나오는 겁니다. 정확한 원인은 찾지 못했는데... 아무래도 중복도를 높이다보니(80%) 비행콘트롤러에서 촬영메시지를 자주 보내지만, 카메라에서 이를 처리하지 못했기 때문이 아닌가 하는 생각이 들었습니다. (다음에는 중복도를 좀 낮춰서 촬영해야 할 듯 싶습니다.)
아무튼... 그래서 여러가지를 고민하다가, 시간태그를 이용하는 방법으로 지오태깅을 하기로 했습니다. 이 방법은 [Geo Ref Images] 화면에서 아래와 같이 [Time offset]을 선택하고 [Estimate Offset]을 누르면 아래 알림창에 몇개의 사진을 기준으로 오프셋을 계산해 주는데, 이 값을 "Seconds offset"에 복사해 넣은 뒤 PreProcessing을 눌러주면 됩니다. 나머지 과정은 동일하고요.
그런데 제 경우엔 위에서 보는 것처럼 53.05를 넣으면 아주 이상한 위치로 나와서 촬영된 사진을 보면서 적당히 판독하여 -8로 넣어줬더니 대략 맞더군요.
그 다음도 위에 있는 방법과 동일합니다. [Preprocess]를 누르고 [Location KML]을 통해 위치가 맞는지 확인한 후 마지막으로 [GeoTag Images]를 눌러주면 됩니다.
아래는 이 방법으로 지오태깅을 하면서 만든 KML을 구글어스에서 돌리면서 녹화한 것입니다. 이번엔 총 6개의 코스가 잘 촬영됐네요. ㅎㅎㅎ
===
참고로... 원래 Pixhawk의 로그 파일에는 사진 촬영 당시의 위치 뿐만 아니라, 자세 (기체의 방향) 정보도 들어 있습니다. 아래는 로그파일 첫부분에 들어 있는 필드 정의에 관한 내용인데요, Lat, Lng, Alt 등 위치 뿐 만 아니라, Roll, Pitch, Yaw 등의 자세 정보도 함께 저장됨을 알 수 있습니다.
다만, 이 값은 그대로 활용하기는 곤란합니다. pixhawk의 IMU 는 Pixhawk 콘트롤러 내부에 들어 있어 카메라가 달려있는 방향과 일치하지도 않을 뿐 더러, 카메라가 별도로 흔들릴 수도 있고... 아주 완벽하게 일치된다고 해도 Pixhawk의 IMU 자체가 별로 정확하지 않기 때문입니다.
그래도... 전문가에겐 이런 정보가 없는 것보다는 도움이 되겠죠. 저도 언젠가 시간이 되면 천천히 한 번 뒤져보고 싶네요.
민, 푸른하늘
===
p.s. : DROTAG를 사용하면 한방에 해결된다네요. Pixhawk 의 Telemetry 포트에 연결만하면 된다는데.. 다만 사진 촬영간격이 최소 3초가 되어야 한다는데... 이건 개선되겠죠. 현재는 품절이라는데 좀더 기다려봐야겠습니다.
p.s. : Mission Planner 대신 UgCS를 사용하면 지오태깅은 해결할 수 있답니다. 이 글을 참고하세요. 무료버전도 가능합니다.
이 글은 여기를 참고로 하고...(앞부분은 번역. 아래에 있음) 제가 직접 미션을 생성하는 방법을 정리하였습니다.
항공사진 촬영용 미션은 우선 촬영대상지역을 폴리곤으로 생성한 후, 이 지역을 대상으로 자동으로 웨이포인트를 생성하는 순서를 따릅니다.
먼저 Mission Planner에서 "FLIGHT PLAN" 탭으로 이동합니다. 지도화면에서 시작하고자 하는 지점에서 마우스 우클릭을 하고 아래와 같이 Draw Polygon -> Add Polygon Point 를 선택합니다.
그러면 경고창(당분간 폴리곤 입력모드가 계속된다는)이 뜨고 빨간색 아이콘이 하나 생깁니다. 그 다음부터 마우스를 클릭할 때마다 폴리곤 꼭지점이 계속 추가됩니다. 입력이 완료된 후에는 아이콘을 드래그하여 원하는 지점으로 이동시킬 수 있습니다.
폴리곤을 완성하면, Auto MIssion을 생성할 수 있습니다. 아래와 같이 Auto WP를 선택하면 됩니다. 이중에서 Survey(Grid), Survey(Gridv2), SimpleGid 등 세가지가 격자식으로 일정한 간격으로 사진을 촬영할 수 있는 옵션입니다.
제가 제일 많이 사용하는 것은 Survey(Grid)입니다. Survey(Gridv2)는 직사각형을 회전시키는 기능이 없는 등 아직까지 활용하기는 약간 부족하고, SimpleGrid는 그냥 Waypoint만 생성해서 카메라 촬영에 관한 내용을 별도로 입력해줘야 합니다.
Survey(Grid)를 선택하면 아래와 같은 화면이 뜹니다. 이때 먼저 자신의 카메라를 선택하고, 고도(Altitude)와 각도(Angle)을 적당히 만져서 가장 최적의 경로를 만들어주면 됩니다. 자신의 카메라 방향에 따라 [Camera Top facing forward]를 선택해주고요. 그러면 아래쪽에 이 미션에 대한 정보가 여러가지가 나타납니다.사진은 총 20장을 촬영하고, 비행시간은 2:45 이라고 나오네요. 지상해상도는 1.6 cm. ㅎㅎ
여기에서 고도 60미터에서 Canon IXUS 870으로 촬영할 때 사진 한장의 크기는 73.9 x 55.4 라고 나옵니다. 촬영간격이 28미터로 설정되었으니, 종중복도는 50%((55.4-28)/55.4) 이고, Strip간의 간격이 29.57 이니까 횡중복도는 60% ((73.9-29.57)/73.9) 로 잡혀있네요.
아래쪽에 있는 Footprints를 눌러주면 아래와 같이 촬영되는 범위를 확인할 수 있습니다. 종중복도 50%, 횡중복도 60% 정도 되는 걸 확인할 수 있습니다.
종중복도/횡중복도를 조정하려면, 맨 아래에 [Advanced Options]를 누르고 [Grid Options] 탭을 누르면 아래와 같은 화면이 나옵니다. 여기에서 Overlap과 Sidelap을 조정하면 됩니다.
자신이 사용하는 카메라가 존재하지 않을 경우에는 [Camera Config] 탭에 들어가서 새로 생성할 수도 있습니다.
아래는 이와 같은 과정을 통해 생성된 자동 미션입니다. 촬영코스를 볼 수 있고... Waypoints에 보면 DO_SET_CAM_TRIG_DIST 가 11.38미터로 설정되어 있음을 알 수 있습니다.
이렇게 하면 대충 어렵지 않게 촬영계획을 세울 수 있을 것 같습니다. 이제 이거 가지고 다시 촬영을 나가봐야겠네요.
민, 푸른하늘
====
개요
카메라 촬영계획을 세우는 것은 웨이포인트와 이벤트가 포함된 다른 미션 계획을 세우는 것과 동일 하다. 단 하나의 차이는 웨이포인트에서 카메라 셔터를 터뜨리는 명령을 지정하거나, 기체의 이동에 따라 정해진 간격으로 촬영하도록 하는 명령을 넣는다는 것이다. 카메라에 짐벌이 달려있을 경우, 짐벌의 방향을 지정하거나, 특정한 지점을 추적하도록 할 수도 있다.
간단한 임무의 경우, 원하는 웨이포인트와 카메라 명령을 직접 지정할 수도 있다. 좀더 복잡하거나, 격자형식으로 촬영해야 할 경우, 임의의 지역에 대해 자동적으로 필요한 임무를 생성해주는 도구를 사용할 수 있다.
이 문서는 사용가능한 카메라 명령 및 짐벌 명령에 대해 설명한다. 아울러 미션 플래너에서 제공하는 자동미션 및 이를 이용하여 복잡한 측량용 사진을 촬영하는 방법에 대해 설명한다.
콥터의 경우 Home Position은 시동을 건 지점으로 설정된다. 즉, 콥터에서 RTL을 실행시키면 콥터가 처음 시동을 건 지점으로 돌아오게 된다. 따라서 이를 고려하여 시동을 걸어야 한다.
비행기의 경우 Home Postion은 GPS가 고정된 지점이다. 따라서 비행기에서 RTL을 시행하면 GPS가 최초로 고정된 지점으로 돌아오게 된다. 따라서 RTL을 실행시켰을 때 돌아오도록 할 지점에서 비행기의 전원을 넣어야 한다.
Video : 다중 지점 미션 생성 및 저장
- Mission Planner -> Config/Tunning 에서 단위를 meter 로 설정
- Flight Plan 화면에 들어감
- 원하는 위치를 클릭하면 Waypoint가 생성됨. (비디오에서는 home Position이 나오지만 ...)
- 원하는 대로 추가한 뒤, 우측에서 Save WP File을 누르면 저장할 수 있음
Video : 이미 저장된 다중 지점 미션 파일 불러들이기
- Load WP File을 누르면 저장된 파일을 읽어들일 수 있음
- Connect 한 상태에서 Write WPs 를 누르면 곱터에 탑재됨
- Connect 한 상태에서 Read WPs 를 누르면 곱터에 현재 탑재되어 있는 Waypoint를 다운로드 받음
명령(Instructions)
아래 스크린샷에 있는 콥터 미션은 맨처음 자동 이륙하여 고도 20미터로 상승한다. 그다음 고도를 100으로 높이면서 WP 2로 향한다. 그다음 10초를 대기한다. 다음 WP 3으로 이동하고(고도를 50으로 낮추면서) 그다음 RTL을 수행한다. Default Height가 100이므로 RTL은 고도 100미터로 돌아간다. 이 지점에 돌아온 후 착륙하게 된다. 이 미션에서는 이륙지점이 Home Position 에 설정되었다고 가정한다.
여기에 추가로 Waypoint를 삽입하거나 다른 명령을 넣을 수도 있다. (자세한 내용은 아래에 있는 Mission Commands 항목 참조) 각각의 행에 있는 드롭다운 메뉴를 선택하면 원하는 명령을 선택할 수 있다. 설정한 명령에 따라 열의 제목이 변경된다. 경위도는 지도에서 클릭하면 변경된다. 고도는 상대적이다. 따라서 100을 설정하면 출발 지점을 기준으로 100미터 위로 상승한다.
Default Alt는 새로운 waypoint를 입력할 때 기본값으로 들어가는 값이다. 아울러 Hold Default ALT를 체크했을 경우, RTL(Return to Launch)를 실행했을 때 돌아오는 고도이다. Hold Default ALT를 체크하지 않았다면 RTL 명령이 내려지는 시점의 고도를 유지한다.
Verify Heights란 Google Earth 지형을 이용하여 실재 지형의 높이에 따라 각 지점의 높이를 조정하라는 의미이다. 따라서 Waypoint가 산위에 있을 경우 산의 높이만큼 기체의 높이가 더 높이 설정된다. 이를 이용하면 산과 충돌을 피할 수 있다.
미션 지정을 완료하면, "Write"를 누르면 APM으로 전송되어 EEPROM에 저장된다. "Read"로 불러들여보면 원하는 대로 저장되었는지 확인할 수 있다.
하드디스크에 미션 파일을 여러개 저장해 둘 수도 있다. "Save WP File"을 선택하면 된다. 이 파일은 "Load WP File"로 불러들일 수 있다.
유용한 팁
Prefetch : 인터넷이 연결되지 않는 현장을 위해 미리 지도를 캐시로 담을 수 있다. Prefetch 버튼을 누르고 Alt 를 누른 상태로 원하는 사각형 범위를 지정하면 해당 지역의 위성영상이 저장된다.
Grid : 원하는 사각형을 그리면 선택된 지역에 대해 자동적으로 waypoint를 생성하는 기능이다. 참고로 이 도구는 'island detection'을 수행하지 않는다. 즉, 큰 사각형 내에 작은 사각형을 그려도 작은 사각형 범위가 제외되지 않는다. (자세한 내용은 여기) 아울러 U 형태로 오목한 지역이 있어도 비행지역 내에 포함된다.
현재 위치를 home position으로 설정하는 것은 아주 쉽다. 위의 "HOME LOCATION"을 클릭만 하면 현재 위치로 설정된다. ???
waypoint간의 거리를 측정하려면 한쪽에서 오른쪽 버튼을 클릭하고 "Measure Distance"를 선택한다. 그다음 다른 점에서 마우스 오른쪽 버튼을 클릭하고 "Measure Distance"를 다시 선택하면 다이얼로그에 거리 정보가 나타난다.
자동 그리드(Auto Grid)
Mission Planner로 하여금 자동적으로 임무를 생성하도록 지정할 수도 있다. 기체가 잔디깍이와 같이 촬영 대상지역을 전후좌우로 이동하는 지도제작과 같은 경우 유용하다.
이를 위해서는 먼저 Poligon을 선택하고 원하는 지역에 대해 박스를 그린다. 그다음 Auto WP -> Grid를 선택한다. 그다음 다이얼로그 박스에 고도와 간격을 입력한다. 완료하면 아래와 같은 임무를 생성한다.
Mission 명령
Mission Planner는 현재의 기종에 따라 적절한 Mission Commands를 제공하며, 사용자가 입력해야 할 파라미터에 따라 열의 제목을 바꾼다. 이러한 명령에는 waypoint 간을 이동하거나 인근에서 체류하는 네비게이션 명령, 특정한 행동(예 : 사진촬영)을 수행하는 DO 명령, DO 명령을 수행할 때 지정해야 하는 조건 명령 등이 있다.
ArduPilot 플랫폼에서 지원 하는 모든 mission commands 명령은 MAVLink Mission Commnand Messages (MAV_CMD)에 들어 있다. 여기에는 각각의 명령에 대한 전체 이름, 어떤 파라미터가 지원되는지에 대한 정보, 및 해당되는 Mission Planner 열 이름 등이 포함되어 있다.
참고 : Mission Planner에스는 전체 이름중 일부를 잘라만든 버전을 사용하고 있다. 예를 들어 MAV_CMD_NAV_WAYPOINT, MAV_CMD_CONDITION_DISTANCE, MAV_CMD_DO_SET_SERVO 등은 MIssion Planner에서 WAYPOINT/CONDITION_DISTANCE/DO_SET_SERVO 등으로 사용된다.
제 관심사는 계속 바뀝니다. 이 블로그를 유지하는 동안에도 벌써 여러번 주제가 빠뀐 것 같습니다. 돌고 돌아 이제 고향으로 돌아왔습니다. 공간정보입니다. 세계를 측정하고, 그 기준을 세우고, 데이터를 효율적으로 공유하는 것이 공간정보에서 다루는 내용입니다. 4차산업혁명이 데이터 기반이라고들 합니다. 데이터는 그냥 모아둔다고 정보가 되지 않습니다. 표준에 따른 공통 스키마를 기반으로 만들어져야 합니다. 누구나 언제든지, 쉽고 투명하게 데이터를 가져다 쓸
댓글을 달아 주세요