acados partial condensing: QP 단계 수와 실제 예측 시간을 구분하기

acados에서 qp_solver_cond_N을 줄여도, 원래 문제의 시간 격자를 그대로 두면 로봇이 예측하는 시간 길이는 그대로입니다. 이 값은 partial condensing 뒤의 QP 단계 수를 정합니다. 예측 구간의 실제 시간은 원래 OCP의 단계 간격인 time_steps와 예측 시간 tf 쪽에서 정합니다. 계산 문제를 묶는 방식과 미래를 얼마나 길게 내다보는지를 나눠 읽어야 합니다.

acados Python API는 qp_solver_cond_N을 partial condensing 후의 새 horizon으로 설명합니다. 여기서 horizon이라는 단어는 QP의 단계 구조를 가리킵니다. 같은 문서가 tf에 쓰는 prediction horizon은 시간 길이입니다. 서로 같은 단어가 붙어 있어도 단위와 변경 대상이 다릅니다.

원래 OCP의 시간 격자를 먼저 적는다

OCP는 optimal control problem, 즉 최적 제어 문제입니다. 연속된 미래 시간을 여러 구간으로 나누고 그 구간에서의 상태·입력을 다룹니다. API의 time_steps는 shooting node 사이의 시간 간격을 담는 길이 N_horizon의 벡터입니다. 이를 따로 주지 않으면 N_horizon과 tf로 균일한 시간 격자를 만듭니다.

가상의 설정 예시로 원래 구간 수 N=20, 각 간격 0.05초를 생각하겠습니다. 전체 예측 시간은 20 × 0.05 = 1초입니다. 이를 20개의 원래 구간으로 계산한다는 것과, condensing 뒤 QP가 몇 단계인지라는 질문은 분리됩니다.

설정 값 뜻
원래 OCP의 구간 수 N 20 시간 격자를 나눈 원래 구간 수
각 time step 0.05초 인접 shooting node 사이의 시간
전체 예측 시간 tf 1초 원래 시간 격자의 전체 길이
qp_solver_cond_N 5 partial condensing 후 QP의 단계 수

표에서 cond_N=5는 “0.05초 구간을 다섯 개만 남겨 0.25초를 예측한다”는 뜻이 아닙니다. 원래 20개 구간의 문제를 더 적은 QP 단계로 묶어 표현하는 설정입니다. 물리 시간 격자를 건드리지 않았으므로 예측 대상은 여전히 1초입니다.

Partial condensing은 원래 블록을 묶는 방식이다

공식 API는 qp_solver_cond_N의 기본값을 원래 N으로 두며, 이때는 condensing을 하지 않는다고 설명합니다. 값을 줄이는 것은 더 적은 단계의 QP를 만들도록 묶음을 바꾸는 작업입니다. 단계 수가 줄어드는 대신 한 단계가 포함하는 원래 문제의 구성이 커질 수 있으므로, 단계 수 하나만 보고 실행 시간을 판단하기는 어렵습니다.

어떻게 묶을지는 qp_solver_cond_block_size에서 더 구체적으로 지정할 수 있습니다. 이 값은 길이가 qp_solver_cond_N + 1인 정수 목록입니다. 각 항목은 원래 OCP의 블록 몇 개를 묶는지 나타내며, 마지막 항목은 부분 축약된 QP의 terminal cost로 들어가는 블록 수입니다.

따라서 앞 예시처럼 cond_N=5라면 목록의 길이는 6입니다. 여섯 번째 항목을 여섯 번째 제어 단계라고 해석하면 terminal cost 항목의 의미가 바뀝니다. 목록의 끝을 포함해 분할을 읽어야 원래 블록들이 어느 부분에 반영되는지 이해할 수 있습니다. 이 옵션을 지정하지 않으면 문서는 cond_N에 따라 고르게 나누는 기본 동작을 설명합니다.

두 업데이트 함수는 바꾸는 대상이 다르다

이미 생성한 solver를 사용할 때는 변경 목적에 따라 호출을 고릅니다. 다음 표는 공식 API의 두 함수가 설명하는 차이입니다.

함수 바꾸는 대상 문서가 밝히는 solver 처리
set_new_time_steps(new_time_steps) 원래 시간 간격 벡터 N이 바뀌면 solver를 다시 생성
update_qp_solver_cond_N(qp_solver_cond_N) partial condensing 뒤 단계 수 새 cond_N으로 solver를 다시 생성

set_new_time_steps는 간격 벡터의 길이를 바꾸거나, 길이는 유지하고 shooting node 배치를 바꿀 때 사용합니다. 예를 들어 앞의 20개 간격을 모두 0.10초로 바꾸면 N은 20이지만 전체 예측 시간은 2초가 됩니다. 반대로 처음 구간은 촘촘하게 하고 뒤 구간은 성기게 배치하면서 총합을 1초로 유지할 수도 있습니다. 후자는 전체 시간은 같아도 미래를 나누는 위치가 달라지는 경우입니다.

update_qp_solver_cond_N은 같은 원래 문제에서 condensing 정도를 바꿔 살펴볼 때 쓰는 경로입니다. 문서는 partial condensing QP solver와 함께 사용할 수 있고, 새 코드 export와 compilation 없이 solver를 재생성한다고 설명합니다. “재컴파일이 없다”와 “solver를 재생성하지 않는다”는 서로 다른 말입니다.

시간 간격 수 N을 바꾼 뒤에는 cond_N도 새 N에 맞춰 볼 필요가 있습니다. API는 set_new_time_steps 이후 새 단계 수에 따라 cond_N 변경이 필요할 수 있으며, 일반적으로 cond_N < N인 경우를 언급합니다. 예를 들어 이전 N에 맞춘 condensing 설정을 유지한 채 N만 크게 줄였다면, 두 설정을 함께 다시 검토해야 합니다.

계산 시간을 비교할 때는 예측 문제를 고정한다

Condensing의 영향을 비교하고 싶다면 원래 모델·비용·제약과 시간 격자를 유지하고 cond_N을 바꾸는 구성이 질문에 맞습니다. N이나 전체 예측 시간까지 동시에 줄여 시간이 짧아지면, 결과에는 더 짧거나 다른 제어 문제를 풀게 된 효과도 섞입니다.

반대로 제어 성능 때문에 예측 시간을 늘리려는 경우에는 time_steps와 tf의 물리적 의미가 먼저입니다. 그 문제를 정한 다음, 어떤 condensing 구조로 풀지 비교할 수 있습니다. N=20·tf=1초·cond_N=5처럼 세 값을 같이 남기면 “horizon을 줄였다”는 모호한 표현을 피할 수 있습니다.

계산 결과를 읽을 때의 NLP·QP 종료 상태와 잔차는 acados 오류 진단 글에서, 최신 상태를 넣는 시점과 준비·피드백 계산의 배치는 acados RTI 설명에서 이어서 볼 수 있습니다. Condensing은 이들 가운데 QP를 어떤 단계 구조로 표현해 풀지 정하는 선택입니다. 먼저 실제 예측 시간과 원래 구간 수를 적어 두면 solver 옵션을 바꾼 결과도 같은 제어 문제 위에서 비교할 수 있습니다.

이 글은 확인한 acados 공식 Python API의 여섯 옵션·함수 설명을 바탕으로 작성했습니다. Solver 실행이나 condensing별 계산 시간 측정은 수행하지 않았습니다.