반응형

ROS2를 설치합니다. 설치할 ROS와 우분투 버전이 맞아야 합니다.

ROS와 우분투의 알파벳을 맞추면 된다고 합니다. Focal Fossa - Foxy 이렇게.

emanual.robotis.com/docs/en/platform/turtlebot3/quick-start/

 

ROBOTIS e-Manual

 

emanual.robotis.com

여기 나온 순서대로 하면 되는데 저는 xubuntu를 깔아놔서 그런지 3.1.2 Install ROS 2 on Remote PC 단계에서 막혔습니다.

실패하면 다음 나오는 싸이트로 가서 순서대로 하라고 해서 여기 나온대로 설치 했습니다.

index.ros.org/doc/ros2/Installation/Foxy/Linux-Install-Debians/

 

Installing ROS 2 via Debian Packages

Debian packages for ROS 2 Foxy Fitzroy are available for Ubuntu Focal. Make sure you have a locale which supports UTF-8. If you are in a minimal environment (such as a docker container), the locale may be something minimal like POSIX. We test with the foll

index.ros.org

여기 나온대로 하면 잘 되네요.

다시 터틀봇3 e-manual 싸이트로 가서

3.1.3 Install Dependent ROS 2 Packages 부터 따라합니다.

 

Set locale

UTF-8 지원되는 locale 인지 확인한다.

If you are in a minimal environment (such as a docker container), the locale may be something minimal like POSIX.

We test with the following settings. However, it should be fine if you’re using a different UTF-8 supported locale.

$ locale  # check for UTF-8
$ sudo apt update && sudo apt install locales
$ sudo locale-gen en_US en_US.UTF-8
$ sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
$ export LANG=en_US.UTF-8
$ locale  # verify settings

 

다시 원래대로 돌릴때는.

$ sudo apt-get install language-pack-ko
$ sudo locale-gen ko_KR ko_KR.UTF-8
$ sudo update-locale LC_ALL=ko_KR.UTF-8 LANG=ko_KR.UTF-8
$ export LANG=ko_KR.UTF-8
$ locale

 

Setup Sources

GPG 키를 인증하고 ROS2 저장소를 추가한다.

$ sudo apt update && sudo apt install curl gnupg2 lsb-release
$ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -

 

And then add the repository to your sources list:

 

$ sudo sh -c 'echo "deb [arch=$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list'

 

Install ROS2 Packages

 

$ sudo apt update

 

Desktop Install (Recommended): ROS, RViz, demos, tutorials.

$ sudo apt install ros-foxy-desktop

 

ROS-Base Install (Bare Bones): Communication libraries, message packages, command line tools. No GUI tools.

$ sudo apt install ros-foxy-ros-base

 

Enviroment Setup

source /opt/ros/foxy/setup.bash

 

Install argcomplete

$ sudo apt install -y python3-pip

$ pip3 install -U argcomplete

 

Try some examples

talker

$ source /opt/ros/foxy/setup.bash

$ ros2 run demo_nodes_cpp talker

 

listener

$ source /opt/ros/foxy/setup.bash

$ ros2 run demo_nodes_py listener

 

Uninstall

sudo apt remove ros-foxy-* && sudo apt autoremove

 

기본 설정

기본으로 항상 

$ source /opt/ros/<distro>/setup.bash

 

를 해줘야 합니다.

$ . /opt/ros/foxy/setup.bash

 

그래서 아예 

echo "source /opt/ros/<distro>/setup.bash" >> ~/.bashrc 

이렇게 넣어놓으면 편합니다.

 

 

그리고 colcon_cd 도 추가하면 편합니다.

$ colcon_cd  some_ros_package 로 찾아들어갈 수 있습니다. cd 명령어처럼.

 

$ echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc

root를 지정하려면 이것도 추가.

$ echo "export _colcon_cd_root=~/ros2_install" >> ~/.bashrc

$ mkdir ~/ros2_install

 

잘 설치되었는지 확인.

$ printenv | grep -i ROS

 

