팀 프로젝트

C-2345 자세 제어 4족보행 로봇 #5 (ROS 7강-1 C++로 topic, service, parameter )

InculPark 2021. 8. 18. 22:46
반응형

●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

 

https://www.tuwlab.com/27260

 

[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의 바뀐 부분을 수정하니 정상적으로 빌드가 됐다.

 

 

우측 상단(publisher), 하단(subscriber)

 

rqt_graph로 node, topic 확인

 

 

잘 작동한다....

 

 

앞으로 잘 모르는 프로그램이라도 오류 나면 그 오류 메시지부터 제대로 읽어야겠다.....

 

 

그래도 오류 찾는다고 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로 확인이 불가하다.

 

 

rqt의 service caller로도 잘 작동한다.

 

 

 

 

 

 

 

 

Parameter 실습

parameter는 service_server를 약간만 수정해서 실습했다.

시계방향 2번(server), 3번(client), 4번(parameter 수정)

 

4번에서 parameter의 값을 수정(1 : +  2 : -  3 : *  4 : /)함에 따라 server의 응답 값이 같은 요청 값에 대해 달라진다.

 

 

&rosparam list

*현재 ros에 존재하는 parameter의 목록을 보여줌

 

 

 

 

&rosparam set /파라미터의디렉토리 값

*해당 파라미터의 값을 바꿈

 

 

 

 

 

 

===============================================================================

정확한 정보 전달보단 공부 겸 기록에 초점을 둔 글입니다.

틀린 내용이 있을 수 있습니다.

틀린 내용이나 다른 문제가 있으면 댓글에 남겨주시면 감사하겠습니다.   : )

===============================================================================

반응형