본문 바로가기

FOSCAR-(Autonomous Driving)/ROS 스터디

[2024 ROS 스터디] 이강욱 #3주차 - ROS 기본 프로그래밍

반응형

1. ROS 프로그래밍 기본 규칙

  • 표준 단위 <-> SI 단위 사용
    ROS는 전세계적가 공통적으로 사용하는 소프트웨어이기 때문에 센서를 통해 들어오는 물리량을 표현할 때에는 단위 표준을 지켜야 개발할 때 혼선이 생기지 않는다. 예를 들어 라이다 관련 패키지 A, B 가 있다고 해보갰다. 그런데 A 패키지는 cm 단위로, B 패키지는 in 단위로 값을 다룬다면 사용하는 입장에서 cm, in 간 변환작업을 거쳐야 하며, cm, in 간 값을 혼동하여 잘못 사용할 수도 있다. 따라서 표준 단위인 m 를 사용하면 이러한 혼동은 없어질 것이다. 반대로 이야기 하면 널리 알려진 공개된 패키지에서 다루는 값들은 모두 표준 단위을 지킨 패키지들 이므로 프로그래밍할 때 참고할 수 있는 유용한 정보가 될 수 있다. 다음은 물리량과 그 표준 단위의 예시이다.

물리량에 대한 표준 단위

  • 좌표 표현 방식
    좌표계의 경우 우리가 평소 수학시간에 배웠던 데카르트 좌표계가 아닌 오른손 법칙에 의한 좌표계를 사용한다. 다음 이미지와 같다.
  • ROS에서 사용하는 좌표계

  • 네이밍 규칙
    네이밍 규칙이 존재한다. 네이밍 규칙은 wiki에 자세히 설명되어 있으니 링크를 남기도록 하겠다.

2. 메세지 통신의 종류

메세지 통신의 종류 4가지

    • 토픽: 상단 이미지에서 Publisher(퍼블리셔, 송신 역할) 와 Subscriber(서브스크라이버, 수신 역할) 로 구성된 통신방식으로 단방향 메세지 통신이다. 일정 주기마다 퍼블리셔에서 토픽을 송신하면 서브스크라이버는 수신하여 일정한 동작을 처리하는 것이다. 다음은 이에 대한 실습 코드 및 사진이다.
      • package.xml
        catkin_pkg에 대한 내용이 담긴 xml 형식의 파일이다. 패키지 이름은 무엇이고 어떤 라이센스를 따르며 누가 만들었는지 등에 대한 정보가 나타나 있다. catkin_create_pkg로 생성된 xml 파일의 태그가 영상 강의하고는 달라서 이름이 비슷한 태그와 정보를 일치시켜 작성해보았다.

package.xml

        • CMakeList.txt
          cmake 빌드 시스템에 기반을 둔 catkin 빌드 시스템에 대한 내용이 담긴 파일이다. 본 실습에서는 커스텀 메세지를 만들어서 publish, subscribe 하는 것이 목표이기 때문에 add_message_files 명령을 넣었다. 이외에도 실행파일을 만들고 의존성을 부여하기 위한 add_executable, add_dependencies 등과 같은 명령이 있다.

CMakeList.txt

        • MsgTutorial.msg
          MsgTutorial 메세지이다. 시간과 정수형 데이터로 구성되어있다. catkin_make를 하면 devel 폴더 아래 include 폴더 아래에 "패키지명"/MsgTutorial.h 파일이 자동으로 생기고, 이 이후부터 컴파일 에러 없이 사용할 수 있다.

MsgTutorial.msg

        • topic_publisher.cpp
          토픽을 publish 하는 코드이다. python과 차이점이 있다면, publisher 를 생성할 때 rospy.Publisher('topic_name', topic_type, queue_size) 로 생성하는 반면, cpp에서는 8번 줄 처럼 NodeHandle을 1번 거치며, 템플릿을 활용하여 publish 할 데이터를 정한다.

topic_publisher.cpp

        • topic_subscriber.cpp
          토픽을 수신하는 Subscriber 코드이다. publisher와 마찬가지로 python과 약간의 차이가 있다.
          python: rospy.Subscriber('topic_name', topic_type, callback)
          cpp: 15번 줄

topic_subscriber

        • 실행결과는 다음과 같다.

실행 결과

 

 

  • 서비스: 양방향 메세지 통신이다. 서버는 클라이언트의 요청이 들어올 동안 대기하다가 요청값에 따른 응답값을 보내준다.
                이때, 이 요청은 별도의 처리를 하지 않는다면 일회성의 통신이 되기 때문에 rqt_graph 에서는 확인할 수 없다.
                두 정수 값을 요청으로 보내면, 두 값을 합한 것을 응답으로 보내는 것이 이번 실습 예제이다. 영상에서는 새로운
                패키지를 만들었지만, 나는 임의로 같은 패키지 안에서 진행하였다. 다음은 실습 코드 및 사진이다.
        • package.xml: 같은 패키지에 만들었기 때문에 다른 점은 없다.
        • CMakeList.txt
          서비스 파일에 대한 내용이 추가되었다. add_service_files 명령으로 서비스 파일을 추가한다. 그 밖에 추가사항은 주석으로 표시해두었다.

CMakeList.txt

        • service_server.cpp
          서비스 서버를 담당하는 코드이다. Subscriber 코드처럼 관련된 서비스명과 콜백함수를 인자로 받는다.

service_server.cpp

        • service_client.cpp
          서비스 클라이언트를 담당하는 코드이다. 토픽 방식의 코드와 다르게 별도의 처리를 하지 않는다면 단 1번만 요청값을 전송하고 실행이 종료된다.

service_client.cpp

        • 실행 결과
          rosrun의 인자로 3 5 를 주니, response 값으로 8을 주는 것을 볼 수 있다,

실행 결과

 

 

  • 파라미터 서버
    roscore 명령을 입력하면 rosmaster, rosout(log 기록용)과 함께 실행되는 요소이다. 유저가 정한 파라미터를 기록하며, 임의의 노드 or 명령으로 값 변경이 가능하다. 일종의 옵션처럼 활용되는 요소이다. 실습 예제는 service_server.cpp 에서만 바뀐다. 변경된 내용을 담은 건 다음과 같다.

스크린샷, 2024-02-11 02-43-45.png
105.2 kB

        • 실행 결과
          rosrun의 인자로 3 5 를 주니 동일하게 8을 반환하지만, rosparam으로 calculation_method 값을 2(MINUS)로 바꾸니 -2를 반환하는 걸 알 수 있다.

실행 결과

 

3. roslaunch

  • rosrun이 하나의 노드를 실행하는 명령어라면, roslaunch 는 하나 이상의 노드를 실행시켜주는 명령어이다. 그리고, roslaunch는 roscore가 실행되지 않았을 때 roscore를 실행해주는 역할도 수행한다. 그 밖에도 패키지의 매개변수, 노드 이름 변경, 환경 변수 변경 등 다양한 옵션을 붙일 수 있는 ROS 명령어이다.
  • 확장자는 launch 이며, XML 기반이다.
  • 실행방법은 roslaunch [패키지명] [roslaunch 파일] 이다.
  • launch에는 group 태그를 활용할 수 있는데, 실행되는 노드를 그룹화할 때 사용한다. 다음과 같이 활용할 수 있다.

반응형