C-2345 자세 제어 4족보행 로봇 #5 (ROS 7강-1 C++로 topic, service, parameter )
●7강
https://www.youtube.com/watch?v=iGdQHi_wL1Y&list=PLRG6WP3c31_VIFtFAxSke2NG_DumVZPgw&index=7
어려웠다....
●Keyword
-catkin, package.xml, CmakeLists.txt, 메시지파일.msg, 서비스파일.srv
-cd, mkdir, git, mv, ls, gedit
-rosservice, service caller(rqt), rosparam
●Study
강의의 시작은 ROS프로그램 작성 시 유의점이었다.
혼자 만들고 쓸 거면 상관없지만 공식으로 배포된 ROS 노드들은 모두 다음의 규칙을 따른다고 한다.
1. 단위는 SI 단위로 통일
2. 좌표계는 오른손 법칙 (Cartesian right-handed system)
3. 프로그래밍 별 명명 규칙이 있음 - cppstyleguide, pystyleguide로 ROSwiki에 있음
우선은 너무 이거에 얽매이지 말고 ROS에 익숙해진 후에 얘들을 신경 써야겠다.
이후 topic publisher-subscriber, service server-client 노드를 직접 만들어보는 실습으로 들어갔다.
Topic 실습
수업의 흐름을 그대로 다시 따라가 보자
1. /catkin/src 이동
$cd 디렉터리 (=&cs)
*cd : change directory
*리눅스에서 앞에 /가 붙으면 디렉터리(폴더, 위치)를 나타내는 것이다.
2. 패키지 생성
$catkin_create_pkg 패키지 이름 패키지의존성1 패키지의존성2 패키지의존성3 ...
*패키지의존성 : 패키지가 가질 특징들을 적는다. 사용언어, 메시지 종류 등
*message_generation : 메시지를 만드는 패키지에 주는 의존성이다.
*std_msgs(standard messages), roscpp(c++), rospy(python)을 가장 많이 쓰지 않을까 싶다.
3. 패키지 디렉터리로 이동
4. package.xml 수정(패키지 설정 파일)
$gedit 파일명
*gedit : 우분투 내장 문서 편집기로 gedit을 통해 문서 수정이 가능하고 없는 이름의 문서는 새로 만들어진다.
*패키지의 설명을 담고 있는 문서로 제작자, 이름, 라이선스, 의존성 등을 포함하고 있다.
*작성 양식(format)은 v1과 v2가 있다.
5. CMakeLists.txt. 수정(빌드 설정 파일)
*CMake는 빌드 툴로 C++로 작성된 프로그램은 빌드를 거쳐야 사용이 가능하다. 파이썬의 경우는 빌드를 하지 않아도 되므로 CMake문서를 작성하지 않아도 된다. 후에 cpp파일은 이 파일의 설정을 바탕으로 빌드된다.
자세한 내용은
https://m.blog.naver.com/ekbae98/221321840751
CMake 란? 사용 예제
오픈소스를 이용해서 개발하다 보면, cmake를 만나게 된다. github의 오픈소스를 다운 받아서 cmake로 빌드...
blog.naver.com
[CMake 튜토리얼] 2. CMakeLists.txt 주요 명령과 변수 정리 - ECE - TUWLAB
▶ 이 글에서는 CMake 빌드 스크립트인 CMakeLists.txt 파일을 작성하는 방법에 대해 다룹니다. CMake 2.8.x 버전 기준이며, C언어 프로젝트를 기준으로 자주 사용되는 명령과 변수들을 선별하여 기능에
www.tuwlab.com
*ROS는 여기서 publisher-subscriber node와 server-client node들의 빌드 옵션을 설정한다.(작성한 cpp파일 지정, 의존성, 라이브러리 등)
6. 메시지 파일 작성
$mkdir msg
$cd msg
$gedit 메시지파일명.msg
&cd ..
*mkdir : make directory
*cd ..에서 ..은 상위 폴더를 의미
*해당 노드가 사용할 메시지의 변수형, 이름을 지정하는 파일이다.
*메시지형식 메시지이름
7. publisher node 작성
&gedit 파일명.cpp
*publisher의 c++ 소스코드 파일을 만든다.
*코드 작성은 강의대로 진행
8. subscriber node 작성
&gedit 파일명.cpp
*subscriber의 c++ 소스코드 파일을 만든다.
*코드 작성은 강의대로 진행
9. ROS node 빌드하기
&cm (강의 기준 ros설치 때. bashrc에 alias로 명령어 만들어둠)
10. 빌드한 node들 테스트
한번 순서와 그 관계를 정리하고 직접 다시 예제를 만들어 실행해봤다.
한번 순서랑 설정 파일들에 익숙해지려고 강의에서 제공한 코드를 복사 안 하고 내가 읽으면서 했더니 바로 오류가 났다...
잘못한 거 찾자고 CMakeLists랑 package만 2시간 동안 검사하고 계속 바꿨는데 못 찾았었다....
그러다 다시 차분하게 읽어본 터미널 오류 부분에서 이유를 바로 찾았다....
ros_tutorial_topic/MsgTutorial.h 헤더 파일을 못 찾는다고 나왔는데 자세히 보니 패키지를 처음 만들 때는 tutorial이라고 해놓고 cpp파일에서는 tutorials라 했다....
설령 MsgTutorial.msg로 헤더 파일이 만들어졌다고 해도 엉뚱한 위치를 지정해서 빌드할 때 .cpp들의 MsgTutorials.h 를 참조하라는 부분을 할 수 없었을 것이다.
mv 명령으로 패키지 폴더명을 바꾸고 package.xml이랑 CMakeLists.txt의 바뀐 부분을 수정하니 정상적으로 빌드가 됐다.
잘 작동한다....
앞으로 잘 모르는 프로그램이라도 오류 나면 그 오류 메시지부터 제대로 읽어야겠다.....
그래도 오류 찾는다고 package랑 CMakelists 꼼꼼히 읽어본 게 좋은 경험이 된 거 같다.
Service 실습
Service도 Topic이랑 크게 다른 건 없었다.
1. /catkin/src 이동
2. 패키지 생성
3. 패키지 디렉터리로 이동
4. package.xml 수정(패키지 설정 파일)
$gedit 파일명
5. CMakeLists.txt. 수정(빌드 설정 파일)
*topic은 메시지 파일로 확장자 .msg 형식을 지정했지만 서비스는 .srv를 지정한다.
6. 메시지 파일 작성
$mkdir srv
$cd srv
$gedit 메시지파일명. srv
&cd ..
*.srv파일을 지정한다. 메시지 파일과 다른 점은 메시지 파일은 단방향(publisher → subscriber)의 메시지 타입, 이름만 정의했다면 서비스는 요청(client → server), 응답(server → client) 두 방향의 메시지 타입을 정의해준다.
7. publisher node 작성
&gedit 파일명.cpp
8. subscriber node 작성
&gedit 파일명.cpp
9. ROS node 빌드하기
&cm (강의 기준 ros설치 때. bashrc에 alias로 명령어 만들어둠)
10. 빌드한 node들 테스트
sevice도 직접 실습해봤다.
얘는 깔끔하게 잘 됐다.
참고로 service는 1회성으로 메시지가 오가기 때문에 rqt_graph로 확인이 불가하다.
Parameter 실습
parameter는 service_server를 약간만 수정해서 실습했다.
4번에서 parameter의 값을 수정(1 : + 2 : - 3 : * 4 : /)함에 따라 server의 응답 값이 같은 요청 값에 대해 달라진다.
&rosparam list
*현재 ros에 존재하는 parameter의 목록을 보여줌
&rosparam set /파라미터의디렉토리 값
*해당 파라미터의 값을 바꿈
===============================================================================
정확한 정보 전달보단 공부 겸 기록에 초점을 둔 글입니다.
틀린 내용이 있을 수 있습니다.
틀린 내용이나 다른 문제가 있으면 댓글에 남겨주시면 감사하겠습니다. : )
===============================================================================