ADD CPS - Rosbot Control

Project

์—ฐ๊ตฌ๋ชฉ์ 

๋ฌผ๋ฆฌ์  Rosbot ์˜ ์ปจํŠธ๋กค์„ ์—ฐ๊ตฌํ•˜์—ฌ, ํ•ด๋‹น ์—ฐ๊ตฌ๋ฅผ Drone์—๋„ ํ™•์žฅํ•˜์—ฌ ์ตœ์ข…์‹œ์—ฐ์„ ์œ„ํ•œ ๋กœ๋ด‡ ์ปจํŠธ๋กค ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. ์š”๊ตฌ์‚ฌํ•ญ์€ ํŠน์ •์ขŒํ‘œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, body frame ์—์„œ ํ•ด๋‹น ์œ„์น˜๋กœ ์ด๋™. ์ด๋™ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฃฐ๊ธฐ๋ฐ˜๊ณผ ๊ฐ•ํ™”ํ•™์Šต ๊ธฐ๋ฐ˜ ๋‘ ๊ฐ€์ง€๋กœ ์ œ๊ณตํ•œ๋‹ค.

์—ฐ๊ตฌ ๋‚ด์šฉ

2023.10.06.1: Rosbot Gazebo

๋กœ์Šค๋ด‡ ์„ธํŒ… ์ฝ”๋“œ ํด๋ฆฐ ๋ฒ„์ „ ๊ตฌํ˜„ [Document]

Terminal ํŒจ๋„ ์ •๋ณด:

  1. roscore
  2. gazebo map load
  3. Rosbot spawn
  4. keyboard Control


2023.10.06.2: Rosbot Environment Sample Collection

๋กœ์Šค๋ณต ๊ฐ•ํ™”ํ•™์Šต ํ™˜๊ฒฝ ๋žœ๋ค ์•ก์…˜์„ ํ†ตํ•œ ์ƒ˜ํ”Œ ํš๋“ [Document]

๋ฐ๋ชจ ๋น„๋””์˜ค google drive


2023.10.16.1: Rosbot RPY

๋กœ๋ด‡์ด ๋†“์ด๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ๋‘ ๊ฐ€์ง€ ์ขŒํ‘œ, world Frame / body Frame ์ด ์กด์žฌํ•œ๋‹ค. ๋กœ๋ด‡ ์ปจํŠธ๋กค ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ์กฐ์ข…ํ•˜๋Š” ์ปจํŠธ๋กค์€ body frame ์—์„œ ๋™์ž‘ํ•˜๋‚˜, ์‹ค์ œ ๋ชฉํ‘œํ•˜๋Š” ์œ„์น˜๋Š” world frame์— ๋†“์—ฌ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํ™˜๊ฒฝ์—์„œ body frame ์˜ ๋ชฉํ‘œ๋ฅผ world frame์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ ๋ชฉํ‘œ ์œ„์น˜์— ๋„๋‹ฌํ•˜๋Š” ์ •๋„๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์ด๋‹ค. ์ด ๋•Œ ๊ณ„์‚ฐ์— ๊ด€์—ฌํ•˜๋Š” ๊ฐ’์€ yaw ์ด๋‹ค. ๋กœ๋ด‡์˜ ์‹ค์ œ 2์ฐจ์› ์ขŒํ‘œ๋ฅผ $(G_x, G_y)$๋ผ๊ณ  ํ•˜์ž, ์ƒ๋Œ€์  ์œ„์น˜ $(R_x, R_y)$์˜ ์ ˆ๋Œ€์ขŒํ‘œ๋Š” ๋กœ๋ด‡์˜ 2์ฐจ์› ํšŒ์ „ ๋ฐฉํ–ฅ๊ฐ’ $\Psi$ (yaw)์— ๋Œ€ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

\[\begin{gather} G_{tx} = G_{x} + \operatorname{Rotate}(R_{x}, R_{y}, \Psi)_x \\ G_{ty} = G_{y} + \operatorname{Rotate}(R_{x}, R_{y}, \Psi)_y \end{gather}\]

์—ฌ๊ธฐ์„œ Rotate ๋Š” $\Psi$ ํšŒ์ „ํ–‰๋ ฌ์— ๋Œ€ํ•ด์„œ $R_{x}, R_{y}$ ๊ฐ’์„ ๋ณ€ํ™˜ํ•œ ๋ฒกํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๋กœ๋ด‡์˜ 2D์—์„œ ์‹ค์ œ ์ขŒํ‘œ์— ๋Œ€ํ•ด์„œ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ์ƒ๋Œ€์  ํƒ€๊ฒŸ ์œ„์น˜ (1,2) ๋ฅผ ๋‹ค๋ฅธ ๋กœ๋ด‡์˜ yaw ๊ฐ’์— ๋Œ€ํ•ด์„œ ์ฐ์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ชฉํ‘œ๋กœ ํ•˜๋Š” ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณฝ ๊ฐ™์ด ๋กœ๋ด‡์˜ ์œ„์น˜ ๋ณ€ํ™”๋ฅผ ์š”๊ตฌํ•˜๋Š” ํƒ€๊ฒŸ ์œ„์น˜๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด์— ๋Œ€ํ•œ ๊ฐ•ํ™”ํ•™์Šต ๋ณด์ƒ์€ ์ ˆ๋Œ€ ์ขŒํ‘œ๊ณ„์—์„œ ์ฃผ์–ด์ง„๋‹ค.

์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ Yaw๊ฐ’ ํ™•์ธ

