본문 바로가기

FOSCAR-(Autonomous Driving)/ROS 스터디

[2023 ROS 스터디] 최지웅 #3주차 - ROS 기본 프로그래밍

반응형

3주차 ROS 스터디입니다!

 

ROBOTIS opensourceteam 유투브 채널의 chapter07. ROS 기본 프로그래밍 강의를 듣고 정리한 내용입니다.

 

ROS 기본

메시지들을 주고 받을때 ROS에서는 SI 단위를 기본으로 사용한다. 좌표표현은 오른손 법칙을 따라서 간다.

sudoapt-update로 쓸 수 있는 공식 패키지를 만들때는 표준 단위 및 좌표 표현 방식을 참고하고 작성해야된다.

 

2주차에 배웠던 내용들을 복습하고 관련된 실습을 해보는 강의인 것 같다

실습 순서 : TOPIC, SERVICE, PARAMETER, ROSLAUNCH

 

TOPIC 실습

 

우선, Topic 이라는 메시지 통신은 단방향 통신일때 사용한다. (송신 publisher - 수신 subscriber)

1) 패키지 생성

- cd: change directory 주소 바꿔주기 

- ~ : 홈에 자신의 아이디로 되어있는 폴더를 의미

- ros tutorial 패키지는 뒤에 3개에 의존적이다 

- ls :list 현재 파일에 있는 것들을 볼 수 있다.

패키지 생성

2) 패키지 설정 파일 수정

gedit package.xml

- package.xml (패키지 설정 파일) : 패키지의 이름, 누가 만들었는지, 갖고있는 라이센스, 의존 패키지는 뭔가에 대한 정보

- gedit: 우분투 기본 메모장

강의 PDF파일 복붙해서 패키지 설정파일 수정

패키지의 기본적인 것들을 기술한다.

설명:  xml 문서 / 패키지 / 패키지의 이름/  버전/ 패키지의 간략 설명(2~3줄)/ 라이센스/ 저자/ maintainer 정보/ 이슈가 있을 시 버그 트래커 기능을 하는 정보 / 빌드 툴 정보(지금으로써는 catkin) / 빌드 할때의 의존성 / 실행 할때의 의존성 (대부분은 빌드와 실행이 동일)

 

3)  빌드 설정 파일 수정

gedit CmakeLists.txt

빌드 설정 파일 수정 복붙

작성한 노드를 빌드할 때(소스코드를 작성하고 실행파일을 만들 때) 사용하는 옵션들이다.

 

설명: 요구되는 버젼 정보/ 요구되는 토픽/ 의존성 패키지/ 새로 만들 메시지 기술/ 의존성 메시지를 기술/ 인클루드 디렉토리를 설정/ 실행파일, 타깃링크 라이브러리, 추가 의존성 등을 생성한다.(publisher 과 subscriber 빌드 옵션)

 

4) 메시지 파일 작성

add_message_files(FILES MsgTutorial.msg)옵션을 3)에서 넣어주었다.

따라서, 위의 메시지 파일을 작성해야한다.

메시지 파일 작성을 위한 코드
메시지 작성

설명: 메시지 형식(time/int32)과 메시지 이름(stamp,data) 작성, 메시지를 보낼 때 현재 시간을 넣어주기 위해 time 작성

 

5) 퍼블리셔 노드 작성

퍼블리셔 노드 작성을 위한 코드
퍼블리셔 노드 작성

6) 서브스카이버 노드 작성

subscriber 노드 작성을 위한 코드
subscriber 노드 작성

7) ROS 노드 빌드

ros_tutorials_topic 패키지의 메시지파일, publisher 노드, subscriber 노드를 빌드한다. (코드가 있지만 cm만 쳐도 된다.)

ROS 노드 빌드 완료!

 

8) publisher 실행 (노드 실행에 앞서 roscore 꼭 실행하기!)

 - 코드: $rosrun ros_tutorials_topic topic_publisher

