import math def calvel(t,a,v0): return v0+a*t def calpos(t,a,v,s0): return s0 + v * t + 0.5 * a * t * t #速度规划之后 获取 当前加速度 速度 位置 def CalPosVel(movlindata, act_t, pos, vel,acc): if ( act_t - movlindata.t[3] > 10e-6): act_t = movlindata.t[3] return -1 elif(act_t - movlindata.t[0] < -10e-6): act_t = movlindata.t[0] return -1 for i in range(3): if( ( act_t - movlindata.t[i] > -10e-6) and ( act_t - movlindata.t[i+1] <= 10e-6 ) ): acc = movlindata.a[i+1] vel = calvel(act_t - movlindata.t[i] , movlindata.a[i+1], movlindata.v[i]) pos = calpos(act_t - movlindata.t[i] , movlindata.a[i+1], movlindata.v[i],movlindata.s[i] ) return pos #input #q0: 起始位置 #q1: 终点位置 #v0: 起始速度 #v1: 终点速度 #vmax: 最大速度 #amax: 最大加速度 #output #time: 时间序列 #q: 位置序列 #qd: 速度序列 #qdd: 加速度序列 def TSpeedCruveMethod(q0,q1,v0,v1,vmax,amax,ts): # input q0,q1,vo,v1,vmax,amax # output time,q,qd,qdd L = q1 - q0 v0 = v0/L v1 = v1/L vmax = vmax/L amax = amax/L v_temp = math.sqrt((2.0 * amax*(1) + (v1*v1 + v0*v0)) / 2.0) if(v_temp<vmax): vlim = v_temp else: vlim = vmax Ta = (vlim-v0)/amax Sa = v0*Ta+amax*Ta*Ta/2 Tv = (1-(vlim*vlim-v0*v0)/(2*amax)-(v1*v1-vlim*vlim)/(2*-amax))/vlim Sv = vlim*Tv Td = (vlim-v1)/amax Sd = vlim*Td - amax*Td*Td/2 T = Ta + Tv +Td T_t = [0,Ta,Ta+Tv,Ta+Tv+Td] a_t = [0,amax,0,-amax] v_t = [0,0,0,0] s_t = [0,0,0,0] for i in range(3): v_t[i+1] = calvel(T_t[i+1] - T_t[i], a_t[i+1], v_t[i]) s_t[i+1] = calpos(T_t[i+1] - T_t[i], a_t[i+1], v_t[i], s_t[i] ) k = round(T/ts) return [T_t,a_t, v_t , s_t, k]

2023-04-06by@2842511358-8rkJK&@python.Model: gpt-3.5
2842511358-8rkJK

You are a Python Coder Expert,I have something to ask you.

Avatar
2842511358-8rkJK

import math

def calvel(t,a,v0):
return v0+a*t

def calpos(t,a,v,s0):
return s0 + v * t + 0.5 * a * t * t

#速度规划之后 获取 当前加速度 速度 位置
def CalPosVel(movlindata, act_t, pos, vel,acc):
if ( act_t - movlindata.t[3] > 10e-6):
act_t = movlindata.t[3]

    return -1
elif(act_t - movlindata.t[0] < -10e-6):
    act_t = movlindata.t[0]

    return -1
for i in range(3):
    if(  ( act_t - movlindata.t[i] > -10e-6) and ( act_t - movlindata.t[i+1] <= 10e-6 ) ):
        acc = movlindata.a[i+1]
        vel = calvel(act_t - movlindata.t[i] , movlindata.a[i+1], movlindata.v[i])
        pos = calpos(act_t - movlindata.t[i] , movlindata.a[i+1], movlindata.v[i],movlindata.s[i] )

return pos

#input
#q0: 起始位置
#q1: 终点位置
#v0: 起始速度
#v1: 终点速度
#vmax: 最大速度
#amax: 最大加速度
#output
#time: 时间序列
#q: 位置序列
#qd: 速度序列
#qdd: 加速度序列
def TSpeedCruveMethod(q0,q1,v0,v1,vmax,amax,ts):

input q0,q1,vo,v1,vmax,amax

output time,q,qd,qdd

L = q1 - q0


v0 = v0/L
v1 = v1/L
vmax = vmax/L

amax = amax/L

v_temp = math.sqrt((2.0 * amax*(1) + (v1*v1 + v0*v0)) / 2.0)

if(v_temp<vmax):
    vlim = v_temp
else:
    vlim = vmax

Ta = (vlim-v0)/amax
Sa = v0*Ta+amax*Ta*Ta/2

Tv = (1-(vlim*vlim-v0*v0)/(2*amax)-(v1*v1-vlim*vlim)/(2*-amax))/vlim
Sv = vlim*Tv

