我有一个现有的代码库,可以对机器人模型进行一些坐标转换和动力学计算,我希望将Cppad添加到所有机器人参数中,但是遇到了这样的问题:
据我所知,正常的CppAD过程是建立动态向量a
,然后调用Independent(a)
,然后进行一些计算,然后定义一个函数CppAD::ADFun<double> f(a,b);
来构建在输入和输出之间的图形上,其中b
是取决于a
的结果。
问题是,假设我有一个3乘3的惯性矩阵M
(本征类型),我想计算一个3的动力学变量result
的导数,仅关注M
的对角线元素(因此有3个)。从M到D的计算都在代码库中完成,而我所做的有点像
Eigen::Matrix<Scalar, Eigen::Dynamic, 1> AD_M(3); //input, or parameter of the function
Eigen::Matrix<Scalar, Eigen::Dynamic, 1> AD_result(3); //output, or the value of the function
AD_M << M(0,0), M(1,1), M(2,2); // only taking the diagonal values
Independent(AD_M);
... compute() //some function that calculates AD_result.
CppAD::ADFun<double> f(AD_M,AD_result);
f.jacobian(x_M); // x_M is some initialize parameter of M
当我这样做时,我得到了雅可比行列的所有零输出。我认为这样做的原因是,通过进行AD_M << M(0,0), M(1,1), M(2,2);
我实际上是在复制M(0,0), M(1,1), M(2,2)
,而不是实际引用或对其进行浅表复制。函数compute()
从原始M
取值,而不是基于AD_M
构建图,所以所有的雅各布都为0。
有人可以告诉我是否有可能使用引用来构建动态数组,或者如何针对这种情况进行其他工作吗?还是就像我知道某个参数的地址一样,如何使用这些地址到ADfun()函数构造一个动态数组?任何建议将不胜感激。