开发环境:Unbuntu 18.04 LTS + ROS Melodic + ViSP 3.3.1

  在上一篇博客中介绍了使用Pionner3dx移动机器人完成视觉伺服任务的例程,收到篇幅限制,对于视觉伺服过程并没有具体介绍,本文针对过程中使用的几个关键函数做一下介绍。

  1. task.setServo(vpServo::EYEINHAND_L_cVe_eJe)

  设定视觉伺服控制律的计算方法,例程中选择的是EYEINHAND_L_cVe_eJe方法,EYEINHAND表示相机固定在机器人上,L表示交互矩阵(图像雅可比矩阵),cVe表示相机和机器人坐标系之间的速度扭曲变换矩阵(velocity twist transformation matrix),eJe表示机器人的雅可比矩阵,该控制律计算方法如下式
q˙=−λ(Le^cVeeJe)+e\dot{q}=-\lambda(\hat{L_e}{^cV_e} {^eJ_e})^+\mathbf{e}q˙​=−λ(Le​^​cVe​eJe​)+e
式中,Le^\hat{L_e}Le​^​描述了图像中坐标的移动和相机运动速度之间的关系,cVe{^cV_e}cVe​描述了相机的运动速度和机器人运动速度之间的关系, eJe{^eJ_e}eJe​描述了机器人运动速度与机器人速度控制律之间的关系。因此根据图像中的特征误差e\mathbf{e}e就可以计算得到机器人的运动控制律q˙\dot{q}q˙​。除了EYEINHAND_L_cVe_eJe方法外,visp_ros中还提供了以下几种计算方法

  1. task.setInteractionMatrixType(vpServo::DESIRED, vpServo::PSEUDO_INVERSE)

  设定交互矩阵的类型,DESIRED表示使用期望位置的特征信息来计算交互矩阵,此外visp_ros还提供了以下集中计算方式

  PSEUDO_INVERSE表示使用广义逆矩阵的方法来处理交互矩阵,此外还可以使用直接计算转置的方法来处理交互矩阵

  1. task.setLambda

  设定增益参数λ\lambdaλ,取值范围为0.1-1,增益参数越大,则计算出来的速度越大。

  1. task.set_cVe(cVe)

  设定速度扭曲变换矩阵cVe{^cV_e}cVe​,利用该矩阵我们可以在已知一个点在相机坐标系下的速度求出该点在机器人坐标系下的速度,该矩阵的计算方法如下
cVe=[cRe[cte]×cRe03×3cRe]^{c}V_{e}=\begin{bmatrix} ^{c}R_{e}& \left [ ^{c}t_{e}\right ]_{\times} {^{c}R_{e}}\\ 0_{3\times3} & ^{c}R_{e} \end{bmatrix}cVe​=[cRe​03×3​​[cte​]×​cRe​cRe​​]
  式中,cRe^{c}R_{e}cRe​表示相机坐标系和机器人坐标系之间的旋转矩阵,cte^{c}t_{e}cte​表示相机坐标系和机器人坐标系之间的平移矩阵,[cte]×[^{c}t_{e}]_{\times}[cte​]×​表示将平移矩阵转化为斜对称矩阵,转换方法如下
a=[a1a2a3]Ta=\begin{bmatrix} a_1 & a_2 &a_3 \end{bmatrix}^Ta=[a1​​a2​​a3​​]T
[a]×=[0−a3a2a30−a1−a2a10]\left [ a\right ]_{\times}=\begin{bmatrix} 0 & -a_3 & a_2\\ a_3& 0 & -a_1\\ -a_2 & a_1 & 0 \end{bmatrix}[a]×​=⎣⎡​0a3​−a2​​−a3​0a1​​a2​−a1​0​⎦⎤​

  1. task.set_eJe(eJe)

  设定机器人雅可比矩阵eJe{^eJ_e}eJe​,关于机器人雅可比矩阵本身是比较复杂的,这里可以简单的理解为我们施加在机器人各个自由度上的运动指令和机器人真实的运动速度之间的关系,即v=eJeq˙v={^eJ_e}\dot{q}v=eJe​q˙​。因为对于差速移动机器人来说只有两个方向的自由度,x方向上的移动vxv_xvx​和z方向上的旋转wzw_zwz​,且我们计算出速度控制律q˙=[vx,wz]T\dot{q}=[v_x,w_z]^Tq˙​=[vx​,wz​]T,所以该机器人雅可比矩阵为
