SpaceX 이중 부스터 착륙 비디오 분석과 Python 모델 구축 방법

SpaceX 이중 부스터 착륙 비디오 분석과 Python 모델 구축 방법
TILPosted On Jul 9, 20248 min read

비디오에서도 놀랍게 멋진 광경이에요. 두 개의 로켓이 빠르게 다가오지만 각자의 플랫폼에 옆으로 착륙하는 걸 볼 수 있어요. 이게 바로 SpaceX 파이콘 헤비 부스터의 작동 방식이에요. 이 비디오를 보세요.

아티스트가 사랑스러운 꽃을 그리듯이, 나는 이 황홀한 사건을 감상하기 위해 약간의 물리학을 사용해야 해요. 이 경우에는 Tracker Video Analysis(무료 소프트웨어)를 사용해서 착륙하는 이 부스터들의 움직임을 살펴볼 거에요. 정말 재미 있을 거예요.

익숙하지 않다면, 비디오 분석의 기본 아이디어를 설명해 드릴게요. 비디오를 찍으면 각 프레임에서 물체의 위치를 볼 수 있어요. 프레임 번호에서 시간 데이터를 얻을 수 있고 (재생 프레임 속도가 실제 속도와 같다고 가정할 때), 비디오 프레임의 물체 크기를 알고 있다면 x와 y 위치도 얻을 수 있어요. 참 많은 것이죠.

비디오 크기 조정 및 프레임 수정

첫 번째 단계는 비디오의 크기를 조정하는 것입니다. 이 경우에는 부스터 자체의 길이를 사용할 수 있습니다. 이 SpaceX 페이지에는 Falcon Heavy의 길이가 70m로 나와 있습니다. 이를 통해 부스터의 길이를 측정할 수 있습니다.

이미지

이를 통해 높이가 약 46m임을 알았습니다. 완벽한 측정이 아니더라도 괜찮습니다. 이제 이 길이를 비디오에서 사용할 수 있습니다. 그런데 기다려 보세요! 이 착륙 중에 카메라가 팬 및 줌을 조정합니다. 걱정하지 마세요. Tracker Video에서 코디네이트 참조 프레임을 조정할 수 있습니다(보정 포인트 쌍을 사용).

만약 카메라가 움직이지 않았다면 이렇게 보일 것입니다.

이미지

다음 단계를 준비했습니다.

움직임 추적

각 프레임에 설정된 좌표 시스템으로 각 로켓의 위치를 표시할 수 있습니다. 실제로 각 로켓에 대해 두 개의 위치를 표시할 거에요 — 상단 위치와 하단 위치를 표시할 거에요. 그래도, 여기 하나의 로켓에 대한 시간에 따른 수직 위치입니다.

image

데이터는 어느 정도 패러볼릭한 모습입니다. 그래서 이 데이터에 맞는 패러본을 적합할 수 있어요(Tracker curve fit을 사용해서). 운동방정식도 1/2 times 가속도가 t² 용어 앞에 오는 패러본 형태이기 때문에, 이를 사용해서 가속도를 결정할 수 있어요. 적합 매개변수를 통해 가속도가 6.38 m/s² 인 것으로 나왔는데, 꽤 합리적으로 보입니다.

3D 로켓 만들기

로켓의 위치를 시간의 함수로만 표시하는 것 이상의 것을 할 수 있어요. 두 로켓의 움직임을 나타내는 3D 모델을 만들 수 있어요. 그게 바로 Web VPython에서 할 거예요. 간단히 말해 Web VPython은 파이썬과 비슷한 코드를 사용하여 3D 모델을 만드는 온라인 플랫폼이에요(정말 멋져요). 모든 세부사항을 자세히 다루지는 않겠지만, 이 정보로도 충분히 이해할 수 있을 거예요.

첫 번째 단계는 각 로켓의 상단과 하단의 위치-시간 데이터를 어떻게든 Web VPython으로 가져오는 것이에요. 안타깝게도 이 작업을 수행하는 훌륭한 방법은 없어요. 대신 Tracker에서 데이터 값을 복사한 다음 그대로 Web VPython에 붙여넣기할 거예요. 마치 90년대 후반의 코딩 야만인인 것처럼요. 얼마나 마법처럼 보이는 일인지, 여기 좀 꿀팁을 하나 주죠. 값을 텍스트 편집기에 붙여넣으면 엔터 키를 제거하고 쉼표로 대체해서 파이썬에 더 적합하게 맞출 수 있어요. 아래가 어떻게 보이는지 확인해보세요.

image

빠른 참고 — 만약 파이썬에서의 리스트에 서투르다면, 여기 튜토리얼(또는 리프레셔)가 있어요. 그리고, 물어보기 전에 — 아니요, 이걸 넘파이 배열로 변환할 수 없어요. 웹 VPython이 실제 파이썬이 아니라서 우리가 사용할 모듈들에 모두 접근할 수 없어요 (넘파이를 사용할 수 있는 방법은 있지만, 이 자리에서는 건드리지 않겠어요). 아마도 (명확하지 않다면) 잘라 말할 필요가 있을 것 같아요 — 이들은 긴 리스트에요 — 362개의 요소가 있어요. 제 파이썬 고대인 방식으로 모든 것이 제대로 가져와졌는지 확인하기 위해 길이를 프린트했어요.