Td = (vlim-v1)/amax
Sd = vlim*Td - amax*Td*Td/2
T = Ta + Tv +Td


T_t = [0,Ta,Ta+Tv,Ta+Tv+Td]
a_t = [0,amax,0,-amax]

v_t = [0,0,0,0]
s_t = [0,0,0,0]


for i in range(3):
    v_t[i+1] = calvel(T_t[i+1] - T_t[i],  a_t[i+1],  v_t[i])
    s_t[i+1] = calpos(T_t[i+1] - T_t[i],  a_t[i+1],  v_t[i], s_t[i] )



k = round(T/ts)

return [T_t,a_t, v_t , s_t,  k]
Avatar
Avatar

The code you provided seems to be related to motion planning or trajectory generation. Specifically, it defines functions for calculating velocity and position given acceleration, and provides a function for generating a time-optimal velocity profile for a linear movement.

The calvel function calculates the velocity given acceleration, time, and initial velocity. The calpos function calculates position given acceleration, time, initial velocity, and initial position.

The CalPosVel function uses the movlindata input to determine the acceleration, velocity, and position at a given time act_t. It first checks if act_t is within the time range of the movlindata trajectory. If it is not, it returns -1. If it is within the range, it uses the calvel and calpos functions to calculate the velocity and position at act_t.

The TSpeedCruveMethod function generates a time-optimal velocity profile for a linear movement with given initial and final positions, velocities, maximum velocity, and maximum acceleration. It first scales the inputs such that the distance to travel is 1. It then calculates the time-optimal velocity profile using a trapezoidal velocity profile. The output is a time sequence, position sequence, velocity sequence, and acceleration sequence, as well as the number of points in the generated trajectory.

2842511358-8rkJK

将以上python代码转换为C++

Avatar
Avatar

以下是将给出的 Python 代码转换为 C++ 代码的示例:

#include <cmath>
#include <vector>

double calvel(double t, double a, double v0) {
    return v0 + a * t;
}

double calpos(double t, double a, double v, double s0) {
    return s0 + v * t + 0.5 * a * t * t;
}

double CalPosVel(const std::vector<double>& t, const std::vector<double>& a, const std::vector<double>& v, const std::vector<double>& s, double act_t, double& acc, double& vel, double& pos) {
    if (act_t - t[3] > 10e-6) {
        act_t = t[3];
        return -1;
    } else if (act_t - t[0] < -10e-6) {
        act_t = t[0];
        return -1;
    }
    for (int i = 0; i < 3; ++i) {
        if (act_t - t[i] > -10e-6 && act_t - t[i+1] <= 10e-6) {
            acc = a[i+1];
            vel = calvel(act_t - t[i], a[i+1], v[i]);
            pos = calpos(act_t - t[i], a[i+1], v[i], s[i]);
        }
    }
    return pos;
}

std::vector<double> TSpeedCruveMethod(double q0, double q1, double v0, double v1, double vmax, double amax, double ts) {
    double L = q1 - q0;
    v0 /= L;
    v1 /= L;
    vmax /= L;
    amax /= L;
    double v_temp = std::sqrt((2.0 * amax*(1) + (v1*v1 + v0*v0)) / 2.0);
    double vlim = (v_temp < vmax) ? v_temp : vmax;
    double Ta = (vlim - v0) / amax;
    double Sa = v0 * Ta + amax * Ta * Ta / 2;
    double Tv = (1 - (vlim*vlim - v0*v0) / (2 * amax) - (v1*v1 - vlim*vlim) / (2 * -amax)) / vlim;
    double Sv = vlim * Tv;
    double Td = (vlim - v1) / amax;
    double Sd = vlim * Td - amax * Td * Td / 2;
    double T = Ta + Tv + Td;
    std::vector<double> T_t = {0, Ta, Ta + Tv, Ta + Tv + Td};
    std::vector<double> a_t = {0, amax, 0, -amax};
    std::vector<double> v_t = {0, 0, 0, 0};
    std::vector<double> s_t = {0, 0, 0, 0};
    for (int i = 0; i < 3; ++i) {
        v_t[i+1] = calvel(T_t[i+1] - T_t[i], a_t[i+1], v_t[i]);
        s_t[i+1] = calpos(T_t[i+1] - T_t[i], a_t[i+1], v_t[i], s_t[i]);
    }
    int k = std::round(T / ts);
    return std::vector<double>{T_t[0], T_t[1], T_t[2], T_t[3], a_t[0], a_t[1], a_t[2], a_t[3], v_t[0], v_t[1], v_t[2], v_t[3], s_t[0], s_t[1], s_t[2], s_t[3], k};
}