eJe=[100000000001]{^eJ_e}=\begin{bmatrix} 1 &0 \\ 0 &0\\ 0 &0 \\ 0 &0 \\ 0 &0 \\ 0 &1 \end{bmatrix}eJe​=⎣⎢⎢⎢⎢⎢⎢⎡​100000​000001​⎦⎥⎥⎥⎥⎥⎥⎤​

  1. s_xd.buildFrom(x, y, Z);

  构建二维视觉特征,x,y分别对应经过归一化的图像坐标(比如图像正中心应该是x=0.5,y=0.5),而Z表示此时在空间坐标系下的三维深度信息,单位是m。例如s_xd.buildFrom(0.5, 0.5, 1);这个描述视觉特征就是在相机与目标特征点相距1m的位置,目标特征点处于图像正中心(个人理解)。

  1. s_Z.buildFrom(x,y, Z, log(Z / Zd));

  构建三维视觉特征,x,y分别对应经过归一化的图像坐标,而Z表示此时在空间坐标系下的三维深度信息,单位是m,log(Z/Zd)表示当前位置的深度Z和期望位置的深度Zd比值的对数。

  1. task.addFeature(s_x, s_xd);

  将当前位置的视觉特征s_x和期望位置的视觉特征s_xd添加到视觉伺服任务中。默认是将s_x和s_xd包含的所有视觉特征都添加到任务中,但通过增加特征选取参数,可以选择特定维度的特征,例如task.addFeature(s_x, s_xd, vpFeaturePoint::selectX());就表示只选择x维度上的特征添加到任务中。

  1. task.computeControlLaw() ;

  根据视觉伺服算法计算控制律,默认的计算方法如下q˙=±λJ^e+e\dot{q}=\pm\lambda\hat{J}_e^+\mathbf{e}q˙​=±λJ^e+​e
  式中,q˙\dot{q}q˙​表示作用在机器人上的速度控制律;±\pm±符号取决于视觉伺服的形式是eyeinhand 还是 eyetohand;λ\lambdaλ是增益参数;J^e+\hat{J}_e^+J^e+​是视觉伺服任务的雅可比矩阵,是关于图像雅可比矩阵和机器人雅可比矩阵的函数;e=(s−s∗)\mathbf{e}=(s-s^*)e=(s−s∗)表示视觉特征误差。

  1. task.getError()

  返回视觉特征误差e=(s−s∗)\mathbf{e}=(s-s^*)e=(s−s∗),返回的是一个向量形式的结果,依次表示x,y,z三个维度上的视觉特征误差,可以使用索引值选择需要的维度。

  1. task.print();

  打印输出视觉伺服任务的相关信息,默认打印所有信息,可以通过添加参数选择需要打印的信息

  1. task.kill();

  结束视觉伺服任务,删除所有的视觉特征。

如果大家对于深度学习与计算机视觉领域感兴趣,希望获得更多的知识分享与最新的论文解读,欢迎关注我的个人公众号“深视”。

Visp_ros学习笔记(三):对于视觉伺服过程中关键函数的理解相关推荐

  1. Visp_ros学习笔记(二):在Gazebo环境下实现Pionner3dx移动机器人视觉伺服仿真

    开发环境:Unbuntu 18.04 LTS + ROS Melodic + ViSP 3.3.1   本文主要介绍了如何实现Pionner3dx移动机器人视觉伺服仿真,仿真环境是ROS+Gazebo ...

  2. 机械臂抓取学习笔记三

    论文:Real-Time Deep Learning Approach to Visual Servo Control and Grasp Detection for Autonomous Robot ...

  3. SurfaceFlinger学习笔记(三)之SurfaceFlinger进程

    概述 本系列是基于android Q 即android10 SurfaceFlinger学习笔记(一)应用启动流程 SurfaceFlinger学习笔记(二)之Surface SurfaceFling ...

  4. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  5. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  6. 吴恩达《机器学习》学习笔记三——多变量线性回归

    吴恩达<机器学习>学习笔记三--多变量线性回归 一. 多元线性回归问题介绍 1.一些定义 2.假设函数 二. 多元梯度下降法 1. 梯度下降法实用技巧:特征缩放 2. 梯度下降法的学习率 ...

  7. Python基础学习笔记三

    Python基础学习笔记三 print和import print可以用,分割变量来输出 import copy import copy as co from copy import deepcopy ...

  8. Python学习笔记三之编程练习:循环、迭代器与函数

    Python学习笔记三之编程练习 1. 编程第一步 # 求解斐波纳契数列 #/user/bin/python3#Fibonacci series:斐波那契数列 #两个元素的总和确定了下一个数 a,b= ...

  9. 学习笔记三:衍生兄弟——过冲和振铃

    学习笔记三:衍生兄弟之过冲和振铃 先解释下过冲和下冲: 过冲(overshoot):通俗讲,一端到另一端,本来是一条很平整的马路,今天走着走着突然中间多了座山.(超过设定值) 下冲(undershoo ...

最新文章

  1. 【跃迁之路】【731天】程序员高效学习方法论探索系列(实验阶段488-2019.2.21)...
  2. 史上最纯洁的女孩,看到我实在被雷到了。
  3. JavaScript开发优化技巧
  4. JAVA链表中迭代器的实现
  5. WebView之加载网页时增加进度提示
  6. str python3_python3.4.3如何转换str字符串?
  7. 交叉熵代价函数(作用及公式推导)
  8. 【开发工具集】显示设备驱动程序列表——DriverView
  9. 文件(夹)操作SHFileOperation (删除 复制 移动) 报错 无法读取源文件或磁盘
  10. Unity修改编辑器
  11. iOS富文本添加下划线和颜色
  12. 华为设备配置SEP多环
  13. ubuntu20.04 重启黑屏 仅有左上角白色横杠闪烁
  14. 计算机系统实验-缓冲区炸弹
  15. 敏捷已死:一场程序员们历经20年的失败反叛
  16. android:exported、enabled属性
  17. 英特尔® Distribution of OpenVINO™ toolkit 2021 版的发布说明
  18. RestTemplete
  19. TA进阶实例34(Unreal制作水晶星光效果)
  20. 云服务器如何安装docker?

热门文章

  1. 【OpenCV】OpenCV-Python实现相机标定+利用棋盘格相对位姿估计
  2. Netflix:风险增加的投资
  3. java绝对路径和相对路径的区别_相对路径和绝对路径的区别
  4. 编程常用英语单词【2016.6月之前熟记要求会默写】
  5. 互联网时代的【三国演义】
  6. 牙齿美白灯行业现状调研及趋势分析报告
  7. 函数重载、运算符重载
  8. SAP HANA跟我学HANA系列之创建分析视图一
  9. sqlmap代理池_sqlmap多代理防IP被BAN
  10. Free Lunch for Few-shot learning:Distribution Calibration(ICLR 2021)详解