基于ROS的机械臂手眼标定-注意事项
手眼标定的结果准确与否严重取决于数据的准确性。根据标定原理我们可以得知,输入数据由机械臂位姿和相机中标定板的位姿共同决定,接下来我们来讲一下如何提高标定结果的准确性的几个方向。
开源地址
github: https://github.com/aiotrobot/handeye-calib gitee: https://gitee.com/ohhuo/handeye-calib
#mermaid-svg-eHoBleDPe1YTqFic .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-eHoBleDPe1YTqFic .label text{fill:#333}#mermaid-svg-eHoBleDPe1YTqFic .node rect,#mermaid-svg-eHoBleDPe1YTqFic .node circle,#mermaid-svg-eHoBleDPe1YTqFic .node ellipse,#mermaid-svg-eHoBleDPe1YTqFic .node polygon,#mermaid-svg-eHoBleDPe1YTqFic .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-eHoBleDPe1YTqFic .node .label{text-align:center;fill:#333}#mermaid-svg-eHoBleDPe1YTqFic .node.clickable{cursor:pointer}#mermaid-svg-eHoBleDPe1YTqFic .arrowheadPath{fill:#333}#mermaid-svg-eHoBleDPe1YTqFic .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-eHoBleDPe1YTqFic .flowchart-link{stroke:#333;fill:none}#mermaid-svg-eHoBleDPe1YTqFic .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-eHoBleDPe1YTqFic .edgeLabel rect{opacity:0.9}#mermaid-svg-eHoBleDPe1YTqFic .edgeLabel span{color:#333}#mermaid-svg-eHoBleDPe1YTqFic .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-eHoBleDPe1YTqFic .cluster text{fill:#333}#mermaid-svg-eHoBleDPe1YTqFic div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-eHoBleDPe1YTqFic .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-eHoBleDPe1YTqFic text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-eHoBleDPe1YTqFic .actor-line{stroke:grey}#mermaid-svg-eHoBleDPe1YTqFic .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-eHoBleDPe1YTqFic .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-eHoBleDPe1YTqFic #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-eHoBleDPe1YTqFic .sequenceNumber{fill:#fff}#mermaid-svg-eHoBleDPe1YTqFic #sequencenumber{fill:#333}#mermaid-svg-eHoBleDPe1YTqFic #crosshead path{fill:#333;stroke:#333}#mermaid-svg-eHoBleDPe1YTqFic .messageText{fill:#333;stroke:#333}#mermaid-svg-eHoBleDPe1YTqFic .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-eHoBleDPe1YTqFic .labelText,#mermaid-svg-eHoBleDPe1YTqFic .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-eHoBleDPe1YTqFic .loopText,#mermaid-svg-eHoBleDPe1YTqFic .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-eHoBleDPe1YTqFic .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-eHoBleDPe1YTqFic .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-eHoBleDPe1YTqFic .noteText,#mermaid-svg-eHoBleDPe1YTqFic .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-eHoBleDPe1YTqFic .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-eHoBleDPe1YTqFic .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-eHoBleDPe1YTqFic .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-eHoBleDPe1YTqFic .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-eHoBleDPe1YTqFic .section{stroke:none;opacity:0.2}#mermaid-svg-eHoBleDPe1YTqFic .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-eHoBleDPe1YTqFic .section2{fill:#fff400}#mermaid-svg-eHoBleDPe1YTqFic .section1,#mermaid-svg-eHoBleDPe1YTqFic .section3{fill:#fff;opacity:0.2}#mermaid-svg-eHoBleDPe1YTqFic .sectionTitle0{fill:#333}#mermaid-svg-eHoBleDPe1YTqFic .sectionTitle1{fill:#333}#mermaid-svg-eHoBleDPe1YTqFic .sectionTitle2{fill:#333}#mermaid-svg-eHoBleDPe1YTqFic .sectionTitle3{fill:#333}#mermaid-svg-eHoBleDPe1YTqFic .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-eHoBleDPe1YTqFic .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-eHoBleDPe1YTqFic .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-eHoBleDPe1YTqFic .grid path{stroke-width:0}#mermaid-svg-eHoBleDPe1YTqFic .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-eHoBleDPe1YTqFic .task{stroke-width:2}#mermaid-svg-eHoBleDPe1YTqFic .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-eHoBleDPe1YTqFic .taskText:not([font-size]){font-size:11px}#mermaid-svg-eHoBleDPe1YTqFic .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-eHoBleDPe1YTqFic .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-eHoBleDPe1YTqFic .task.clickable{cursor:pointer}#mermaid-svg-eHoBleDPe1YTqFic .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-eHoBleDPe1YTqFic .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-eHoBleDPe1YTqFic .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-eHoBleDPe1YTqFic .taskText0,#mermaid-svg-eHoBleDPe1YTqFic .taskText1,#mermaid-svg-eHoBleDPe1YTqFic .taskText2,#mermaid-svg-eHoBleDPe1YTqFic .taskText3{fill:#fff}#mermaid-svg-eHoBleDPe1YTqFic .task0,#mermaid-svg-eHoBleDPe1YTqFic .task1,#mermaid-svg-eHoBleDPe1YTqFic .task2,#mermaid-svg-eHoBleDPe1YTqFic .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-eHoBleDPe1YTqFic .taskTextOutside0,#mermaid-svg-eHoBleDPe1YTqFic .taskTextOutside2{fill:#000}#mermaid-svg-eHoBleDPe1YTqFic .taskTextOutside1,#mermaid-svg-eHoBleDPe1YTqFic .taskTextOutside3{fill:#000}#mermaid-svg-eHoBleDPe1YTqFic .active0,#mermaid-svg-eHoBleDPe1YTqFic .active1,#mermaid-svg-eHoBleDPe1YTqFic .active2,#mermaid-svg-eHoBleDPe1YTqFic .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-eHoBleDPe1YTqFic .activeText0,#mermaid-svg-eHoBleDPe1YTqFic .activeText1,#mermaid-svg-eHoBleDPe1YTqFic .activeText2,#mermaid-svg-eHoBleDPe1YTqFic .activeText3{fill:#000 !important}#mermaid-svg-eHoBleDPe1YTqFic .done0,#mermaid-svg-eHoBleDPe1YTqFic .done1,#mermaid-svg-eHoBleDPe1YTqFic .done2,#mermaid-svg-eHoBleDPe1YTqFic .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-eHoBleDPe1YTqFic .doneText0,#mermaid-svg-eHoBleDPe1YTqFic .doneText1,#mermaid-svg-eHoBleDPe1YTqFic .doneText2,#mermaid-svg-eHoBleDPe1YTqFic .doneText3{fill:#000 !important}#mermaid-svg-eHoBleDPe1YTqFic .crit0,#mermaid-svg-eHoBleDPe1YTqFic .crit1,#mermaid-svg-eHoBleDPe1YTqFic .crit2,#mermaid-svg-eHoBleDPe1YTqFic .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-eHoBleDPe1YTqFic .activeCrit0,#mermaid-svg-eHoBleDPe1YTqFic .activeCrit1,#mermaid-svg-eHoBleDPe1YTqFic .activeCrit2,#mermaid-svg-eHoBleDPe1YTqFic .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-eHoBleDPe1YTqFic .doneCrit0,#mermaid-svg-eHoBleDPe1YTqFic .doneCrit1,#mermaid-svg-eHoBleDPe1YTqFic .doneCrit2,#mermaid-svg-eHoBleDPe1YTqFic .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-eHoBleDPe1YTqFic .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-eHoBleDPe1YTqFic .milestoneText{font-style:italic}#mermaid-svg-eHoBleDPe1YTqFic .doneCritText0,#mermaid-svg-eHoBleDPe1YTqFic .doneCritText1,#mermaid-svg-eHoBleDPe1YTqFic .doneCritText2,#mermaid-svg-eHoBleDPe1YTqFic .doneCritText3{fill:#000 !important}#mermaid-svg-eHoBleDPe1YTqFic .activeCritText0,#mermaid-svg-eHoBleDPe1YTqFic .activeCritText1,#mermaid-svg-eHoBleDPe1YTqFic .activeCritText2,#mermaid-svg-eHoBleDPe1YTqFic .activeCritText3{fill:#000 !important}#mermaid-svg-eHoBleDPe1YTqFic .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-eHoBleDPe1YTqFic g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-eHoBleDPe1YTqFic g.classGroup text .title{font-weight:bolder}#mermaid-svg-eHoBleDPe1YTqFic g.clickable{cursor:pointer}#mermaid-svg-eHoBleDPe1YTqFic g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-eHoBleDPe1YTqFic g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-eHoBleDPe1YTqFic .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-eHoBleDPe1YTqFic .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-eHoBleDPe1YTqFic .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-eHoBleDPe1YTqFic .dashed-line{stroke-dasharray:3}#mermaid-svg-eHoBleDPe1YTqFic #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-eHoBleDPe1YTqFic #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-eHoBleDPe1YTqFic #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-eHoBleDPe1YTqFic #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-eHoBleDPe1YTqFic #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-eHoBleDPe1YTqFic #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-eHoBleDPe1YTqFic #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-eHoBleDPe1YTqFic #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-eHoBleDPe1YTqFic .commit-id,#mermaid-svg-eHoBleDPe1YTqFic .commit-msg,#mermaid-svg-eHoBleDPe1YTqFic .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-eHoBleDPe1YTqFic .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-eHoBleDPe1YTqFic .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-eHoBleDPe1YTqFic g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-eHoBleDPe1YTqFic g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-eHoBleDPe1YTqFic g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-eHoBleDPe1YTqFic g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-eHoBleDPe1YTqFic g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-eHoBleDPe1YTqFic g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-eHoBleDPe1YTqFic .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-eHoBleDPe1YTqFic .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-eHoBleDPe1YTqFic .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-eHoBleDPe1YTqFic .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-eHoBleDPe1YTqFic .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-eHoBleDPe1YTqFic .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-eHoBleDPe1YTqFic .edgeLabel text{fill:#333}#mermaid-svg-eHoBleDPe1YTqFic .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-eHoBleDPe1YTqFic .node circle.state-start{fill:black;stroke:black}#mermaid-svg-eHoBleDPe1YTqFic .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-eHoBleDPe1YTqFic #statediagram-barbEnd{fill:#9370db}#mermaid-svg-eHoBleDPe1YTqFic .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-eHoBleDPe1YTqFic .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-eHoBleDPe1YTqFic .statediagram-state .divider{stroke:#9370db}#mermaid-svg-eHoBleDPe1YTqFic .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-eHoBleDPe1YTqFic .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-eHoBleDPe1YTqFic .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-eHoBleDPe1YTqFic .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-eHoBleDPe1YTqFic .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-eHoBleDPe1YTqFic .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-eHoBleDPe1YTqFic .note-edge{stroke-dasharray:5}#mermaid-svg-eHoBleDPe1YTqFic .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-eHoBleDPe1YTqFic .error-icon{fill:#522}#mermaid-svg-eHoBleDPe1YTqFic .error-text{fill:#522;stroke:#522}#mermaid-svg-eHoBleDPe1YTqFic .edge-thickness-normal{stroke-width:2px}#mermaid-svg-eHoBleDPe1YTqFic .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-eHoBleDPe1YTqFic .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-eHoBleDPe1YTqFic .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-eHoBleDPe1YTqFic .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-eHoBleDPe1YTqFic .marker{fill:#333}#mermaid-svg-eHoBleDPe1YTqFic .marker.cross{stroke:#333}
:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}
#mermaid-svg-eHoBleDPe1YTqFic {
color: rgba(0, 0, 0, 0.75);
font: ;
}
机械臂位姿
手眼标定程序
相机中标定板位姿
末端与相机位姿关系
本教程一共包含五个部分:
- 手眼标定-基础使用
- 手眼标定-JAKA机械臂
- 手眼标定-AUBO机械臂
- 手眼标定-Aruco使用与相机标定
- 手眼标定-注意事项
如果上述程序使用过程中遇到问题,可以参考:
- 手眼标定-常见问题排查
如果你对手眼标定原理感兴趣,可以参考以下文章:
- 机器人手眼标定原理介绍(含详细推导过程)使用Tsai-Lenz算法
- 手眼标定算法TSAI_LENZ,眼在手外python代码实现
- 手眼标定算法Tsai-Lenz代码实现(Python、C++、Matlab)
机械臂的数据一般从厂家所给的SDK或者中可以很方便的获取到,而且精度还是非常精准的,但这所说的只是末端的角度,对于我们实际使用来说,一定会在机械臂上安装夹爪和吸盘等,所以机械臂的末端标定要准确才行,这个标定可以使用机械臂厂家所给的标定程序。
2.相机标定的准确性- 如果使用的标定目标板是类似于棋盘格式的平面标定板,请使用加工精度相对较高的标定板
- 尽量多的角点数和图片数量。这里推荐角点数比较多的标定板。10x10是原作者认为应该采用标定板的-最小尺寸,通常使用20x20。
- 拍照时使用较大的拍照范围。确保在某些图片中,聚焦轴以较大的倾斜对准标定板
- 减少晃动和拍照时的运动模糊(使用ros标定过程中容易出现这个情况)一定要注意。
参考:https://blog.csdn.net/sandy_wym_/article/details/83996479
- 两次运动的旋转轴的夹角:越大越好
- 每次运动的旋转矩阵对应的旋转角度:越大越好
- 相机中心到标定板的距离: 距离越小越好
- 每次运动机械臂末端运动的距离:距离越小越好
- 机械臂精度影响
提高精度的几个方向
- 不管采集多少组用于标定的运动数据,每组运动使运动角度最大。
- 使两组运动的旋转轴角度最大。
- 每组运动中机械臂末端运动距离尽量小,可通路径规划实现该条件。
- 尽量减小相机中心到标定板的距离,可使用适当小的标定板。
- 尽量采集多组用于求解的数据。
- 使用高精度的相机标定方法。
- 尽量提高机械臂的绝对定位精度,如果该条件达不到,至少需要提高相对运动精度。
如果有不明白和有错误的地方可以留言~
作者介绍:我是小智,机器人领域资深玩家,现深圳某独脚兽机器人算法工程师一枚
初中学习编程,高中开始学习机器人,大学期间打机器人相关比赛实现月入2W+(比赛奖金)
目前在输出机器人学习指南、论文注解、工作经验,欢迎大家关注小智,一起交流技术,学习机器人