VISP库IBVS仿真

2023-05-16

示例程序1–tutorial-ibvs-4pts.cpp

/*! \example tutorial-ibvs-4pts.cpp */
#include <visp3/visual_features/vpFeatureBuilder.h>
#include <visp3/vs/vpServo.h> //实现控制律的头文件
#include <visp3/robot/vpSimulatorCamera.h> //包含六自由度的虚拟相机

int main()
{
  try {
    vpHomogeneousMatrix cdMo(0, 0, 0.75, 0, 0, 0); //相机目标位置
    vpHomogeneousMatrix cMo(0.15, -0.1, 1.,        //相机初始位置
                            vpMath::rad(10), vpMath::rad(-10), vpMath::rad(50));

    vpPoint point[4] ;                             //四个角点
    point[0].setWorldCoordinates(-0.1,-0.1, 0);
    point[1].setWorldCoordinates( 0.1,-0.1, 0);
    point[2].setWorldCoordinates( 0.1, 0.1, 0);
    point[3].setWorldCoordinates(-0.1, 0.1, 0);

    vpServo task ;
    task.setServo(vpServo::EYEINHAND_CAMERA);     //初始化任务,手眼模型
    task.setInteractionMatrixType(vpServo::CURRENT);//设着交互矩阵类型(current, desired, mean or user defined)
    task.setLambda(0.5);                          //收敛速度

    vpFeaturePoint p[4], pd[4] ;                  //初始化特征点
    for (unsigned int i = 0 ; i < 4 ; i++) {
      point[i].track(cdMo);                      //相机坐标系下 跟踪特征点,并计算二位图像平面内的投影
      vpFeatureBuilder::create(pd[i], point[i]); //根据point[i]和相机参数,创建一个特征点,
      point[i].track(cMo);
      vpFeatureBuilder::create(p[i], point[i]);
      task.addFeature(p[i], pd[i]);
    }

    vpHomogeneousMatrix wMc, wMo;   //定义相机、目标位置
    vpSimulatorCamera robot;
    robot.setSamplingTime(0.040);
    robot.getPosition(wMc);
    wMo = wMc * cMo;

    for (unsigned int iter=0; iter < 150; iter ++) {
      robot.getPosition(wMc);
      cMo = wMc.inverse() * wMo;
      for (unsigned int i = 0 ; i < 4 ; i++) {   //通过将3维点投影到图像平面,来更新特征点
        point[i].track(cMo);
        vpFeatureBuilder::create(p[i], point[i]);
      }
      vpColVector v = task.computeControlLaw();
      robot.setVelocity(vpRobot::CAMERA_FRAME, v);
    }

    task.kill();
  }
  catch(vpException &e) {
    std::cout << "Catch an exception: " << e << std::endl;
  }
}

效果图
http://visp-doc.inria.fr/doxygen/visp-daily/tutorial-ibvs.html


vpHomogeneousMatrix cdMo(0, 0, 0.75, 0, 0, 0);
vpHomogeneousMatrix cMo(0.15, -0.1, 1., vpMath::rad(10), vpMath::rad(-10), vpMath::rad(50));

用两个齐次矩阵定义相机的目标位置与初始位置。前三个值表示平移分量,后三个表示旋转分量,组合成其次坐标表示,参考:http://blog.csdn.net/yjy728/article/details/78335758


vpPoint point[4] ;
point[0].setWorldCoordinates(-0.1,-0.1, 0);
point[1].setWorldCoordinates( 0.1,-0.1, 0);
point[2].setWorldCoordinates( 0.1, 0.1, 0);
point[3].setWorldCoordinates(-0.1, 0.1, 0);

然后定义边长20cm的正方形的四个角点;vpPoint这个数据类型定义如下。

   51 void
   52 vpPoint::init()
   53 {
   54   p.resize(3) ; p = 0 ; p[2] = 1 ;
   55   oP.resize(4) ; oP = 0 ; oP[3] = 1 ;
   56   cP.resize(4) ; cP = 0 ; cP[3] = 1 ;
   57 
   58   //default value Z (1 meters)
   59   set_Z(1) ;
   60 }

vpPoint这个类型里面包含了
1. p–图像平面p内的表示的特征坐标,与2维正规化坐标对应,单位m。
2. oP–目标坐标系表示的特征,也叫世界坐标系
3. cP–相机坐标系下的特征表示
setWorldCoordinates是设置了oP;