ROS_VERSION=2
ROS_PYTHON_VERSION=3
ROS_DISTRO=foxy

 

터틀심과 rqt

 

일단 설치

$ sudo apt install ros-<distro>-turtlesim

 

잘 설치 되었는지 확인.

ros2 pkg executables turtlesim
turtlesim draw_square
turtlesim mimic
turtlesim turtle_teleop_key
turtlesim turtlesim_node

 

실행!

$ ros2 run turtlesim turtlesim_node

[INFO] [1609734593.758574687] [turtlesim]: Starting turtlesim with node name /turtlesim
[INFO] [1609734593.760920791] [turtlesim]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]

 

키보드로 조정하기 위해서 turtle_teleop_key 실행

$ ros2 run turtlesim turtle_teleop_key

이제 키보드로 조정 가능.

 

rqt 설치

$ sudo apt update

각자 맞게 이렇게 설치 sudo apt install ~nros-<distro>-rqt*

$ sudo apt install ~nros-foxy-rqt*

 

rqt 실행

$ rqt

메뉴에 Plugins > Services > Service Caller 에서 서비스별로 조회 가능.

 

서비스 선택한 후 내용 채워서 call 버튼 누르면 실행된다.

/spawn 서비스를 선택하고 turtle2를 만들어 본다.

 

Remapping

좀 전에 만든 turtle2를 키보드로 조종하고 싶으면 ramapping 해서 사용한다.

ros2 run turtlesim turtle_teleop_key --ros-args --remap turtle1/cmd_vel:=turtle2/cmd_vel

 

Node 에 대해 알아보기

 

ros2 run

ros2 run <package_name> <executable_name>

$ ros2 run turtlesim turtlesim_node

노드 이름을 모를 때에는 ros2 node list 로 찾는다.

 

ros2 node list
/turtlesim

 

turtle_teleop_key를 띄우고 하면 두개 나온다.

$ ros2 run turtlesim turtle_teleop_key

ros2 node list

/turtlesim
/teleop_turtle

 

Remapping

리매핑은 노드의 프로퍼티를 재할당하게 해줌. 프로퍼티라 함은 노드이름, 토픽이름, 서비스이름 등 custom 값을  말함.

$ ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle

 

이렇게 하면

$ ros2 node list
/my_turtle   <<== 이렇게 나옴
/turtlesim 

 

ros2 node info

ros2 node info <node_name>

ros2 node info /my_turtle
/my_turtle
  Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
  Publishers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/color_sensor: turtlesim/msg/Color
    /turtle1/pose: turtlesim/msg/Pose
  Service Servers:
    /clear: std_srvs/srv/Empty
    /kill: turtlesim/srv/Kill
    /my_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /my_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /my_turtle/get_parameters: rcl_interfaces/srv/GetParameters
    /my_turtle/list_parameters: rcl_interfaces/srv/ListParameters
    /my_turtle/set_parameters: rcl_interfaces/srv/SetParameters
    /my_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
    /reset: std_srvs/srv/Empty
    /spawn: turtlesim/srv/Spawn
    /turtle1/set_pen: turtlesim/srv/SetPen
    /turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
    /turtle1/teleport_relative: turtlesim/srv/TeleportRelative
  Service Clients:

  Action Servers:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
  Action Clients:

 

Topic 에 대해 알아보기

 

일단 이 두개를 띄워 놓는다.

$ ros2 run turtlesim turtlesim_node

$ ros2 run turtlesim turtle_teleop_key

 

rqt_graph

노드와 토픽의 변화와 연결 구조를 비쥬얼적으로 보여준다.

$ rqt_graph

실행한 후

Plugins > Introspection > Nodes Graph.

 

현재 활성화 되어 있는 모든 토픽 리스트를 보려면.

ros2 topic list
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

 

토픽의 타입도 궁금하다면 이렇게  -t 를 써준다.

ros2 topic list -t
/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]

 

토픽에 publish 되는 데이타를 보려면.

ros2 topic echo <topic_name>

