반응형

ROS에서 디버깅하고 많은 노드들을 동시에 시작하기 위한 rqt_console과 rqt_logger_level을 알아보자.

 

1. Prerequisites rqt and turtlesim package

이번 과정은 rqt와 turtlesim 패키지를 모두 사용하므로 둘 다 설치를 진행한다.

 

<distro>는 ROS버전(kinetic, melodic, ...)을 입력한다.

2. Using rqt_console and rqt_logger_level

rqt_console은 ROS의 rogging 프레임워크를 통해 노드들의 결과를 표시해준다.

rqt_logger_level 은 노드들이 실행되면서 동시에 verbosity level(DEBUG, WARN, INFO and ERROR)을 변경할 수 있도록 한다.

 

rqt_console의 turtlesim의 출력을 확인해보고 rqt_logger_level을 turtlesim으로 변경해보자.

turtlesim을 시작하기 전에 새로운 터미널창을 열고 rqt_console과 rqt_logger_level을 실행하자.

 

그럼 아래와 같은 창이 팝업되게 된다.

 

 

그럼 이제 아래 명령어를 통해 turtlesim_node를 실행시키자.

 

기본으로 설정된 logger level이 INFO이므로 turtlesim 이 publish하는 정보들을 확인할 수 있게 된다.

 

이제 logger level을 WARN으로 변경해보자.

 

그리고 아래 코드를 입력하여 보면

콘솔에 아래와 같은 Warn 메시지들이 출력되는 것을 확인할 수 있다.

 

2.1 Quick Note about logger levels

Logging levels는 다음의 순서로 우선순위가 정해지게 된다.

Fatal은 가장 높은 우선순위를 갖고 Debug는 가장 낮은 우선순위를 갖는다. logger level을 설정함으로써 priority level 이상의 메시지들을 받게 된다. 예를들어, logger level을 WARN으로 설정하면 모든 Warn, Error, Fatal logging messages를 받게 된다.

 

그럼 이제 turtlesim 노드를 종료하고 다수의 turtlesim 노드들을 실행하기 위해 roslaunch를 사용해보자.

 

2.2 Using roslaunch

roslaunch는 launch file에 정의된대로 노드들을 실행하게 된다.

우선 앞에서 생성하고 빌드했던 beginner_tutorials 패키지의 경로로 이동하자.

만약 위의 명령에서 "roscd:No such package/stack 'beginner_tutorials'" 라는 에러가 출력되면 setup파일의 설정을 source하여 저장해야한다.

(참고: wiki.ros.org/catkin/Tutorials/create_a_workspace)

 

다음 launch 폴더를 생성한다.

2.3 The Launch File

이제 turtlemimic.launch 라는 파일을 생성하고 아래 내용을 복붙하자.

$ gedit turtlemimic.launch


<launch>

  <group ns="turtlesim1">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>

  <group ns="turtlesim2">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>

  <node pkg="turtlesim" name="mimic" type="mimic">
    <remap from="input" to="turtlesim1/turtle1"/>
    <remap from="output" to="turtlesim2/turtle1"/>
  </node>

</launch>

2.4 The Launch File Explained

 

위의 코드에서 가장 위에 <launch> 는 해당 파일이 launch file임을 나타낸다.

 

그리고 첫번째, 두번째 문단을 통해 sim이라는 이름의 2가지 노드(turtlesim1, turtlesim2)를 정의하고

이는 충돌없이 두개의 시뮬레이터가 잘 작동할 수 있도록 해준다.

 

마지막 문단은 각각의 노드들의 입/출력을 설정하는 과정으로 turtlesim2가 turtlesim1을 따라하도록 설정한 것이다.

 

마지막 </launch>는 launch file의 xml을 닫도록 하는 것이다.

 

 

2.5 roslaunching

이제 해당 파일을 roslaunch 해보자.

그럼 거북이 창이 2개 뜨는 것을 확인할 수 있다.

 

하나의 명령을 통해 2개의 거북이가 동시에 움직이는 것을 확인할 수 있다.

그럼 rqt_graph를 통해 관계를 조금 더 자세히 알아보자.

 

