반응형
 

아래 내용은 https://blog.github.com/2016-02-01-working-with-submodules/ 에 포스팅된 글을 번역 및 추가한 것이다.


복잡한 소프트웨어 프로젝트는 다른 프로젝트, 라이브러리 또는 프레임워크에 의존하게 되는 경우가 많다. Git(깃) 은 submodule(서브모듈)을 제공하여 이러한 과정을 돕는다. 서브모듈은 다른 repository(저장소)를 하나의 sub-folder로 추가할 수 있도록 한다.


Git 에서 Submodule을 사용하면 재사용되는 제네릭한 프로젝트들을 부모 프로젝트에서 분리해서 관리하기 쉽고 다른 프로젝트에 적용하기 쉽지만 사용하기가 번잡스러운 부분이 있다. 그래서 아래의 예를 통해 이해해보자.


서브모듈 추가하기


예를 들어 Slingshot(새총) 이라는 프로젝트를 개발중이라고 해보자. 이 프로젝트에는 y-shaped stickrubber-band라는 코드가 있다.


flickr photo shared by young@art under a Creative Commons ( BY ) license


이때, 다른 저장소에는 Rock 이라고 불리는 프로젝트가 있는데 이것은 그냥 일반적인(generic) rock 이라는 라이브러리일 뿐이지만 Slingshot에 적합하다고 가정해 보자.

그래서 slingshot 저장소에 이 rock이라는 저장소를 slingshot의 서브모듈로 추가하기 위해 다음을 입력한다:


git submodule add https://github.com/<user>/rock rock

<추가됨>

이렇게 추가된 서브모듈에 대한 정보는 root 폴더의 .gitmodules 에 아래와 같은 내용이 추가된 것을 확인할 수 있다.


[submodule "rock"]
	path = rock
	url = https://github.com/<user>/rock.git
	branch = master


또한 .git/config 에도 이 내용이 반영되어있다.


[submodule "rock"]
	url = https://github.com/<user>/rock.git

</추가됨>


이 시점에서 slingshot 폴더 안에 rock이라는 폴더가 생성되지만 사실 그 안에는 아무것도 존재하지 않는다.


새로운 버전의 깃 에서는 자동으로 내용물을 채우지만 이전 버전에서는 깃에서 rock의 내용을 명시적으로 다운로드해야 한다:


git submodule update --init --recursive


모든것이 잘 되었다면 이 변경점을 커밋하고 rock 폴더를 slingshot 저장소에 추가하게 된다.


깃허브에서는 rock 폴더 아이콘에 작은 표시를 붙여 이것이 서브모듈임을 나타낸다:


screen shot 2016-01-27 at 4 55 10 pm

rock 폴더를 클릭하면 rock 저장소로 이동하게 된다.


이제 rock 저장소를 slingshot 저장소에 추가하였고 rock의 모든 내용들을 slingshot에 포함된 것처럼 사용할 수 있다.

slingshot 저장소에서 실행한 깃 명령어는 "부모 저장소"에서 동작한다. 그리고 rock 폴더 안에서 실행한 명령어는 단지 rock 저장소에서 동작한다.

cd ~/projects/slingshot
git log # log shows commits from Project Slingshot
cd ~/projects/slingshot/rubber-band
git log # still commits from Project Slingshot
cd ~/projects/slingshot/rock
git log # commits from Rock
서브모듈을 사용하는 프로젝트에 참가하기

이제 여러분이 Slingshot 프로젝트에 참가하는 협업자라고 가정해보자. git clone을 사용하여 slingshot 의 내용물을 다운로드하기 시작한다. 이 시점에서  rock 폴더를 들여다보면 아무것도 없는것을 확인할 수 있다.
다시 말하지만 깃은 명시적으로 서브모듈을 다운로드할것을 기대한다. 여기서 git submodule update --init --recursive를 사용할 수도 있지만 아래와 같이 clone 명령어를 변경하여 서브모듈 내용물을 포함하여 다운로드할 수 있다.

git clone --recursive <project url>

서브모듈로 변경


이미 존재하는 서브폴더를 외부에 의존적인 폴더로 변경하는 것은 약간 복잡하다. 다음 예를 보자.