vpServo task ;
task.setServo(vpServo::EYEINHAND_CAMERA);
task.setInteractionMatrixType(vpServo::CURRENT);
task.setLambda(0.5);

将任务初始化为手眼相机的视觉伺服,控制器计算出来的是相机坐标系下的速度值。交互矩阵有当前特征值计算出来,需要在每个循环内更新。常数 λ 是收敛的速度,设为0.5。
其中:

vpServo::vpServoIteractionMatrixType区别
CURRENT使用当前特征点 s 计算出来的交互矩阵L̂ s
DESIRED使用目标特征点 s 计算出来的交互矩阵 L̂ s
MEAN使用 L̂ =(L̂ s+L̂ s)/2
USER-DEFINED控制律中,使用用户自定义的交互矩阵
vpFeaturePoint p[4], pd[4] ;

定义图像平面内的视觉特征,这里使用点特征,p[i]代表当前点特征,pd[i]代表目标特征。


for (unsigned int i = 0 ; i < 4 ; i++) {
  point[i].track(cdMo);
  vpFeatureBuilder::create(pd[i], point[i]);
  point[i].track(cMo);
  vpFeatureBuilder::create(p[i], point[i]);
  task.addFeature(p[i], pd[i]);
}

track()函数是跟踪特征点,并计算二维图像平面内的投影,内部调用了虚函数project(cMo);project()定义如下:

   75 void
   76 vpForwardProjection::project()
   77 {
   78   projection(cP, p) ;
   79 }
   80 
   95 void
   96 vpForwardProjection::project(const vpHomogeneousMatrix &cMo)
   97 {
   98   try{
   99     changeFrame(cMo) ;
  100     projection() ;
  101   }
  102   catch(...)
  103   {
  104     vpERROR_TRACE("Error caught") ;
  105     throw ;
  106   }
  107 }

从相机坐标系下的参数 (vpTracker::cP).计算图像平面内的特征参数(vpTracker::p) 。
先通过changeFrame(cMo)这个函数,根据给定目标坐标系下的参数(vpForwardProjection::oP) 和给定的齐次坐标矩阵(cMo) ,计算相机坐标系下的参数 (cP),同时,更新相机坐标系下的参数 (vpTracker::cP);
projection() 是一个虚函数,计算图像平面内的特征参数。定义如下

  471 void vpPoint::projection() {
  472   double d = 1/cP[2] ;
  473   p[0] = cP[0]*d ;
  474   p[1] = cP[1]*d ;
  475   p[2] = 1 ;
  476 }

所以point[i].track(cdMo);这一句实际上做了这么几步
1. 根据point[i]中的oP与cMo,计算出cP=cMo*oP;
2. 更新point[i]中的cP;
3. 根据cp计算p。


vpFeatureBuilder::create(pd[i], point[i]);

通过point[i]创建一个vpFeaturePoint 类型(表示二维视觉特征s,包含两个参数x,y)的pd[i];其中x,y来自point中的图像平面参数p;深度信息Z来自相机坐标系,即point中的cP;所以,至少要知道point中的p和cP才能正确地设置pd


task.addFeature(p[i], pd[i]);

给任务添加一对特征点,分别为 s s;还有一个可选的参数,默认选择所有的特征点都使用,但是当有很多特征点的时候可以选择使用哪一些。


vpHomogeneousMatrix wMc, wMo;

定义wMc:相机在世界坐标系下位置的齐次矩阵;wMo:目标在世界坐标系下的齐次矩阵


vpSimulatorCamera robot;
robot.setSamplingTime(0.040);

设置一个虚拟的飞行相机对象,采样时间设置为0.04s;但计算出一个速度时,利用这个采样时间计算出下一时刻相机的位置。


robot.getPosition(wMc);
wMo = wMc * cMo;

通过相机初始位置wMc和相机坐标系下的目标位置cMo,计算出目标在世界坐标系位置wMo;因为本任务中目标静止,所以wMo不变。


进入真正的视觉伺服环节

robot.getPosition(wMc);
cMo = wMc.inverse() * wMo;

cMo=wMc1wMo 计算新的相机坐标系下的目标位置,下为齐次矩阵求逆公式:

[R01×3t1]1=[RT01×3RTt1]


vpColVector v = task.computeControlLaw();

最后,计算纠正速度 vc ,是一个6维向量,对应相机的平移和旋转速度;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VISP库IBVS仿真 的相关文章

  • cmake-debug和release模式

    一般在工程中 xff0c 自动构建可能会编译两个版本的发布包 xff0c 一个debug版本 xff0c 一个release版本 那么通过cmake怎样来实现呢 xff1f 本文就以这个需求为例 xff0c 来介绍cmake中的逻辑控制 目
  • CSDN,你在忽悠谁?——社区用户数量大曝光

    根据 http hi csdn net 提供的好友搜索功能 xff0c 按地区搜索结果得出 xff0c csdn 社区用户数量是国内 66964 xff0c 国外用户总数不超过 1 千 详细清单请点击 根据 csdn 官方提供的数据 htt
  • vb.net中使用GetPrivateProfileString访问INI文件,解决中文路径问题

    在vb net2005 43 winxp中 xff0c 我使用GetPrivateProfileString读取一个ini文件 xff0c 如果文件路径中含有中文 xff0c 就会遇到一个奇怪的问题 xff1a 第一次读取正常 xff0c
  • CSDN史上最大的非法集资案

    短短 12 小时内发生了什么 xff1f 263231 分 xff0c 417 人次 xff0c 押宝游戏 疯狂大倒分 成为了 CSDN 历史上最大的非法集资 非法集资怎么操作的 xff1f 谁是幕后黑手 xff1f 集资的目的是什么 xf
  • 小帅和七个男友 ---第二章 一株含羞草

    第二章 一株含羞草 升入初三 xff0c 中考对我们这所国家重点中学来说 xff0c 只相当于一场普通的模拟考试 学习并不紧张 xff0c 我们还是该玩的玩 xff0c 该吃的吃 转瞬间就远去的椅子 xff0c 激起了我少女的情怀 我越来越
  • 20号你会黑屏吗?来验证一下你的正版XP和Office

    相当一部分企业都担心自己的电脑到时候会黑屏 这些企业并不是拿不出那几千块买套正版 xff0c 是没有习惯 其他社区也就罢了 xff0c 作为csdn xff0c 以软件开发人员集中的社区 xff0c 对使用正版软件这么抵触 xff0c 是不
  • 搜狗输入法 VS 拼音加加

    用了16年计算机 xff0c 一共用过四个输入法 xff1a 五笔 xff08 牌子忘记了 xff09 xff0c 智能ABC xff0c 拼音加加 xff0c 搜狗 放弃五笔的原因很简单 xff1a 我要学拼音 xff01 一说到高考 x
  • 苹果应用商店支持人民币信用卡(已验证,有图有真相)

    今日打开i4上的app store xff0c 惊奇发现货币单位已从 变为 xffe5 惊讶万分 xff0c 于是测试一下 xff0c 随机找了一个25元的航班追踪应用 屏幕弹出登录界面后 xff0c 输入appleid xff0c 随后出
  • 2011年终总结-DIY 苹果手机铃声

    一首 月亮之上 红遍中国南北 xff0c 只要这铃声响起 xff0c 100个人得有10个人掏出手机看看 xff0c 当之无愧的山寨歌王 当IPhone变成街机 xff0c 出厂铃声数量不多 xff0c 铃声总是撞车 xff0c DIY个性
  • CELF(Cost-Effective Lazy Forward selection)具有成本效益的惰性前向选择算法

    CELF Cost Effective Lazy Forward selection 算法解析 引言 xff1a 在社交网络影响力最大化问题的求解过程中 xff0c 我们往往需要去选择一些目标种子结点作为信息初始传播的源头 贪婪算法在传播效
  • 如何正确的报修

    先讲个故事 xff0c 今天接到一宗报修 xff0c 主题是 数据库连不上了 xff0c 我的天 xff0c 大事件啊 xff0c 习惯性地立即测试一下 xff0c 发现一切正常 随后开始追问谁说的 数据库连接不上 xff0c 原来是一个女
  • HTML5移动应用抓包

    有时候看到某个移动应用很不错 xff0c 想研究一下其HTML5源码 xff0c 样式表 xff0c 脚本什么的 xff0c 正常方法是不好得到的 通常可以用Safari伪造User Agent来欺骗目标网站 xff0c 让网站认为你是一个
  • #define和const的区别

    这个区别用从几个角度来说 xff1a 角度1 xff1a 就定义常量说的话 xff1a const 定义的常数是变量 也带类型 xff0c define 定义的只是个常数 不带类型 角度2 xff1a 就起作用的阶段而言 xff1a def
  • Vue.js 教程---菜鸟教程

    文章目录 Vue js 教程Vue js 安装Vue js 起步Vue js 模板语法插值指令用户输入过滤器缩写 Vue js 条件语句Vue js 循环语句Vue js 计算属性Vue js 监听属性Vue js 样式绑定Vue js 事
  • 我的2011 憧憬2012

    逝者如斯夫 不舍昼夜 2012已经向我们走来 xff0c 我们面对2011的离开 xff0c 稍有不舍 xff1b 但是人总得往前走 xff0c 微笑迎接2012 xff0c 注定我们在2012收获的更多 2011 xff0c 写给宿舍的哥
  • Microsoft Visual C++ Runtime Library Runtime Error的解决办法

    打开浏览器时 xff0c 出现Microsoft Visual C 43 43 Runtime Library Runtime Error错误 xff0c 初步估计是软件冲突 xff0c 可能有多种出错的方式 xff0c 我的是浏览器自动关
  • 你应该掌握的——树和二叉树

    我在上课的时候 xff0c 由于各种原因 xff0c 上课老师讲的自己总不爱听 xff0c 现在到火烧眉毛了 xff0c 才知道这些基础知识的重要性 xff0c 现在想想 xff0c 也没有那么的困难 重在理解这些底层的概念 xff0c 然
  • 把学习由复杂变简单(二叉树和树)

    现在发现二叉树和树讲起来真的是没完没了 xff0c 刚发表博客之后发现 xff0c 那还不足以表述这颗大树 我们继续完善 树与二叉树遍历确实很重要 xff0c 但是还有一些你也许忘记的重要知识点 xff0c 我们再来看一下还有什么好玩的 x
  • 原来编译原理可以这么学

    最近对数据结构的研究又有了进展 xff0c 挺好玩的 xff0c 总结这些内容的同时 xff0c 希望也能帮助到大家 xff0c 这样的话 xff0c 达到双赢 xff0c 这才是写博客的目的 xff0c 接下来我们来轻松学习编译原理 xf