ros2 topic echo /turtle1/cmd_vel
linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
---

 

ros2 토픽 정보를 보려면.

ros2 topic info /turtle1/cmd_vel
Type: geometry_msgs/msg/Twist    <==publishers 와 subscribers 같에 타입이 맞아야 함.
Publisher count: 1
Subscription count: 1

 

타입의 정보를 보려면.

$ ros2 interface show geometry_msgs/msg/Twist
# This expresses velocity in free space broken into its linear and angular parts.

Vector3  linear
Vector3  angular

 

토픽에 publish 하기.

ros2 topic pub <topic_name> <msg_type> '<args>'

 

타입을 알았으니 publish 를 할 수 있다. 이 argument는 YAML syntax로 만들어야 한다.

--once는 한번만 하고 끝낼때 쓴다.

$ ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

1Hz 로 계속 발생시키고 싶으면 --rate 1을 써준다.

$ ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

 

1Hz로 계속 위치가 바뀌고 있기 때문에 /turtle1/pose 값을 찍어보면 계속 움직이는 것을 볼 수 있다.

$ ros2 topic echo /turtle1/pose

 

이렇게 하면 hz 갱신 단위가 출력된다.

$ ros2 topic hz /turtle1/pose

 

Service 에 대해 알아보기

서비스는 ROS 그래프의 Node들과 통신하는 또다른 방법이다. 토픽이 publisher-subscriber 모델인 반면, 서비스는 call-and-response 모델 기반으로 되어있다.

토픽은 노드가 데이터 스트림을 subscribe하고 연속적으로 업데이트를 받을 수 있게 해주는 반면에,  서비스는 클라이언트가 특별히 호출 할 때만 데이터를 제공한다.

 

역시 마찬가지로 일단 이 두개를 띄워 놓는다.

$ ros2 run turtlesim turtlesim_node

$ ros2 run turtlesim turtle_teleop_key

 

ros2 service list -t
/clear [std_srvs/srv/Empty]
/kill [turtlesim/srv/Kill]
/reset [std_srvs/srv/Empty]
/spawn [turtlesim/srv/Spawn]
/teleop_turtle/describe_parameters [rcl_interfaces/srv/DescribeParameters]
/teleop_turtle/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
/teleop_turtle/get_parameters [rcl_interfaces/srv/GetParameters]
/teleop_turtle/list_parameters [rcl_interfaces/srv/ListParameters]
/teleop_turtle/set_parameters [rcl_interfaces/srv/SetParameters]
/teleop_turtle/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
/turtle1/set_pen [turtlesim/srv/SetPen]
/turtle1/teleport_absolute [turtlesim/srv/TeleportAbsolute]
/turtle1/teleport_relative [turtlesim/srv/TeleportRelative]
/turtlesim/describe_parameters [rcl_interfaces/srv/DescribeParameters]
/turtlesim/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
/turtlesim/get_parameters [rcl_interfaces/srv/GetParameters]
/turtlesim/list_parameters [rcl_interfaces/srv/ListParameters]
/turtlesim/set_parameters [rcl_interfaces/srv/SetParameters]
/turtlesim/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]

 

ros2 service list
/clear
/kill
/reset
/spawn
/teleop_turtle/describe_parameters
/teleop_turtle/get_parameter_types
/teleop_turtle/get_parameters
/teleop_turtle/list_parameters
/teleop_turtle/set_parameters
/teleop_turtle/set_parameters_atomically
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/describe_parameters
/turtlesim/get_parameter_types
/turtlesim/get_parameters
/turtlesim/list_parameters
/turtlesim/set_parameters
/turtlesim/set_parameters_atomically

 

6개의 서비스가 두개의 노드에 똑같이 존재하고 있다. ROS2의 거의 모든 노드에는 이런 infrastructure 서비스가 있다.

지금은 이 서비스에 집중해서 알아본다.

/clear, /kill, /reset, /spawn, /turtle1/set_pen, /turtle1/teleport_absolute, and /turtle1/teleport_relative

 