magic roll-back can 이라는 새로운 프로젝트를 시작하기로 했는데 여기에는 rubber-band가 유용하다고 가정하자. slingshot 을 위해 만든 rubber-band를 독립적인 저장소로 분리하고 이것을 두개의 프로젝트에 서브모듈로 추가해야 한다.


먼저 rubber-band 폴더의 내용물을 slingshot에서  추출한다. git filter-branch 명령을 사용하여 rubber-band와 관련된 커밋만을 남겨둘 수 있다. git filter-branch 명령어는 우리의 저장소 이력을 재작성 하여 마치 rubber-band 폴더가 원래 저장소에 포함되지 않은것처럼 보이게 한다. git filter-branch명령어에 대해 더 자세히 알아보려면 다음 글을 참조한다.


slingshot안에 있는 rubber-band 를 자체적인 저장소로 동작하게 하기 위해서 slingshot 의 복사본을 만든다. cp -r 명령어를 사용하여 slingshot의 전체 폴더를 rubber-band 라는 폴더로 재귀 복사 한다.


cd ..
cp -r slingshot rubber-band


rubber-band는 또 다른 slingshot과 동일하지만 이제부터 rubber-band 저장소로부터 git filter-branch 명령어를 실행한다.


cd rubber-band
pwd # (double check before proceeding!)
git filter-branch --subdirectory-filter rubber-band -- --all


이 시점에서 rubber-band 라는 폴더는 slingshot 프로젝트와 유사하게 보이지만 rubber-band 폴더의 파일과 커밋 히스토리만을 갖게 된다.

이 폴더를 slingshot에서 복사하였기때문에 새 저장소는 여전히 slingshot에서 설정한 리모트 트래킹 브랜치(remote tracking branch)를 갖고있다. rubber-bandslingshot 에 푸시(push)하면 안되고 새로운 저장소에 푸시해야한다.


이제 깃허브에서 rubber-band라는 새로운 저장소를 만들고 리모트(remote)를 rubber-band로 업데이트한다. remote origin 이라고 가정하면 아래와 같이 입력한다.


git remote set-url origin https://github.com/<user>/rubber-band


git push를 통해  새로운 "generic rubber-band 모듈"을 퍼블리쉬 하면 rubber-band를 분리하고 이것을 자체적인 저장소로 만들게 된다. 이제 slingshot 저장소에서 기존의 rubber-band 폴더를 삭제해야한다.


git rm -r rubber-band
git commit -m "Remove rubber-band (preparing for submodule)"


slingshot을 업데이트하여 rubber-band를 서브모듈로 사용하기 위해 다음을 입력한다.


git submodule add https://github.com/<user>/rubber-band rubber-band
git commit -m "rubber-band submodule"

rock을 추가할 때와 같이 저장소 안의 저장소를 갖게 되었다. 부모 저장소인 slingshot 그리고 두개의 "서브" 저장소인 rockrubber-band를 포함하여 세개의 저장소가 되었다.


게다가 slingshot의 히스토리를 들여다보면 rubber-band가 폴더일때 만들었던 커밋들을 재발견 할 수 있다. folder를 삭제하더라도 히스토리가 삭제되는것은 아니다. 이것은 때때로 혼란스러울 수 있는데, rubber-band "자식" 저장소가 기존의 slingshot 커밋의 복사되고 변경된 버전의 사본을 갖고있기 때문이다.


불행하게도 이 시점에 협업자들이 slingshot을 pull 하게 되면 rubber-band 비어있게 된다. 협업자들이 아래 명령어를 실행하여 서브모듈의 모든 내용물을 다운로드하도록 해야한다.


git submodule update --init --recursive


rubber-bandmagic roll-back can에 서브모듈로 추가하고 싶다면 slingshotrock을 추가한것처럼 반복하면 된다.


cd ~/projects/roll-back-can
git submodule add https://github.com/<user>/rubber-band rubber-band
git commit -m "rubber-band submodule"
git submodule update --init --recursive


반응형

'Computer > git' 카테고리의 다른 글

