优化器 非线性
https://nlopt.readthedocs.io/en/latest/
射弹发射优化
projectile launch optimization
worldbody中 geom没有joint的话就是默认固定
如何使用非线性优化 求解
// void simulator(double Xin[3],double Xout[2])
// {
// double v,theta,time_of_flight;
// v = Xin[0];
// theta = Xin[1];
// time_of_flight = Xin[2];
//
// d->qvel[0] = v*cos(theta);
// d->qvel[2] = v*sin(theta);
// while (d->time < time_of_flight)
// {
// mj_step(m,d);
// }
// //printf("%f %f %f \n",d->time,d->qpos[0],d->qpos[2]);
// Xout[0] = d->qpos[0];
// Xout[1] = d->qpos[2];
// }
先初始化,然后就是开始循环,但是他这里有个问题,就是
他的意思是他初始化以后他的初始化里面调用了 simulator,里面step了
然后他初始化后 时间就变成2了 ,他想要初始化后时间从0开始
就在初始化函数里用一个 mj_reset
mj_resetData(m, d);
在main 中include constrain c
在constrain 里extern 声明参数,或者用别的方法
reset的位置错了。constrain中的simulator用到了积分器,要注意积分器的时间,他constrain中要一次次优化,每次看效果 每次搞完都要置零
更改优化损失函数 t最小
NPLOT的一个问题
在equality中call simulator
如果要用什么积分器计算 又要调用simulator
此时可以计算cost
开发者没有考虑 你在这里要调用两次simulator,特别是当你的时间很长
中间的参数,缓存 更新 追踪 计算啥的
作者给出的建议是,弄一个全局变量,然后把中间计算参数给到这个变量,可以访问
equality是在cost后面调用的
把equality中的计算剪切给到cost中。然后用cost中变量保存的参数到equality用
double cost = 0*x[2];
lecture 12 利用非线性优化 进行运动学反解
他的意思是 你这里会重复运行 关于data 用于robot 还是 simulator
一个用于 forward simulation 在每一个时间步长
一个用于计算来找到torque
所以这里用了一个分支,可以随意重置这个分支
数据分支
lemniscate
void my_controller(const mjModel* m, mjData* d)
{
//write control here
double Xin[2] = {d->qpos[0],d->qpos[1]};
double Xref[2]={0};
curve(d->time, Xref);
inverse_kinematics(Xin,Xref);
d->ctrl[0] = Xin[0]; d->ctrl[2] = Xin[1];
xref=Xref[0]; zref=Xref[1];
xact=d->sensordata[0]; zact = d->sensordata[2];
//write data here (dont change/dete this function call; instead write what you need to save in save_data)
if ( loop_index%data_frequency==0)
{
save_data(m,d);
}
loop_index = loop_index + 1;
}
为他配置偏移中心 以及 角速度 和 幅度
根据关节配置的初始位置来反推 你这个轨迹的中心点
左边是你设置了 你每次step 都会调用
你使用了4次 my controller is called 4 times
右边的不会每次step都会调用你controller,相当于是独立了