์ด๋ฒ์๋ Ch10. Parameter ๋ค๋ฃจ๊ธฐ์ ๋ํด์ ์์ฑํ๊ณ ์ ํ๋ค.
1. ๋ชฉ์
ROS์์๋ ์ค์ ๊ฐ์ ๊ด๋ฆฌํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์๊ณ , ๊ทธ์ค์ ํ๋ก๊ทธ๋จ ์ฝ๋์ ๋ณ์๋ก ๋ฑ๋กํด ๋๋ ๋ฐฉ๋ฒ์ด ์๋ค.
๊ทธ๋ ๊ฒ ํ๋ฉด ์ด๋ค ์ฝ๋์์ ์ฌ์ฉํ๋ ์ค์ ์ ์ธ๋ถ์์๋ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ ๊ฒฝ์ ๋ง์ด ์จ์ผ ํ๋ค.
๋ฐ๋ผ์ ์ด๋ด ๋ ํ๋ผ๋ฏธํฐ ์๋ฒ๋ฅผ ์ด์ฉ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์ ์ด ํ๋ผ๋ฏธํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณผ ๊ฒ์ด๋ค.
2. ํฐ๋ฏธ๋ ๋ช ๋ น์ผ๋ก ํ๋ผ๋ฏธํฐ ์ฌ์ฉํด๋ณด๊ธฐ
(1) ์ค์ตํ๊ฒฝ
๋ค์๊ณผ ๊ฐ์ด ํฐ๋ฏธ๋์ ์ค๋น ํ๋ค.
์ดํ turtlesim, turtle_teleop์ ์ด์ด์ค๋ค.
(2) ros2 param list
๊ทธ๋ฆฌ๊ณ ์๋์กฑ ํฐ๋ฏธ๋์์๋ ros2 param list ๋ช ๋ น์ ํตํด์ ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ผ๋ฏธํฐ๋ฅผ ํ์ธํ๊ณ ์ ํ๋ค.
๋ค์๊ณผ ๊ฐ์ด ๋ฆฌ์คํธ๋ฅผ ํ์ธํ ์ ์๋ค.
(3) ros2 param get
ํ์ฌ ํ๋ผ๋ฏธํฐ ๋ชฉ๋ก์ ๋ณด๋ฉด 2๊ฐ์ ๋ ธ๋๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ์ง๋ก ํฌ๊ฒ ๋๋์ด ์๋ ๊ฒ์ ํ์ธ ๊ฐ๋ฅํ๋ค.
์ด ์ค์์ background_g์ ๊ฐ์ ros2 param get์ผ๋ก ์กฐํํ๊ณ ์ ํ๋ค.
๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
(4) ros2 param set
์ดํ ํ๋ผ๋ฏธํฐ /turtlesim background_r์ 250์ผ๋ก set ํ๊ณ ์ ํ๋ค.
์ด๋ ๊ฒ ์์ด ๋ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
(5) ros2 param dump
์์์์ฒ๋ผ ํ๋ํ๋ parameter ๊ฐ์ ์ป๋ ๊ฒ์ ๊ท์ฐฎ์ ์ ์๊ธฐ์ ๋ค์๊ณผ ๊ฐ์ด ์ํฌ์คํ์ด์ค์ src/my_first_package๋ก ์ด๋ํ์ฌ paramํด๋๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ ๋ค์ ๋ช ๋ น์ผ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ฅํ ์ ์๋ค.
ros2 param dump /turtlesim
๊ทธ๋ฆฌ๊ณ ๊ทธ ํ์ผ์ ์ด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋๋ค.
(6) ros2 param load
์ดํ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๊ฐ์ ๋ณ๊ฒฝ ํ ๋ค์ ๋ช ๋ น์ด๋ฅผ ํตํด ํ๋ผ๋ฏธํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋ค. ๊ทธ๋ฌ๋ฉด
๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ ํ ๊ฐ๋ค์ ๋ณ๊ฒฝ๋๊ณ , ๋๋จธ์ง๋ ์๋ฌ๊ฐ ๋๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
3. ์ฝ๋๋ก ์ ๊ทผํ๋ ํ๋ผ๋ฏธํฐ
์ด๋ฒ์๋ ์ฝ๋๋ฅผ ํตํด์ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐ์ ํด๋ณด๊ณ ์ ํ๋ค.
(1) ํ๋ผ๋ฏธํฐ ์ ์ธ
dist_turtle_action_server.py ํ์ผ์ DistTurtleServer ํด๋์ค์ ๋๋ init์ ๋ค์ ๋ ์ค์ ์ถ๊ฐํ๋ค.
self.declare_parameter('quatile_time', 0.75)
self.declare_parameter('almost_goal_time', 0.95)
๋ ธ๋๊ฐ ์ ๊ณตํ๋ declare_parameter๋ ์ ์ ๊ฐ ์ง์ ํ ์ด๋ฆ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ง๋ค๊ณ ์ด๊ธฐ์น๋ฅผ ์ง์ ํด์ค๋ค.
์ดํ ๋น๋ํ๊ณ , ๋ ธ๋๋ฅผ ์คํ ํ ros2 param list๋ฅผ ํตํด์ ํ์ธํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ง์ ํ ๋ ๊ฐ์ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ros2 param get ๋ช ๋ น์ ์ด์ฉํด์ ์ด๊ธฐ์น๋ฅผ ํ์ธํด ๋ณด๋ฉด ์ง์ ํ ์ด๊ธฐ์น์ ๊ฐ์ ๊ฒ์ ํ์ธํ ์ ์๋ค.
(2) ํ๋ผ๋ฏธํฐ ์ฝ๋ ๋ด ์ฌ์ฉ
๋ณ๊ฒฝํ ์ฝ๋ ์๋์ ์ถ๊ฐ๋ก ๋ค์์ ๋ด์ฉ์ ์์ฑํ๋ค.
(quantile_time, almosts_time) = self.get_parameters(['quatile_time', 'almost_goal_time'])
print('quatile_time and almost_goal time is ', quantile_time.value, almosts_time.value)
์ด ๊ณผ์ ์ ํตํด์ get_parameters๋ฅผ ์ฌ์ฉํด ํ๋ผ๋ฏธํฐ๋ฅผ ๋ณ์๋ก ์ ์ฅํ์๋ค.
์ดํ ๋น๋ํ๊ณ , ๋ค์ dist_turtle_action_server๋ฅผ ์คํํ๋ฉด ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ฌ์ฉ ์ค์์ ํ์ธํ ์ ์์ผ๋ฉฐ, ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ๋ณ๊ฒฝ ํ ํ์ธํด ๋ณด๋ฉด ์ ๋ฐ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
(3) ํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ ํ์ธ
ROS2 ์ ์ฅ์ ์ผ๋ก ํ๋ผ๋ฏธํฐ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ์ค์๊ฐ์ผ๋ก ํ์ธ ๊ฐ๋ฅํ๋ค.
์์์ ์์ด ๋ฐ๋ก ๋ฐ๋ ๊ฒ์ฒ๋ผ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ์๊ธฐ ์ํด์ add_on_set_parameters_callback์ด๋ผ๋ ๊ฒ์ ์ด์ฉํด์ผ ํ๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ dist_turtle_action_server์ ์ถ๊ฐํ๋ค.
from rcl_interfaces.msg import SetParametersResult
์ถ๊ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ถ๋ถ๋ ์ถ๊ฐํ๊ณ ๋ฐ๊พผ๋ค.
self.add_on_set_parameters_callback(self.parameter_callback)
def parameter_callback(self, params):
for param in params:
print(param.name, " is changed to ", param.value)
return SetParametersResult(successful=True)
๊ทธ ๋ค์ ๋ค์ ๋น๋ํ๊ณ , ๋ ธ๋ ์คํ๊ณผ set์ผ๋ก ๊ฐ์ ๋ฐ๊ฟ๋ณด์๋ค.
์ด์ ์ ๋๋ก ์ฝ๋ฐฑํจ์๊ฐ ์๋ํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ด์ฉ์ ์์ ํ๋ค.
(quantile_time, almosts_time) = self.get_parameters(['quatile_time', 'almost_goal_time'])
self.quantile_time = quantile_time.value
self.almosts_time = almosts_time.value
self.add_on_set_parameters_callback(self.parameter_callback)
def parameter_callback(self, params):
for param in params:
print(param.name, " is changed to ", param.value)
if param.name == 'quatile_time':
self.quantile_time = param.value
if param.name == 'almost_goal_time':
self.almosts_time = param.value
print('quatile_time and almost_goal_time is ', self.quantile_time, self.almosts_time)
return SetParametersResult(successful=True)
์ดํ ๋น๋ํ๊ณ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
4. ๋ง๋ฌด๋ฆฌ
๋ค์์๋ ์ด ์ฑ ์ ๋ง์ง๋ง ์ฑํฐ์ธ Ch11. ๋๋ฒ๊ทธ์ ๊ด์ฐฐ์ ์ํ ์ฌ๋ฌ ๋๊ตฌ๋ค์ ๋ํด์ ์จ๋ณด๊ณ ์ ํ๋ค.
์ฌ๊ธฐ๊น์ง์ ์ฝ๋๋ ๋ค์ github์ ์ฌ๋ผ๊ฐ์๋ค.
https://github.com/MOSW626/ros2_study.git