git 디렉토리 복사 후 복구  (0) 2018.10.10
git 에 사용자 정보 입력하기  (0) 2018.03.29
git 에서 새로운 브랜치 만들기  (0) 2018.02.02
git 의 오래된 항목 삭제하기  (0) 2018.01.22
반응형

레이싱 드론의 비행제어용으로 많이 사용하는 naze32 보드에 비행기를 설정하여보았다.

이미 이전 포스팅에서 naze32 보드로 비행기제어하기 라는 포스팅에서 설정방법을 올렸으나. 최신 Cleanflight Configurator 버전 2.4.0(2019/1/7현재) 에서는 제대로 동작하지 않는 현상이 있어서 다시 정리해보았다.


0. FW 올리기


Cleanflight Configurator 2.4.0 를 실행 후 Firmware Flasher탭에서

Board : NAZE

Firmware version: CLFL_v2.3.2 버전을 다운로드 후 Flash한다.



또는 아래 링크에서 직접 다운로드 한다.

https://github.com/cleanflight/cleanflight/releases/tag/CLFL_v2.3.2


*2019/1/7 현재 Naze32 rev6 보드의 경우 가장 최신버전은 2.3.2까지 동작한다. 2.4 이후 버전은 제대로 동작하지 않음


1. Ports 설정


UART2 에서 Serial Rx를 Enable 하고 재부팅한다.


2. Configuration 설정


Mixer = Custom Airplane

ESC/Motor 프로토콜은 PWM으로 설정한다.

RC수신기는 SBUS 형식의 수신기를 사용하므로 SBUS로 선택한다.


3. 조종기 입력 설정


Receiver 탭에서 RC조종기 입력을 설정하고 각 스틱이 제대로 입력되는지 확인한다.


주의! 조종기 스틱 입력에 Reverse 가 설정되어있다면 모두 해재한다. 



4. Resource OUTPUT  변경하기


펌웨어 1.14 그리고 Cleanflight configurator 1.1.0 버전에서는 mixer를 airplane으로 설정 시 pwm output mapping이 자동으로 서보 모터에 할당되었지만 그 이후에는 CLI에서 수동으로 resource를 할당해주어야하는 것으로 바뀌었다.

방법은 다음과 같다.


주의! CLI에서 입력하는 모든 명령어는 마지막에 save를 입력하고 재부팅해야 eeprom에 저장되어 설정된다. 그냥 연결을 끄면 모든 변경 내용이 사라지므로 주의한다.


CLI 탭에서 resource를 입력하면 아래와 같이 출력된다. 


# resource

resource BEEPER 1 A12

resource MOTOR 1 A08

resource MOTOR 2 A11

resource MOTOR 3 B06

resource MOTOR 4 B07

resource MOTOR 5 B08

resource MOTOR 6 B09

resource PPM 1 A00

resource PWM 1 A00

resource PWM 2 A01

resource PWM 3 A02

resource PWM 4 A03

resource PWM 5 A06

resource PWM 6 A07

resource PWM 7 B00

resource PWM 8 B01

resource LED_STRIP 1 A06

resource SERIAL_TX 1 A09

resource SERIAL_TX 2 A02

resource SERIAL_TX 11 A07

resource SERIAL_TX 12 B01

resource SERIAL_RX 1 A10

resource SERIAL_RX 2 A03

resource SERIAL_RX 11 A06

resource SERIAL_RX 12 B00

resource INVERTER 2 B02

resource I2C_SCL 2 B10

resource I2C_SDA 2 B11

resource LED 1 B03

resource LED 2 B04

resource SPI_SCK 2 B13

resource SPI_MISO 2 B14

resource SPI_MOSI 2 B15

resource ADC_BATT 1 A04

resource ADC_RSSI 1 A01

resource ADC_CURR 1 B01

resource ADC_EXT 1 A05


resource MOTOR ## ## 형식으로 되어있는데

여기서 첫번째 번호는 채널, 두번째는 할당된 포트 번호를 의미한다.


SERVO가 할당되어있지 않으므로 MOTOR 3~6까지를 SERVO 1~4로 할당해야한다.

