꾸준하고 즐겁게

ROS message 패키지를 만들어보았다. - [2 of 2] 본문

Hardware/ROS

ROS message 패키지를 만들어보았다. - [2 of 2]

wj9183 2021. 6. 12. 18:11
728x90

https://gradient-descent.tistory.com/69

이전 글에서 이어지는 내용이다.

 

 

 

 

 

 

 

 

5. subscriber 노드 만들기

gedit sub_test.cpp

이번에도 gedit을 이용할 것이다.

발행하는 역할을 할 노드를 만들었으니, 이제 정보를 수신하는 노드도 만들자.

 

 

 

추가할 헤더는 똑같다.


메인 함수 전에, msgCallback이라는 함수를 하나 만들어주었다.

반환값은 없고 입력받는 변수는 상수형태이다.

wooju_tutorial::wj_msg_tutorial::ConstPtr& msg는 들어오는 메세지 형태를 상수로 끊어서 집어넣겠다는 의미이다.

여기서의 msg는 ROSINFO줄에 있는 msg이다.

핸들 이름은 퍼블리셔 노드 파일에서도 그랬듯 nh로 통일했다. 물론 바꿔도 상관은 없다.

퍼블리셔 노드 파일의 nh와는 또 다른 노드 핸들이다.
서브스크라이버를 sub이란 이름으로 만들어주었다.

얘는 광고가 아니라 구독이다.

토픽을 wj_topic으로 설정했다. 이건 마스터한테 가는 정보다.

그럴 때마다 msgCallback이라는 함수를 실행시키게 된다.
spin은 값이 들어오면 돌아가는 무한 반복문 같은 것이다.

spin에서 값이 들어올 때까지 멈춰있다.



 

 

 

 

6. CMakelist 파일 편집하기

 

cd ..

gedit CMakelist.txt

경로를 이동하고, gedit 편집기로 CMakelist.txt를 편집해보자.

catkin_ws에 있는 CMakelist와는 구분이 되어야한다.

 



ROS 패키지의 경로를 찾으면, /opt/ros/share 와 현재 경로의 src가 나왔었다.
find_package 함수는 그 둘 중에서 지가 알아서 찾는 함수다.

이름이 바뀌면 못찾는다.

add_message_files 라는 함수에 메세지1,2 파일이 아닌 우리가 아까 작성한 메세지 파일을 추가해주고 주석을 풀어준다.

나는 괄호 하나 주석을 풀어주지 않아 패키지 빌드 과정에서 에러가 났었다.

텍스트 편집기라 탭도 뭣도 안먹으므로, 주의해줘야한다.

 

 

 

generate_message 함수도 주석을 풀어준다.

 

 

 

catkin_package에는 우리가 만든 패키지명이 들어가야하고, catkin_depends에서는 message_generation을 지우고 주석을 풀어준다.

message_generation이 이미 위에서 다룬 내용 중에 있기 때문이다.

이때 이 명령어가 쓸모가 있는지 없는 컴퓨터는 알지못하고, 그냥 써놓은 것이다.

 

 

주석을 해제해줬다.

빌드를 할 거니까 실행가능한 노드를 추가해주는 것이다.

우리는 이미 노드를 두개 만들었다.

그러니 두 줄을 써야한다.

pub_test 는 실행시킬 노드의 이름이고, 스페이스바 이후는 그때 실행되는 진짜 파일 이름이다.

 

프로젝트 네임이 두꺼운 글씨로 써져있어야한다.

두꺼운 글씨는 이미 컴퓨터가 알고 있는 경우다.

빌드 과정에 위 함수가 두 번 실행된다.

 

target_link_libraries도 주석을 풀고 노드명을 넣어준다.

여담이지만, 라이브러리 설치할 때 퍼센티지 나오면 빌드가 시작된 것이다.

퍼센테이지 나오기 전에 오류가 났으면 경로나 의존성에 문제가 있다.(준비물들을 모으는 과정)그 뒤에 오류가 나면 문법이 잘못됐거나 내용이 잘못된 것이다.(부품을 가져와서 까는 과정 = 빌드)





 

 

 

7. 빌드 과정

먼저 catkin 워크스페이스로 경로를 이동해주고,

catkin_make

catkin_make 명령어를 입력해준다.

이전 스텝에서 얘기했던 괄호 주석을 하나 안풀어줘서 났던 에러다.

스크린샷에는 나오지 않았지만 사실 에러가 하나 더 있었다.

이전에 패키지를 하나 더 만들었는데, 노드 이름을 두 패키지에서 모두 똑같이 해줘서 문제가 있었다.

노드 이름을 패키지마다 달리 해줘야한다.

 

디버깅을 마친 이후다.

. ~/catkin_ws/devel/setup.bash

명령어를 실행한다.

패키지 변경 사항을 적용해주는 것이다.

 

rospack profile

catkin 워크스페이스 내부의 package 인덱스를 재구축해준다.

roscore

퍼블리셔와 서브스크라이버 노드를 실행하기 이전에 마스터를 먼저 실행해줘야하는데,

마스터를 실행하는 명령어이다.

 

 

그리고 터미널을 두 개 더 켠다.

터미널마다 아까 입력했던 다음 명령어를 한 번씩 입력해줘야한다.

. ~/catkin_ws/devel/setup.bash

source devel/setup.bash 명령어로 바꿔 입력해도 된다.
역시 수정된 사항을 적용시켜준다.

 

가장 중요한 부분의 스크린 샷이 없어서 아쉽다.

심지어 디버깅 중에 문제가 있어서 노드 이름을 바꿔서 더 설명하기 곤란한 상황이 됐다.

아래 각 터미널에 아래 명령어를 하나씩 실행해준다.

rosrun [패키지이름] [노드이름]
rosrun [패키지이름] [서브스크라이버 노드 이름]

다른 패키지와 노드 이름이 겹치지 않았다고 가정하고,

이 글 내용을 그대로 따라왔다면 rosrun wooju_tutorial pub_test 와 rosrun wooju_tutorial sub_test를 각각 입력하면 된다.

노드 이름은 CMakelist.txt의 add_executable 함수에서 에 썼던 이름이다.

그러면 위와 같은 화면을 볼 수 있다.

send msg가 나오는 쪽은 publisher, receive msg가 나오는 쪽은 subscriber다.

 

728x90