随机推荐

  • 流水线—你理解多少?

    流水线 xff1a 流水线是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术 各种部件同时处理是针对不同指令而言的 xff0c 它们可同时为多条指令的不同部分进行工作 xff0c 以提高各部件的利用率和指令的平均执行速度 概念我们
  • 通达OA系统创建用户与HR试图的sql语句,左连接实例

    select 96 u 96 96 USER ID 96 AS 96 USER ID 96 96 u 96 96 BYNAME 96 AS 96 BYNAME 96 96 u 96 96 USER NAME 96 AS 96 USER NA
  • 生活中的PV操作

    之前写过操作系统的文章 xff0c 然后最近发现少了点什么 xff0c 仔细检查发现 xff0c 没写PV操作 xff0c 那么我们接下来就单独为PV操作写一篇博客 xff0c 让大家不再惧怕PV操作 xff0c 我们深入浅出的分析 xff
  • 精通CSS.DIV网页样式与布局(五) ——设置表格与表单样式

    表格和表单是网页中非常重要的两个元素 xff0c 我们这次来说说CSS如何设置表格和表单样式 我们先来看看CSS如何控制表格 首先表格中的标记 xff1a 我们看一下代码 xff1a lt html gt lt head gt lt tit
  • J2EE技术规范(七)——JTA(理解JTA,编写简单的事务客户程序)

    之前的内容中 xff0c 写了几篇关于J2EE规范的博客 xff0c 现在继续来完善这些内容 xff0c 这次内容主要补充上一篇博客 WebLogic Server使用JTA1 0 1a实现和管理事务 WebLogic Server提供以下
  • J2EE技术规范(八)——JMS(消息,域)

    老样子 xff0c 继续完善J2EE技术规范 xff0c 这次内容主要是写个JMS 理解面向消息的中间件 定义 xff1a 消息 xff08 1 xff09 消息是可编程实现两端通信的机制 xff08 2 xff09 一些消息技术如 xff
  • J2EE技术规范(九)——JMS (JMS客户端)

    上篇博客写了JMS的一些内容 xff0c 后来觉得那篇博客的内容不够阐述JMS的内容 xff0c 所以这篇博客就继续完善JMS 在WebLogic Server 环境中配置JMS WebLogic Server的JMS特性 WebLogic
  • ubuntu下载搜狗输入法并设置开机自启动

    官网下载搜狗输入法linux版deb包 下好后在下载目录里执行安装 xff1a sudo dpkg i sogoupinyin 3 4 0 9700 amd64 deb 因为我之前下载过搜狗输入法 xff0c 卸掉后fcitx输入法系统还在
  • Java基础之抽象类与接口

    很多常见的面试题都会出诸如抽象类和接口有什么区别 xff0c 什么情况下会使用抽象类和什么情况你会使用接口这样的问题 本文我们将仔细讨论这些话题 在讨论它们之间的不同点之前 xff0c 我们先看看抽象类 接口各自的特性 抽象类 抽象类是用来
  • debian系linux更新时,提示“由于没有公钥,无法验证下列签名”

    问题 在新安装的Ubuntu上 xff0c 我在使用sudo apt get update更新时 xff0c 出现如下错误 xff1a W GPG error http mirrors span class hljs number 163
  • 机器学习(周志华) 第八章集成学习

    关于周志华老师的 机器学习 这本书的学习笔记 记录学习过程 本博客记录Chapter8 1 个体与集成 集成学习 xff08 ensemble learning xff09 xff1a 通过构建多个学习器来完成学习的任务 可以分成同质集成
  • MWC(1) Multiwii 飞控程序初学者概要

    学习MWC飞控程序有一段时间了 xff0c 略有所得 xff0c 现整理一下学习思路 xff0c 略作记录 大三开始老师让我看飞控程序 xff0c 就给了一块飞控板 xff08 如下图 xff09 xff0c Cirus AIOP xff0
  • 我们约会吧魏荔嵩 不要迷恋姐,姐容易让你胃出血

    魏荔嵩是 我们约会吧 20101229期的女嘉宾 xff0c 来自上海 xff0c 家乡是内蒙古呼伦贝尔的 xff0c 27岁的魏荔嵩是一名广告策划 xff0c 曾是一名白衣天使 魏荔嵩的世纪佳缘昵称 xff1a 粉红小猪 太嗲了 xff0
  • MWC(2) Multiwii初学者详细准备

    1 1 软件准备 Arduino IDE 官方下载链接 xff1a https www arduino cc download handler php 或者Arduino社区资源 xff1a http www arduino cn thre
  • Linux(Ubuntu)下使用OneNote

    开始学习ROS xff0c 学习时遇到问题想要记录 xff0c 原来Office套件不支持Linux xff0c 大坑一 xff1a 搜了很久 xff0c 看到的无外乎以下几种 xff1a 作者 xff1a mst7 链接 xff1a ht
  • Ubuntu Anaconda 安装tensorflow及opencv3.2.0

    教程已更新 xff0c 请参照http blog csdn net yjy728 article details 78826447 一 安装Anaconda windows只支持python3 5 X xff0c ubuntu下直接下最新版
  • Ubuntu16.04下PX4 开发环境配置

    PX4 Ubuntu1604 开发环境配置 问题1 依赖错误及安装时404错误问题2 安装基于NuttX的硬件出错问题3 编译报错问题4 QT配置问题 PX4 Ubuntu16 04 开发环境配置 看到官网有详细介绍 xff08 官网安装说
  • [px4仿真]单独启动编译和Gazebo仿真器

    This article shows how to starting Gazebo and PX4 separately 按照官方教程并没有成功 中文教程和英文教程都有错误 xff0c 应该如下 span class hljs built
  • [px4仿真]px4的STIL仿真中添加向下的摄像头

    后面发现这样改有问题 xff0c 正确的修改方法参考这条提交记录 xff1a https github com TokyoClod sitl gazebo commit e61e6e46a665804f072474b2b1b085fb701
  • VISP库IBVS仿真

    示例程序1 tutorial ibvs 4pts cpp span class hljs comment example tutorial ibvs 4pts cpp span span class hljs preprocessor in