使用ceres solver时发现,发现自定义代价函数和输入代价函数使用AutoDiffCostFunction的参数顺序有些不同,总结如下:
1. 自定义代价函数
一个例子如下:
struct CostFunctor {
template <typename T>
bool operator()(const T* const x, T* residual) const {
residual[0] = T(10.0) - x[0];
return true;
}
};
而在定义operator()
时参数顺序是先是参数块,然后是残差块
2. AutoDiffCostFunction
ceres solver中类的源码如下:
template <typename CostFunctor,
int kNumResiduals, // Number of residuals, or ceres::DYNAMIC.
int N0, // Number of parameters in block 0.
int N1 = 0, // Number of parameters in block 1.
int N2 = 0, // Number of parameters in block 2.
int N3 = 0, // Number of parameters in block 3.
int N4 = 0, // Number of parameters in block 4.
int N5 = 0, // Number of parameters in block 5.
int N6 = 0, // Number of parameters in block 6.
int N7 = 0, // Number of parameters in block 7.
int N8 = 0, // Number of parameters in block 8.
int N9 = 0> // Number of parameters in block 9.
class AutoDiffCostFunction : public SizedCostFunction<kNumResiduals,
N0, N1, N2, N3, N4,
N5, N6, N7, N8, N9>
{
...
}
template<int kNumResiduals,
int N0 = 0, int N1 = 0, int N2 = 0, int N3 = 0, int N4 = 0,
int N5 = 0, int N6 = 0, int N7 = 0, int N8 = 0, int N9 = 0>
class SizedCostFunction : public CostFunction
{
...
}
所以模板的第1个参数是自定义的CostFunctor类,第2个参数是残差项的数量,第3个参数是第0个参数块的参数数量,后面依次类推,数量默认为0
3. 参数顺序总结
自定义代价函数的参数顺序:
- 参数块
- 残差块
- 雅克比(如果有的话)
AutoDiffCostFunction的模板参数顺序:
- 代价函数
- 残差块中残差项的数量
- 各参数块中参数的数量
网友评论