를했지만,,,,,

에러.............

에러가 떠서,, 파일 위치도 확인해보고 잘못친 부분이 있나 여러번 검토했지만 결국 원인을 찾지못해서 ROS한줄 설치를 다시하고 위 의 1~7번까지를 다시 쳐봤다.

한줄 설치 코드:wget https://raw.githubusercontent.com/orocapangyo/meetup/master/190830/install_ros_melodic.sh && chmod 755 ./install_ros_melodic.sh && bash ./install_ros_melodic.sh

 

결과는! 성공했습니다!!!

성공

오류가 발생한 이유는 다름이 아닌, 앞에 1~7번 코드를 작성하는 과정에서 잘못된 파일에 코드를 작성했긴 때문이었다. 항상 조심하자...

참고) rostopic : ROS 네트워크에서 사용중인 토픽 목록, 주기, 데이터대역폭, 내용 확인 등이 가능하다.

 

10) 실행된 노드들의 통신 상태 확인 (rqt_graph를 통해서)

결과!

 

SERVICE 실습

 

Service는 양방향, 일회성의 통신이다. (요청 service client - 응답 service server)

실습 과정은 topic과 똑같다.

1. 패키지 생성

2. 패키지 설정파일 수정

3. 빌드 설정 파일 수정

4. 서비스 파일 작성

5. 서비스 서버 노드 작성

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

7. ros 노드 빌드

8. 서비스 서버 실행

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

실습 1)

서비스 클라이언트 실행

실습 2)

rosservice call 명령어 사용 실습

실습 3)

ROS의 GUI 도구인 rqt 실행 실습

 

PARAMETER 실습

 

앞의 server 실습에서 만들어둔 service_server.cpp 소스를 수정해서 덧셈 뿐만 아니라, 사칙연산을 할 수 있도록 파라미터를 활용해보자.

1) 파라미터를 활용한 노드 작성

service_server.cpp 소스 수정 과정

2) 노드 빌드 및 실행

그 후에는, 노드 빌드 및 실행을 한다.

노드 빌드 과정

3) 매개 변수 목록 보기

rosparam list 명령어로 네트워크에 사용된 파라미터 목록을 확인할 수 있다. 

 

4) 파라미터 사용 예

 

덧셈,뺄셈,나눗셈,곱셈 활용 예시

 

ROSLAUNCH 실습

 

- rosrun은 하나의 노드를 실행하는 명령어고, roslaunch는 하나 이상의 정해진 노드를 실행한다. 

- roslaunch의 다양한 기능: 패키지의 매개변수나 노드이름 변경, 노드 네임스페이스 설정, 환경 변수 설정(XML기반)

- 실행 명령어: roslaunch [패키지명] [roslaunch 파일]

 

1) roslaunch의 활용

launch 파일 생성 및 union.launch 파일 생성 과정

생성된 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>

 

두 번째,

<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>

 

roslaunch ros_tutorials_topic union.launch --screen을 작성하고

rqt_graph를 통해 결과값들을 정리해보자

 

첫번째 방식의 결과,

첫번째 방식의 결과

두 번째 방식의 결과,

두 번째 방식의 결과

여기에서 조심해야 되는 부분이, union.launch를 수정할 때 강의 자료에는 

$roscd ros_tutorials_service/launch라고 되어있는데 위에 launch는 service가 아니라 topic에 있기 때문에

$roscd ros_tutorials_topic/launch라고 적어줘야된다!

 

이로써, 3주차 실습이 모두 끝났다!

생각보다 실습양이 많아서 놀랐지만 생각보다 재밌게 실습했다.

1,2주차때는 막연하게 복붙하고 결과를 봤는데, 3주차에 접어들면서 어느정도 내가 뭘 하고있는지와 

학습하는 정보들을 이해하며 스터디를 진행하는 느낌이 들어서 뿌듯하다.

마지막 주차도 화이팅!

 

반응형