Я работаю над кодом, который должен отображать вращение вокруг осей x, y и z. Углы должны рассчитываться на основе данных о положении, которые даны для 4 маркеров, каждый из которых имеет координаты x, y и z. Позиции измеряются с течением времени с помощью системы захвата движения, а затем извлекаются в файл csv.
Я пытаюсь заставить это работать в основном с Chat GPT, но у меня есть базовое понимание.
Данные сравниваются с уже вычисленным и нанесенным на график набором данных, измеренным с помощью другой системы, которая выдает угловые скорости в качестве выходных данных.
Текущая проблема заключается в том, что 2 из 3 углов кажутся достаточно точными, в то время как 3-й - скидка около 30°.
Как я могу предоставить свои данные? Пока не знаю куда и как загрузить. Спасибо!
Вот мой код:
Построение графика рабочей скорости:
import pandas as pd
import matplotlib.pyplot as plt
#from mpl_toolkits.mplot3d import Axes3D
import numpy as np
# load data
data = pd.read_csv('path_to_file', delimiter=';')
#%%
# extract time data
zeit = pd.to_numeric(data['time'].str.replace(',', '.'), errors='coerce')
#%%
# extract each velocity
winkelgeschwindigkeit_x = pd.to_numeric(data['wx (rad/s)'].str.replace(',', '.'), errors='coerce')
winkelgeschwindigkeit_y = pd.to_numeric(data['wy (rad/s)'].str.replace(',', '.'), errors='coerce')
winkelgeschwindigkeit_z = pd.to_numeric(data['wz (rad/s)'].str.replace(',', '.'), errors='coerce')
#%%
# compute orientation
orientierung_x = np.zeros_like(zeit)
orientierung_y = np.zeros_like(zeit)
orientierung_z = np.zeros_like(zeit)
#%%
for i in range(1, len(zeit)):
dt = zeit.iloc - zeit.iloc[i-1]
orientierung_x = orientierung_x[i-1] + winkelgeschwindigkeit_x.iloc * dt
orientierung_y = orientierung_y[i-1] + winkelgeschwindigkeit_y.iloc * dt
orientierung_z = orientierung_z[i-1] + winkelgeschwindigkeit_z.iloc * dt
orientierung_x = orientierung_x * (180/3.1415)
orientierung_y = orientierung_y * (180/3.1415)
orientierung_z = orientierung_z * (180/3.1415)
#%%
# Initialise the subplot function using number of rows and columns
figure, axis = plt.subplots(2, 2)
# For Sine Function
axis[0, 0].plot(zeit, orientierung_x)
axis[0, 0].set_title("x over t")
# For Cosine Function
axis[0, 1].plot(zeit, orientierung_y)
axis[0, 1].set_title("y over t")
# For Tangent Function
axis[1, 0].plot(zeit, orientierung_z)
axis[1, 0].set_title("z over t")
# For Tanh Function
axis[1, 1].plot()
axis[1, 1].set_title("spare square")
# Combine all the operations and display
plt.show()
# Plot der Bewegung in 3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(orientierung_x, orientierung_y, orientierung_z)
ax.set_xlabel('X-Achse')
ax.set_ylabel('Y-Achse')
ax.set_zlabel('Z-Achse')
ax.set_title('Bewegung des Handys in 3D')
plt.show()
А вот и мой лучший опыт в позиционных вычислениях:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# read data
dfraw = pd.read_csv('path_to_file, skiprows = [0,1,2,3,4,6,7], delimiter=',')
df = dfraw
df.rename(columns = {'Time':'time',
'LASI':'x1',
'Unnamed: 2':'y1',
'Unnamed: 3':'z1',
'RASI':'x2',
'Unnamed: 5':'y2',
'Unnamed: 6':'z2',
'LPSI':'x3',
'Unnamed: 8':'y3',
'Unnamed: 9':'z3',
'RPSI':'x4',
'Unnamed: 11':'y4',
'Unnamed: 12':'z4'},
inplace=True)
#%%
# naming data
zeit = df[["time"]].to_numpy()
Marker1 = df[["x1", "y1", "z1"]].to_numpy()
Marker2 = df[["x2", "y2", "z2"]].to_numpy()
Marker3 = df[["x3", "y3", "z3"]].to_numpy()
Marker4 = df[["x4", "y4", "y4"]].to_numpy()
import numpy as np
import matplotlib.pyplot as plt
# function to compute vectors
def compute_normal_vectors(marker_coordinates):
normal_vectors = []
for i in range(len(marker_coordinates[0])):
# Extracting coordinates for each marker at the current time point
marker1 = marker_coordinates[0]
marker2 = marker_coordinates[1]
marker3 = marker_coordinates[2]
marker4 = marker_coordinates[3][i]
# Computing vectors between the markers
vector1 = np.array(marker4) - np.array(marker1)
vector2 = np.array(marker3) - np.array(marker2)
# Computing the cross product to get the normal vector
normal_vector = np.cross(vector1, vector2)
# Normalizing the normal vector
normal_vector /= np.linalg.norm(normal_vector)
normal_vectors.append(normal_vector)
return normal_vectors
# function to compute normal angles
def compute_normal_angles(normal_vectors):
angles = []
for normal_vector in normal_vectors:
# Calculate angles with x, y, and z axes
z_angle = np.degrees(np.arccos(np.dot(normal_vector, [0, 0, 1])))
y_angle = np.degrees(np.arccos(np.dot(normal_vector, [0, 1, 0])))
x_angle = np.degrees(np.arccos(np.dot(normal_vector, [1, 0, 0])))
angles.append((x_angle, y_angle, z_angle))
return angles
# function to plot
def plot_angle_over_time(angle, time_points, title):
time_points = np.array(time_points)
angle = np.array(angle)
# Subtracting angle at time point 0 from all other time points
angle_at_t0 = angle[0]
angle = angle - angle_at_t0
plt.figure(figsize=(10, 6))
plt.plot(time_points, angle)
plt.title(title)
plt.xlabel('Zeitpunkt')
plt.ylabel('Winkel (in Grad)')
plt.xticks(time_points[::2])
plt.grid(True)
plt.show()
# adding coordinates
marker_coordinates = [Marker1, Marker2, Marker3, Marker4]
# time steps
time_points = zeit
# computing normal vectors
normal_vectors = compute_normal_vectors(marker_coordinates)
# Computing angles
angles = compute_normal_angles(normal_vectors)
# Plotting angles over time
for i, axis_name in enumerate(['X-Achse', 'Y-Achse', 'Z-Achse']):
plot_angle_over_time([angle[i] for angle in angles], time_points, f'Winkel zur {axis_name} über der Zeit')
Подробнее здесь: https://stackoverflow.com/questions/784 ... oordinates