turtlesim1이 움직임의 메시지를 subscribe하고 mimic 노드를 통해 turtlesim2가 turtlesim1을 따라가는 관계임을 볼 수 있다.

반응형

'ROS > ROS Wiki' 카테고리의 다른 글

Creating a ROS msg and srv  (0) 2021.01.05
Using rosed to edit files in ROS  (0) 2021.01.05
Understanding ROS Services and Parameters  (0) 2021.01.05
Understanding ROS Topics  (0) 2021.01.04
Understanding ROS Nodes  (0) 2021.01.03
반응형

1. ROS Services

서비스는 노드 사이 통신을 위한 또다른 방법이다. 서비스는 노드들에게 Request를 보내고 Response를 받게 된다.

앞에서 다룬 Topic과의 차이는 아래 그림을 통해 쉽게 이해할 수 있다.

Topic은 데이터가 지속적으로 전달되어지는 데이터 스트림에 적합한 비동기식 통신 방법인 반면, 서비스는 대기/응답(Request/Response) 방식의 통신으로 동기식 통신 방법을 의미한다.

 

 

2. Using rosservice

rosservice는 ROS의 client/service 프레임워크의 일부로 많은 명령어들이 존재한다.

* setup

$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key

 

 

2.1 rosservice list

 

list는 현재 가동중인 노드의 활성화된 서비스에 대한 정보를 출력하는 것으로, roscore만 실행한 후 이를 진행해보면

위의 결과를 확인할 수 있고 setup과정의 모든 노드를 실행하고 list를 확인하여 보면

위의 결과를 확인할 수 있다.

 

즉, turtlesim 노드는 9개의 서비스(reset, kill, clear, spawn, turtle1/set_pen, ... , turtlesim/get_logger_level)를 나타내고

turtle_teleop_key 노드는 2개의 서비스(teleop_turtle/get_loggers, teleop_turtle/set_logger_level)를 나타내며

rosout 노드에서 2개의 서비스를 나타내는 것을 확인할 수 있다.

 

 

2.2 rosservice type

 

turtlesim 의 clear 서비스의 타입을 살펴보자.

서비스가 empty로  표시되는데 이는 서비스가 호출될 때 전달된 인자가 없다는 것을 의미한다.

(Request할때 어떠한 데이터를 전송하지도 않고 Response할때 어떠한 데이터도 받지 않는다.)

그럼 이제 clear service를 rosservice call 을 이용하여 호출하여 보자.

 

 

2.3 rosservice call

 

위의 내용은 turtlesim_node의 clear 서비스를 실행시키는 것으로 거북이가 움직인 경로(background)를 초기화한다.

 

service가 전달인자를 갖는 경우를 살펴보기 위해 spwan service를 살펴보자.

 

spwan 서비스는 새로운 거북이를 주어진 방향과 위치로 생성한다(name 부분은 선택사항이다).

위의 명령어를 실행하면 새로 생성된 거북이의 이름을 return하고 아래와 같이 한마리가 추가된다.

내요은 /spawn 서비스를 호출하는데 x값에 해당하는 값에 2, y값에 해당하는 값에도 2, theta값에 0.2값을 넣어준 것이다.

마지막의 ""는 turtlesim의 이름을 지정하는 부분으로 공백으로 사용하여 임의의 값을 얻어오고자 함이다.

 

 

 

3. Using rosparam

ROS에서의 파라미터는 전역변수(Global variable)와 같은 역할을 한다.

rosparam은 사용자가 ROS 파라미터 서비스의 데이터를 저장하거나 조종하는 것을 허용하며 integer, float, boolean, dictionary, list 타입의 데이터를 저장할 수 있고 YAML 마크업언어 문법을 사용한다.

*YAML은 "또 다른 마크업 언어(Yet Another Markup Language)" 이며 사람이 쉽게 읽을 수 있는 데이터 직렬화 양식으로 가벼운 마크업 언어로 사용하고 있다(최근에는 XML, JSON이 데이터 직렬화에 주로 쓰인다).

 

$ rosparam

위의 명령어를 통해 옵션들을 확인해볼 수 있다.

 

3.1 rosparam list

rosparam list를 통해 현재 노드들에서 활성화된 파라미터들을 확인할 수 있고 turtlesim 노드에서 배경색에 대한 3가지의