이때 resource SERVO 1 B06 이라고 입력하면 이미 할당되어 있다고 나오므로 먼저 MOTOR에 할당된 포트를 Free해야한다.

"resource MOTOR 3 none" 이라고 입력하면 


# resource MOTOR 3 none

Freed

Freed 라고 출력한다.

나머지 MOTOR 4,5,6 에 대해서 각각 resource none 을 해준다.

이제 각 포트 B06, B07, B08, B09에 대해서 SERVO 1, 2, 3, 4를 할당하기 위해

# resource SERVO 1 B06 # resource SERVO 2 B07 # resource SERVO 3 B08 # resource SERVO 4 B09

라고 입력한다.

모두 입력한 다음 반드시 save 를 입력하고 재부팅한다.


5. Mixer설정

지금까지는 각 출력 포트를 서보의 채널과 연결시키는 작업이었다면 다음은 각 서보 채널을 비행기의 throttle, aileron, elevator, rudder 입력으로 연결하는 것이다.

자세한 방법은 https://cleanflight.readthedocs.io/en/stable/Mixer/ 에 설명되어 있다.


모터 출력은 mmix 에서 담당하고 각 파라미터는 다음과 같이 구성된다.

mmix 

[n(모터 순서)] 

[throttle 입력(0.0혹은1.0)] 

[roll: roll 입력에 대한 authority(-1.0~1.0)] 

[pitch: pitch 입력에 대한 authority(-1.0~1.0)] 

[yaw: yaw 입력에 대한 authority (-1.0~1.0)] 


따라서 엔진이 2개인 비행기의 경우 yaw입력에 대해 1번 엔진과 2번 엔진에 differential 출력을 설정한다면


# mmix reset

# mmix 0 1.0 0.0 0.0 0.3 # Left Engine # mmix 1 1.0 0.0 0.0 -0.3 # Right Engine

을 입력하면 조종기와 gyro의 yaw 입력에 따라 차등하여 엔진 출력을 조절할 수 있다.


서보 모터 출력은 smix에서 담당하고 각 파라미터는 다음과 같이 구성된다.

smix

[rule] 

[n(서보 순서)]

[Source ID: 0=Stab Roll, 1=Stab Pitch, 2=Stab Yaw, 3=Stab Throttle, 4=RC Roll, 5=RC Pitch, 6=RC Yaw...]

[Rate : 100]

[Speed: 0]

[Min: 0]

[Max: 100]

[Box: 0]


smix 설정은 Rule 0번부터 진행하고 서보 순서는 다음과 같다.


idServo slot
0GIMBAL PITCH
1GIMBAL ROLL
2ELEVATOR / SINGLECOPTER_4
3FLAPPERON 1 (LEFT) / SINGLECOPTER_1
4FLAPPERON 2 (RIGHT) / BICOPTER_LEFT / DUALCOPTER_LEFT / SINGLECOPTER_2
5RUDDER / BICOPTER_RIGHT / DUALCOPTER_RIGHT / SINGLECOPTER_3
6THROTTLE (Based ONLY on the first motor output)
7FLAPS

서보의 순서 중 0, 1 은 Motor에 할당되어 있으므로 2번을 엘리베이터, 3, 4번 채널을 에일러론, 5번 채널을 러더로 설정한다.


# smix reset

% Rule Servo Source Rate Speed Min Max Box # smix 0 3 0 100 0 0 100 0 % Roll / Aileron # smix 1 4 0 100 0 0 100 0 % Roll / Aileron # smix 3 5 2 100 0 0 100 0 % Yaw / Rudder # smix 2 2 1 100 0 0 100 0 % Pitch / Elevator


이렇게 입력하면 각 서보 채널에 대해 롤/피치 요 값이 적용되는 것을 확인할 수 있다.


6. 서보 Reverse


이제 보드에 서보를 연결하고 조종기를 켜서 제대로 동작하는지 확인해보자.

조종면 확인은 다음과 같다.

에일러론부터 시작하여 엘리베이터, 러더 순서로 진행한다.


Roll Left -> Aileron left goes up, Aileron right goes down

Roll Right -> Aileron left goes down, Aileron right goes up