์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ Yaw ๊ฐ’์„ ํ™•์ธํ•ด๋ณด๋ฉด, ํšŒ์ „์†๋„๋ฅผ ์˜ฌ๋ฆฌ๋ฉด yaw ๊ฐ’์ด ์„ ํ˜•์œผ๋กœ ๋ณ€ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ’์˜ ๋ฒ”์œ„๋Š” $-\pi \sim \pi$ ์ด๋‹ค.

์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ Yaw ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๋กœ๋ด‡์˜ ์‹ค์ œ ์ขŒํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค. ๋นจ๊ฐ„์ƒ‰ ์ขŒํ‘œ์ถ•์„ ๊ธฐ์ค€์œผ๋กœ yaw๊ฐ’์ด ์ธก์ •๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


Rosbot Goal Control

# ๊ด€์ฐฐ ๊ณต๊ฐ„์˜ ๊ฐ Dimension ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. feature_names = [ #ํ˜„์žฌ ์ƒํƒœ 'linear_velocity_1', 'linear_velocity_2', 'linear_velocity_3', 'linear_acceleration_1', 'linear_acceleration_2', 'linear_acceleration_3', 'raw', 'pitch', 'yaw', 'angular_velocity_1', 'angular_velocity_2', 'angular_velocity_3', ] + [ # ๋ชฉํ‘œ ํ• ๋‹น์‹œ ์ƒํƒœ 'prev_linear_velocity_1', 'prev_linear_velocity_2', 'prev_linear_velocity_3', 'prev_linear_acceleration_1', 'prev_linear_acceleration_2', 'prev_linear_acceleration_3', 'prev_raw', 'prev_pitch', 'prev_yaw', 'prev_angular_velocity_1', 'prev_angular_velocity_2', 'prev_angular_velocity_3', ] + [ # ๋ชฉํ‘œ ์ƒ๋Œ€ ์œ„์น˜ ์ •๋ณด 'rel_x', 'rel_y', 'duration' ]

SAC Training Results 2023.10.17

rosbot_goal_control ํ™˜๊ฒฝ์— SAC์œผ๋กœ 300K ์‹œ๊ฐ„์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•œ ๋ชจ๋ธ์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. Actor ์™€ Critic์€ ์„œ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š์œผ๋ฉฐ, Critic ์˜ ๊ฐ’์€ (๊ด€์ฐฐ๊ฐ’๊ณผ ํ–‰๋™)์— ๋Œ€ํ•ด์„œ $V$ ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Actor( (mlp): Sequential( (0): Linear(in_features=27, out_features=64, bias=True) (1): Tanh() (2): Linear(in_features=64, out_features=64, bias=True) (3): Tanh() (4): Linear(in_features=64, out_features=64, bias=True) (5): Tanh() ) (fc_mean): Linear(in_features=64, out_features=2, bias=True) (fc_logstd): Linear(in_features=64, out_features=2, bias=True) ) Critic( (mlp): Sequential( (0): Linear(in_features=29, out_features=64, bias=True) (1): GELU(approximate='none') (2): Linear(in_features=64, out_features=64, bias=True) (3): GELU(approximate='none') (4): Linear(in_features=64, out_features=1, bias=True) ) )

ํ•™์Šต ๊ณผ์ •์—์„œ episode์˜ return ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ํ•™์Šต๊ฒฐ๊ณผ 100K ์ˆ˜์ค€์—์„œ ๋ณด์ƒ์ด ์ˆ˜๋ ดํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์„ฑ๋Šฅ์ด -30 ์ดํ›„๋กœ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ, ์ด์— ๋Œ€ํ•ด์„œ Upperbound ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด๋ด์•ผ ํ•œ๋‹ค.


๋กœ๋ด‡์˜ ์ปจํŠธ๋กค $action = (\beta, \alpha)$ ์— ๋Œ€ํ•ด์„œ $\beta$๋Š” ์ „์ง„ํ•˜๋Š” ์†๋„, $\alpha$๋Š” ํšŒ์ „ ๊ฐ’์œผ๋กœ ๋ฒ”์œ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. $\beta \in [0,1]$ ๊ณผ $\alpha \in (-1, 1)$ ํšŒ์ „๊ฐ’์€ $-1$ ์˜ ๊ฒฝ์šฐ ์™ผ์ชฝ, $+1$์˜ ๊ฒฝ์šฐ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค. ํ•™์Šต ์™„๋ฃŒ๋œ ๋ชจ๋ธ์— ๋Œ€ํ•ด์„œ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ์ƒ๋Œ€์œ„์น˜ $(rx,ry)$ ๋ฅผ ์คฌ์„ ๋•Œ ๋กœ๋ด‡์˜ ํ–‰๋™์„ ๋ถ„์„ํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋กœ๋ด‡์˜ ์‹ค์ œ ๋ฐฉํ–ฅ $(dx,dy)$์˜ ๊ฐ’์„ $(\beta, \alpha)$ ๋กœ๋ถ€ํ„ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹์œผ๋กœ ์œ ๋„๋  ์ˆ˜ ์žˆ๋‹ค.

\[\begin{gather} \theta = (1-\alpha)/2 \pi \\ dx = \beta \cdot \cos{\theta} \\ dy = \beta \cdot \sin{\theta} \end{gather}\]

๋ฐฉํ–ฅ๋ฒกํ„ฐ๋ฅผ ๋ชฉํ‘œ ์œ„์น˜ $(rx, ry) \in [-3,3] \times [-3,3]$ ์˜ ์œ„์น˜์—์„œ ํ‘œ์‹œํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ๋ด‡์˜ ์ด๋™ ์„ ํ˜ธ๋„๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


2023.10.17 : ๋ฌธ์ œ์  : Real Trajectory ๊ฐ€ ์™„๋ฒฝํ•˜์ง€ ์•Š์Œ.


2023.10.18: Rosbot Data Collect