parameters가 존재함을 확인할 수 있다.

그럼 rosparam set을 이용하여 파라미터를 수정하여보자.

 

 

3.2 rosparam set and rosparam get

현재 배경의 RGB값을 확인하여보면 위와 같다.

Parameter Server의 모든 내용을 확인하고자 하면 다음과 같이 진행한다.

 

그럼 set을 통해 값을 변경해보자.

 

3.3 rosparam dump and rosparam load

 

rosparam을 이용하여 정보들을 저장하여 추후에 다시 불러올 수 있도록 해보자.

아래 명령어를 통해 모든 parameters를 params.yaml로 저장한다.

또한 저장된 yaml파일을 새로운 namespace에 저장하여 사용할 수 있다.

반응형

'ROS > ROS Wiki' 카테고리의 다른 글

Using rosed to edit files in ROS  (0) 2021.01.05
Using rqt_console and roslaunch  (0) 2021.01.05
Understanding ROS Topics  (0) 2021.01.04
Understanding ROS Nodes  (0) 2021.01.03
Building a ROS Package  (0) 2020.12.31
반응형

1. Setup

$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key

 

 

 

2. ROS Topics

위의 setup과정에서 실행한 turtlesim_node와 turtle_teleop_key 노드들은 ROS Topic을 통해 서로 통신하게 된다.

tuetle_teleop_key는 키보드의 입력을 publishing하게 되고 tuetlesim_node 노드는 같은 Topic을 subscribe하여 키의 입력을 전달받데 된다. 구조는 rqt_graph를 이용하여 쉽게 시각화시킬 수 있다.

 

 

2.1 Using rqt_graph

rqt_graph는 ROS 시스템의 구성을 그래프로 보여주는 도구로 rqt package의 한 부분이다.

아래 명령어를 통해 작업을 진행한다.

(위의 내용에서 <distro>는 kinetic, melodic, ... 등으로 대체된다.)

그럼 아래 명령어를 통해 Setup과정에서 진행한 ROS시스템의 구성을 살펴보자.

위의 그래프를 통해 /turtle1/command_velocity 라는 이름의 Topic에 대해 /teleop_turtle 노드와 tutlesim 노드가 메시지(데이터)를 통신하는 관계임을 확인할 수 있다.

 

 

2.2 Introducing rostopic

rostopic 툴은 ROS Topics에 대한 정보를 얻기 위한 도구이다.

 

2.3 Using rostopic echo

rostopic echo는 토픽에 대해 publish된 내용들을 표시해준다.

위와 같은 구조로 사용하게 되고 이를 예제 적용하여 보면

위의 명령어를 입력한 후 teleop_key 터미널창에 방향키 입력을 통해 거북이를 움직여보면 값이 변화하는 것을 확인할 수 있다.

이제 rqt_graph를 확인하여 보면 아래와 같이 붉은색으로 rostopic echo 노드가 생성되어 turtle1/command_velocity 토픽을

subscribe 하는것을 확인할 수 있다.

 

즉, turtle1/cmd_vel topic에 대해 teleop_turtle노드는 입력받는 키에 대한 정보를 publish하고 이를 나타내는 turtlesim 노드와 회전각 및 이동량을 전달받는 rostopic echo 노드가 topic을 subscribe하는 것을 확인할 수 있다.

 

2.4 Using rostopic list

rostopic list는 현재 topic에 대해 subscribe 및 publish 되는 노드들의 정보를 나타낸다.

rostopic list에 대한 argument들은 다음 명령어를 통해 확인할 수 있다.

 

 

3. ROS Messages

Topic들에 대한 통신(Communication)은 노드들 사이에 ROS 메시지를 전송함으로서 진행된다.

publisher(turtle_teleop_key)와 subscriber(turtlesim_node)가 통신하기 위해서는 각각 동일한 타입의 메시지를 송수신 하여야 한다.

즉, topic의 타입은 publish되는 메시지의 타입에 따라 정의되게 되고 이러한 토픽에 전송되는 메시지는 rostopic 타입을 통해 결정된다.

 

3.1 Using rostopic type

rostopic type는 publish되는 메시지 타입들을 보여준다.

 