需要注意的是,C++ 中没有 Python 中的列表(list)数据类型,因此使用 C++ 中的 std::vector 来代替。此外,C++ 中需要声明函数的参数类型和返回值类型,而 Python 中不需要。

2842511358-8rkJK

import robot_arm_math as robot_math
import velocity_planner as velocity_planner
import math

import numpy as np

#xyz笛卡尔速度 和旋转轴rx ry rz旋转角速度
class DynamicInfo:
vel = np.zeros((1,6))
acc = np.zeros((1,6))

class MoveLineData:
#当前时间
current_time = 0
#运行总时间
max_time = 0
#起始点齐次矩阵
start_frame = np.identity(4)

#xyz方向起点
direct_start = np.zeros((1,3))
#xyz方向长度
direct_length = np.zeros((1,3))
#总长度
total_lenth = np.zeros((1,3))

quaternion = robot_math.QuaternionData()
max_axis_number = 0 
max_time = 0.0
total_num = 0
#运动规律
t = np.array([0,0,0,0])
a = np.array([0,0,0,0])
v = np.array([0,0,0,0])
s = np.array([0,0,0,0])
totalnum = 0
Ts = 0.01
vmax = 0.0
amax = 0.0
def __init__(self):
    self.max_time = 0

def __eq__(self,other):
    if isinstance(other, MoveLineData):
        return 

#最大a v
class DynamicPara:

#位置+姿态
max_a = np.zeros((1,2))
max_v = np.zeros((1,2))
def __init__(self,dyna,dynv):
    self.max_a = dyna
    self.max_v = dynv

start起始位姿 需转 齐次矩阵 end终点位姿 需转齐次矩阵

def LinPlanner(start, end, dynamicPara, movlindata):

movlindata.max_time = 0

startmat = robot_math.EulerAngleToMat(start)
print(start)
print( "startmat @@@@@@@@@@@@@@@@@@@@@@@@@@@")
print(startmat)

movlindata.start_frame = startmat

for i in range(3):
    movlindata.direct_start[0,i] = start[i]
    movlindata.direct_length[0,i] = end[i] - start[i]

#长度
len_sum = 0.0
for i in range(3):
    len_sum = len_sum + ( movlindata.direct_length[0,i] )**2
movlindata.total_lenth[0,0] =  math.sqrt(len_sum)
#姿态规划
qs = robot_math.Eul2Quat(start[5],start[4],start[3])
qe = robot_math.Eul2Quat(end[5],end[4],end[3])

movlindata.quaternion.qs = qs
movlindata.quaternion.qe = qe

#轴角
InvQuat = robot_math.invQuat(movlindata.quaternion.qs)
deltaQuat = robot_math.MultiQuat(movlindata.quaternion.qe ,InvQuat)
QuaAxis = robot_math.GetQuaAxis(deltaQuat)
movlindata.total_lenth[0,1] = QuaAxis[0]



#位 姿优先度  确定时间最长的轴
max_axis_time = 0.0
max_axis_number = 1
act_axis_time = 0.0

for i in range(2):
    #有位移并且没有速度,报错 return 0
    act_axis_time = movlindata.total_lenth[0,i] / np.abs(  dynamicPara.max_v[0,i] )

    if(act_axis_time - max_axis_time > 1e-6):
        max_axis_time = act_axis_time
        max_axis_number = i #需要规划的轴号

q0 = 0
v0 = 0
v1 = 0

#v0  ===>v0[max_axis_number]
#v1  ===>v1[max_axis_number]
#max_v =>dynamicPara.max_v[max_axis_number]
#max_v =>dynamicPara.amax[max_axis_number]

#[q0,movlindata.total_lenth[0,max_axis_number], v0,v1,dynamicPara.max_v[0,max_axis_number],

dynamicPara.max_a[0,max_axis_number],movlindata.Ts))

[T_t, a_t, v_t, s_t,  k] = velocity_planner.TSpeedCruveMethod(q0,movlindata.total_lenth[0,max_axis_number], v0,v1,dynamicPara.max_v[0,max_axis_number],dynamicPara.max_a[0,max_axis_number],movlindata.Ts)


movlindata.max_axis_number = max_axis_number
movlindata.t = T_t
movlindata.a = a_t
movlindata.v = v_t
movlindata.s = s_t

movlindata.max_time = T_t[3]
movlindata.total_num = k

return 0
Avatar
Avatar

An error occurred with your deployment

EDGE_FUNCTION_INVOCATION_TIMEOUT

2842511358-8rkJK

将python代码转换为C++代码

Avatar