socceR
================

RoboCup Soccer 2Dの試合分析のためのツール群

## 機能

### `read_rcl`

指定されたrclファイルを解析し、tibbleにして返します。

``` r
library(tidyverse)
source("R/read_rcl.R")
rcl <- read_rcl("data/20220405162804-HELIOS_base_3-vs-enemy_2.rcl")

head(rcl)
## # A tibble: 6 x 6
##   step  team        unum  command   args      line                              
##   <chr> <chr>       <chr> <chr>     <list>    <chr>                             
## 1 0     HELIOS_base 1     init      <chr [1]> "0,114\tRecv HELIOS_base_1: (init~
## 2 0     HELIOS_base 1     version   <chr [1]> "0,114\tRecv HELIOS_base_1: (init~
## 3 0     HELIOS_base 1     goalie    <chr [0]> "0,114\tRecv HELIOS_base_1: (init~
## 4 0     HELIOS_base 1     synch_see <chr [0]> "0,115\tRecv HELIOS_base_1: (sync~
## 5 0     HELIOS_base 1     ear       <chr [0]> "0,115\tRecv HELIOS_base_1: (sync~
## 6 0     HELIOS_base 1     off       <chr [1]> "0,115\tRecv HELIOS_base_1: (sync~
```

### `read_rcg`

指定されたrcgファイルを解析し、tibbleにして返します。

``` r
library(tidyverse)
source("R/read_rcg.R")
rcg <- read_rcg("data/20220405162804-HELIOS_base_3-vs-enemy_2.rcg")

head(rcg)
## # A tibble: 6 x 21
##    step side   unum  type state     x     y    vx    vy   body  neck vq       vw
##   <int> <chr> <int> <int> <int> <dbl> <dbl> <dbl> <dbl>  <dbl> <int> <chr> <int>
## 1     1 l         1     0     9   -49     0     0     0   54.7     0 h       180
## 2     1 l         2    17     1   -25    -5     0     0 -118.      0 h       180
## 3     1 l         3     8     1   -25     5     0     0  108.      0 h       180
## 4     1 l         4    13     1   -25   -10     0     0 -117.      0 h       180
## 5     1 l         5     6     1   -25    10     0     0 -174.      0 h       180
## 6     1 l         6    11     1   -25     0     0     0  114.      0 h       180
## # ... with 8 more variables: stamina <dbl>, effort <dbl>, recovery <dbl>,
## #   capacity <dbl>, ball_x <dbl>, ball_y <dbl>, ball_vx <dbl>, ball_vy <dbl>
```

## plotlyを使ったビジュアライゼーションのサンプル

``` r
library(plotly)

ball_path <- rcg |>
  dplyr::group_nest(step, ball_x, ball_y) |>
  dplyr::mutate(move_dist_x = ball_x - dplyr::lag(ball_x),
                move_dist_y = ball_y - dplyr::lag(ball_y),
                move_dist   = sqrt(move_dist_x^2 + move_dist_y^2),
                move_dist   = dplyr::if_else(is.na(move_dist), 0, move_dist)) |>
  dplyr::filter(move_dist != 0 & move_dist < 40)

ball_path |>
  plotly::plot_ly(showlegend = FALSE) |>
  plotly::add_markers(
    data       = ball_path,
    x          = ~ball_x,
    y          = ~ball_y,
    z          = ~move_dist,
    marker     = list(color        = ~move_dist,
                      size         = 3,
                      colorscale   = "Viridis",
                      opacity      = 0.8,
                      showscale  = FALSE)
  ) |>
  plotly::add_paths(
    data       = ball_path |>
                 dplyr::select(step, ball_x, ball_y, move_dist) |>
                 dplyr::mutate(base = 0) |>
                 tidyr::pivot_longer(c(move_dist, base)) |>
                 dplyr::group_by(step),
    x          = ~ball_x,
    y          = ~ball_y,
    z          = ~value,
    color      = ~value
  ) |>
  plotly::hide_colorbar() |>
  plotly::layout(
    scene = list(
      xaxis  = list(title = "ボールのX座標"),
      yaxis  = list(title = "ボールのY座標"),
      zaxis  = list(title = "ボールの飛距離"),
      camera = list(eye    = list(x = 0.8, y = -1.8, z =  0.8),
                    center = list(x = 0.0, y =  0.0, z = -0.2))
    )
  )
```

![plotly-visualization-sample](image/plotly-visualization-sample.png)
