본문 바로가기

FOSCAR-(Autonomous Driving)/ROS 스터디

[2025 ROS 스터디] 홍동형 #3주차 - ROS 기본 프로그래밍

반응형

 

ROS프로그래밍 전에 알아둬야 할 사항

ROS프로그래밍 전에 알아둬야 할 사항

원활한 소통과 프로그래밍을 위해서는 표현 단위와 방식을 통일해야 함

그 규칙들 sI단위, 오른손 좌표계 등..

 

프로그래밍 규칙

http://wiki.ros.org/CppStyleGuide

+ 파이썬도 찾아보니 있음 http://wiki.ros.org/PyStyleGuide

 


실습 과정

topic

1) 패키지 생성

$ cd ~/catkin_ws/src
$ catkin_create_pkg ros_tutorials_topic message_generation std_msgs roscpp

패키지 생성 패키지 이름 의존성

 

2) 패키지 설정 파일(package.xml) 수정

$ gedit package.xml

package.xml 수정 내용

package.xml -> 패키지 이름, 저작자, 라이선스, 의존성 패키지 등을 기술

 

3) 빌드 설정 파일(CMakeLists.txt) 수정

$ gedit CMakeLists.txt

CMakeLists.txt 수정 내용

 

4) 메시지 파일 작성

roscd ros_tutorials_topic 명령어 입력시
roscd: No such package/stack 'ros_tutorials_topic' 라는 에러 메시지가 발생한다. 강의에는 있는데 pdf에는 없어졌다. 이미 그 폴더에 있으니 일단은 넘어간다...

$ mkdir msg
$ cd msg
$ gedit MsgTutorial.msg

MsgTutorial.msg 파일 내용

time 형의 stamp 이름

int32 형의 data 이름

5) 퍼블리셔 노드 작성

여기서도 roscd명령어는 잘 모르겠어서 어찌저찌 src디렉토리에 들어갔다...

$ cd ..
$ cd ./src
$ gedit topic_publisher.cpp

topic_publisher.cpp 파일 내용

6) 서브스크라이버 노드 작성

$ gedit topic_subscriber.cpp

topic_subscriber.cpp 파일 내용

7) ROS 노드 빌드

$ cm

cd ~/caktin_ws

catkin_make

단축 명령어 -> cm

 

헤더 파일과 실행 파일은 catkin_ws/devel/ 에 자동으로 생긴다.

8) 퍼블리셔 실행

$ rosrun ros_tutorials_topic topic_publisher

명령어 입력시

[rospack] Error: package 'ros_tutorials_topic' not found

같은 에러가 발생한다.

$ source ~/catkin_ws/devel/setup.bash
$ rospack find ros_tutorials_topic

이 명령을 진행 후 다시 시도하니 성공!! (+roscore 실행도 잊지말자)

문제 해결 참고 사이트 : https://stackoverflow.com/questions/56139647/how-to-fix-rospack-error-package-my-package-not-found

퍼블리셔 실행 모습

화면에 보이는 것은 퍼블리셔 하는 것이 아닌 ROS_INFO뿐이다.

 

$ rostopic list
$ rostopic info /ros_tutorial_msg

현 상황 파악 가능

명령 실행 결과

 

9) 서브스크라이버 실행

퍼블리셔와 동일

그러나 동일한 오류 발생 동일한 해결 방법... 굉장히 번거롭다 영구적으로 해결할 방법 찾아야함.

+ 찾았다!!! .bashrc 파일에 해결할 때 사용한 명령어를 넣으면 명령창이 열릴때 마다 실행되어 해결.

$ rqt_graph

rqt를 통해 잘 작동함을 확인


 

service

* topic과 거의 동일하므로 차이점과 결과 위주로 작성함

1) 패키지 생성, 2) 패키지 설정 파일(package.xml) 수정, 3) 빌드 설정 파일(CMakeLists.txt) 수정

topic과 거의 동일

각각 package.xml, CMakeLists.txt 파일

4) 서비스 파일 작성

bashrc 파일을 수정하니 전에 문제있던 roscd명령어도 잘 작동함.

SrvTutorial.srv 파일

 

서비스 요청

--- (구분자)

서비스 응답

5) 서비스 서버 노드 작성

service_server.cpp 파일

 

6) 서비스 클라이언트 노드 작성

service_client.cpp 파일

7) ROS 노드 빌드

topic과 동일

8) 서비스 서버 실행

server ready

9) 서비스 클라이언트 실행

각각 server, client

service는 일회성이므로 rqt_graph 등에서 확인 불가능


노드외에

$ rosservice call /ros_tutorial_srv 10 2

로도 요청 가능

각각 server, client

 

또, rqt -> Plugins -> Service -> Service Caller 로도 사용 가능

rqt를 이용해 service call


** 하나의 노드는 복수의 퍼블리셔, 서브스크라이버, 서비스 서버, 서비스 클라이언트 가능


Parameter

service서버를 수정하여 실습

 

빌드,  실행 하면 ready srv server ! 메시지가 나온다

 

$ rosparam list

를 통해서

/calculation_method
/rosdistro
/roslaunch/uris/host_localhost__38555
/rosversion
/run_id

확인 가능

 

$ rosservice call /ros_tutorial_srv 10 5 

$ rosparam set /calculation_method 2
$ rosservice call /ros_tutorial_srv 10 5

service와 동일하게 요청하지만 파라미터 셋으로 다른 처리를 이용 가능함

두번 모두 10, 5를 입력했지만 15, 5로 결과가 덧셈에서 뺼셈으로 변함


roslaunch

rosrun - 하나의 노드를 실행하는 명령어

roslaunch - 하나 이상의 정해진 노드를 실행

이 외에도 여러 기능

xml기반

$ roscd ros_tutorials_topic
$ mkdir launch
$ cd launch
$ gedit union.launch
<launch>
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher1"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber1"/>
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher2"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber2"/>
</launch>

노드 이름이 같으면 이전의 노드는 죽기에 name을 이용해 지정해줌.

 

$ roslaunch ros_tutorials_topic union.launch --screen

실행 명령어

--screen을 이용하면 진행상황을 보여줘서 디버깅에 유리

왼쪽 --screen 명령어 입력, 오른쪽 입력 x

 

rqt_graph

1 : N topic통신 중임을 확인 가능

그러나 퍼블리셔 1은 서브스크라이버1에게 2는 2에게만 메시지를 보내고 싶었다면???

<launch>
<group ns="ns1">
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber"/>
</group>
<group ns="ns2">
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber"/>
</group>
</launch>

union.launch 파일을 이렇게 수정한다. group을 사용해 구분한다.

 

rqt_graph

rqt_graph로 확인하면 원하는 대로 구분된 것을 확인할 수 있다.

 

이 외의 launch 태그들

 

 

 

 

 

출처 : https://youtu.be/iGdQHi_wL1Y?si=RUAScZDmJJl2oeLj

 

 

반응형