Navigation
-
스윈님 레포에 보면 이런 식으로 브랜치가 많다. 브랜치들 네이밍 규칙이 뭐냐고 여쭤보니 {카테고리 : feature, refactor ...} / {제작자} / {애자일 할 때 그 스프린트} / {기능 세부}이런 식이라고 하셨다. 별 생각 없이 지은 거라고 하시긴 했지만 공동 작업을 많이 안 해봐서 merge request도 제대로 보내본 적 없는 나에게는 다소 신문물이었다. 그래서 url_navigation_pkg를 만들 때는 이를 적극 채택하여 나도 똑같이 따라 해 보기로 했다. Main에 깔끔하게 Merge Request / Pull Requeset 올리는 방법작업용 브랜치 생성작업 단위 잘게 나눠서 커밋 한 커밋 = 하나의 논리적 변경이 되도록 의식적으로 나누기버그 수정, 리팩토링, 신규 기능..
대형 프로젝트에서 Github 잘 활용하는 법스윈님 레포에 보면 이런 식으로 브랜치가 많다. 브랜치들 네이밍 규칙이 뭐냐고 여쭤보니 {카테고리 : feature, refactor ...} / {제작자} / {애자일 할 때 그 스프린트} / {기능 세부}이런 식이라고 하셨다. 별 생각 없이 지은 거라고 하시긴 했지만 공동 작업을 많이 안 해봐서 merge request도 제대로 보내본 적 없는 나에게는 다소 신문물이었다. 그래서 url_navigation_pkg를 만들 때는 이를 적극 채택하여 나도 똑같이 따라 해 보기로 했다. Main에 깔끔하게 Merge Request / Pull Requeset 올리는 방법작업용 브랜치 생성작업 단위 잘게 나눠서 커밋 한 커밋 = 하나의 논리적 변경이 되도록 의식적으로 나누기버그 수정, 리팩토링, 신규 기능..
2025.11.23 -
우선 시작해야 할 부분은 Terrain map (2.5D heightmap, 주로 포맷은 PCD) loader이다. 우리 랩에서는 주로 터레인 매핑 모듈의 결과물로 나온 2.5D static map에서 global path planning을 진행한다. 이 PCD 파일의 필드에는 height 뿐 아니라, 각종 collision risk, inclination risk,,... 등등과 각 과제에서 필요로 하는 요구사항에 맞는 값들이 들어가 있고 이 필드값은 계속 바뀔 수 있다. 그래서 터레인 맵 loader의 소프트웨어 요구사항은 다음과 같다. 메모리 효율성 : 필요한 필드만 선택적으로 로드동적 필드 지원 : PCD 파일의 모든 필드 자동 인식확장성 : 새로운 필드 타입 쉽게 추가 가능┌───────────..
A. Terrain Map Loader우선 시작해야 할 부분은 Terrain map (2.5D heightmap, 주로 포맷은 PCD) loader이다. 우리 랩에서는 주로 터레인 매핑 모듈의 결과물로 나온 2.5D static map에서 global path planning을 진행한다. 이 PCD 파일의 필드에는 height 뿐 아니라, 각종 collision risk, inclination risk,,... 등등과 각 과제에서 필요로 하는 요구사항에 맞는 값들이 들어가 있고 이 필드값은 계속 바뀔 수 있다. 그래서 터레인 맵 loader의 소프트웨어 요구사항은 다음과 같다. 메모리 효율성 : 필요한 필드만 선택적으로 로드동적 필드 지원 : PCD 파일의 모든 필드 자동 인식확장성 : 새로운 필드 타입 쉽게 추가 가능┌───────────..
2025.11.20 -
Naming Convention파일명 : snake_casepose.pyglobal_planner.py클래스명 : PascalCaseclass GlobalPlanner함수/메소드명 : snake_casedef plan_path()변수명 : snake_casecurrent_pose상수명 : UPPER_SNAKE_CASEMAX_VELOCITY * 코드 포맷팅 라이브러리 활용할 것
url_navigation_pkg (3) : Naming ConventionNaming Convention파일명 : snake_casepose.pyglobal_planner.py클래스명 : PascalCaseclass GlobalPlanner함수/메소드명 : snake_casedef plan_path()변수명 : snake_casecurrent_pose상수명 : UPPER_SNAKE_CASEMAX_VELOCITY * 코드 포맷팅 라이브러리 활용할 것
2025.11.20 -
Design Philosophy의존성 규칙 준수 : 도메인이 ROS에 의존하지 않음알고리즘 순수성 : 각 알고리즘은 상태를 갖지 않고 순수 함수처럼 동작state machine 분리: 상태 관리는 application layer에서 담당조립 : 런타임에 Config로 컴포넌트 조합Software Engineering도메인 (Domain)└─ Navigation (로봇 이동 문제 영역) ├─ Entity (핵심 개념들) │ ├─ Pose (위치) │ ├─ Path (경로) │ ├─ Velocity (속도) │ └─ Obstacle (장애물) │ └─ 비즈니스 로직 (Business Logic) ├─ 목표 도달 판단 ├─ 충돌 검사 ├─ 경로 유효성..
url_navigation_pkg (2) : Code structureDesign Philosophy의존성 규칙 준수 : 도메인이 ROS에 의존하지 않음알고리즘 순수성 : 각 알고리즘은 상태를 갖지 않고 순수 함수처럼 동작state machine 분리: 상태 관리는 application layer에서 담당조립 : 런타임에 Config로 컴포넌트 조합Software Engineering도메인 (Domain)└─ Navigation (로봇 이동 문제 영역) ├─ Entity (핵심 개념들) │ ├─ Pose (위치) │ ├─ Path (경로) │ ├─ Velocity (속도) │ └─ Obstacle (장애물) │ └─ 비즈니스 로직 (Business Logic) ├─ 목표 도달 판단 ├─ 충돌 검사 ├─ 경로 유효성..
2025.11.19 -
URL에 들어오고 나서 좋았던 점 중 하나는 Aswin님의 DreamWaQ Universe 소스코드를 보고 공부할 기회가 있었다는 것이다. 그 코드는 내가 이제껏 봤던 어떤 코드보다 예뻤다. 6~7월은 내내 그 코드를 뜯어보고 사용하면서 보냈다. 그전에는 딱히 클린 코드에 대한 경이로움이나 필요성을 못 느끼면서 살았고, 그 때문에 내가 만든 코드도 정말 되는대로 작성한 것이 대부분이었다. 하지만 DreamWaQ 코드를 보고 난 후에, 잘 조직된 패키지는 참 많은 사람들의 삶의 질을 향상시킨다는 것을 체감했다. 그래서 내가 향후에 만들 패키지도 이와 같이 손쉽게 유지보수되는 영리한 구조를 지녔으면 좋겠다는 생각을 처음으로 했다.클린 코드는 기술 부채를 최소화하고 가독성과 유지보수성 그리고 타인의 이해도를 ..
url_navigation_pkg (1) : 클린 코드, 소프트웨어 요구사항URL에 들어오고 나서 좋았던 점 중 하나는 Aswin님의 DreamWaQ Universe 소스코드를 보고 공부할 기회가 있었다는 것이다. 그 코드는 내가 이제껏 봤던 어떤 코드보다 예뻤다. 6~7월은 내내 그 코드를 뜯어보고 사용하면서 보냈다. 그전에는 딱히 클린 코드에 대한 경이로움이나 필요성을 못 느끼면서 살았고, 그 때문에 내가 만든 코드도 정말 되는대로 작성한 것이 대부분이었다. 하지만 DreamWaQ 코드를 보고 난 후에, 잘 조직된 패키지는 참 많은 사람들의 삶의 질을 향상시킨다는 것을 체감했다. 그래서 내가 향후에 만들 패키지도 이와 같이 손쉽게 유지보수되는 영리한 구조를 지녔으면 좋겠다는 생각을 처음으로 했다.클린 코드는 기술 부채를 최소화하고 가독성과 유지보수성 그리고 타인의 이해도를 ..
2025.11.19 -
SplatNav에서는 SFC-1, SFC-2라는 두 가지 옵션을 제공한다. 둘의 차이점을 비교하면 다음과 같다. SFC-1SFC-2코드 분기점 (1) SFC/corridor_utils.pyPointCloudCollisionSet을 기본 옵션으로 생성PointCloudCollisionSet(sample_surface=20)으로 생성코드 분기점 (2) polytopes/collision_set.pypoint_cloud = self.means (가우시안 중심만 사용)충돌 집합 계산은 “점”들에 대해 Ax fibonacci_ellipsoid(...)로 각 가우시안의 “표면”을 샘플링ellipsoid_samples = fibonacci_ellipsoid(self.means, self.rots, self.scal..
SplatNav 코드 뜯어보기 : SFC-1과 SFC-2의 차이점SplatNav에서는 SFC-1, SFC-2라는 두 가지 옵션을 제공한다. 둘의 차이점을 비교하면 다음과 같다. SFC-1SFC-2코드 분기점 (1) SFC/corridor_utils.pyPointCloudCollisionSet을 기본 옵션으로 생성PointCloudCollisionSet(sample_surface=20)으로 생성코드 분기점 (2) polytopes/collision_set.pypoint_cloud = self.means (가우시안 중심만 사용)충돌 집합 계산은 “점”들에 대해 Ax fibonacci_ellipsoid(...)로 각 가우시안의 “표면”을 샘플링ellipsoid_samples = fibonacci_ellipsoid(self.means, self.rots, self.scal..
2025.11.06 -
https://zzziito.tistory.com/174 SplatNav 코드 돌려보기 (1) 제공해준 데이터로 돌려보기1. 환경 설정A. NerfStudio 설치SplatNav는 NerfStudio를 기반으로 작성되었다. https://github.com/nerfstudio-project/nerfstudio/tree/main GitHub - nerfstudio-project/nerfstudio: A collaboration friendly studio for NeRFsA collaboration friendlyzzziito.tistory.com여기서 제공해 준 데이터로 돌려봤으니까 이제 내가 딴 데이터로 돌려볼 차례이다. 친절하게도 이렇게 설명해주고 있다. 대략 이런 내용. 다음과 같은 순서로 수행한다..
SplatNav 코드 돌려보기 (2) 내 데이터로 돌려보기https://zzziito.tistory.com/174 SplatNav 코드 돌려보기 (1) 제공해준 데이터로 돌려보기1. 환경 설정A. NerfStudio 설치SplatNav는 NerfStudio를 기반으로 작성되었다. https://github.com/nerfstudio-project/nerfstudio/tree/main GitHub - nerfstudio-project/nerfstudio: A collaboration friendly studio for NeRFsA collaboration friendlyzzziito.tistory.com여기서 제공해 준 데이터로 돌려봤으니까 이제 내가 딴 데이터로 돌려볼 차례이다. 친절하게도 이렇게 설명해주고 있다. 대략 이런 내용. 다음과 같은 순서로 수행한다..
2025.11.04 -
Filetreesplatnav/├─ .git/├─ .gitignore├─ LICENSE├─ README.md├─ SFC/│ ├─ __pycache__/│ ├─ astar_utils.py│ ├─ corridor_utils.py│ ├─ helper_utils.py│ └─ viz_utils.py├─ SplatNav Data/ │ ├─ old_union_sfc-1.json│ └─ old_union_sfc-2.json├─ assets/ ├─ blender/│ ├─ viz_dataset.py│ ├─ viz_statistical_traj.py│ └─ viz_utils.py├─ data/│ ├─ exp_room/│ ├─ flight/│ └─ old_union2/├─ ellipsoids/│ ├..
SplatNav : 코드 아키텍쳐 분석Filetreesplatnav/├─ .git/├─ .gitignore├─ LICENSE├─ README.md├─ SFC/│ ├─ __pycache__/│ ├─ astar_utils.py│ ├─ corridor_utils.py│ ├─ helper_utils.py│ └─ viz_utils.py├─ SplatNav Data/ │ ├─ old_union_sfc-1.json│ └─ old_union_sfc-2.json├─ assets/ ├─ blender/│ ├─ viz_dataset.py│ ├─ viz_statistical_traj.py│ └─ viz_utils.py├─ data/│ ├─ exp_room/│ ├─ flight/│ └─ old_union2/├─ ellipsoids/│ ├..
2025.11.03 -
1. 환경 설정A. NerfStudio 설치SplatNav는 NerfStudio를 기반으로 작성되었다. https://github.com/nerfstudio-project/nerfstudio/tree/main GitHub - nerfstudio-project/nerfstudio: A collaboration friendly studio for NeRFsA collaboration friendly studio for NeRFs. Contribute to nerfstudio-project/nerfstudio development by creating an account on GitHub.github.comconda create -n nerfstudio python=3.10conda activate nerfs..
SplatNav 코드 돌려보기 (1) 제공해준 데이터로 돌려보기1. 환경 설정A. NerfStudio 설치SplatNav는 NerfStudio를 기반으로 작성되었다. https://github.com/nerfstudio-project/nerfstudio/tree/main GitHub - nerfstudio-project/nerfstudio: A collaboration friendly studio for NeRFsA collaboration friendly studio for NeRFs. Contribute to nerfstudio-project/nerfstudio development by creating an account on GitHub.github.comconda create -n nerfstudio python=3.10conda activate nerfs..
2025.10.21 -
OMPL 설치 후 로봇이 있는 scene 만들기collision-free 경로 계산하기계획된 경로 시각화하기Open Motion Planning Library(OMPL)https://ompl.kavrakilab.org/webapp.html OMPL Web AppUsage The OMPL web app is a web front end for motion planning and benchmarking using OMPL. Basic usage is very similar to the standalone GUI. Once deployed, this may be the easiest way to try out OMPL without to compile anything. Detailed instructions ..
Open Motion Planning Library(OMPL)를 사용해 경로 계산하고 시각화하기OMPL 설치 후 로봇이 있는 scene 만들기collision-free 경로 계산하기계획된 경로 시각화하기Open Motion Planning Library(OMPL)https://ompl.kavrakilab.org/webapp.html OMPL Web AppUsage The OMPL web app is a web front end for motion planning and benchmarking using OMPL. Basic usage is very similar to the standalone GUI. Once deployed, this may be the easiest way to try out OMPL without to compile anything. Detailed instructions ..
2025.03.09 -
러닝 기반으로 waypoint를 생성하는 모델을 학습할 때 당연히 나도 처음에는 min-max normalize를 했으나 왜인지 생성되는 경로가 일관되게 방향이 이상한 것을 확인했다. 그런데 문제는 몽땅 이런 건 아니고 방향이 정상적으로 나오는 샘플들도 있기는 해서 의문이었다. 그런데 샘플들을 공통적으로 살펴보니 Goal point가 1사분면에 있을 때만 멀쩡 경로로 나오는 것 같았다. 그러니까, 경로의 흐름은 괜찮은데 denormalize과정에서 생성된 경로가 모두 1사분면으로만 나오는 게 문제였다. def normalize_waypoints(waypoints, goal_point): # 모든 점들의 좌표를 첫 번째 점(0,0)에 대한 상대 좌표로 변환 relative_waypoints = ..
Waypoint 정규화 시, 생각없는 min-max 정규화의 함정러닝 기반으로 waypoint를 생성하는 모델을 학습할 때 당연히 나도 처음에는 min-max normalize를 했으나 왜인지 생성되는 경로가 일관되게 방향이 이상한 것을 확인했다. 그런데 문제는 몽땅 이런 건 아니고 방향이 정상적으로 나오는 샘플들도 있기는 해서 의문이었다. 그런데 샘플들을 공통적으로 살펴보니 Goal point가 1사분면에 있을 때만 멀쩡 경로로 나오는 것 같았다. 그러니까, 경로의 흐름은 괜찮은데 denormalize과정에서 생성된 경로가 모두 1사분면으로만 나오는 게 문제였다. def normalize_waypoints(waypoints, goal_point): # 모든 점들의 좌표를 첫 번째 점(0,0)에 대한 상대 좌표로 변환 relative_waypoints = ..
2025.03.04 -
모바일 로봇의 Path planning을 공부하다 보면 가장 먼저 마주하게 되는 것은 Dijkstra, A*이고, 그 다음이 PRM과 RRT입니다. 샘플을 뿌린다는 점에서 유사해 보이는 이 두 알고리즘을 비교해 보고자 합니다. PRM (Probabilistic RoadMap)Roadmap-based planning에서 가장 유명한 방법은 Probabilistic RoadMap(PRM) 입니다. 기본적으로는 Configuration space에서 미리 그래프(roadmap)을 구성하고, 여기서 노드는 valid configuration을, 엣지는 feasible path를 표현합니다. 이후 사용할 때는 시작점과 목표점을 roadmap에 연결하여 경로를 탐색합니다. Example┌───────────────..
Path Planning : Roadmap-based 방법과 Tree-based 방법의 차이점모바일 로봇의 Path planning을 공부하다 보면 가장 먼저 마주하게 되는 것은 Dijkstra, A*이고, 그 다음이 PRM과 RRT입니다. 샘플을 뿌린다는 점에서 유사해 보이는 이 두 알고리즘을 비교해 보고자 합니다. PRM (Probabilistic RoadMap)Roadmap-based planning에서 가장 유명한 방법은 Probabilistic RoadMap(PRM) 입니다. 기본적으로는 Configuration space에서 미리 그래프(roadmap)을 구성하고, 여기서 노드는 valid configuration을, 엣지는 feasible path를 표현합니다. 이후 사용할 때는 시작점과 목표점을 roadmap에 연결하여 경로를 탐색합니다. Example┌───────────────..
2025.01.23