타입 알아보기.

ros2 service type <service_name>

$ ros2 service type /clear
std_srvs/srv/Empty

 

ros2 service find <type_name>

ros2 service find std_srvs/srv/Empty
/clear
/reset

 

서비스 구조 확인하기.

ros2 interface show <type_name>.srv

$ ros2 interface show std_srvs/srv/Empty.srv
---

 

--- 라고 나오는건 response 와 request를 구분하는 것이다.

request

---

response 

 

이런 구조. 지금은 empty라 안나온것이다.

 

ros2 interface show turtlesim/srv/Spawn.srv
float32 x
float32 y
float32 theta
string name # Optional.  A unique name will be created and returned if this is empty
---
string name

 

이경우는 위에 x, y, theta, name 이 request

name 이 response 이다.

 

구조를 확인했으니 call 해볼 수 있다.

ros2 service call <service_name> <service_type> <arguments>

 

이렇게 하면 왔다갔다 지저분하게 그림 그려진거 싹 지워진다.

$ ros2 service call /clear std_srvs/srv/Empty
requester: making request: std_srvs.srv.Empty_Request()

response:
std_srvs.srv.Empty_Response()

 

거북이 새로 하나 소환하기

소환은 /spawn 인데 타입은 이거다.

/spawn [turtlesim/srv/Spawn]

데이타는 YAML 구문으로 써준다.

$ ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"

waiting for service to become available...
requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='')

response:
turtlesim.srv.Spawn_Response(name='turtle2')

 

노드들의 파라메터들을 보려면 이렇게 한다.

노드들의 subnamespace 가 나온다.

ros2 param list
/teleop_turtle:
  scale_angular
  scale_linear
  use_sim_time
/turtlesim:
  background_b
  background_g
  background_r
  use_sim_time

 

모든 노드는 use_sim_time 파라메터를 갖는다.

 

파라메터 값을 보려면 이렇게 한다.

ros2 param get <node_name> <parameter_name>

ros2 param get /turtlesim background_g
Integer value is: 86

 

설정 하려면 이렇게 한다. 이렇게 하면 배경 화면 색이 바뀐다.

ros2 param set <node_name> <parameter_name> <value>

ros2 param set /turtlesim background_r 150
Set parameter successful

 

노드 전체의 현재 파라메터를 파일로 떨구기.

ros2 param dump <node_name>

ros2 param dump /turtlesim
Saving to:  ./turtlesim.yaml

 

열어보면.

$ cat turtlesim.yaml 
turtlesim:
  ros__parameters:
    background_b: 255
    background_g: 86
    background_r: 150
    use_sim_time: false

 

파일로 떨군것을 로드 할 수 있다.

ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>

 

그냥 띄우면 파란색

$ ros2 run turtlesim turtlesim_node

 

저장한 파라메터를 로딩하면서 띄우면 보라색이 된다.
$ ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim yaml

 

action에 대해 알아보기

액션은 ROS2에서 장기간 실행되는 태스크에서 많이 쓰는 통신이다. 

goal, result, feedback 부분으로 구성되어있다.

 

액션음 토픽과 서비스에 붙어있다.

서비스랑 기능적으로 비슷한데, 선점가능형인것은 다르다. 실행 중간에 취소 가능하다.

서비스는 한번 응답하는 것에 반해 액션은 지속적인 feedback이 가능하다.

 

액션은 client - server 모델이다. publisher-subscriber 모델이랑 비슷하다.

'액션 클라이언트' 노드는  '액션 서버' 노드로 goal 을 보낸다. goal을 확인하고 result와  feedback stream을 리턴한다.

 

마찬가지로 두개를 띄워놓는다.

$ ros2 run turtlesim turtlesim_node

$ ros2 run turtlesim turtle_teleop_key

 

G|B|V|C|D|E|R|T 키들을 눌러보면 turtlesim_node 쪽 콘솔에 

누를때 마다 이런 메세지가 찍힌다.