Elevator Push -> Elevator goes down

Elevator Pull -> Elevator goes up

Rudder Left -> Rudder goes left

Rudder Right -> Rudder goes right


만약 서보의 방향이 반대로 움직인다면 smix reverse의 설정을 변경해주어야 한다.

다시 CLI에서 smix reverse를 입력하면


# smix reverse s i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 i12 i13 0 n n n n n n n n n n n n n n 1 n n n n n n n n n n n n n n 2 n n n n n n n n n n n n n n 3 n n n n n n n n n n n n n n 4 n n n n n n n n n n n n n n 5 n n n n n n n n n n n n n n 6 n n n n n n n n n n n n n n 7 n n n n n n n n n n n n n n

각 행은 서보의 순서 혹은 채널을 의미하고 열은 입력 소스(Input sources)를 의미한다.


idInput sources
0Stabilised ROLL
1Stabilised PITCH
2Stabilised YAW
3Stabilised THROTTLE
4RC ROLL
5RC PITCH
6RC YAW
7RC THROTTLE
8RC AUX 1
9RC AUX 2
10RC AUX 3
11RC AUX 4
12GIMBAL PITCH
13GIMBAL ROLL

에일러론으로 설정된 3번 서보의 Stabilized Roll가 Reverse 되어있다면 다음과 같이 입력한다.

# smix reverse 3 0 r

마찬가지로 엘리베이터로 설정된 2번 서보의 Stabilized Pitch 가 Reverse 되어있다면 다음과 같이 입력한다.

# smix reverse 2 1 r

smix reverse 를 입력하면 다음과 같이 변경되었음을 확인할 수 있다.

# smix reverse

s i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 i12 i13 0 n n n n n n n n n n n n n n 1 n n n n n n n n n n n n n n 2 n r n n n n n n n n n n n n 3 r n n n n n n n n n n n n n

save 후 reboot 하여 제대로 동작하는지 확인해보면 된다.

# save


주의! 이때 조종기 자체 설정에서 출력을 Reverse 하면 안된다.



반응형
반응형

이전에 포스팅한 Bixler 무인기를 자동비행으로 날려보았다.

제작 과정은 다음을 참조 http://kyubot.tistory.com/79?category=566605


비행 장소는 아래 그림과 같이 암사동 광나루 드론 공원이다. 

이번에는 이륙부터 경로비행 그리고 착륙까지 완전 자동비행으로 시도해보았다.


비행전 점검


자동비행으로 비행하기 전에 반드시 수행해야 하는 절차는 각 조종면이 움직임에 대해 올바로 반응하는지 확인하는 것이다.

비행기에 전원을 넣고 Stabilzation 모드에서 기체를 회전시켜 실제 조종면이 아래 그림처럼 동작하는지 확인해야 한다.

만약 반대로 움직이게 되면 비행기는 자동모드로 넘어가자마자 곤두박질 칠 것이다.


경로점 설정하기


바람 방향을 고려하여 북쪽으로 이륙 후 2차례 홀딩 패턴 비행을 한 다음 접근 및 착륙하는 간단한 미션을 설정하였다.



언제부터인지 모르겠으나 1.8.1 버전에서는 처음 경로를 설정하였는데 착륙 진입(landing approach) 경로점과 최종 착륙지점(Landing point)까지 landing flare (최종 접근 지점에서 부드러운 착지를 위해 고개를 들어올리는 기술)를 진행하기 위한 여유 거리, 방향 및 고도가 필요하다는 경고를 준다. 이 경고를 무시하면 자동 비행 자체가 진입이 안됨.


내용 추가

고정익 항공기의 착륙


