์ด๋ฒ์๋ Ch9. ์ก์ ์ต์ํด์ง๊ธฐ ์ ๋ํด์ ์จ๋ณด๊ณ ์ ํ๋ค.
์์ ๊ธ์์ ์ก์ ์ ํฐ๋ฏธ๋ ๋ช ๋ น์ ์ด์ฉํ์ฌ ์ฌ์ฉํด ๋ณด์๋ค. ์ด์ ๊ฐ๋จํ python์ผ๋ก ROS ์ก์ ํด๋ผ์ด์ธํธ๋ฅผ ๋ค๋ค๋ณด๊ณ ์ก์ ์๋ฒ๋ฅผ ๋ง๋ค์ด๋ณด๊ณ ์ ํ๋ค.
์ก์ ์ ๋ชฉํ๋ ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์๋น์ค๋ก ์ค๊ฐ ์ํ๋ ํ ํฝ์ผ๋ก ์ ๋ฌํ๋ ํํ์ด๋ค.
1. ์ก์ ์ ์ ๋ง๋ค๊ธฐ
(1) ์ก์ ์ ์๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ค๋น
์๋กญ๊ฒ ์ก์ ์ ์์ํ๊ธฐ ์ํด์๋ ์ก์ ์ ์๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
๋ฐ๋ผ์ ์๋ก์ด ์ ์๋ฅผ ๋ง๋ค๊ธฐ ์ํ ํจํค์ง์ธ my_first_package_msgs์ ์ ์ก์ ์ ์ถ๊ฐํ๊ณ ์ ํ๋ค.
์ด๋ฅผ ์ํด์ my_first_package_msgs ํด๋์ action์ด๋ผ๋ ํด๋๋ฅผ ๋ง๋ค์๋ค.
(2) ์ก์ ์ ์ ๋ง๋ค๊ธฐ
์ด๋ฒ ์ก์ ์์ ๋ฐ์์ผ ํ ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ ๋ ฅ : ์ ์๋, ๊ฐ ์๋, ์ด๋ํ ๊ฑฐ๋ฆฌ
๊ฒฐ๊ณผ : turtlesim.x, turtlesim.y, ์์ธ, ์ด๋ํ ๊ฑฐ๋ฆฌ
ํผ๋๋ฐฑ : ๋จ์ ๊ฑฐ๋ฆฌ
์ด๋ฌํ ๊ณผ์ ์ ์ํด์ action ํด๋์ DistTurtle.action ์ด๋ผ๊ณ ํ์ผ์ ์์ฑํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฅํ๋ค.
์ด ๊ณผ์ ์ ํตํด์ ์ก์ ์ ์๊ฐ ์์ฑ๋์๋ค.
(3) ์ก์ ์ ์ ๋น๋ํ๊ธฐ
Cmake ํ์ผ์ ํ์ฌ CmdAndPoseVel๊ณผ MultiSpawn์ด ๋ฑ๋ก๋ ์ํฉ์์ action/DistTurtle.action์ด๋ผ๋ ๋ถ๋ถ์ ์ถ๊ฐํ๋ค.
์ดํ package.xml ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด action_msgs ๋ฅผ ์ถ๊ฐํ๋ค.
์ดํ ๋น๋๋ฅผ ์งํํ ๋ค ์ ๋๋ก ๋์๋์ง ํ์ธํ๊ธฐ ์ํด์ interface show ๋ช ๋ น์ ์ด์ฉํด์ ํ์ธํ๋ค.
2. ๊ฐ๋จํ ์ก์ ์๋ฒ๋ก ๊ฐ๋ ๋ณด๊ธฐ
(1) ๊ฐ๋จํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ก์ ์๋ฒ
๊ฐ๋จํ๊ฒ ์ก์ ์๋ฒ๋ฅผ ๋ง๋ค์ด์ ์ก์ ์ด ์ด๋ป๊ฒ ๋์ํ๋ ์ง ์์๋ณด๊ณ ์ ํ๋ค.
my_first_package ํด๋์ dist_turtle_action_server.py ๋ผ๋ ํ์ผ์ ๋ง๋ค๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
import rclpy as rp
from rclpy.action import ActionServer
from rclpy.node import Node
from my_first_package_msgs.action import DistTurtle
class DistTurtleServer(Node):
def __init__(self):
super().__init__('dist_turtle_action_server')
self._action_server = ActionServer(
self,
DistTurtle,
'dist_turtle',
self.execute_callback)
def execute_callback(self, goal_handle):
goal_handle.succeed()
result = DistTurtle.Result()
return result
def main(args=None):
rp.init(args=args)
dist_turtle_action_server = DistTurtleServer()
rp.spin(dist_turtle_action_server)
if __name__ == '__main__':
main()
์ฝ๋ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
rclpy, ActionServer, Node, DistTurtle์ import ํ๊ณ , Node ํด๋์ค์ ์์ฑ์ ์์ํ๋ DistTurtleServer๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค์๋ค.
์ดํ ActionServer์ ์ ์ธํ๊ณ , ์ก์ ์ ์๋ฅผ DistTurtle๋ก ์ง์ ํ๊ณ ๊ทธ ์ด๋ฆ์ dist_turtle์ด๋ผ๊ณ ์ง์ ํ๋ค.
์ดํ ๋ชฉํ๊ฐ ์ค์ ๋๋ฉด ์คํํด์ผ ํ๋ execute_callback ํจ์๋ ์ง์ ํด์ ์์ฑํ๋ค.
๋ชฉํ๊ฐ ์ค์ ๋๋ฉด goal_handle์ด๋ผ๋ ์ก์ ์ ์ํ๋ฅผ ์ ์ฅํ๋ ๋ฉ์๋๊ฐ ์์ด ์ฌ๊ธฐ์ succeed()๋ผ๊ณ ํ๋ฉด ์ก์ ์ด ์ฑ๊ณต๋ ์ํ๊ฐ ๋๋ค.
์ดํ ๋จ์ํ ์ด๋ฅผ ์ฑ๊ณตํ ๊ฒ์ผ๋ก ๋ฐ๋ก ์ง์ ํ์๋ค.
์ดํ setup.py์ ๋ค์ ๋ด์ฉ์ ์ถ๊ฐํ๋ค.
์ดํ ์ํฌ์คํ์ด์ค์ ๋น๋ ์ดํ dist_turtle_action_server์ ์คํํ๋ค.
๋ค์๊ณผ ๊ฐ์ด ๊ฒฐ๊ณผ๊ฐ ๋ํ๋๋ฉด ์ ๋์ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
(2) feedback์ ์ก์ ์๋ฒ์ ์ถ๊ฐํด ๋ณด๊ธฐ
์์์ ์ ํ feedback ๋ถ๋ถ์ ์ถ๊ฐํ์ฌ ์ค๊ฐ ๊ณผ์ ์ ํ ํฝ์ผ๋ก ๋ฐํ ํ ์ ์๋๋ก ํ๊ณ ์ ํ๋ค.
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ ํ์๋ค.
feedback_msg = DistTurtle.Feedback()
for n in range(0, 10):
feedback_msg.remained_dist = float(n)
goal_handle.publish_feedback(feedback_msg)
time.sleep(0.5)
์ ์ฒด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
import rclpy as rp
from rclpy.action import ActionServer
from rclpy.node import Node
import time
from my_first_package_msgs.action import DistTurtle
class DistTurtleServer(Node):
def __init__(self):
super().__init__('dist_turtle_action_server')
self._action_server = ActionServer(
self,
DistTurtle,
'dist_turtle',
self.execute_callback)
def execute_callback(self, goal_handle):
feedback_msg = DistTurtle.Feedback()
for n in range(0, 10):
feedback_msg.remained_dist = float(n)
goal_handle.publish_feedback(feedback_msg)
time.sleep(0.5)
goal_handle.succeed()
result = DistTurtle.Result()
return result
def main(args=None):
rp.init(args=args)
dist_turtle_action_server = DistTurtleServer()
rp.spin(dist_turtle_action_server)
if __name__ == '__main__':
main()
์ด๋ฅผ ๋ค์ ๋น๋ํ๊ณ ์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
์ฌ๊ธฐ์ ์ก์ ๋ช ๋ น์ feedback ์ต์ ์ ์ค์ผ ํ๋ค.
3. ROS2 Multi Thread ๊ธฐ์ด
ํ์ฌ ์งํํ๊ณ ์๋ ๊ฒ์ turtlesim์ ์์ง์ธ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ ํ๊ณ , ์ฌ์ฉ์์ ์ง์์ ๋ฐ๋ผ turtlesim์ ๊ตฌ๋์ํค๊ธฐ๋ ํด์ผ ํ๋ค.
๋ฐ๋ผ์ ์ด๋ฅผ ์ํด์๋ ์ก์ ์๋ฒ์์ ํ ํฝ์ ๋ฐํํ๊ณ , ๊ตฌ๋ ํด์ผ ํ๋ค.
์ด๋ ํ ํฝ์ ๋ฐํ์ excute_callback ํจ์์ ๋ฃ์ผ๋ฉด ๋์ง๋ง, ํ ํฝ์ ๊ตฌ๋ ํ๊ธฐ ์ํด์๋ ๋ฐํํ ๋๋ง๋ค ์คํํ๋ callback ํจ์๋ฅผ ํ๋ ๋ ๋ง๋ค์ด์ผ ํ๋๋ฐ, ์์ ์ฝ๋์ฒ๋ผ ํ๋ฉด ์ ๋์ง ์๋๋ค.
๊ทธ ์ด์ ๋ ํ์ฌ callback ํจ์์ธ excute_callback์ด ์คํ๋๋ฉด ๋ค๋ฅธ callback ํจ์๋ ์คํ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ฉํฐ์ค๋ ๋(multi thread)๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ค.
๋ฐ๋ผ์ ๋ฉํฐ์ค๋ ๋๋ฅผ ์ตํ๋ณด๊ณ ์ ํ๋ค.
๋ค์๊ณผ ๊ฐ์ด my_first_package/my_multi_thread.py ์ ์์ฑํด ๋ณด์๋ค.
import rclpy as rp
from rclpy.executors import MultiThreadedExecutor
from rclpy.node import Node
from my_first_package.my_publisher import TurtlesimPublisher
from my_first_package.my_subscriber import TurtlesimSubscriber
def main(args=None):
rp.init()
sub = TurtlesimSubscriber()
pub = TurtlesimPublisher()
executor = MultiThreadedExecutor()
executor.add_node(sub)
executor.add_node(pub)
try:
executor.spin()
finally:
executor.shutdown()
# sub.destroy_node()
pub.destroy_node()
rp.shutdown()
if __name__ == '__main__':
main()
์ด ์ฝ๋๋ ์์์ ๋ง๋ Subscriber์ Publisher ์ฝ๋๋ฅผ ๋ถ๋ฌ์์, ๋ ํด๋์ค๋ฅผ sub, pub์ผ๋ก ๋ฐ๊ณ , ๋ฉํฐ์ค๋ ๋๋ฅผ ์ํด์ excutor๋ผ๋ ๋ณ์์ MultiThreadedExecutor๋ฅผ ๊ฐ์ฒดํ์์ผฐ๋ค.
์ดํ add_node ๋ช ๋ น์ผ๋ก TurtlesimPublisher์ TurtlesimSubscriber๋ฅผ ์ถ๊ฐํ์๋ค.
์ด์ ์ด๋ฅผ setup.py์ entry_point์ ์ถ๊ฐํ๊ณ , ๋น๋ ํ turtlesim๊ณผ my_multi_thread๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
4. ์ง์ ํ ๊ฑฐ๋ฆฌ๋งํผ ์ด๋ํ๋ ์ก์ ์๋ฒ ๋ง๋ค๊ธฐ
์ด์ ๋ชฉํํ ๋ด์ฉ์ ํ ์ค๋น๊ฐ ๋๋ฌ์ผ๋ฏ๋ก ํ๋ํ๋ ๋ง๋ค์ด๋ณด๊ณ ์ ํ๋ค.
< ๋ชฉํ >
- ์ฌ์ฉ์๊ฐ turtle์๊ฒ ์๋ ๋ช ๋ น์ ์ธ๊ฐํ ๊ฒ์ ์ ๋ฌ
- ์ฌ์ฉ์๊ฐ ์ง์ ํ ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ์ฌ ํด๋น ์ด๋ ๊ฑฐ๋ฆฌ๋งํผ ์ด๋ํ๊ณ ๋ฉ์ถ๊ธฐ
- ์ด๋ ๊ฑฐ๋ฆฌ๋ pose ํ ํฝ์ ๊ตฌ๋ ํ์ฌ ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ๋ง๋ค ์งํํ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐ
(1) ์ ์ฒด ์ฝ๋
import rclpy as rp
from rclpy.action import ActionServer
from rclpy.executors import MultiThreadedExecutor
from rclpy.node import Node
from turtlesim.msg import Pose
from geometry_msgs.msg import Twist
from my_first_package_msgs.action import DistTurtle
from my_first_package.my_subscriber import TurtlesimSubscriber
import math
import time
class TurtleSub_Action(TurtlesimSubscriber):
def __init__(self, ac_server):
super().__init__()
self.ac_server = ac_server
def callback(self, msg):
self.ac_server.current_pose = msg
class DistTurtleServer(Node):
def __init__(self):
super().__init__('dist_turtle_action_server')
self.total_dist = 0
self.is_first_time = True
self.current_pose = Pose()
self.previous_pose = Pose()
self.publisher = self.create_publisher(Twist, '/turtle1/cmd_vel', 10)
self._action_server = ActionServer(self, DistTurtle, 'dist_turtle', self.execute_callback)
def calc_diff_pose(self):
if self.is_first_time:
self.previous_pose.x = self.current_pose.x
self.previous_pose.y = self.current_pose.y
self.is_first_time = False
diff_dist = math.sqrt((self.current_pose.x - self.previous_pose.x)**2 + (self.previous_pose.y - self.current_pose.y)**2)
self.previous_pose = self.current_pose
return diff_dist
def execute_callback(self, goal_handle):
feedback_msg = DistTurtle.Feedback()
msg = Twist()
msg.linear.x = goal_handle.request.linear_x
msg.angular.z = goal_handle.request.angular_z
while True:
self.total_dist += self.calc_diff_pose()
feedback_msg.remained_dist = goal_handle.request.dist - self.total_dist
goal_handle.publish_feedback(feedback_msg)
self.publisher.publish(msg)
time.sleep(0.01)
if feedback_msg.remained_dist < 0.2:
break
goal_handle.succeed()
result = DistTurtle.Result()
result.pos_x = self.current_pose.x
result.pos_y = self.current_pose.y
result.pos_theta = self.current_pose.theta
result.result_dist = self.total_dist
self.total_dist = 0
self.is_first_time = True
return result
def main(args=None):
rp.init(args=args)
executor = MultiThreadedExecutor()
ac = DistTurtleServer()
sub = TurtleSub_Action(ac_server = ac)
executor.add_node(sub)
executor.add_node(ac)
try:
executor.spin()
finally:
executor.shutdown()
sub.destroy_node()
ac.destroy_node()
rp.shutdown()
if __name__ == '__main__':
main()
(2) main: ๋ฉํฐ์ค๋ ๋ ์ฌ์ฉ
import ํด์ ์์์ ๋ง๋ ๊ฒ๋ค์ ๊ฐ์ ธ์๊ณ , main() ๋ฌธ์์ ์์์ ์งํํ ๋ฉํฐ์ค๋ ๋๋ฅผ ์ ์ฉํ์๋ค.
์ฌ๊ธฐ์ TurtleSub_Action์ turtlesim์ pose ํ ํฝ์ ๋ฐ๊ธฐ ์ํ ํด๋์ค์ด๋ฉฐ, ์์์ ๋ง๋ DistTurtleServer๋ฅผ ac๋ผ๊ณ ๋ฐ๊ณ TurtleSub_Action์ ๊ฐ์ฒดํ์ํฌ ๋ ์ ๋ ฅ์ผ๋ก ๋ฃ์๋ค. ๊ทธ ์ด์ ๋ pose๋ฅผ ํ ํฝ์ผ๋ก ๋ฐ๊ณ ์ด๋ฅผ ์ก์ ์๋ฒ์ ์ ๋ฌํ๊ธฐ ์ํด์์ด๋ค.
(3) TurtleSub_Action: pose ํ ํฝ ๊ตฌ๋
TurtleSub_Action ํด๋์ค๋ TurtlesimSubscriber ํด๋์ค๋ฅผ ์์๋ฐ๊ณ , ac_server๋ผ๋ ์ ๋ ฅ์ ์ค๋นํด์ ์ ์ฉํ ์ก์ ์๋ฒ๋ฅผ ์ง์ ํ์๋ค.
์ดํ callback ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ current_pose๋ผ๋ ๋ณ์๋ฅผ ์ค๋นํ๊ณ ๊ทธ ๋ด์ฉ์ msg, ์ฆ pose ํ ํฝ์ ๋ด์ฉ์ผ๋ก ์ ๋ฐ์ดํธํ์๋ค.
(4) DistTurtleServer: ์ฌ์ฉ์๊ฐ ์ง์ ํ ๊ฑฐ๋ฆฌ๋งํผ ์ด๋
1) DistTurtleServer/__init__()
๋๋ init ํจ์์์๋ ์ค๋นํ ๋ณ์๋ค๊ณผ ํ ํฝ์ ๋ฐํํ๊ณ , ์ก์ ์๋ฒ๋ฅผ ์ด๊ธฐํํ๊ธฐ ์ํ ์ ์ธ๋ค์ด ์๋ค.
cmd_vel ๋ฐํ์ ์ํ publisher๋ฅผ ์ค๋นํ์์ผ๋ฉฐ, ์ก์ ์๋ฒ๋ฅผ ์ค๋นํ์๋ค.
turtle์ด ์์ง์ธ ๊ฑฐ๋ฆฌ๋ฅผ ํ๋ฒ์ ์ ์ ์๊ธฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋์ ํด์ ๊ธฐ๋กํ ์ฉ๋์ธ ๋ณ์, total_dist๋ฅผ ์ ์ธํ์๋ค.
์ก์ ์๋ฒ์์ ๋ฐ๋ณต๋ฌธ์ด ๋์ํ ๋ ์ฒ์ ์คํ์ธ์ง ํ์ธํ๊ธฐ ์ํ ๋ณ์๋ก is_first_time์ ์ ์ธํ์๋ค. ์ด๋ฅผ ํตํด ์ฒซ ๊ณ์ฐ์์ ์ฒซ ์์น๋ฅผ ์ด๋ ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ ํฌํจ์ํค์ง ์์ ์ ์๋ค.
2) DistTurtleServer/calc_diff_pose()
์์์ ๋ฐ์ pose ํ ํฝ์ ์ด์ฉํด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ์๋ค.
์ดํ current_pose์ TurtleSub_Action ํด๋์ค๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ์งํํ๋ค.
์ด๋ฅผ ํตํด ๊ณ์ํด์ ์ด์ ์์น๊ฐ ์ ์ฅ๋์ด ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ด ๊ฐ๋ฅํด์ง๋ค.
calc_diff_pose๊ฐ ์ฒซ ์คํ์ผ ๋ ์์์ ์ ์์น๋ฅผ ๋ณด์ ํ๋ ์์ ์ ๊ฑฐ์น๊ณ , ๋ง์ง๋ง์ current_pose๋ฅผ previous_pose์ ์ ์ฅํ๊ณ ์๊ฐ์ ์ธ ๊ฑฐ๋ฆฌ๊ฐ์ ๋ฐํํ์๋ค.
3) DistTurtleServer/execute_callback()
์ฌ์ ์ ๋ง๋ค์ด๋ ์ก์ ์ ์์ Request ๋ถ๋ถ ์ค ์๋ ๋ช ๋ น์ ๋ํ ๊ฒ์ด ์กด์ฌํ๋ค.
์ด ๋ถ๋ถ์ ์ฌ์ฉ์์๊ฒ ๋ฐ์์ ๊ทธ๋๋ก cmd_vel ํ ํฝ์ผ๋ก ๋ฐํํ ๊ฒ์ด๋ค.
publisher๋ฅผ ์์์ ์ ์ธํด์ ์ฌ๊ธฐ์ ๋ฐํํ๊ณ ์๋ค.
์ฌ๊ธฐ์ ์ฌ์ฉ๋ msg๋ Twist๋ฅผ ๊ฐ์ฒดํํ๊ณ linear.x์ angular.z์ ์ฌ์ฉ์์๊ฒ ๋ฐ์ ๊ฐ๋ค์ ๊ฐ๊ฐ ์ง์ ํ์๋ค.
while True๋ก ๋ฌดํ ๋ฐ๋ณต๋๋ ์ฝ๋์์ ์๊ฐ์ ์ธ ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋์ ํด์ ํฉ์ฐํ๋ฉฐ, ์ ์ ๊ฐ ์ง์ ํ ๊ฑฐ๋ฆฌ์์ ์ด ๊ฒฐ๊ณผ๋ฅผ ๋นผ์ remained_dist์ ์ ์ฅํ์๋ค.
์ด๋ฅผ ์ถํ์ ๋ฐํ๊ฐ๋ฅํ๊ณ , ์ด๋ฅผ ์งํํ๋๋ก goal.handle.publish_feedback ๋ช ๋ น์ ์ฌ์ฉํ์๋ค.
๋จ์ ๊ฑฐ๋ฆฌ๊ฐ 0.2 ์ด๋ด์ ๋ค์ด์ค๋ฉด ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃํ์๋ค.
์ด๋ ํญ์ ๊ฑฐ๋ฆฌ๊ฐ 0์ด ๋์ง ์๋ ๋ถ๋ถ์ ๊ณ ๋ คํ์ฌ ๊ฐ์ ์ก์ ๊ฒ์ด๋ค.
์ดํ ์ก์ ์ ์ฑ๊ณต์ผ๋ก ์ํ๋ฅผ ์ ํํ๋ค.
๊ฒฐ๊ณผ ๋ฐํ์ ์ํด์ result๋ฅผ ์ ์ธํ๊ณ , ๋ง์ง๋ง turtlesim์ ์์น๋ฅผ ๊ธฐ๋กํ์ฌ ๋ฐํํ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋์ ์ถํ ๋ค์ ๋ช ๋ น์ด ๋ค์ด์์ ๋ ๊ฑฐ๋ฆฌ๋ฅผ 0๋ถํฐ ๋ฐ์ง๊ธฐ ์ํ ๋ถ๋ถ ๋ํ ์ถ๊ฐํ์๋ค.
5. ์ก์ ์๋ฒ ๊ฐ๋จํ ์ฌ์ฉํด๋ณด๊ธฐ
์ํฌ์คํ์ด์ค์์ ๋น๋๋ฅผ ์งํํ๊ณ turtlesim, dist_turtle_action_server๋ฅผ ์คํํ ๋ค, ros2 action ๋ช ๋ น์ผ๋ก send_goal์ ํผ๋๋ฐฑ์ด ์๋ ํ์์ผ๋ก ์ธ๊ฐํ์๋ค.
๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
6. ๋ง๋ฌด๋ฆฌ
์ด๋ ๊ฒ ๊ฐ๋จํ ์ก์ ์ ์๋ถํฐ ๋์, ๋ฉํฐ์ค๋ ๋๋ฅผ ๋ง๋ค์ด๋ณด์๋ค.
๋ค์์๋ Ch10. Parameter ๋ค๋ฃจ๊ธฐ์ ๋ํด์ ์์ฑํ๊ณ ์ ํ๋ค.
github : https://github.com/MOSW626/ros2_study.git
GitHub - MOSW626/ros2_study
Contribute to MOSW626/ros2_study development by creating an account on GitHub.
github.com