Ch3. ROS2 ๊ธฐ๋ณธ ๋ช ๋ น ์ตํ๊ธฐ
์ด ๊ธ์์๋ Ch3์ ๋์ค๋ ๋ด์ฉ์ธ ROS2 ๊ธฐ๋ณธ ๋ช ๋ น ์ตํ๊ธฐ๋ฅผ ์์๋ณด๋ ค๊ณ ํ๋ค. ๋จผ์ ๊ธฐ๋ณธ์ ์ธ ๊ฒ๋ค์ ๋ฐฐ์ฐ๊ธฐ ์ํด์ turtlesim์ด๋ผ๋ ํจํค์ง๋ก ์ด์ผ๊ธฐ๋ฅผ ์์ํ๊ฒ ๋๋ค.
1. turtlesim ์ค์น
๋จผ์ , turtlesim์ ROS๋ฅผ ์ค์นํ ๋ desktop ๋ฒ์ ์ ์ ํํ๋ค๋ฉด ์ค์น๋์ง๋ง ๊ทธ๋ ์ง ์์๋ค๋ฉด ๋ค์์ ๋ช ๋ น์ด๋ก ์ค์น๊ฐ ๊ฐ๋ฅํ๋ค.
sudo apt install ros-humble-turtlesim
์ดํ humble๋ก ์ ์ ๋ช ๋ น์ด๋ฅผ ์ค์ ์ ํ์์ผ๋, ์ด๋ฅผ ํตํด ROS2๋ฅผ ํ์ฑํ๋ฅผ ์์ผ์ฃผ๊ณ , turtlesim ๋ ธ๋๋ฅผ ์คํ์ํค๋๋ก ํ๊ณ ์ ํ๋ค.
2. node ์คํ
'ros2 run <PKG Name> <Node Name>' ์ผ๋ก ๋ ธ๋๋ฅผ ์คํํ ์ ์๋ค.
ros2 run turtlesim turtlesim_node
3. ROS node
'ros2 node list' ๋ผ๋ ๋ช ๋ น์ด๋ฅผ ์น๋ค๋ฉด ํ์ฌ ์คํ์ค์ธ ๋ ธ๋๋ฅผ ํ์ธ ๊ฐ๋ฅํ๋ค.
ros2 node list
๋ํ ์ฌ๊ธฐ์ /turtlesim ์ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ ์ถ๋ค๋ฉด 'ros2 node info /turtlesim'์ ํตํด ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
ros2 node info /turtlesim
/turtlesim
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
/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
/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
Service Clients:
Action Servers:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
Action Clients:
์ ๊ฒฐ๊ณผ๋ turtlesim node์ ์ ๋ณด์ด๋ค. ์ฌ๊ธฐ์ ์ฐจ์ฐจ ํ์ธํ๊ณ ์ ํ๋ ๋ถ๋ถ๋ค์ ๋ณด์๋ฉด
/turtlesim ์ด๋ผ๋ ๋ ธ๋๋ ๊ตฌ๋ (subscriber)ํ๋ ๊ฒ์ด ์์ผ๋ฉฐ, ๋ฐํ(publisher)ํ๋ ๊ฒ์ด ์กด์ฌํ๋ค. ๋ํ Service์ Topic๊น์ง ์กด์ฌํ๋ค. ์ด๋ฅผ ํตํด ์ด ๋ ธ๋๋ฅผ ์คํํ ๋์ ํด๋นํ๋ ํ ํฝ, ์๋น์ค, ์ก์ ์ ์ด๋ฆ์ ์ ์ ์์ผ๋ฉฐ, ๊ทธ๋ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ์ ํ๋ ์ ์ ์๋ค.
4. ROS Service
: ROS์ ์๋น์ค๋ ๋ ๋ ธ๋๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ฐฉ์ ์ค์ ํ๋๋ก, ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ ์์ฒญํ๋ฉด ์๋ต์ ๋ฐ์ ์ ์๋ ๋ฐฉ์์ ์๋น์ค๋ผ๊ณ ํ๋ฉฐ, ์ด๋ ์ ๋ ฅ ํน์ ์ถ๋ ฅ ๋ฐ์ดํฐ๋ ์์ ์๋ ์๊ณ ์์ ์๋ ์๋ค.
์ดํ ์๋ก์ด ํฐ๋ฏธ๋ ์ฐฝ์์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ ์ ๋ ฅํ๋ค๋ฉด ํ์ฌ ์ฌ์ฉ๊ฐ๋ฅํ ์๋น์ค๋ค์ด ๋ํ๋๊ฒ ๋๋ค.
ros2 service list
์ด ์ค์์ service type ๋ช ๋ น์ ์ด์ฉํ๋ฉด ์๋น์ค์ ๋ฐ์ดํฐ ์ ์๋ฅผ ํ์ธ ๊ฐ๋ฅํจ.
ros2 service type /turtle1/teleport_absolute
์ด ๊ฒฐ๊ณผ๋ฅผ ๋ณธ๋ค๋ฉด turtlesim ์ ๋ ธ๋์ด์ ํจํค์ง์ ์ด๋ฆ์ด๋ฉฐ, ๊ทธ ์์ srv๋ service๋ฅผ ์๋ฏธํ๊ธฐ๋ ํ๋ฉด์ ํจํค์ง๊ฐ ์์นํ๋ ํด๋์์์ srv๋ผ๋ ํด๋๋ช ์ด๊ธฐ๋ ํ๋ค. ๋ํ TeleportAbsolute๋ ์๋น์ค์ ๋ฐ์ดํฐ ์ ์์.
์๋น์ค์ ์ ์๋ srv ํ์ฅ๋ช ์ ๊ฐ์ง ํ์ผ์ ์ ์ฅ๋๋ฉฐ, ํต์ ํด๋น ํจํค์ง์ srv ํด๋์ ์์นํ๊ฒ ๋๋ค. ๋ํ ---๋ฅผ ํตํด์ ์ ์๋๋ก ๋๋๋๋ฐ, ์๋ถ๋ถ์ ์๋น์ค๋ฅผ ์์ฒญํ ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ๊ณ , ์๋ซ๋ถ๋ถ์ ์๋น์ค ์๋ฒ๊ฐ ์๋ตํ ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ๊ฒ ๋จ.
์ด ๋ด์ฉ์ ํ์ธํ๊ณ ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ ์น๋ฉด ๋จ.
ros2 interface show turtlesim/srv/TeleportAbsolute
์ฌ๊ธฐ์ x, y, theta์ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ , ์ด๋ฅผ ๋ฐํ์ ํ์ง ์๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ดํ ์ด๋ฅผ ์ด์ฉํด ์๋น์ค๋ฅผ ์์ฒญํด๋ณด์๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ ์์ฑ ๊ฐ๋ฅํจ.
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 2, y: 2, theta: 1.57}"
์ด๋ฐ ๋ฐฉ์์ผ๋ก ๊ฒฐ๊ตญ ์๋น์ค๋ฅผ ์์ฒญํ๋ ค๋ฉด 'ros2 service call <service name> <service definition> "data"'์ ๋ฐฉ์์ ์ด์ฉํ๋ฉด ๋๋ฉฐ, ์ฒ์์ผ๋ก ๋๋๋ฆฌ๊ณ ์ถ๋ค๋ฉด /reset ์ ์ด์ฉํ๋ฉด ๋จ.
์๊น ์๋น์ค๋ค์ ํ์ธํ๋ ์ฅ๋ฉด์์ ์ด๋ค ์๋น์ค๋ค์ ๊ทธ๋ฅ /service์ ํํ๋ฅผ ๋๊ณ , ์ด๋ค ์๋น์ค๋ค์ /turtle1/service์ ๊ผด์ ๊ฐ์ง๊ณ ์๋๋ฐ, ์ด๋ name space๋ก ๊ฑฐ๋ถ์ด์ ์ด๋ฆ์ ์ ํด์ฃผ๊ณ , ์ด ๊ฑฐ๋ถ์ด(turtle)๊ฐ๊ฐ์ ์๋น์ค๋ฅผ ๊ตฌ๋ถํด์ฃผ๊ณ ์ ๋ค์์คํ์ด์ค๋ก ์ ํด์ค ๊ฒ์ด๋ค.
ros2 service type /spawn
ros2 interface show turtlesim/srv/Spawn
์ด ๋ช ๋ น์ด๋ค์ ํตํด์ spawn์ ์ฌ์ฉ๋ฒ์ ์์๋ณธ ๋ค, ์ด๋ฅผ ์ด์ฉํด์ ๊ฑฐ๋ถ์ด๋ฅผ ํ๋ ๋ ๋ง๋ค์ด๋ณด๊ณ ์ ํ๋ค.
ros2 service call /spawn turtlesim/srv/Spawn "{x: 1, y: 1, theta: 0, name: ''}"
์ดํ ros2 service list๋ฅผ ํ์ธํ๋ค๋ฉด turtle1๊ณผ turtle2๊ฐ ๋ชจ๋ ์๋ ๊ฒ์ ํ์ธ ๊ฐ๋ฅํ๋ค.
5. ROS Topic
: ํ ํฝ์ ์์ฒญ(request)๊ณผ ์๋ต(response)์ผ๋ก ์ด๋ฃจ์ด์ง ์๋น์ค์ ๋ฌ๋ฆฌ, ๋ฐํ(publish)๊ณผ ๊ตฌ๋ (subscribe)๋ก ๊ตฌ์ฑ ๋์ด์๋ค.
๊ตฌ๋ ๊ณผ ๋ฐํ์ด๋ผ๋ ์ด๋ฆ์ฒ๋ผ, ์์ฒญ๊ณผ ์๋ต์ฒ๋ผ ํ๋ฒ ์์ฒญํ๋ฉด ํ๋ฒ ์๋ตํ์ง ์๊ณ , ๋ฐ์์ํค๋ฉด ์ธ์ ๋ ์ง ๊ตฌ๋ ํ๊ณ , ๊ตฌ๋ ํ๋ฉด ๊ณ์ํด์ ์ ๋ณด๋ฅผ ๋ฐ์ ์ ์๋ ์์คํ ์ด๋ค.
์์์ ํ ๊ฒ์ฒ๋ผ, 'ros2 topic list'๋ฅผ ํตํด topic๋ค์ list ํ์ธ์ด ๊ฐ๋ฅํจ.
์ด๋ 'ros2 topic list -t'๋ผ๊ณ ์น๋ฉด ๊ทธ ํ์ ์ ํ์ธ ํ ์ ์์.
์ดํ ์์์ ์ฌ์ฉํ๊ฒ์ฒ๋ผ 'ros2 topic info <topic>' ๋ช ๋ น์ด๋ฅผ ํตํด ๊ตฌ๋ ๊ณผ ๋ฐํํ๋ ๋ ธ๋์ ๊ฐ์๋ฅผ ํ์ธ ๊ฐ๋ฅํ๋ฉฐ, 'ros2 topic list -v'๋ฅผ ํตํด ํ๋ฒ์ ํ์ธ์ด ๊ฐ๋ฅํจ.
์์์ ํ์ฉํ interface show ๋ช ๋ น์ ๋๊ฐ์ด ์ด์ฉํ๋ค๋ฉด ์ํฐ๋ฅผ ํตํด์ ๋๋์ด์ ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ ์๋ค.
ํ ํฝ์ ๊ตฌ๋ ์ ๋ค์์ ๋ช ๋ น๋ฐฉ์์ผ๋ก ๊ฐ๋ฅํ๋ค.
ros2 topic echo /turtle1/pose
๋ํ ๋ฐํ์ ์ฒซ๋ฒ์ฌ ์ค์ ๋ฐฉ์์ผ๋ก ๊ฐ๋ฅํ๋ฉฐ, ์์๋ ๋๋ฒ์งธ ์ค๊ณผ ๊ฐ๋ค.
ros2 topic pub -once(or rate <hz> <topic_name> <msg_type> "<args>"
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: 0.0}}"
์ดํ ์ด๋ฅผ rqt_graph๋ก ํ์ธํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
6. ROS Action
๋ง์ง๋ง์ผ๋ก Action์ ๋ํด์ ์์๋ณด๊ณ ์ ํ๋ค.
Action์ ์ก์ ์ ์ ๊ณตํ๋ ์ก์ ์๋ฒ(server)๋ฅผ ๊ตฌํํ๋ ๋ ธ๋์ ํด๋ผ์ด์ธํธ ๋ ธ๋์์ ๋จผ์ ์ค์ค๋ก ๋ชฉํ๋ฅผ ์์ฒญ(request)ํ๋ฉด ์๋ฒ์์ ์๋ต(response)๋ฅผ ํ๋ ๋ฐฉ์์ด๋ฉฐ, ์ดํ ๋ชฉํ(goal)์ ๋ฌ์ฑํ ๋๊น์ง ๊ทธ ์ค๊ฐ์ ํ ํฝ์ผ๋ก ํผ๋๋ฐฑ์ ํด์ฃผ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๊ทธ ๋ชฉํ์ ๋๋ฌํ ๋๊น์ง ์ค๊ฐ์ ํ์ธํ ์ ์์ผ๋ฉฐ ๋๋๋ฉด ๊ฒฐ๊ณผ(result)๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
๊ทธ ์์๋ก ํ ํฐ๋ฏธ๋์์ turtlesim_node๋ฅผ ์คํํ๊ณ , ๋ค๋ฅธ ํฐ๋ฏธ๋์์ turtle_teleop_key๋ฅผ ์ฐ ๋ค, ํ์ดํํค๋ก turtle์ ์์ง์ธ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋ชจ์ต์ ๋ณผ ์ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ rqt_graph๋ก ๋ณธ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ค.
๋ค๋ฅธ ํฐ๋ฏธ๋์์ ์ก์ ์ ํ์ธํ๊ธฐ ์ํด์ ๋ค์ ๋ช ๋ น์ด๋ค์ ์ ๋ ฅ ๊ฐ๋ฅํ๋ค.
ros2 action list //list ํ์ธ
ros2 action list -t //info๊น์ง ํ์ธ
๋ํ ์ ์ฒ๋ผ interface show ๋ช ๋ น์ด๋ ๋์ผํ๋ค.
์ดํ ์ก์ ์์ ๋ค๋ฅธ ์ ์ธ ๋ชฉํ๋ฅผ ์ง์ ํ๊ธฐ ์ํด์ send_goal๋ฅผ ์ง์ ํ๋ฉด ๋๋ค.
ros2 action send_goal <action_name> <action_type> <values>
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 3.14}"
์ดํ ๋ชฉํ์ ์ฑ๊ณตํ๋ฉด Succeeded๋ผ๋ ๊ธ๊ณผ ๊ทธ ์ฌ์ด์ ๊ณผ์ ๊ณผ ๊ฒฐ๊ณผ๊ฐ๊น์ง ์ ์ ์๋ค.
์ดํ ๋ค์์๋ Ch4. Python์ผ๋ก ROS2 ํ ํฝ ๋ค๋ฃจ๊ธฐ์ ๋ํด์ ์์๋ณด๊ณ ์ ํ๋ค.
'๊ณต๋ถ ๐ > Robot & ROS2' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฌด์์ ๊ณต๋ถํ๊ธฐ - ํผ์ ๊ณต๋ถํ๋ ๋ก๋ด SW ๋ฐ๋ผํ๊ธฐ (5) (0) | 2023.02.13 |
---|---|
๋ฌด์์ ๊ณต๋ถํ๊ธฐ - ํผ์ ๊ณต๋ถํ๋ ๋ก๋ด SW ๋ฐ๋ผํ๊ธฐ (4) (0) | 2023.02.09 |
๋ฌด์์ ๊ณต๋ถํ๊ธฐ - ํผ์ ๊ณต๋ถํ๋ ๋ก๋ด SW ๋ฐ๋ผํ๊ธฐ (2) (0) | 2023.01.30 |
๋ฌด์์ ๊ณต๋ถํ๊ธฐ - ํผ์ ๊ณต๋ถํ๋ ๋ก๋ด SW ๋ฐ๋ผํ๊ธฐ (1) (0) | 2023.01.28 |
Use Camera in Raspberry Pi (0) | 2022.09.10 |