로켓 2의 데이터를 얻은 후 (나의 데이터 목록에서 딱 첫 번째였어요), 로켓 1을 위해 이 과정을 반복해야 해요. 또한, 시간 값들을 위한 리스트가 필요할 것인데, 이는 프레임 속도의 역수인 0.0166833의 균일한 시간 간격으로 만들 수 있어요.

이제 3D 마술을 해보죠. 웹 VPython에는 여러 다양한 객체들이 포함되어 있어요 — 이 경우, 우리는 실린더를 사용하여 블로스터들을 만들 거예요. 다음 코드로 실린더를 만들 수 있어요.

Image of Video Analysis

한쪽 끝에서 다른 쪽 끝으로 향하는 축 벡터가 있을 때 pos는 실린더의 한쪽 끝의 벡터 위치이고 axis는 축 벡터입니다. 반지름은 여기서 다루기 까다로울 수 있어요. 도움이 될 만한 그림이 있어요.

Image of Cylinder

적은 문제가 있어요. 실린더의 맨 위와 맨 아래에 대한 벡터 위치가 있는게 맞아요. 이러한 벡터 값들을 사용하여 축 벡터를 찾을 수 있겠죠. 그러나 이러한 벡터 위치는 약간 변경될 수 있어 로켓 부스터의 길이가 약간 변할 수 있어요. 그래서 대신에 이러한 맨 위와 맨 아래 위치를 사용하여 축 벡터의 방향을 찾고, 그 후에 상수 길이를 곱해서 사용할 거예요. 아, 코드를 보여드릴게요. 그게 더 쉬울 거에요.

아래는 이 코드에 대한 주석입니다:

  • 부스터의 길이인 L이 분명히 되어 있기를 바랍니다 (그것을 주석으로도 넣었죠).
  • r1a는 로켓의 아래에서 위로 향하는 벡터입니다. 맨 위와 맨 아래 x 및 y 위치의 값 목록에서 데이터를 사용하여 이러한 위치를 벡터로 먼저 구성해야 합니다. 다소 어색할 수 있지만 작동합니다.
  • 실린더의 경우, 위치는 아래 벡터 값으로, 축은 길이(L)이고 r1a 방향의 단위 벡터로 곱한 값입니다. 내장 된 norm() 함수를 사용하여 이 작업을 수행할 수 있습니다.
  • 아, 실린더의 정의에 make_trail=True를 추가할 것입니다. 이렇게하면 분명히 경로가 만들어집니다 (때로는 코드가 간단합니다).

부스터 동작 애니메이션화하기

부스터용 3D 모델을 만들었습니다. 이제 그들을 움직이도록 해야 합니다. 이 경우에는 데이터 목록의 각 값을 통해 시간 단계마다 실린더를 새 위치로 이동시키는 것만 할 거에요.

좀더 살펴봐야 할 점이 있어요, 그러니까 일단 코드의 간단한 버전부터 시작해볼까요? 이거 봐봐요.

이미지

자세한 내용은 아래와 같아요:

  • 시간 값 목록(t)이 있음을 기억해주세요. 26번째 줄은 이 목록의 길이를 따라가며 변수 i를 사용하여 계산합니다. 다른 목록의 인덱스로 사용할 수 있도록 유용합니다.
  • 아, 파이썬의 루프에는 :가 필요하며, 그 아래에 탭으로 들여쓴 모든 내용이 루프의 일부입니다.
  • 27번째 줄은 이상하게 보일 수 있습니다. rate(100)라는 문을 가지고 있으면, 파이썬에게 초당 최대 100번의 루프만 수행하라고 알립니다. 애니메이션을 특정 속도로 실행하려고 하는 것이 중요합니다. 이 경우에는 rate(1/dt)를 사용하여 "실시간"으로 실행되도록 합니다.
  • 28번째 줄과 29번째 줄에서는 부스터의 바닥과 꼭대기에 대한 벡터 값을 생성합니다.
  • 30번째 줄에서는 부스터의 위치를 업데이트 합니다. 이것이 실제로 3D 애니메이션에서 이동하는 것을 만듭니다.
  • 31번째 줄에서는 축을 업데이트 합니다.

이 모든 내용으로 아래는 애니메이션입니다.

애니메이션

전체 코드가 필요하시다면, 여기에서 확인하실 수 있습니다.

숙제

앗, 누군가가 숙제 과제를 원한다고 했던 것 같아요. 제가 준비해왔어요.

  • 이 애니메이션에서 두 로켓은 동일한 z-위치(화면 내외)를 가지고 있습니다. 촬영 위치와 착륙 장소의 z-값을 조정하기 위해 추정해보세요.
  • 로켓의 각 크기를 이용하여 z-위치를 결정할 수 있을까요? 힌트: 제 생각에는 불가능한데, 왜 작동하지 않을까요?
  • 그 로켓 엔진에 일부 화염을 붙이는 건 어떨까요? 가능할까요?
  • 부스터의 가속도와 추정 질량을 사용하여 연료 사용률을 계산해보세요.
  • 애니메이션을 더 멋지게 만들어보세요. 화염을 추가하는 것 외에도, 지면을 착륙 패드(아마도 몇 개의 타워도)로 만들어보세요.