키를 누를때마다  goal을 액션 서버에 보낸다.

 

[INFO] [1610086707.798478521] [turtlesim]: Rotation goal completed successfully

터틀이 회전을 완료하면 뿌려지는 메세지는 goal의 결과를 알려준다.

 

F 키를 누르면 돌다가 멈춘다. 실행 중간에 goal을 cancel 할 수 있다. 액션의 선점 기능이다.

[INFO] [1610087043.483155130] [turtlesim]: Rotation goal canceled

 

클라이언트에서만 goal 선점이 가능한게 아니다. 서버 사이드에서 액션 선점을 하면 aborts 가 나온다.

 

D를 눌렀다가 G를 눌렀다가 하면서 다 돌아가기 전에 키를 누르면 돌아가는 중에 방향이 바뀌면서 메세지가 나온다.

[INFO] [1610088186.474941341] [turtlesim]: Rotation goal completed successfully
[WARN] [1610088189.387013413] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal
[INFO] [1610088190.491371547] [turtlesim]: Rotation goal completed successfully

 

노드 알아볼 때 했던것 처럼 info 로 액션을 확인 할 수 있다.

$ ros node info /turtlesim

 

ros2 node info /my_turtle
/my_turtle
  Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
  Publishers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/color_sensor: turtlesim/msg/Color
    /turtle1/pose: turtlesim/msg/Pose
  Service Servers:
    /clear: std_srvs/srv/Empty
    /kill: turtlesim/srv/Kill
    /my_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /my_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /my_turtle/get_parameters: rcl_interfaces/srv/GetParameters
    /my_turtle/list_parameters: rcl_interfaces/srv/ListParameters
    /my_turtle/set_parameters: rcl_interfaces/srv/SetParameters
    /my_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
    /reset: std_srvs/srv/Empty
    /spawn: turtlesim/srv/Spawn
    /turtle1/set_pen: turtlesim/srv/SetPen
    /turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
    /turtle1/teleport_relative: turtlesim/srv/TeleportRelative
  Service Clients:

  Action Servers:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
  Action Clients:

 

액션서버에 rotate_absolute 라는 액션이 있는게 보인다.

/turtle1/rotate_absolute 액션에 응답하고 피드백을 준다는 뜻이다.

 

teleop_turtle 에 보면 

이렇게 되어있는데, 이것은 goal을 그 액션 네임에 보낸다는 뜻이다.

 

 Action Servers:

  Action Clients:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute

 

ros2 action listROS 그래프에서 모든 액션을 확인할라면

 

$ ros2 action list
/turtle1/rotate_absolute

 

지금 액션 하나밖에 없어서 하나만 나온다. 

 

위에서 했던것과 마찬가지로 -t 를 주면 타입이 보인다.ros2 action list -t
/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]

 

더 많은 액션 정보를 보려면ros2 action info /turtle1/rotate_absolute
Action: /turtle1/rotate_absolute
Action clients: 1
    /teleop_turtle
Action servers: 1
    /turtlesim

 

/turtlesim 이 하나의 액션 서버를 갖고 있고 /teleop_turtle은 하나의 액션 클라이언트를 갖고 있는게 확인된다.

 

action goal을 실행하거나 보내기전에 action type의 구조 정보가 더 필요하다.$ ros2 interface show turtlesim/action/RotateAbsolute.action
# The desired heading in radians
float32 theta  <<== goal request 부분.
---
# The angular displacement in radians to the starting position
float32 delta  <<=== result 부분.
---
# The remaining rotation in radians
float32 remaining  <<=== feedback 부분.

 

action 보내보기ros2 action send_goal <action_name> <action_type> <values>

 

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"
Waiting for an action server to become available...
Sending goal:
     theta: 1.57

Goal accepted with ID: 1a84cc08488b4ef68373062b0562875b

Result:
    delta: 1.5520031452178955

Goal finished with status: SUCCEEDED

 

모든 goal은 유니크 ID가 있다. 위에서  구조 살펴본 대로 result 에 보면 delta 가있고 sending goal 에는 theta가 있다.

 

