ros 토픽이란 ros에서 노드와 노드 사이에 연속적으로 데이터를 주고받을 수 있는 방법 중 하나입니다. 특정 노드에서 토픽 형태로 데이터를 뿌리면 다른 여러 개의 노드에서 그 데이터를 받아서 처리하는 것이 가능합니다. ros 토픽 명령어를 배워봅시다. 이전에 노드 기초 시간에 실행했던 거북이 노드를 실행해 봅시다. 이 노드는 turtlesim 이름으로 이 노드는 teleop_turtle 이름으로 실행되고 있습니다.
두 노드는 토픽을 통해 데이터를 주고받아 움직입니다. 토픽 리스트를 확인해 보겠습니다. 여러 개의 토픽이 있습니다만, 이 중 거북이를 움직이게 하는 토픽은 터틀 1 cmd_vel 토픽입니다. 이 토픽의 정보를 보겠습니다 누가 토픽을 발신하고 있고 누가 수신하고 있는지 보여줍니다. 그림으로 표현하면 다음과 같습니다. 또한 토픽의 타입을 알 수 있습니다. 지오메트리 메시지 트위스트는 ros에서 기본으로 제공하는 메시지 타입으로 구조는 다음과 같습니다. 토픽 데이터를 확인해 보겠습니다. 델로 업데이터틀에서 방향키를 눌렀을 때 토픽 데이터를 확인할 수 있습니다 현재 토픽 값에 따라 거북이가 어떻게 움직이는지 확인해 보세요. 기타 여러가지 토픽 명령어는 영상 설명란에 링크를 참고하시기 바랍니다.
퍼블리셔 노드란 ros에서 토픽을 발신하는 노드를 의미합니다.
퍼블리셔 노드 작성 워크스페이스의 src 경로에서 퍼블리셔 노드 작성을 위한 ros 패키지를 생성합시다. 패키지 이름은 베이직 퍼블리시 튜토리얼 종속성 패키지는 roscpp 로 하겠습니다.
퍼블리셔 노드 작성은 다음에 순서로 진행합니다.
첫 번째 씨메이크 리스트에 find 패키지 수정
씨메이크 리스트를 텍스트 에디터로 열어 find 패키지에 토픽 사용을 위한 종속성 패키지를 추가해야 합니다.
이 영상에서는 ros에서 기본으로 제공하는 메시지 패키지 중 하나인 geometry_msgs를 추가하여 진행하겠습니다.
두 번째 package.xml 수정 패키지에 있는 패키지 package.xml을 텍스트 에디터로 열어 시메이크 리스트에 파인드 패키지에 추가한 패키지 이름을 다음에 새 항목에 대해서 추가해줍시다. 저장하고 나와 줍시다.
세번째 퍼블리셔 노드 소스 코드 작성
패키지의 src 경로에서 cpp 파일을 생성합시다. 이름은 베이직 퍼블리시로 하겠습니다. 이전에 ros 노드 생성에서 작성한 basic_turtorial 패키지에 basic.cpp 소스코드를 복사 후 붙여넣어줍시다. 토픽을 퍼블리시 하기 위한 부분을 추가하겠습니다 이 영상에서는 지오메트리 메시지 패키지에 트위스트 메시지 타입을 사용할 것입니다이를 위한 헤더 파일추가입니다. 노드 이름을 베이직 퍼블리시 노드로 수정하겠습니다. 지오메트리 트위스트 형식의 메시지를 cmd별 이름으로 선언하겠습니다. 퍼블리셔를 선언하는 내용입니다. 노드 핸들 n에 어드벨타이즈를 통해 정의할 수 있으며 괄호 안에는 어떤 메시지 타입을 사용할 것인지를 정리하고 이곳은 로스토픽 리스트를 입력할 때 나오는 토픽 이름을 정의할 수 있습니다. 여기서는 cmd_vel 이름으로 정의되었습니다. 1000은 메시지 대기열의 크기입니다. 메시지 대기열에 대한 자세한 설명은 영상 설명란을 참고해주세요. cmd_vel의 값을 할당합니다. cmd벨의 메시지 타입인 지오메트리 트위스트의 구조는 다음과 같습니다.
ros 퍼블리셔에 퍼블리시를 호출하면 ros의 토픽이 퍼블리시됩니다. 인자의 전달된 메시지의 값을 퍼블리시하며 인자의 타입은 퍼블리셔의 정의를 메시지 타입과 같아야 합니다. 스핀 원스는이 노드에서 아무런 기능을 하지 않기 때문에 다음 영상에서 설명하겠습니다. 저장하고 나오겠습니다.
네 번째 CMakelists.txt의 add_executable, target_link_libraries 추가
패키지에 씨메이크 리스트를 텍스트 에디터로 열어 소스코드 컴파일 및 실행 파일을 만들기 add_executable과 타겟 링크 라이브러리를 추가합시다. 저장하고 나와주면 모든 단계가 끝납니다. 컴파일 후 실행해줍시다. 작성된 퍼블리셔 노드가 실행되었습니다 로스토픽 리스트를 통해 토픽 이름을 확인합시다. 정의한대로 cmd별 이름으로 퍼블리시 되고 있습니다. 로스토픽 에코 명령을 통해 cmd_vel의 값을 확인해 보겠습니다. 할당된 값 리니어 x와 앵귤러 g의 10으로 퍼블리시 되고 있는 것을 확인할 수 있습니다.
ROS 기초 subscriber node 생성
subscriber node란 ros에서 토픽을 수신하는 노드를 의미합니다.
워크스페이스의 src 경로에서 서스카이버 노드 작성을 위한 ros 패키지를 생성합시다. 패키지 이름은 basic_subscribe_tutorial 종속성 패키지는 roscpp로 하겠습니다. subs카이버 노드 작성은 다음에 순서로 진행합니다
씨메이크 리스트를 텍스트 에디터로 열어 find 패키지에 토픽 사용을 위한 종속성 패키지를 추가해야 합니다. 이 영상에서는 ros에서 기본으로 제공하는 메시지 패키지 중 하나인 지오메트리 메시지를 추가하여 진행하겠습니다.
패키지에 있는 package.xml을 텍스트 에디터로 열어 시메이크 리스트에 find 패키지에 추가한 패키지 이름을 다음에 세 항목에 대해서 추가해줍시다. 저장하고 나와 줍시다.
패키지에 src 경로에서 cpp 파일을 생성합시다. 이름은 베이직 서스카이브로 하겠습니다. 이전에 ros 노드 생성에서 작성한 베이직 튜토리얼 패키지에 basic.cpp 소스코드를 복사 후 붙여 넣어줍시다. 토픽을 subscribe 하기 위한 부분을 추가하겠습니다.
이 영상에서는 geometry_msgs 패키지의 Twist 메시지 타입을 사용할 것입니다.
이를 위한 헤더 파일 추가입니다
노드 이름을 베이직 서스카이브 노드로 수정하겠습니다. 서브스카이버를 선언하는 내용입니다.
선언한 서스카이버를 정의하는 내용입니다. 노드 핸들 n의 subscriber를 통해 정의할 수 있으며 세계의 인자를 입력받습니다. 첫 번째 인자는 수신할 토픽 이름입니다. 두 번째 인자는 메시지 대기열의 크기입니다. 메시지 대기열에 대한 자세한 설명은 영상 설명란을 참고해주세요. 세 번째 인자는 토픽이 수신되었을 때 호출할 함수입니다. 호출할 함수를 작성하겠습니다. 토픽이 수신되었을 때 호출되는 함수는 일반적으로 void 타입으로 정의되며 const 수신하는 토픽의 메시지 타입 그리고 ros에서 제공하는 스마트 포인터를 이용한 Constptr에 &를 붙여 매개변수를 정의합니다. 포인터를 사용한 것이기 때문에 문법적 해석은 어려울 수 있습니다만 궁금하신 분은 영상 설명란을 참고해주세요.
토픽의 값을 로스 인포를 통해 출력하는 부분을 작성하겠습니다. subscriber를 정의했다고 해서 토픽을 수신하고 함수가 실행되는 것이 아니고 SpinOnce가 실행되는 순간에 토픽이 수신되고 함수가 실행됩니다.저장하고 나오겠습니다
패키지에 씨메이크 리스트를 텍스트 에디터로 열어 소스코드 컴파일 및 실행 파일을 만들기 위한 add_executable 과 target_link_libraries 를 추가합시다. 저장하고 나와주면 모든 단계가 끝납니다. 컴파일 후 실행해줍시다. 작성된 서브스카이버 노드가 실행되었습니다. 수신하고자 하는 토픽이 퍼블리시 되고 있지 않기 때문에 아무런 반응이 없습니다. 작성한 서스카이버 노드에서 수신하고자 하는 토픽은 geometry_msgs/Twist 타입의 cmd_vel 이었습니다.
이를 퍼블리시하는 노드는 이전 영상에서 작성한 Publisher Node 입니다. 실행해 봅시다. 토픽이 퍼블리시되자 Suscriber node에서 토픽이 쓰신 되어 반응이 나타났습니다. 토픽에 대한 이해가 되었고 퍼블리셔 노드와 서브스카이브 노드 작성 방법을 익혔으면 터틀심에 거북이가 자동으로 움직이도록 거북이가 움직일 때 속도 데이터가 출력되도록 하는 노드를 작성해 보시는 것을 권장드립니다.
ros에서 기본적으로 사용 가능한 메시지 유형이 있지만 때때로 사용자 지정된 데이터 유형에 대한 메시지 정의가 필요할 수 있습니다 이러한 사.용자 정의 메시지를 ros 커스텀 메시지라고 합니다 ros 커스텀 메시지는 .msg 파일 형식으로 정의됩니다 메시지 파일은 독립된 패키지로 만드는 것을 권장합니다. 커스텀 메시지 파일이 포함된 퍼블리처 노드 패키지와 서스카이브 노드 패키지가 있을 때 해당 패키지에서이 메시지 파일을 사용하기위해선 불필요한 퍼블리셔 노드를 설치해야 합니다. 그러나 독립된 메시지 패키지를 만들면 불필요한 노드 설치를 없앨 수 있습니다.
워크스페이스의 src 경로에서 커스텀 메시지 패키지 작성을 위한 ROS 패키지를 생성합시다.
패키지 이름은 tutorial_msgs 종속성 패키지는 roscpp로 하겠습니다.
패키지 생성 후 다음의 순서로 진행합니다.
패키지에서 msg 폴더를 생성 후 그 안에 msg 파일을 생성합시다. 저는 TutorialMsg 이름으로 생성하겠습니다. ros의 msg에서 사용할 수 있는 기본적인 유형은 다음과 같습니다.
이 유형들을 사용해 보겠습니다. 저장하고 나와줍시다.
CMakelists.txt를 텍스트 에디터로 열어 커스텀 메시지 사용을 위한 부분을 추가해야 합니다. find 패키지에 message_generation과 std_msgs를 추가합시다.message_generation은 RS 메시지와 관련된 코드를 자동으로 생성하는 패키지입니다. std_msgs는 ros 메시지에서 자주 사용되는 일반적인 데이터 유형을 정의하는데 사용합니다. 애드메시지 파일에 메시지 폴더 아래에 생성한 메시지 파일의 이름을 적어줍시다. generate_messages에 std_msgs를 추가합시다. 캡틴 패키지에 캡틴 디펜드에 find 패키지에 추가한 부분을 추가합시다 그리고 메시지 런타임을 추가합시다 메시지 런타임은 메시지 제네레이션 단계에서 생성된 메시지를 다른 ros 노드가 사용할 수 있게 하는데 필요한 패키지입니다 이곳에 메시지 런타임을 추가함으로써이 패키지가 생성한 메시지를 다른 ros 노드에서 참조하고 사용할 수 있게 됩니다 세번째 패키지 xml 수정 패키지에 있는 패키지 xml을 텍스트 에디터로 열어 시메크 리스트에 find 패키지에 추가한 패키지 이름을 다음에 새 항목에 대해서 추가해줍시다.
그리고 마지막 항목에 대해서만 메시지 런타임을 추가해줍시다. 저장하고 나와 줍시다.
네 번째 캡틴 메이크 커스텀 메시지 패키지를 컴파일하여 메시지 라이브러리를 생성합시다.
생성된 메시지 라이브러리는 컴파일된 결과물 아래에 인클루드 폴더에서 커스텀 메시지 패키지 이름의 폴더 아래에 존재합니다.
ros 노드 작성 시 커스텀 메시지를 사용하려는 경우 생성된이 메시지 라이브러리를 헤더 파일로 선언하여 사용합니다 커스텀 메시지 패키지 작성을 완료하였으니이를 사용한 노드 생성 방법을 알아보겠습니다.
워크스페이스의 src 경로에서 커스텀 메시지 패키지 사용을 위한 ros 패키지를 생성합시다 패키지 이름은 베이직 메시지 스토리얼 정숙성 패키지는 노스 cp로 하겠습니다. 패키지 생성 후 다음의 순서로 진행합니다 첫 번째 시메이크 리스트에 마인드 패키지 수정 패키지에 씨메이크 리스트를 텍스트 에디터로 열어 find 패키지에 커스텀 메시지 패키지 이름을 추가합시다. 두 번째 패키지 xml 수정 패키지 xml을 텍스트 에디터로 열어 스메이크 리스트에 find 패키지에 추가한 패키지 이름을 다음에 새 항목에 대해서 추가해줍시다 저장하고 나와줍시다
세번째 커스텀 메시지 노드 소스코드 작성 패키지에 src 경로에서 cpp 파일을 생성합시다 퍼블리스 노드부터 작성해보겠습니다 이름은 베이직 메시지 퍼블리시로 하겠습니다 이전에 ros 퍼블리셔 노드 생성에서 작성한 베이직 퍼블리시 스토리얼 패키지에 베이직 퍼블릭 시점 cpp 소스코드를 복사 후 붙여 넣어줍시다 이 소스 코드를 커스텀 메시지에 유형에 맞게 변환하면 됩니다 커스텀 메시지에 헤더 파일은 다시 한번 설명합니다만 컴파일된 결과물 아래 인클루드 폴더에서 커스텀 메시지 패키지 이름에 폴더 아래 존재하는 이것을 선언하여 사용합니다 일반적으로 커스텀 메시지 패키지 이름 슬러시 메시지 8 이름.h로 생성되어 있습니다 변환을 완료했습니다. 저장하고 나오겠습니다.
네 번째 씨메이크 리스트에 링크 라이브러리 추가 패키지에 씨메이크 리스트를 텍스트 에디터로 열어 소스코드 컴파일 및 실행 파일을 만들기 위한 에듀 이스크 테이블과 타겟 링크 라이브러리를 추가합시다 다섯 번째 씨메이크 리스트에 애드 디펜던트 추가 애드 디펜던스를 추가합시다 커스텀 메시지를 사용한 노드는
메시지가 먼저 생성이 되어야 노드 컴파일이 가능합니다이를 추가함으로써 해당 노드는 컴파일 하기 전에 메시지가 먼저 생성되도록 합니다 저장하고 나와주면 모든 단계가 끝납니다 컴파일 후 실행해줍시다 작성된 커스텀 메시지에 퍼블리셔 노드가 실행되었습니다 토픽의 값을 확인해 봅시다 커스텀 메시지는 소스 명령을 먼저 입력해 주어야 인식할 수 있습니다 커스텀 메시지에 서스커버 노드 또한 이전에 rus suscriver 노드 생성에서 작성한 베이직 서브스카이버 튜토리얼 패키지에 베이직 서스 카이브 점 cpp 소스코드를 복사 후 붙여 놓고 커스텀 메시지에 유형에 맞게 변환 후 씨메이크 리스트에 등록하여 컴파일하고 실행하면 됩니다
여러 개의 ros 노드를 한 번의 명령으로 실행할 수 있게 해주는 도구입니다.
ros launch 파일은 노드 1에 대한 실행 명령..
2에 대한 실행 명령 등등..으로 구성되어 있습니다.
ros 런치를 이용하면 여러 개의 노드를 실행할 때 더 이상 rosrun명령을 여러번 입력할 필요가 없습니다.
ros 런치는 실행시 roscore가 실행되어 있지 않다면 자동으로 roscore를 실행합니다.
이미 실행되어 있으면 기존의 실행되어 있는 roscore를 유지합니다.
ros에서 같은 이름의 노드는 2개 이상 실행할 수 없습니다. 그러나 로스 런치를 이용하면 컴파일 없이 노드의 이름을 변경하여 실행할 수 있으며, 이를 통해 같은 노드를 다른 이름으로 여러 실행하는 것이 가능합니다.
ros 런치를 통해 노드 실행시 사용할 수 있는 옵션이 존재합니다. 노드의 출력을 본다 안 본다 노드가 종료되면 다시 실행하게 하는 옵션 등등 여러가지가 있습니다.
ros의 기능 중 하나인 파라미터의 값을 설정할 수 있습니다. 이 부분은 RS 파라미터 영상에서 자세히 다루겠습니다.