우리의 예를 들면

위의 명령어를 통해 turtle1/cmd_vel 이라는 Topic의 메시지 타입을 확인하면 아래와 같은 결과를 확인할 수 있다.

그리고 메시지의 자세한 정보를 위해 rosmsg를 아래와 같이 사용하면 결과를 확인할 수 있다.

 

즉, geometry_msgs/Twist 라는 데이터 형은 직선방향, 각도에 대한 데이터형이고 이는 float64형임을 확인할 수 있다.

 

 

 

 

4. rostopic continued

4.1 Using rostopic pub

rostopic pub은 현재 토픽에서의 데이터를 publish한다.

 

위의 명령은 turtlesim 노드에게 직선속도 2.0과 각속도 1.8을 갖고 움직여라 라는 의미를 담고있다.

 

그럼 위와 같은 결과를 볼 수 있다.

 

굉장히 복잡한 명령어이므로 자세히 살펴보자.

 

우선 가장 앞에 등장하는 rostopic pub은 해당 topic에게 메시지를 전송하겠다는 것을 의미한다.

 

*  -1(dash-one) 은 한번의 메시지만 publish한 후 종료하라는 의미를 담고있다.

*  turtle1/cmd_vel 은 publish할 토픽의 이름을 나타낸다.

*  geometry_msgs/Twist 는 topic을 publish할 때, 메시지의 타입을 나타낸다.

*  --(double dash)는 해당 argument에 값을 넣어주지 않기 위한 과정이다.

*  앞에서와 같이 geometry/Twist 메시지는 각각 3개의 floating 요소들로 구성된다.

 

 

그리고 거북이를 계속 움직이기 위해선 아래 명령어와 같이 rostopic pub -r  명령어를 사용하자.

 

이 과정을 rqt를 이용해서 확인하여보면 아래와 같다.

 

보면 subscribe 노드는 rostopic echo 노드와 turtlesim 노드, publish는 teleop_turtle노드와 추가적으로

새로운 노드가 생성된 것을 확인할 수 있다.

 

즉 teleop_turtle로 키 입력을 받는 것 외에 계속적으로 움직임을 가질 수 있도록 새로운 노드가 생성되어 publish하는 것을

확인할 수 있다.

 

 

4.2 Using rostopic hz

rostopic hz는 어떤 데이터들이 publish 되는지 확인할 수 있다.

보면 average rate가 60과 가까운 것을 확인할 수 있고 이는 turtlesim 노드가 pose에 대한 데이터는 60Hz로 Publish 한다는

것을 의미한다.

 

 

 

5. Using rqt_plot

rqt_plot은 topics에 대해 publish되는 데이터의 연속적인 값들을 보여준다.

 

위의 명령어를 통해 rqt_plot을 진행하고 상단의 Topic에 그래프로 나타내고자 하는 토픽을 지정하고 옆의 + 버튼을 누르자.

 

근데 우분투 18.04버전을 진행함에 있어 다음과 같은 에러가 발생한다.

창의 크기를 조절하게 되면 다음과 같은 결과를 출력하며 강제 종료되게 된다.

 

 

이는 matplotlib 내부에 존재하는 문제로 아직 해결책을 찾지는 못하였지만 대체 방안으로 창을 최대화하면 보이는 것을 확인할 수 있다.

 

아래 링크는 해당 문제가 발생한 것에 대한 참고 링크이다.

 

github.com/ros-visualization/rqt_plot/issues/35

 

Error when re-arranging widgets over plot. Kinetic, 16.04 · Issue #35 · ros-visualization/rqt_plot

When I try to re-arrange widgets in rqt, whenever I pass with it over a plot widget, I get the error: Traceback (most recent call last): File "/opt/ros/kinetic/lib/python2.7/dist-packages/qt_g...

github.com

 

반응형

'ROS > ROS Wiki' 카테고리의 다른 글

Using rqt_console and roslaunch  (0) 2021.01.05
Understanding ROS Services and Parameters  (0) 2021.01.05
Understanding ROS Nodes  (0) 2021.01.03
Building a ROS Package  (0) 2020.12.31
Creating a ROS Package  (0) 2020.12.31

+ Recent posts