feedback 을 볼라면 뒤에다가 --feedback 을 써주면 된다.이렇게 하면 돌아가는 동안 feedback 이 쭈루룩 출력된다.

 

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --feedback
Waiting for an action server to become available...
Sending goal:
     theta: -1.57

Feedback:
    remaining: -3.1268222332000732

Goal accepted with ID: 777ceaa142f84328a10da10a17b03673

Feedback:
    remaining: -3.1108222007751465

Feedback:
    remaining: -3.0948221683502197

Feedback:
    remaining: -3.078822135925293

Feedback:
    remaining: -3.062822103500366

 

주루루룩~~~~

 

Feedback:
    remaining: -0.0068215131759643555

Result:
    delta: 3.1200008392333984

Goal finished with status: SUCCEEDED

 

이렇게 끝.

 

rqt_console

ROS2 에서 로그 메세지 확인하는데 쓰는 GUI 툴이다. 일반적으로는 로그를 터미널에 뿌린다. rqt_console 을 쓰면 메세지를 모을 수 있고, 더 체계적이고 필터도 걸 수 있고, 저장했다가 불러오기도 되고 여러가지로 좋다.

 

실행은 이렇게

$ ros2 run rqt_console rqt_console

 

띄워놓고 뭐 토픽같은거 날리거나 조작하면 로그가 보인다.

 

로그 레벨은  5단계가 있다.

Fatal
Error
Warn
Info  --  기본레벨
Debug -- 개발할때 쓰고 기본적으로 숨긴다. 안본다.

 

기본 로그 레벨 설정하기.$ ros2 run turtlesim turtlesim_node --ros-args --log-level WARN이렇게 해놓으면 WARN 아래 레벨은 안나옴.

 

launch 파일 만들기.

 

런치파일을 만들어서 돌리면 실행파일의 설정 시작등을 한방에 할 수 있다.

ros2 launch 명령으로 전체 시스템을 시작 시킬 수 있다. 모든 노드들과 그것들의 설정까지 한방에.

 

$ mkdir launch

$ vi launch/turtlesim_mimic_launch.py

 

from launch import LaunchDescription # <=== 이 두줄 파이썬 시작 모듈을 가져온다.
from launch_ros.actions import Node   # <=== 여기까지 파이썬 시작 모듈을 가져온다.

def generate_launch_description():
    return LaunchDescription([  # <===== 노드 세개 띄운다. 터틀심 윈도우 두개랑 따라하게 하는 mimic 노드 하나
        Node(  # <=== 터틀심 윈도우 1 띄운다.
            package='turtlesim',
            namespace='turtlesim1',
            executable='turtlesim_node',
            name='sim'
        ),
        Node( # <=== 터틀심 윈도우 2 띄운다. namespace 만 다르다. namespace 같으면 뒤죽박죽 되니까 다르게 해줘야 함.
            package='turtlesim',
            namespace='turtlesim2',
            executable='turtlesim_node',
            name='sim'
        ),
        Node(  # <=== 터틀심 윈도우 1 띄운다.
            package='turtlesim',
            executable='mimic',
            name='mimic',
            remappings=[
                ('/input/pose', '/turtlesim1/turtle1/pose'),
                ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
            ]
        )
    ])

 

mimic은 /input/pose -> /turtlesim1/turtle1/pose->/output/cmd_vel-> /turtlesim2/turtle1/cmd_vel이런 순서로 subscribe 와 republish 가 연결되면서 turtlesim2 가 1을 따라하게 된다.

 

$ cd launch $ ros2 launch turtlesim_mimic_launch.py

 

이렇게 띄워놓으면 두개의 윈도우가 뜬다.

 

이렇게 움직이게 하면 두개가 똑같이 움직이는걸 볼 수 있다.

$ ros2 topic pub -r 1 /turtlesim1/turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: -1.8}}" 

 

rqt_graph 를 이용해서 topic 이 어떻게 연결되고 있는지 확인 할 수 있다.

