针对给定目标位置及速度的连续输入的轨迹段数据,用python实现一个梯形加减速规划算法,考虑轨迹段之间的速度连续,并用图形绘制原始数据和规划后的数据
时间: 2024-03-20 09:41:20 浏览: 130
以下是一个基于梯形加减速规划算法的Python代码,可以实现对给定的轨迹段进行规划并绘制原始数据和规划后的数据:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义梯形加减速规划函数
def trapezoid_planning(start_pos, end_pos, max_vel, max_acc, delta_t):
# 计算距离和方向
dist = abs(end_pos - start_pos)
direction = np.sign(end_pos - start_pos)
# 计算最大速度持续时间和距离
t1 = max_vel / max_acc
d1 = 0.5 * max_acc * t1 ** 2
# 判断是否需要加减速
if dist <= 2 * d1:
# 不需要加减速,匀速运动
t1 = np.sqrt(dist / max_acc)
t2 = t1
t3 = 0
d1 = 0.5 * max_acc * t1 ** 2
d2 = dist - 2 * d1
d3 = 0
else:
# 需要加减速,梯形运动
t2 = (dist - 2 * d1) / max_vel
t3 = t1
d2 = max_vel * t2
d3 = 0.5 * max_acc * t3 ** 2
# 计算时间和距离序列
t = np.arange(0, t1 + t2 + t3 + delta_t, delta_t)
d = start_pos + direction * (
np.minimum(np.maximum(0, t - t1), t1) ** 2 * max_acc / 2
+ np.minimum(np.maximum(0, t - t1 - t2), t3) * max_vel
+ np.maximum(np.minimum(t, t1), t1 - t3) ** 2 * max_acc / 2
)
# 返回时间和距离序列
return t, d
# 定义轨迹段数据
pos = [0, 0.5, 1, 2, 3, 2.5, 1.5, 0.5]
vel = [0.1, 0.2, 0.1, 0.1, 0.1, 0.2, 0.1, 0.1]
# 初始化规划后的轨迹段数据
planned_pos = [pos[0]]
planned_vel = [0]
# 对每个轨迹段进行规划
for i in range(1, len(pos)):
# 获取当前轨迹段的起始位置、结束位置和速度
start_pos = planned_pos[-1]
end_pos = pos[i]
vel_i = vel[i]
# 计算最大速度和加速度
max_vel = np.minimum(np.abs(vel_i), np.sqrt(np.abs(end_pos - start_pos) * np.abs(vel_i)))
max_acc = max_vel / 0.5
# 进行规划
t_i, planned_pos_i = trapezoid_planning(start_pos, end_pos, max_vel, max_acc, 0.01)
planned_vel_i = np.gradient(planned_pos_i, t_i)
# 添加规划后的轨迹段数据
planned_pos += list(planned_pos_i[1:])
planned_vel += list(planned_vel_i[1:])
# 绘制原始数据和规划后的数据
t = np.arange(0, len(pos), 0.01)
plt.plot(t, pos, label='Original Position')
plt.plot(np.arange(0, len(planned_pos) / 100, 0.01), planned_pos, label='Planned Position')
plt.xlabel('Time / s')
plt.ylabel('Position / m')
plt.legend()
plt.show()
```
这个代码将对给定的轨迹段进行梯形加减速规划,并绘制原始数据和规划后的数据的图形。可以根据需要调整轨迹段数据的位置和速度,来生成不同的规划结果。
阅读全文