착륙과 관련하여 PX4 에서 설명한 자료(https://docs.px4.io/en/flying/fixed_wing_landing.html)에 따르면 고정익 비행기의 착륙 로직은 아래 그림과 같은 2가지 단계로 이루어진다.

1. 먼저 착륙 접근 단계에서 고정익 비행기는 고정된 착륙 접근 각도(FW_LND_ANG)에 따라 진행한다.

2. 플레어 고도(FW_LND_FLALT)에 다다르면 플레어 경로(FW_LND_HVIRT에 설정된 커브)를 따라 착륙한다.


플레어 랜딩 고도는 고정익 항공기가 실제 지상으로 "간주"하는 고도에 대한 상대적인 고도이다.

착륙 모드에서 지면 고도는 알 수 없으므로 비행체는 그것을 해면고도(0m)로 사용한다. 대체로 지면이 해수면보다 높으므로 비행기는 첫번째 단계에서 착륙하게 된다(플레어 고도에 도달하기 전에 지면에 닿게 됨)


만약 비행기에 지면 거리를 측정할 수 있는 센서가 장착되어 있다면 위 그림과 같은 단계로 착륙하게 될 것이다.


착륙은 다음 파라미터에 따라 영향을 받는다.


파라미터 

설명

 FW_LND_ANG

플레어 전단계까지 적용되는 착륙 접근 각도

 FW_LND_HVIRT

 플레어 경로를 산출하기 위한 가상의 수평 라인/고도

이 값은 플레어 경로 커브가 점근적으로 사용하는 지면 고도이다.

 FW_LND_FLALT

 착륙 플레어 고도(착륙 고도에 대한 상대 고도)

 FW_LND_TLALT

 착륙 쓰로틀 제한을 적용하는 고도(착륙 고도에 대한 상대고도) 기본값 -1.0은 출력 제한을 플레어 고도의 2/3 지점에서 적용하기 시작한다.

 FW_LND_HHDIST

 착륙 헤딩을 고정하는 수평 거리

 FW_LND_USETER

 착륙 단계에서 추정된 지면 거리(GPS에서 나오는 지면 고도)를 사용한다.

이 기능은 기본적으로 Off된 상태로 경로점이나 리턴 고도(또는착륙 지점에 대한 가상의 해면 고도)가 사용된다.

FW_LND_FL_PMIN

플레어 시 최소 피치 각도. 양의 값은 FW_LND_TLALT에 도달했을 때 기수가 들림을 의미한다.

FW_LND_FL_PMAX

플레어 시 최대 피치 각도. 위와 동일

FW_LND_AIRSPD_SC

착륙중에 적용되는 최소 에어스피드 스케일 팩터 혹은 게인. 이 값을 비행기의 최소 비행속도에 곱하여 착륙 접근시에 목표 속도로 설정한다.

FW_AIRSPD_MIN x FW_LND_AIRSPD_SC



GeoFence 설정하기


안전을 위해 비행 경로 바깥으로 가상의 비행금지 구역을 설정한다.

파라미터 설정의 GF_ACTION  항목에서 Fence를 침범했을 때 경고만 줄지, 제자리에 있을지, 홈으로 돌아올지, 자폭(?)할지를 설정할 수 있다.




또한 시동걸기에서 자꾸 mag0 inconsistent 에러가 떠서 COM_ARM_MAG 파라미터를 0.15에서 0.25로 증가시켜주었다.

mag0 inconsistent 에러는 지자기 센서의 캘리브레이션 값이 나머지 mag 센서의 값과 차이를 보이는 경우를 의미하는데 gps센서에 장착된 컴파스 센서가 약간 틀어져서 나타나는 현상인듯 하다.


비행 결과


이륙은 ARM후 비행기를 이륙자세로 만들고 비행모드를 mission으로 변경한 다음 Throttle을 최대로 올리면 진행된다. 바로 모터가 돌지는 않는데 이때는 비행기를 살짝 흔들면 이륙 상태로 인식하는거 같다. 자세한 이륙 방법은 문서를 좀더 찾아봐야할듯.


추가됨

고정익 비행기의 이륙


PX4에 설명된 비행기의 이륙과정을 정리하면 다음과 같다.


비행기는 사출기/핸드런치 모드 또는 활주로 이륙 모드에서 현재 헤딩에 따라 이륙한다.

기본 모드는 사출기/핸드런치 모드이며 RWTO_TKOFF 파라미터에 따라 활주로 모드로 변경할 수 있다.

사출기/핸드런치 모드에서 비행기는 최대 출력으로 상승한다(약 2초간 RWTO_MAX_THR에 설정된 값 까지)

고도 에러가 FW_CMLBOUT_DIFF 보다 작으면 통상적인 항법으로 진행한다.

참고: 런치 디텍터(launch detector)가 특정한 조건을 만족시켜야 위에 언급한 절차가 수행될 수 있다. 사출기 런치의 경우 특정 가속도가 충족되어야 한다.

활주로 이륙 모드는 다음 단계를 따라 진행한다:

 1. Throttle ramp: 이륙 최소 속도(Minimum airspeed for takeoff = FW_AIRSPD_MIN x RWTO_AIRSPD_SCL)에 도달할 때까지 활주로에 고정(Clamp) 됨(피치, 롤, 헤딩 고정)

 2. Take off: 비행기 고도 > 항법 고도(RWTO_NAV_ALT)가 될때까지 피치를 상승시킴

 3. Climbout: 지면 고도(Altitude above gound level) > FW_CLMBOUT_DIFF 를 만족할때까지 상승. 이 단계에서 롤과 헤딩 고정 제한은 풀리게 된다.


이륙은 다음 설정 항목에 따라 영향을 받는다.


파라미터 

설명

 RWTO_TKOFF

 랜딩기어를 사용한 활주로 이륙. 기본값은 해제.

 RWTO_MAX_THR

 활주로 이륙 시 최대 출력.

 FW_CLMBOUT_DIFF

 Climbout 고도 차이.

 FW_AIRSPD_MIN

 최소 대기속도. 이보다 낮은 속도에서 TECS 제어기는 대기속도를 높이기 위해 보다 적극적으로 개입할 것이다.

 RWTO_AIRSPD_SCL

 이륙을 위한 대기속도 스케일 팩터. 대기 속도가 FW_AIRSPD_MIN x RWTO_AIRSPD_SCL 값에 도달하면 피치를 증가시키게 된다.

 WTO_NAV_ALT

 어느정도의 롤을 허용할 수 있는 지면 고도 (AGL).
RWTO_NAV_ALT 값에 도달하기 전까지 비행기는 수평(level)상태를 유지하며 러더만을 사용하여 현재 헤딩을 유지한다.(see RWTO_HDG). FW_CLMBOUT_DIFF > 0 인 경우 이 값은 반드시 FW_CLMBOUT_DIFF 보다 작아야 한다.


아래 동영상을 통해 PX4가 자동으로 착륙하는 모습을 잘 볼 수 있다.



처음에 이륙하자마자 비행기가 왼쪽으로 기우는 현상이 발생하였다. 되도록이면 다음 경로점 방향으로 던진다고 했는데 왜 이런 현상이 나타났는지는 좀더 분석이 필요할 듯.


마지막 착륙 접근에는 착륙지점에서 180m 거리에 최종 접근 지점을 설정하고 고도를 약 18미터 정도로 설정하였는데 예상보다 너무 낮은 고도였는지 착륙지점 근처의 높은 나무를 피할 수 없을꺼 같아서 아쉽지만 자동조종을 해제하고 수동으로 착륙하였다. 


사실 180미터 거리에 18미터 고도면 대략 6도 강하각이므로 그렇게 완만한 어프로치는 아닌데 다음에는 강하각을 더 크게 설정하거나 landing target을 좀더 뒤로 보내야할꺼 같다. 


비행 결과는 다음과 같다.

px4 비행로그 분석 사이트 (https://review.px4.io/upload)에 업로드한 비행 결과는 아래와 같다. 

자세한 비행 결과는 다음 링크에서 확인이 가능하다. (https://review.px4.io/plot_app?log=04d917f6-eeec-4d47-a1b2-95513b961a08)

보라색으로 표시된 선이 자동비행 경로이고 파란색 선은 manual 혹은 stabilized 모드를 의미한다.






최근에 업데이트된 px4 log 는 이렇게 입체적인 비행궤적도 표시해주고 각 해당 경로의 비행 자세와 조종기 입력도 관찰할 수 있다.



2018/12/2 최초 문서 발행됨.

2018/12/6 비행전 점검, 착륙접근에 관한 내용 추가

반응형

+ Recent posts