$ rqt_graph

 

데이터를 녹화하고 재생하기

ros2 bag 은 토픽에 뿌려지는 데이터를 저장할 수 있는 툴이다.

 

ros2 bag 설치하기$ sudo apt-get install ros-foxy-ros2bag \ ros-foxy-rosbag2-converter-default-plugins \ros-foxy-rosbag2-storage-default-plugins

 

두개를 띄우고$ ros2 run turtlesim turtlesim_node$ ros2 run turtlesim turtle_teleop_key

 

$ mkdir bag_files$ cd bag_files

 

저장 할 토픽을 골라야 한다.ros2 topic list
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

 

ros2 bag record <topic_name>

 

$ ros2 bag record /turtle1/cmd_vel
[INFO] [1610340027.158090820] [rosbag2_storage]: Opened database 'rosbag2_2021_01_11-13_40_27/rosbag2_2021_01_11-13_40_27_0.db3' for READ_WRITE.
[INFO] [1610340027.163085274] [rosbag2_transport]: Listening for topics...
[INFO] [1610340027.163645425] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [1610340027.163717599] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...

 

컨트롤C 로 멈추고나면 yaml이랑 db3 파일이 생긴것을 볼 수 있다.bag_files$ tree
.
└── rosbag2_2021_01_11-13_40_27
    ├── metadata.yaml
    └── rosbag2_2021_01_11-13_40_27_0.db3

1 directory, 2 files

 

여러개 토픽을 저장하고 싶으면 -o 옵션을 쓴다.ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose

 

저기 subset은 저장될 파일의 이름이다. 자유롭게 지정 할 수 있다.

$ tree
.
├── rosbag2_2021_01_11-13_40_27
│   ├── metadata.yaml
│   └── rosbag2_2021_01_11-13_40_27_0.db3
└── subset
    ├── metadata.yaml
    └── subset_0.db3

2 directories, 4 files

 

ros2 bag  info 로 저장된 정보를 알 수 있다.ros2 bag  info ./subset/subset_0.db3 
[INFO] [1610340437.076395874] [rosbag2_storage]: Opened database './subset/subset_0.db3' for READ_ONLY.

Files:             ./subset/subset_0.db3
Bag size:          88.0 KiB
Storage id:        sqlite3
Duration:          19.120s
Start:             Jan 11 2021 13:45:14.245 (1610340314.245)
End:               Jan 11 2021 13:45:33.366 (1610340333.366)
Messages:          1211
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 15 | Serialization Format: cdr
                   Topic: /turtle1/pose | Type: turtlesim/msg/Pose | Count: 1196 | Serialization Format: cdr

 

재생하기

ros2 bag play subset

ros2 bag play subset
[INFO] [1610340596.574688255] [rosbag2_storage]: Opened database 'subset/subset_0.db3' for READ_ONLY.

 

이렇게 하면 저장된게 플레이 되면서 터틀이 움직이는것을 확인 할 수 있다.

완벽하게 100% 일치하게 움직이지는 않는다고 한다. 시스템 타이밍등의 영향을 받기 때문이라고 한다.

 

설치되어있는 패키지들 리스트 보려면 

ros2 pkg list

 

ros2 pkg -h
usage: ros2 pkg [-h] Call `ros2 pkg <command> -h` for more detailed usage. ...

Various package related sub-commands

optional arguments:
  -h, --help            show this help message and exit

Commands:
  create       Create a new ROS2 package
  executables  Output a list of package specific executables
  list         Output a list of available packages
  prefix       Output the prefix path of a package
  xml          Output the XML of the package manifest or a specific tag

  Call `ros2 pkg <command> -h` for more detailed usage.

 

.

반응형

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

ROS2 간단한 publisher 와 subscriber 만들기 (C++)  (1) 2021.01.12
ROS2 클라이언트 라이브러리, 패키지  (0) 2021.01.11
ROS 1 연습  (0) 2021.01.04
Posted by Real_G