2023.11.08 DAY36
내일 오프라인 실습을 위해 준비해야할 것에 대해 회의를 진행하고 ros와 차선인식 프로젝트를 연결하는 클래스를 작성하였다. c++이 익숙하지 않은 상태에서 라이브러리를 만들고 연결하려니 hpp와 cpp를 어떻게 나눠서 작성하는게 좋은지, public과 private는 어떻게 구분하는게 좋은지, 전반적으로 어떻게 구성이 되면 좋은지에 대해 이해하고 생각하는데 너무 많은 시간이 걸렸다ㅠㅠ c++ 공부가 필요한데 시간이 부족하다...ㅠㅠ 일단 오프라인 프로젝트를 끝내고 주말에 정리를 해야겠다!!!
🛣 차선 인식 프로젝트
- 데브코스에서 템플릿을 제공해주었지만 템플릿을 사용하면 직접 클래스를 만들고 구조를 짜는 경험을 하지 못할 것 같아서 직접 구현하기로 결정하였다!!! 조금 어렵겠지만.. 많은 것을 배울 수 있기를 바라며 화이팅!!
- 정지선 인식
- threshold를 너무 좁게 잡았더니 노이즈는 인식이 안되지만 정지선도 인식이 안되어서 좀 여유롭게 변경했다.
- 정지선은 가운데에 위치한다고 생각하여 가운데 1/4 ~ 3/4 사이를 보았는데 정지선 인식되는 부분이 생각보다 넓게 있어서 범위를 1/5 ~ 4/5로 넓혔다.
- 그 결과, 정지선이 잘 인식되었다!!
- PIDController 헤더 파일 작성
- PID 를 제어하는 헤더 파일
- 쉽게 구현할 수 있을거라고 생각하였지만... 어려웠다.
- PIDController가 생성될 때 p,i,d 값으로 초기화해야하는데 이걸 어떻게 해야할지 몰랐다ㅠㅠ
- 구현하고 나니 이렇게 간단할 수가 없다....하하
- LaneManager 헤더 파일 작성
- 이미지 데이터를 받아서 제어값을 발행해주는 노드
- 지금까지 작성한 헤더 파일들을 사용해서 연결해야한다.
- 하지만 가장 어려운 부분은...! ROS를 사용하는 것이었다. ros를 파이썬으로 배웠는데 이를 c++로 구현해야하는 부분이 어려웠다.
ros::NodeHandle
을 사용해서 subscribe 해야한다.
- subscribe 할때의 callback 함수에 이미지를 어떻게 넘겨줘야할지 모르겠어서 데브코스의 템플릿을 참고하였다.
📝 배운 내용
- c++ 생성자 멤버 초기화
- 생성자에서 멤버 변수, 함수를 초기화하는 방법이다
=
을 사용하는 것은 초기화가 아니고 할당이다.
- 아래와 같은 방법으로 생성자 뒤에
:
을 사용하여 초기화하고 싶은 변수를 초기화하면 된다.
PIDController::PIDController(PREC p_gain, PREC i_gain, PREC d_gain)
: proportional_gain_(p_gain), integral_gain_(i_gain), differential_gain_(d_gain) {}
- c++ ros Subscriber, Publisher
ros::NodeHandle
을 사용하여 생성한다.
publisher_ = node_handler_.advertise<xycar_msgs::xycar_motor>("xycar_motor", 1);
subscriber_ = node_handler_.subscribe("/usb_cam/image_raw/", 1, &LaneManager::image_callback, this);