Я хочу, чтобы моя «Следующая система координат (FCS)» достигла положения «установленной системы координат (SCS)», сохраняя при этом профиль трапециевидной скорости с использованием заданных параметров как ограниченная скорость и ускорение. Тем не менее, я сталкиваюсь с такими проблемами, как колебания скорости и отсутствие целевой позиции, возможно, из -за точных ошибок. Несмотря на тестирование различных решений, я не смог достичь неизменно положительных результатов. < /P>
поведение системы: < /h3>
Позиции для FCS и SCS являются случайными. Как только FCS достигает
целевой позиции SCS (
Код: Выделить всё
linear_distance < 1e-3< /code>), SCS перемещается случайным образом на новую позицию ... пока, но
[b] в будущем я хочу, чтобы SCS двигался случайным образом и непредсказуемо в любой момент, не ожидая FCS Чтобы добраться до него < /strong>. < /li>
Каждый шаг начинается с расчета линейной скорости
fcs, а затем скорость пропорционально разделена между x, y,
и z оси, основанные на нормированном векторе направления от FCS до SCS. Начиная мои расчеты с ускорения и перехода от ускорения
к скорости, а затем от скорости до положения стало слишком сложным, и
трудно отладить, но я готов дать ему еще один шанс. < /Li>
< /ul>
мой алгоритм сбоя (Python): < /h3>
Часть 1. Расчеты линейной скорости: < /h4>
for step in range(cycles):
axis_distance = np.array(current_scs[:3]) - np.array(current_fcs[:3])
linear_distance = np.linalg.norm(axis_distance)
breaking_distance = (linear_velocity[-1]**2) / (2 * max_deceleration)
# Acceleration or constant velocity phase
if linear_distance > breaking_distance:
if np.abs(max_velocity - linear_velocity[-1]) > max_acceleration * cycle_time: # Preventing overshooting max_velocity
linear_velocity.append(linear_velocity[-1] + max_acceleration * cycle_time)
else:
linear_velocity.append(max_velocity)
# Deceleration phase
else:
if linear_velocity[-1] > max_deceleration * cycle_time: # Preventing overshooting 0
linear_velocity.append(linear_velocity[-1] - max_deceleration * cycle_time)
else:
linear_velocity.append(0)
linear_acceleration.append((linear_velocity[-1] - linear_velocity[-2]) / cycle_time)
< /code>
Часть 2. Разделение линейной скорости между XYZ: < /h4>
for i in range(3):
factor = axis_distance[i] / linear_distance if linear_distance != 0 else 0
new_axis_velocity = linear_velocity[-1] * factor
if velocity[i][-1] < new_axis_velocity:
velocity[i].append(velocity[i][-1] + np.min([max_acceleration * cycle_time, new_axis_velocity - velocity[i][-1]]))
#print(f"{step} accelerating at axis {i}")
elif velocity[i][-1] > new_axis_velocity:
velocity[i].append(velocity[i][-1] - np.min([max_deceleration * cycle_time, velocity[i][-1] - new_axis_velocity]))
#print(f"{step} decelerating at axis {i}")
else:
velocity[i].append(velocity[i][-1])
#print(f"{step} target velocity for axis {i} reached")
acceleration[i].append((velocity[i][-1] - velocity[i][-2]) / cycle_time)
current_fcs[i] += velocity[i][-1] * cycle_time
< /code>
output: < /h3>
Чтобы отслеживать прогресс, я регистрирую данные и отображаю их на графиках. Вот почему, например, Скорость сейчас массива массивов. Это не будет, когда я закончу. Вот один набор графиков:
Как вы видите, что FCS траектория сначала пропустила SCS, Но затем он нажимал и нажимает снова, это следующие позиции с правильным замедлением. < /p>
SCS reached at 5574 : linear_distance = 0.0008199809854013105, linear_velocity = 2.7999999999649416
SCS reached at 9163 : linear_distance = 0.0008934633980521272, linear_velocity = 0.7999999999478358
и вот линейная скорость после деления на xyz
< /p>
Проблемы: < /h3>
Я мог бы продолжать пытаться исправить, но я не уверен, что это правильный подход в первое место. Мне не хватает фон в теории управления и планировании движения.
Я ищу обратную связь и любые советы по решению проблем, с которыми я сталкиваюсь!>
Подробнее здесь: https://stackoverflow.com/questions/794 ... gorithm-is