ROS2 install 및 기본 사용법.
ROS2를 설치합니다. 설치할 ROS와 우분투 버전이 맞아야 합니다.
ROS와 우분투의 알파벳을 맞추면 된다고 합니다. Focal Fossa - Foxy 이렇게.
emanual.robotis.com/docs/en/platform/turtlebot3/quick-start/
여기 나온 순서대로 하면 되는데 저는 xubuntu를 깔아놔서 그런지 3.1.2 Install ROS 2 on Remote PC 단계에서 막혔습니다.
실패하면 다음 나오는 싸이트로 가서 순서대로 하라고 해서 여기 나온대로 설치 했습니다.
index.ros.org/doc/ros2/Installation/Foxy/Linux-Install-Debians/
여기 나온대로 하면 잘 되네요.
다시 터틀봇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 |