Commit 3117be3b authored by François Lavallée's avatar François Lavallée

mesures PSE

parent 1546556a
...@@ -64,7 +64,7 @@ angleIni_F = 0 ...@@ -64,7 +64,7 @@ angleIni_F = 0
# time # time
timeStep = 0.005 # sec timeStep = 0.005 # sec
timeStep = 0.02 # sec #timeStep = 0.02 # sec
Tfinal = 5 Tfinal = 5
times = seq(0,Tfinal, by = timeStep) times = seq(0,Tfinal, by = timeStep)
t=0.1 t=0.1
...@@ -91,6 +91,12 @@ plotTrajectory_v2(times, v1,v2,v3, rB,rC,rD,rE,rF,rG,rH,rI, angleH,angleI, angle ...@@ -91,6 +91,12 @@ plotTrajectory_v2(times, v1,v2,v3, rB,rC,rD,rE,rF,rG,rH,rI, angleH,angleI, angle
timeStep = 0.0005 # sec
Tfinal = 4
times = seq(0,Tfinal, by = timeStep)
plotTrajectory_v2(times, v1=5,v2=4,v3=5, rB,rC,rD,rE,rF,rG,rH,rI, angleH,angleI, angleIni_B,angleIni_D,angleIni_F)
# remplir l'espace (densité) ? # remplir l'espace (densité) ?
timeStep = 0.005 # sec timeStep = 0.005 # sec
...@@ -102,7 +108,44 @@ plotTrajectory_v2(times, v1,v2,v3=pi, rB,rC,rD,rE,rF,rG,rH,rI, angleH,angleI, an ...@@ -102,7 +108,44 @@ plotTrajectory_v2(times, v1,v2,v3=pi, rB,rC,rD,rE,rF,rG,rH,rI, angleH,angleI, an
# nsga2 result
v1=5.0
v2=3.0537391026395397
v3=-2.496259000231632
angleIni_B = 0.0
angleIni_D = 0.473719893001516
angleIni_F = 1.0229217740760777
timeStep = 0.005 # sec
Tfinal = 4
times = seq(0,Tfinal, by = timeStep)
df = create_df_v2(times, v1,v2,v3, rB,rC,rD,rE,rF,rG,rH,rI, angleH,angleI, angleIni_B,angleIni_D,angleIni_F)
rayonMax = sqrt(df$Bx^2+df$By^2)[1]
distance = 1
resSimpliTraj = simplifiedTrajectory(cbind(df$Dx,df$Dy), distance)
dim(resSimpliTraj)
n=27
plot(resSimpliTraj[1:n,1],resSimpliTraj[1:n,2], xlim = c(-rayonMax,rayonMax), ylim = c(-rayonMax, rayonMax))
points(resSimpliTraj[1,1],resSimpliTraj[1,2], xlim = c(-rayonMax,rayonMax), ylim = c(-rayonMax, rayonMax), col="red")
plot(resSimpliTraj[,1],resSimpliTraj[,2], xlim = c(-rayonMax,rayonMax), ylim = c(-rayonMax, rayonMax), type = "l")
#p <- ggplot(df %>% filter(time <0.7)) +
p <- ggplot(df ) +
expand_limits(x=c(-rayonMax,rayonMax), y=c(-rayonMax, rayonMax)) +
coord_fixed(ratio=1) +
theme(axis.title.x=element_blank(), axis.title.y=element_blank() ) +
geom_point(aes(x=Dx, y=Dy), size=1, col= "red", shape = 3) +
labs(title = "Trajectoire Stationnaire",
subtitle = paste0("v1=",v1,", v2=",v2,", v3=",v3,", \n",
"angleIni_B=",angleIni_B,", angleIni_D=",angleIni_D,", angleIni_F=",angleIni_F))
p
......
...@@ -149,11 +149,46 @@ plotTrajectory_v2 <- function(times, v1,v2,v3, rB,rC,rD,rE,rF,rG,rH,rI, angleH,a ...@@ -149,11 +149,46 @@ plotTrajectory_v2 <- function(times, v1,v2,v3, rB,rC,rD,rE,rF,rG,rH,rI, angleH,a
} }
distanceSquared = function(v1,v2){
sqrt((v1[1]-v2[1])^2 +(v1[2]-v2[2])^2)
}
nextSimplifiedTrajectory = function(current,res, distance){
#current:Vector[(Double,Double)] => array à deux colonnes
#res:Vector[(Double,Double)]
#distance:Double
if (dim(current)[1]==0) { #isempty(current)
res
} else {
temp = current[1,]
temp2 = apply(current, 1, function(x){distanceSquared(x,temp)})
temp3 = cumsum(temp2)
temp4 = which(temp3 > distance)
if (length(temp4)==0){
newCurrent = matrix(, nrow = 0, ncol = 2)
newRes = rbind(res, current[(dim(current)[1]),] )
nextSimplifiedTrajectory(newCurrent, newRes, distance)
} else {
newCurrent = current[temp4,]
newRes = rbind(res, current[temp4[1],])
nextSimplifiedTrajectory(newCurrent, newRes, distance)
}
}
}
simplifiedTrajectory = function(mat, distance){
current = mat
res = current[1,]
nextSimplifiedTrajectory(current,res,distance)
}
# current = cbind(df$Dx,df$Dy)
# res = current[1,]
# distance = 1
# simplifiedTrajectory(cbind(df$Dx,df$Dy), distance)
......
...@@ -7,6 +7,7 @@ library(tidyverse) ...@@ -7,6 +7,7 @@ library(tidyverse)
library(dplyr) library(dplyr)
library(ggplot2) library(ggplot2)
library(gganimate) library(gganimate)
library(RColorBrewer)
#library(gifski) #library(gifski)
#library(pracma) #library(pracma)
theme_set(theme_bw()) theme_set(theme_bw())
...@@ -151,22 +152,23 @@ indiceRetourD = resTempsRetourSegmentsD$indiceRetourD ...@@ -151,22 +152,23 @@ indiceRetourD = resTempsRetourSegmentsD$indiceRetourD
plot(df$Dx,df$Dy, type = "l", xlim = c(-rayonMax,rayonMax), ylim = c(-rayonMax,rayonMax)) plot(df$Dx,df$Dy, type = "l", xlim = c(-rayonMax,rayonMax), ylim = c(-rayonMax,rayonMax))
# a faire sur countRetourD = resTempsRetourSegmentsD %>% group_by(tempsRetourD) %>% summarise(count = n())
# car les temps de retour (pas les indices) sont décalés de 1 parfois => les regrouper
nextSimplifyRetour = function(current,res,temp){ nextSimplifyRetour = function(current,res,temp){
if(isempty(current)){res} else{ if(isempty(current)){res} else{
if(size(current)[1] > 1){temp2 = current[1,]} else{temp2 = current[1] } if(size(current)[1] > 1){temp2 = current[1,]} else{temp2 = current[1] }
l = (size(res)[1]) l = (size(res)[1])
if (temp2[1] == temp[1]+1){ if (temp2[1] == temp[1]+1){
newTemp = temp2 newTemp = temp2
if(size(current)[1] > 1){newCurrent = current[-1,]} else{newCurrent = c() } if(size(current)[1] > 1){newCurrent = current[-1,]} else{newCurrent = c() }
if (l>1){ if (l>1){
newRes = rbind( res[1: (l-1), ] , c( res[l,1] , res[l,2] + temp2[2]) )} else{ newRes = rbind( res[1: (l-1), ] , c( res[l,1] , res[l,2] + temp2[2]) )} else{
newRes = c( res[1] , res[2] + temp2[2]) newRes = c( res[1] , res[2] + temp2[2])
} }
nextSimplifyRetour(newCurrent,newRes,newTemp) nextSimplifyRetour(newCurrent,newRes,newTemp)
}else{ }else{
newTemp = temp2 newTemp = temp2
if(size(current)[1] > 1){newCurrent = current[-1,]} else{newCurrent = c() } if(size(current)[1] > 1){newCurrent = current[-1,]} else{newCurrent = c() }
newRes = rbind( res , temp2 ) newRes = rbind( res , temp2 )
nextSimplifyRetour(newCurrent,newRes,newTemp) nextSimplifyRetour(newCurrent,newRes,newTemp)
...@@ -187,17 +189,109 @@ selectRetour = function(resRetourCount){ ...@@ -187,17 +189,109 @@ selectRetour = function(resRetourCount){
resRetourCount = as.matrix(countRetourD) resRetourCount = as.matrix(countRetourD)
resRestourSimpli = selectRetour(resRetourCount) resRestourSimpli = selectRetour(resRetourCount)
ll = size(resRestourSimpli)[1] -1 ll = size(resRestourSimpli)[1] -1
# avant
plot(countRetourD$tempsRetourD,countRetourD$count)
# maintenant
points(resRestourSimpli[1:ll,1],resRestourSimpli[1:ll,2], col="red")
plot(resRestourSimpli[1:ll,1],resRestourSimpli[1:ll,2]) plot(resRestourSimpli[1:ll,1],resRestourSimpli[1:ll,2])
sum(resRestourSimpli[1:ll,2]) length(resRestourSimpli[1:ll,1])
sum(countRetourD$count) diff(resRestourSimpli[1:ll,1])
# retrouver les points associés au temps de retour
# i=1
# tt = resRetourCount[i,1]
# selInd_tt = which(resTempsRetourSegmentsD$tempsRetourD == tt)
# # plot
# plot(df$Dx,df$Dy, type = "l", xlim = c(-rayonMax,rayonMax), ylim = c(-rayonMax,rayonMax))
# selIndicesRetour_D = resTempsRetourSegmentsD$indiceRetourD[selInd_tt]
# points(df$Dx[selIndicesRetour_D],df$Dy[selIndicesRetour_D], col="red")
# retrouver les points associés au temps de retour dans la version simplifiée (rassemblée)
temp = resRetourCount # as.list(countRetourD) # resRetourCount # countRetourD
#temp$resInd = rep(0,dim(temp)[1])
ll = list()
lg = dim(resRetourCount)[1]
for (i in 1:lg){
temp2 = list()
temp2[[1]] = temp[i,1]
temp2[[2]] = temp[i,2]
tt = resRetourCount[i,1]
selInd_tt = which(resTempsRetourSegmentsD$tempsRetourD == tt)
selIndicesRetour_D = resTempsRetourSegmentsD$indiceRetourD[selInd_tt]
temp2[[3]] = selIndicesRetour_D
ll[[i]] = temp2
}
length(ll)
#ll
# current et res : list, temp: int (le temps de retour en cours)
nextSimplifyRetourList = function(current,res,temp){
if(isempty(current)){res} else{
temp2 = current[[1]] # liste
l = length(res)
if (temp2[[1]] == temp[[1]][[1]] + 1){
newTempRetour = temp2[[1]]
if(length(current) > 1){newCurrent = current[-1]} else{newCurrent = list() }
if (l>1){
newRes = c( res[1: (l-1)] , list( list( res[[l]][[1]], res[[l]][[2]] + temp2[[2]], c(res[[l]][[3]], temp2[[3]]) )))
} else{
newRes = list( list(res[[1]][[1]], res[[1]][[2]] + temp2[[2]], c(res[[1]][[3]], temp2[[3]]) ) ) #c( res[[1]][1] , res[[1]][2] + newTemp)
}
nextSimplifyRetourList(newCurrent,newRes,newTempRetour)
}else{
newTempRetour = temp2[[1]]
if(length(current) > 1){newCurrent = current[-1]} else{newCurrent = list() }
newRes = c( res , list(temp2) )
nextSimplifyRetourList(newCurrent,newRes,newTempRetour)
}
}
}
# pour tester
# current = newCurrent
# res = newRes
# temp = newTempRetour
# ll = ll[1:5]
selectRetour_List = function(ll){
res = ll[1]
temp = ll[1]
current = ll[2:length(ll)]
nextSimplifyRetourList(current,res,temp)
}
resList = resRestourSimpli_List = selectRetour_List(ll)
#
# plot
plot(df$Dx,df$Dy, type = "l", xlim = c(-rayonMax,rayonMax), ylim = c(-rayonMax,rayonMax))
colorsPalette = colorRampPalette(brewer.pal(9,"YlOrRd")[4:9])(length(resList))
colorsPalette = topo.colors(length(resList))
#plot(1:length(resList),1:length(resList), col = colorsPalette)
for (i in 1:length(resList)){
selIndicesRetour_D = resList[[i]][[3]]
points(df$Dx[selIndicesRetour_D],df$Dy[selIndicesRetour_D], col=colorsPalette[i])
}
sum(resRestourSimpli[1:ll,2])
sum(countRetourD$count)
lg = dim(resRestourSimpli)[1]
plot(resRestourSimpli[1:(lg-1),1],resRestourSimpli[1:(lg-1),2], xlab = "temps de retour", ylab = "nombre de points")
length(res$Dx)
# D # D
plot(res$Dx,res$Dy, type = "l") plot(res$Dx,res$Dy, type = "l")
...@@ -237,7 +331,7 @@ resTimesPointSinguliers = as_tibble(resTimesPointSinguliers) ...@@ -237,7 +331,7 @@ resTimesPointSinguliers = as_tibble(resTimesPointSinguliers)
# B # B
resTimesPointSinguliersB = resTimesPointSinguliers %>% select(timesPointSinguliersB) %>% drop_na() resTimesPointSinguliersB = resTimesPointSinguliers %>% select(timesPointSinguliersB) %>% drop_na()
nSingulierB = dim(resTimesPointSinguliersD)[1];nSingulierB nSingulierB = dim(resTimesPointSinguliersB)[1];nSingulierB
plot(df$Bx,df$By, type = "l", xlim = c(-rayonMax,rayonMax), ylim = c(-rayonMax,rayonMax)) plot(df$Bx,df$By, type = "l", xlim = c(-rayonMax,rayonMax), ylim = c(-rayonMax,rayonMax))
points(df$Bx[resTimesPointSinguliersB$timesPointSinguliersB],df$By[resTimesPointSinguliersB$timesPointSinguliersB], col="red", cex = 0.5) points(df$Bx[resTimesPointSinguliersB$timesPointSinguliersB],df$By[resTimesPointSinguliersB$timesPointSinguliersB], col="red", cex = 0.5)
...@@ -286,7 +380,7 @@ plot(times,courburesF, type = "l") ...@@ -286,7 +380,7 @@ plot(times,courburesF, type = "l")
# D # D
seuilCourbureD = min(courburesD)+(max(courburesD)-min(courburesD))/2 seuilCourbureD = min(courburesD)+(max(courburesD)-min(courburesD))/2
selIndBigCourbureD = which(courburesD > seuilCourbureD) selIndBigCourbureD = which(courburesD > seuilCourbureD)
plot(res$Dx,res$Dy, type = "l") plot(res$Dx,res$Dy, type = "l", asp=1)
points(res$Dx[selIndBigCourbureD],res$Dy[selIndBigCourbureD], col="red") points(res$Dx[selIndBigCourbureD],res$Dy[selIndBigCourbureD], col="red")
plot(times,courburesD, type = "l") plot(times,courburesD, type = "l")
......
...@@ -120,37 +120,6 @@ plot_oneTime_v2 = function(t, v1,v2,v3, rB,rC,rD,rE,rF,rG,rH,rI, angleH,angleI, ...@@ -120,37 +120,6 @@ plot_oneTime_v2 = function(t, v1,v2,v3, rB,rC,rD,rE,rF,rG,rH,rI, angleH,angleI,
# create_df_v2 = function(times, v1,v2,v3, rB,rC,rD,rE,rF,rG,rH,rI, angleH,angleI, angleIni_B,angleIni_D,angleIni_F){
# df = data.frame(Bx = double(), By = double(), Cx = double(), Cy = double(),
# Hx = double(), Hy = double(),
# Dx = double(), Dy = double(), Ex = double(), Ey = double(),
# Ix = double(),
# Iy = double(),
# Fx = double(), Fy = double(), Gx = double(), Gy = double(),
# time = double(),
# speedBx = double(), speedBy = double(),
# speedCx = double(), speedCy = double(),
# speedDx = double(), speedDy = double(),
# speedEx = double(), speedEy = double(),
# speedFx = double(), speedFy = double(),
# speedGx = double(), speedGy = double(),
# accBx = double(), accBy = double(),
# accCx = double(), accCy = double(),
# accDx = double(), accDy = double(),
# accEx = double(), accEy = double(),
# accFx = double(), accFy = double(),
# accGx = double(), accGy = double())
#
# for (i in 1:length(times)){
# t = times[i]
# res = positions_t_Stationnaire_v2(t, v1,v2,v3, rB,rC,rD,rE,rF,rG,rH,rI, angleH,angleI, angleIni_B,angleIni_D,angleIni_F)
# df = rbind(df,res)
# }
# return(df)
# }
plotTrajectory_v2 <- function(times, v1,v2,v3, rB,rC,rD,rE,rF,rG,rH,rI, angleH,angleI, angleIni_B,angleIni_D,angleIni_F) { plotTrajectory_v2 <- function(times, v1,v2,v3, rB,rC,rD,rE,rF,rG,rH,rI, angleH,angleI, angleIni_B,angleIni_D,angleIni_F) {
theme_set(theme_bw()) theme_set(theme_bw())
df = positions_t_Stationnaire_v2(times, v1,v2,v3, rB,rC,rD,rE,rF,rG,rH,rI, angleH,angleI, angleIni_B,angleIni_D,angleIni_F) df = positions_t_Stationnaire_v2(times, v1,v2,v3, rB,rC,rD,rE,rF,rG,rH,rI, angleH,angleI, angleIni_B,angleIni_D,angleIni_F)
......
...@@ -65,6 +65,8 @@ ...@@ -65,6 +65,8 @@
\usepackage{hyperref} \usepackage{hyperref}
\usepackage{cleveref}
% fourier soit stmaryrd % fourier soit stmaryrd
%\usepackage{fourier} %\usepackage{fourier}
...@@ -546,6 +548,25 @@ Points doubles: $t_1$ et $t_2$ tels que: $x(t_1)=x(t_2)$ et $y(t_1) = y(t_2)$. ...@@ -546,6 +548,25 @@ Points doubles: $t_1$ et $t_2$ tels que: $x(t_1)=x(t_2)$ et $y(t_1) = y(t_2)$.
\section{Mesures} \section{Mesures}
On illustre les mesures sur une trajectoire obtenue avec les paramètres suivants:
angles initiaux: $angleIniB = 0$ , $angleIniD = 1$ , $angleIniF = 2$
et les vitesses:
$v_1 = 1.8$ , $v_2= -2.66$ , $v_3 = 3.14$
Tfinal = 10, deltaT = 0.0005.
Les trajectoires des points sont tracées sur la figure \ref{trajectoire_exemple_mesure} .
\begin{figure}[H]
\center{\includegraphics[width=0.75\linewidth]{figure_trajectoires_exemple_mesures}}
\caption{Trajectoires pour illustrer les mesures}
\label{trajectoire_exemple_mesure}
\end{figure}
\bigbreak
\textbf{Densité} \textbf{Densité}
La trajectoire remplit l'espace ? La trajectoire remplit l'espace ?
...@@ -554,24 +575,100 @@ Densité d'occupation des points de la trajectoire sur une grille: densité pour ...@@ -554,24 +575,100 @@ Densité d'occupation des points de la trajectoire sur une grille: densité pour
\textbf{Points singuliers:} leur nombre et les indices (temps) auxquels ils apparaissent. Paramètre: seuil sur la dérivée \textbf{Points singuliers:} leur nombre et les indices (temps) auxquels ils apparaissent. Paramètre: seuil sur la dérivée
Dans l'exemple, seules les trajectoires des points D et E présentent des points singuliers (figure \ref{mesure_singulierD})
\begin{figure}[H]
\center{\includegraphics[width=0.55\linewidth]{singulierD}}
\caption{Les 27 points singuliers de la trajectoire du point D}
\label{mesure_singulierD}
\end{figure}
\textbf{Boucle / temps de retour:} nombre, indice (temps) du point concerné, et la durée (nombre de pas te temps) de la boucle, aussi la distribution des angle des points boucles. \textbf{Boucle / temps de retour:} nombre, indice (temps) du point concerné, et la durée (nombre de pas te temps) de la boucle, aussi la distribution des angle des points boucles.
Dans l'exemple, les trajectoires des points D et E ainsi que celles de F et G présentent des points de retour (figures \cref{mesure_retourD,mesure_retourF})
\begin{figure}[H]
\center{\includegraphics[width=0.55\linewidth]{retourD}}
\caption{Points de retour pour la trajectoire D}
\label{mesure_retourD}
\end{figure}
\begin{figure}[H]
\center{\includegraphics[width=0.55\linewidth]{retourF}}
\caption{Points de retour pour la trajectoire F}
\label{mesure_retourF}
\end{figure}
Sur la figure \ref{mesure_retourD_color}, les couleurs correspondent à des points ayant des temps de retour identiques.
\begin{figure}[H]
\center{\includegraphics[width=0.55\linewidth]{retourD_ordered_color}}
\caption{Temps de retour pour la trajectoire D}
\label{mesure_retourD_color}
\end{figure}
\textbf{Courbure de la trajectoire:} en chaque point la courbure. Regarder la moyenne ou d'autres information statistique sur la distribution des rayons de courbure. Pas de paramètre. On peut aussi repérer des morceaux de trajectoires qui ressemblent à une droite (courbure nulle: seuil) ou à un cercle (courbure constante).
\textbf{Courbure de la trajectoire:} en chaque point la courbure. Regarder la moyenne ou d'autres information statistique sur la distribution des rayons de courbure. %Pas de paramètre. On peut aussi repérer des morceaux de trajectoires qui ressemblent à une droite (courbure nulle: seuil) ou à un cercle (courbure constante).
%concavité/ convexité locale?: rayon de courbure: les distribution des rayons de courbure sur la trajectoire: diversité ou uniforme ? %concavité/ convexité locale?: rayon de courbure: les distribution des rayons de courbure sur la trajectoire: diversité ou uniforme ?
Les figures \cref{mesure_ourbureB,mesure_ourbureD,mesure_ourbureF} représentent respectivement les courbures pour les points des trajectoire des points B, D et F. La trajectoire de B est un cercle, le rayon de courbure est donc constant.
\begin{figure}[H]
\center{\includegraphics[width=0.55\linewidth]{courbureB}}
\caption{Rayon de courbure pour la trajectoire B}
\label{mesure_ourbureB}
\end{figure}
\begin{figure}[H]
\center{\includegraphics[width=0.55\linewidth]{courbureD}}
\caption{Rayon de courbure pour la trajectoire D}
\label{mesure_ourbureD}
\end{figure}
\begin{figure}[H]
\center{\includegraphics[width=0.55\linewidth]{courbureF}}
\caption{Rayon de courbure pour la trajectoire F}
\label{mesure_ourbureF}
\end{figure}
\textbf{Indice de Moran:} sur l'agrégation spatiale. \textbf{Indice de Moran:} sur l'agrégation spatiale.
\textbf{Autres idées:} (pas implémentées)
Nombre de composantes connexes dans l'espace (Julien ?, JTS lib scala pour les trucs de géométrie) Nombre de composantes connexes dans l'espace (Julien ?, JTS lib scala pour les trucs de géométrie)
%https://locationtech.github.io/jts/javadoc/org/locationtech/jts/geom/Geometry.html %https://locationtech.github.io/jts/javadoc/org/locationtech/jts/geom/Geometry.html
La courbe est elle fermée (périodicité) La courbe est elle fermée (périodicité)?
\subsection{Les mesures retenues}
Pour une trajectoire avec des lumières allumées/ éteintes:
\begin{itemize}
\item nombre de points singuliers
\item nombre de point de retour
\item densité totale (+ celle de D/F)
\item indice Moran total (+ D/F)
\item courbure moyenne: toutes les trajectoires
\end{itemize}
......
...@@ -339,7 +339,7 @@ object Electra extends App { ...@@ -339,7 +339,7 @@ object Electra extends App {
// point retour (boucle) [le seuil est mis pour éviter de compter les points des trajectoires périodiques] // point retour (boucle) [le seuil est mis pour éviter de compter les points des trajectoires périodiques]
/* /*
val seuilRetour = max(math.floor(1/ (deltaT * DefaultValuesParameterModel.v1)).toInt - 10 ,0) val seuilRetour = max(math.floor(1/ (deltaT * DefaultValuesParameterModel.v1)).toInt - 10 ,0)
//println(numberRetour(res3.Bx,res3.By,seuilRetour)) println(numberRetour(res3.Bx,res3.By,seuilRetour))
println(numberRetourAllTrajectories(res3,seuilRetour)) println(numberRetourAllTrajectories(res3,seuilRetour))
*/ */
...@@ -380,10 +380,10 @@ object Electra extends App { ...@@ -380,10 +380,10 @@ object Electra extends App {
// courbure moyenne // courbure moyenne
/*
println(meanCourbure(res3.speedBx,res3.speedBy,res3.accBx,res2.accBy)) println(meanCourbure(res3.speedBx,res3.speedBy,res3.accBx,res2.accBy))
println(meanCourbureAllTrajectories(res3)) println(meanCourbureAllTrajectories(res3))
*/
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment