Levmar配置

原文有些错误,在我的博客里已经改好了:http://blog.sina.com.cn/s/blog_45b747f70101he1t.html

如果6或者7自由度机器人的运动学逆解无法找到解析解,我们就要用数值解法来处理。这属于非线性超越方程的数值解法问题。LM算法,也成为阻尼最小二乘法。

本人编程能力太弱,只好借助于库函数。看到网上教程有用Levmar(FAQ)来做LM算法的。Levmar可用于C++, Matlab,Perl, Python, Haskell and Tcl。本人在VS2010下编程,所以下面只谈谈如何在VS2010下配置。

经过测试,win7与win8 64位系统下的VS2010/VS2013用下面的方法配置可以成功。

准备工具:

1. cmake-2.8.12.1-win32-x86.zip (选择Binarydistributions栏下的第二个)。

2. clapack-3.2.1-CMAKE.tgz(页面做的稍乱,找到同名的那个压缩包下载)。

3. levmar-2.6

步骤:

1.  先将上面下载的三个压缩包都解压。解压后的cmake-2.8.12.1-win32-x86是编译工具,建议放在常用的工具文件夹下(英文目录,不要有中文)。解压后的clapack-3.2.1-CMAKE和levmar-2.6等会要用到,而且编程的时候也用到其做包含目录,因此不建议放在桌面。

2.  针对clapack-3.2.1-CMAKE的操作。双击打开cmake-gui.exe(该文件在cmake-2.8.12.1-win32-x86文件夹里的bin文件夹下)首先要对clapack-3.2.1-CMAKE进行编译。如图:

对于箭头1,点击右边的BrowseSource...将文件夹定位到第一步解压出的clapack3.2.1-CMAKE,对于箭头2,Browse Build..则是你要编译到的位置,为了方便我选择C:\CLAPACK。选择完之后,我们点击左下角的configure按钮,弹出的框里我们选择Visual Studio 10 Win64,点Finish等几秒钟,Configure结束后画面中间会出来一些红色的条框,不管它,我们再点Configure右边的Generate按钮,根据下面提示Generate
done后,可以先关掉这个窗口了。现在我们到C:\CLAPACK下,找到CLAPACK.sln这个文件,并双击,这时候会在VS2010里出来一个工程,等待加载完成后,我们选择生成解决方案。这里需要花点时间,等程序跑完之后会提示成功了33个项目(这一步是为了生成4个lib文件)。下面我们可以先关掉VS2010。然后再次到C:\CLAPACK文件夹下,我们要寻找4个.lib文件(为了在levmar中要链接他们),这4个文件分别是:

l C:\Clapack\BLAS\SRC\Debug:       blas.lib

l C:\Clapack\F2CLIBS\libf2c\Debug:    libf2c.lib

l C:\Clapack\SRC\Debug:              lapack.lib

l C:\Clapack\Testing\MATGEN\Debug:     tmglib.lib

为了便于我们在后面链接他们,我们先在C:\CLAPACK下新建一个LIB文件夹,然后复制上面四个lib文件到这个文件夹下。到这里第二步基本完成了。

注意:复制libf2c.lib的时候我们将文件名改为f2c.lib(因为后面链接的默认名是f2c.lib)

3.   针对LEVMAR2.6部分接下去我们再次打开cmake-gui.exe,Browse Source...选择第一步解压出来的levmar-2.6,Browse Build..选择要编译到的位置,这里我选的是C:\lm26。然后点击Configure,选择Visual Studio 10 Win64,之后弹出如下所示:

将LAPACKBLAS_DIR 后面的usr/lib文件夹路径改成第二步中我们自己建的那个文件夹路径 C:\CLAPACK\LIB。然后再次点击左下角的Configure,红色变白色,之后再点击Generate。下面我们到 C:\lm26文件夹下找到LEVMAR.sln文件,运行它,点生成解决方案,全部成功后关掉。这一步是为里生成C:\lm26\Debug\levmar.lib文件。到这里配置部分基本完成了,下面讲如何在我们自己的程序里用。

4.  新建一个VS2010的c++工程lm_test,点顶部菜单栏的项目,再点属性,点左侧的配置属性,再点右侧的配置管理器,点活动平台解决方案的下拉菜单,点新建,然后把Itanium换成x64点确定,如图

这样,我们就将我们的工程配置成了64位的。

然后右键点击左侧解决方案资源管理器中lm_test,选择属性,弹出的窗口左侧点击配置属性下的VC++目录,然后在右侧的包含目录中添加我们在第一步中解压出的levmar2.6的文件夹,如图

确定后,我们再在库目录下再添加两个文件夹,一个是我们在第二步中自己新建的那个C:\CLAPACK\LIB,另一个是C:\lm26\Debug,为的就是这两个文件夹里面的lib文件,如图:

确定后我们点击左侧的链接器、输入,附加依赖项添加第二步生成4个lib文件和第三步生成的1个lib文件: lapack.lib, blas.lib, f2c.lib,tmglib.lib.levmar.lib。

现在把下面的程序拷贝进去运行看看吧。(可以对比 levmar-2.6 里面的 expfit.c  )

// testlevmar.cpp : Defines the entry pointfor the console application.

//

////////////////////////////////////////////////////////////////////////////////////

// Example program that shows how to use levmar in order to fit the three-

// parameter exponential model x_i = p[0]*exp(-p[1]*i) + p[2] to a set of

// data measurements; example is based on a similar one from GSL.

//

// Copyright (C) 2008-11  ManolisLourakis (lourakis at ics forth gr)

// Institute of Computer Science, Foundation for Research & Technology- Hellas

// Heraklion, Crete, Greece.

//

// This program is free software; you can redistribute it and/or modify

// it under the terms of the GNU General Public License as published by

// the Free Software Foundation; either version 2 of the License, or

// (at your option) any later version.

//

// This program is distributed in the hope that it will be useful,

// but WITHOUT ANY WARRANTY; without even the implied warranty of

// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

// GNU General Public License for more details.

//

////////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <math.h>

#include "levmar.h"

#ifdef _cplusplus

extern "C"{

#include "f2c.h"

#include "clapack.h"

}

#endif

#ifndef LM_DBL_PREC

#error Example program assumes that levmarhas been compiled with double precision, see LM_DBL_PREC!

#endif

#define M_PI 3.14

#undef REPEATABLE_RANDOM

#define DBL_RAND_MAX (double)(RAND_MAX)

#ifdef _MSC_VER // MSVC

#include <process.h>

#define GETPID  _getpid

#elif defined(__GNUC__) // GCC

#include <sys/types.h>

#include <unistd.h>

#define GETPID  getpid

#else

#warning Do not know the name of thefunction returning the process id for your OS / compiler combination

#define GETPID  0

#endif

#ifdef REPEATABLE_RANDOM

#define INIT_RANDOM(seed) srandom(seed)

#else

#define INIT_RANDOM(seed)srandom((int)GETPID()) // seed unused

#endif

double gNoise(double m, double s)

{

doubler1, r2, val;

r1= ((double)rand()) / DBL_RAND_MAX;

r2= ((double)rand()) / DBL_RAND_MAX;

val= sqrt(-2.0*log(r1))*cos(2.0*M_PI*r2);

val= s*val + m;

returnval;

}

struct xtradata{

charmsg[128];

};

void expfunc(double *p, double *x, int m,int n, void *data)

{

registerint i;

structxtradata *dat;

dat= (struct xtradata *)data;

for(i = 0; i<n; ++i)

{

x[i]= p[0] * exp(-p[1] * i) + p[2];

}

}

/* Jacobian of expfunc() */

void jacexpfunc(double *p, double *jac, intm, int n, void *data)

{

registerint i, j;

structxtradata *dat;

dat= (struct xtradata *)data;

/*fill Jacobian row by row */

for(i = j = 0; i<n; ++i)

{

jac[j++]= exp(-p[1] * i);

jac[j++]= -p[0] * i*exp(-p[1] * i);

jac[j++] = 1.0;

}

}

int main()

{

constint n = 40, m = 3; // 40 measurements, 3 parameters

doublep[m], x[n], opts[LM_OPTS_SZ], info[LM_INFO_SZ];

registerint i;

intret;

structxtradata data;

/*generate some measurement using the exponential model with

*parameters (5.0, 0.1, 1.0), corrupted with zero-mean

*Gaussian noise of s=0.1

*/

//INIT_RANDOM(0);//这个地方源程序是没注释掉的

for(i = 0; i<n; ++i)

x[i]= (5.0*exp(-0.1*i) + 1.0) + gNoise(0.0, 0.1);

/*initial parameters estimate: (1.0, 0.0, 0.0) */

p[0]= 1.0; p[1] = 0.0; p[2] = 0.0;

/*optimization control parameters; passing to levmar NULL instead of opts revertsto defaults */

opts[0]= LM_INIT_MU; opts[1] = 1E-15; opts[2] = 1E-15; opts[3] = 1E-20;

opts[4]= LM_DIFF_DELTA; // relevant only if the finite difference Jacobian version isused

strcpy_s(data.msg,"Hello there!");

/*invoke the optimization function */

ret= dlevmar_der(expfunc, jacexpfunc, p, x, m, n, 1000, opts, info, NULL, NULL,(void *)&data); // with analytic Jacobian

//ret=dlevmar_dif(expfunc,p, x, m, n, 1000, opts, info, NULL, NULL, (void *)&data); // withoutJacobian

printf("Levenberg-Marquardtreturned in %g iter, reason %g, sumsq %g [%g]\n", info[5], info[6],info[1], info[0]);

printf("Bestfit parameters: %.7g %.7g %.7g\n", p[0], p[1], p[2]);

system("pause");

exit(0);

}

Levmar 配置的更多相关文章

  1. NDK配置debug环境时:Error:FAILURE: Build failed with an exception

    Error:FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:ex ...

  2. levmar ndk 编译

         levmar是一个强大的和高效率的C/C++库,采用Levenberg - 马奎德(LM)优化算法, 主要是为了解决非线性最小二乘问题.官网是:http://users.ics.forth. ...

  3. Levmar:Levenberg-Marquardt非线性最小二乘算法

    Levmar:Levenberg-Marquardt非线性最小二乘算法 eryar@163.com Abstract. Levmar is GPL native ANSI C implementati ...

  4. 配置android sdk 环境

    1:下载adnroid sdk安装包 官方下载地址无法打开,没有vpn,使用下面这个地址下载,地址:http://www.android-studio.org/

  5. Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记

    以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...

  6. react-router 组件式配置与对象式配置小区别

    1. react-router 对象式配置 和 组件式配置    组件式配置(Redirect) ----对应---- 对象式配置(onEnter钩子) IndexRedirect -----对应-- ...

  7. 总结:Mac前端开发环境的搭建(配置)

    新年新气象,在2016年的第一天,我入手了人生中第一台自己的电脑(大一时好友赠送的电脑在一次无意中烧坏了主板,此后便不断借用别人的或者网站的).macbook air,身上已无分文...接下来半年的房 ...

  8. Android Studio 多个编译环境配置 多渠道打包 APK输出配置

    看完这篇你学到什么: 熟悉gradle的构建配置 熟悉代码构建环境的目录结构,你知道的不仅仅是只有src/main 开发.生成环境等等环境可以任意切换打包 多渠道打包 APK输出文件配置 需求 一般我 ...

  9. Virtual Box配置CentOS7网络(图文教程)

    之前很多次安装CentOS7虚拟机,每次配置网络在网上找教程,今天总结一下,全图文配置,方便以后查看. Virtual Box可选的网络接入方式包括: NAT 网络地址转换模式(NAT,Network ...

随机推荐

  1. Harmonic Number LightOJ - 1234 (分段打表)

    题意: 求调和级数,但n很大啦.. 解析: 分段打表  每间隔50存储一个数,在计算时  只需要找到离输入的n最近的那个数 以它为起点 开始计算即可 emm...补充一下调和级数的运算公式   r为常 ...

  2. ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang (分块思想)

    题目链接:https://nanti.jisuanke.com/t/31451 题意: 给你一颗树,树上各点有初始权值,你有两种操作: 1. 给树中深度为l的点全部+x,(根节点为1,深度为0) 2. ...

  3. PHP 判断浏览器语言

    详情请参看代码 作用:判断当前的浏览器语言.接收传入参数.拼接字符串 <?php $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2); if ...

  4. CodeForces 464E The Classic Problem | 呆克斯歘 主席树维护高精度

    题意描述 有一个\(n\)点\(m\)边的无向图,第\(i\)条边的边权是\(2^{a_i}\).求点\(s\)到点\(t\)的最短路长度(对\(10^9 + 7\)取模). 题解 思路很简单--用主 ...

  5. ORMLite学习入门笔记

    ORMLite学习入门笔记 使用原始的SQLiteHelper来操作维护数据库有点过于繁琐,重复工作量较大.所以会想到使用一个比较方便的ORM来维护我们本地的数据库,各位业界前辈都给我推荐了ORMLi ...

  6. Ubuntu安装Atom编辑器

    安装方法 执行以下命令 sudo add-apt-repository ppa:webupd8team/atom sudo apt-get update udo apt-get install ato ...

  7. VB|xp风格:终于解决了“图片优化软件”在部分xp系统上无法启动的问题。

    一年以来,图片优化软件一直存在一个“兼容”性问题. 因为之前的软件是在windows 2003系统上开发的,制作成安装文件后,经部分用户测试发现,在部分用户的xp系统上安装后,无法正常启动,只能听到p ...

  8. Django框架之模板继承和静态文件配置

    一.模板继承 目的是:减少代码的冗余 语法: {% block classinfo %} {% endblock %} 具体步骤: 1.创建一个base.html文件,2.把要显示的页面的内容写在这里 ...

  9. QQ企业邮箱+Spring+Javamail+ActiveMQ(发送企业邮件)

    原来有个教程是关于Javamail的,但是那个是自己写Javamail的发送过程,这次不同的是:使用Spring的Mail功能,使用了消息队列. 先看一下设想的场景 不过本文重点不是消息队列,而是使用 ...

  10. 结尾非零数的奇偶性(问题来源于PythonTip)

    给你一个正整数列表 L, 判断列表内所有数字乘积的最后一个非零数字的奇偶性.如果为奇数输出1,偶数则输出0.. 例如:L=[2,8,3,50] 则输出:0 L = [2,8,3,50] c2 = 0 ...