常用功能

使用图漾相机

添加相机资源

在菜单栏—资源中添加 TyCameraResource 资源算子到算子图中的 ResourceGroup 中,将搜索结果中 TyCameraAccess 算子添加到算子图中,并根据需要调整算子参数。 TyCameraResource 算子的默认属性参数以及参数说明如下所示。

image-20231023095106746

  • 自动启动:用于开启资源算子。

    • :打开 RVS 软件后第一次进入运行状态时自动开启资源线程。

    • :不自动开启资源线程。

  • 启动 / 停止: 分别用于开启、关闭资源算子的线程。

  • 重置:在打开资源线程后如果需要更改属性参数,需要选中该选项进行重置。

  • 相机ID:默认不填写。在打开该资源线程后会自动查找当前工控机所在网段的所有图漾相机并将这些设备的硬件信息打印在 terminal 中,然后随机选中一台设备进行链接。如果需要指定连接某台图漾相机设备,则需要将该设备的编码填写到相机_id选项。编码可以在相机设备硬件上查看,也可以在上述 terminal 的打印信息中查找。

  • 深色图像模式/彩色图像模式:连接到设备后会自动选择并显示深度图以及 2D 图的图像尺寸,前者影响了最终形成的点云图的尺寸。后续可以更改,但是需要设置重置选项。

  • 畸变矫正:对 rgb 进行去畸变处理后再输出。

  • 输出***:用于设置是否输出某个图像。如果需要输出点云,需要选中输出深度图输出点云

  • 激光自动控制:激光自适应模式。当为 false 时,激光强度可以设置激光的强度。

  • 彩色图像Isp:对 rgb 图像的预处理。

  • 相机深度图标定文件相机彩色图标定文件:存放在相机设备内的深度相机以及 2D 相机的出厂标定参数,开启资源线程后会自动读取该标定参数并按照这两个参数对应的文件路径保存成文件。 文件内容说明:

    • color_calib_file:

      • 第一行(下图红色区域)表示相机的 RGB 镜头在进行出厂标定时所采用的镜头分辨率。实际使用相机时,只有将相机分辨率同这里的数值保持一致,才可以直接使用下述的内参矩阵。否则需要对应的进行数值缩放(但是会有一定的精度损失)。

      • 第二行(下图蓝色区域)表示相机 RGB 镜头的内参。总共9个数值,是一个按行排列的3 * 3矩阵。矩阵形式为 [fx,0,cx,0,fy,cy,0,0,1] ,其中fx表示 x 轴方向的相机焦距 (单位为像素),其中 cx 表示 x 轴方向的相机中心(单位为像素);fy 、cy 类似。

      • 第三行(下图绿色区域)表示相机 RGB 镜头的外参,即 RGB 镜头到左 IR 镜头的空间坐标系转换矩阵。总共16个数值,是一个按行排列的4 * 4矩阵。左上角的3 * 3模块表示旋转,右上角的1 * 3表示平移。平移值的单位为毫米。

      • 第四行(下图黄色区域)表示相机 RGB 镜头的畸变参数,总共12个数值。可以用来对原始的RGB图像进行畸变校正。

        说明:关于depth_calib_file,其说明同上述说明保持一致。特别的,由于深度相机是虚拟相机,所以其畸变参数以及外参都是零矩阵。

calibfile

  • 触发模式

    • TY_SOFTWARE_TRIGGER_MODE:为软件触发方式,每一次发送 trigger 命令时相机采集一帧图像

    • TY_HARDWARE_TRIGGER_MODE:为硬件触发方式,通过硬件触发相机采集。

    • TY_TRIGGER_MODE_OFF:则为相机不停的采集图像,每一次发送 trigger 命令时,相机回传一帧数据给 RVS 。TY_TRIGGER_MODE_OFF 时间上效率更高,但请注意,t 时刻发送 trigger 获得的图像并非是 t 时刻采集的,而是 t-t0 时刻采集的,t0 由相机型号来定,一般大于 0.5 秒。

  • 是否再发

    • :在每一次相机回传 RVS 数据发生丢包时会重新发送。

    • :在每一次相机回传 RVS 数据发生丢包时不会重新发送。

  • 相机外参坐标:无法修改,是从当前相机资源载入后,从 sdk 中读取当前相机的 rgb 相机的外参(即 rgb 相机到左 ir 深度相机的转换矩阵)并转换成 pose 形式进行展示。

  • 相机参数展开:是否暴露相机的一些功能属性参数。

添加图漾相机采集器

步骤2:将 trigger 、TyCameraAccess 算子添加到算子图中,并将其 finished 端口连接到 TyCameraAccess 算子的 start 端口上。

相机数据实时采集

步骤3

  1. 单击 RVS 软件顶端工具栏中的运行按钮。

  2. 点击 TyCameraResource ,勾选 自动启动启动属性。

  3. 勾选 trigger 算子的属性栏中 触发器 属性,此时会按照 TyCameraResource 算子所勾选的 output_? 属性进行一次数据采集,如果需要显示采集的数据还需要更改 TyCameraAccess 算子的属性栏中的可视化属性。如果勾选 trigger 算子的循环属性,则会连续采集图像。

相机连接使用如下。

tycameracess

数据的保存

RVS 软件提供了 Save 算子进行数据保存。根据需求选择对应的 type 属性,下面以 type 为 Image 为例进行说明。

在 Save 算子左侧的 filename 端口(或在算子的 filename 属性中)输入文件路径,并且在左侧 image 输入端口(或者 image_list 端口)给入图像,触发算子的 start 端口,即可将图像保存到本地。

说明:如果算子的 filename 属性和算子左侧的 filename 端口都被赋值了,则优先使用算子左侧的 filename 端口的数值。

Save—Image:

save

另外还有 PointCloud 、Pose 、JointArray 、String 、Cube 等类型,直接在算子列表的搜索框输入 save 关键字,选择对应的 type 属性即可。

本地数据的读取

RVS软件也提供了 Load 算子进行本地数据读取。type 属性包含:Cube 、Image 、JointArray 、Line 、Path 、PointCloud 、PolyData 、Pose 、Shpere 、Voxels 。

下面以 Image 为例进行说明。

通过 Load 算子可以读取单张图像或者读取某个文件夹内的所有图像。读取单张图片,需要在算子左侧 filename 端口(或在属性面板的 filename 属性)输入“图像路径+名称”,在 start 的被触发的情况下,会将读取的图像数据输出到右侧的 image 端口。读取多张图片,需要在算子左侧 directory 端口(或在属性面板的 directory 属性)输入“图像路径”,在 start 的被触发的情况下,会将读取的所有图像数据以列表的形式输出到右侧的 imagelist 端口。

load

其他的 type 类型,在 save 算子中选择对应的 type 属性即可。

TCP通讯

RVS 提供了一个标准 TCP 通讯算子:HandEyeTCPServer,用于 RVS 程序同机器人或其他工控机程序之间的通讯。算子运行时会在 RVS 程序底层新建一个线程来创建并维持一个 TCP server 端。

其属性如下图所示。

handeyetcpserver

点云滤波

降采样

DownSampling 算子,作用是对点云进行稀疏化处理。对于部分算子,少量稀疏的点云足以完成计算,过于稠密的点云只会降低算子执行效率,此时可以考虑首先对原始点云进行降采样稀疏化处理再进行后续运算。下面是一个 DownSampling 算子的连接示例。

downsample_nodes

修改该算子属性面板中 leaf_x 、leaf_y 、leaf_z 可以指定 xyz 轴方向点云重采样间距,此处指定为 0.005m ,表示在 0.005m * 0.005m * 0.005m 的空间尺度内仅取一个点。

downsample_panel

下图显示了过滤前后的点云。

downsampling_result

点数过滤

CloudFilter 算子,可以对输入的点云进行点数判断。可以修改 CloudFilter 的属性模式 ,该属性表示点云过滤的方法。

属性最小点数和最大点数数值,该属性指定了输入的点云点数的阈值。模式与点数数值配合,触发 finished ,否则触发 failed 。

cloudFilter

平面滤波

FindElement 算子,可以自动查找当前点云的对应的几何图形,并根据点到平面的距离阈值来过滤点云。type 属性包含:Plane 、Cylinder 、Sphere 、Circle 、Line 。 连接示例如下图所示。

findelement_nodes

属性图如下。

findelement_panel

可以通过修改属性 距离阈值 来调整点云过滤的距离阈值,下图分别展示了原始点云 、查找平面后点云输出。

findelement_result

区域裁剪

CloudSegment 算子,type 属性包含:CropboxSegment 、PlaneSegment 、PassthroughSegment 、DiffSegment 、NNPDSegment 。

CropboxSegment 根据输入的立方体区域对点云进行切割,需要结合 Emit-Cube 算子使用。示例如下图所示。

cloudsegment

您可以通过调整 3D 视图中的 Cube 位置及大小来切割出所需要的点云区域。右图为切割出的点云。

cloudsegment_result

目标定位

定位目标上表面姿态

MinimumBounddingBox 算子,其作用是根据目标上表面点云来获取点云的最小立方体包围框。常用于箱包等物体的姿态定位。

注意:由于目标是上表面点云的最小矩形包围框,所以在进行 MinimumBounddingBox 算子计算之前,往往需要对点云进行 PlaneFinder 算子处理,目的是去除目标侧面上的点云。

该算子找到目标的最小立方体后,会将立方体的中心作为输出姿态的中心,将立方体的三个轴的方向 Hight-Width-Depth 作为输出姿态的三个轴 XYZ 的方向。

miniboundingbox

上图中有个 ref_pose 数据端口。当连接 ref_pose ,结果 Cube 则会参照算子左侧的 ref_pose 端口输入的 pose 姿态进行 Hight - Width - Depth 同 X Y Z 的匹配。如果该端口不连接数据,则 Hight - Width - Depth 默认与 Pose(0,0,0,0,0,0) 中 X Y Z 匹配。

算子定位效果如下。

minimumboundingbox_result

中心定位

CloudProcess 算子中 type 属性为 CloudCentroid,作用是输入一个点云,输出点云的坐标中心。

注意:输出的姿态自动选择为基坐标系而不是沿着目标的长宽方向。

连接示例与效果如下图所示。

cloudprocess_nodes

cloudprocess_result

点云聚类

ClusterExtraction 算子。作用是根据设定的最小距离参数公差值(如下图属性图所示),将彼此间距超过该距离的两个目标点归为两类,间距小于该距离的点云归为一类,最终将多个目标点云彼此分开。另外,该算子还限制类每一个点云类别的点云最小数量与最大数量 。

clusterExtraction

使用该算子时应该根据需要调整 tolerance 算子,下面两图中,分别展示了聚类前后的对比。(每个颜色对应一个类别)

clusterextracyionresult

坐标系说明与姿态变换

坐标系说明

RVS软件有一个自带的 3D 视图显示环境,该显示坐标系即 世界坐标系 BaseXYZ ,坐标原点 (0,0,0)。我们通过 Emit-Pose 等算子生成的 pose 全是基于 BaseXYZ 坐标系。

我们的仿真机器人是由数模文件定义的,机器人有一个自身的 基座坐标系 RobotXYZ ,由于制作机器人数模时我们都将机器人的基座坐标系同制作软件的世界坐标系保持对齐,所以在 RVS 软件中导入数模文件后,RobotXYZ 默认同 BaseXYZ 对齐。

图漾相机的 3D 点云图也有一个自带的坐标系,相机左 IR 坐标系 CameraXYZ 。当我们在 BaseXYZ 中显示 CameraXYZ 时,默认是将相机的左 IR 按照 Pose(0,0,0,0,0,0) 的姿态摆放的,所以此时 CameraXYZ 同 BaseXYZ 是同一个坐标系。但是这样的显示实际上毫无意义,我们需要找到相机在机器人坐标系下的空间姿态 pose_true,进而按照该姿态在 BaseXYZ 中矫正 CameraXYZ 坐标系。

另外我们相机拍摄的目标比如箱子,其本身也有一个物体坐标系 ObjXYZ 。该体坐标系即为该目标的 pose 。

RVS 软件中每一个 Pose(x,y,z,rx,ry,rz) 既表示一个姿态,又表示一个 4*4 坐标转化矩阵,xyz 代表该矩阵的平移量 rx/ry/rz 代表了矩阵的旋转量。

坐标变换

Transform算子,属性 type 为 pose ,示例如下。

transform

图中 Emit( TCP2robot )为机器人的法兰盘在机器人坐标系下的位姿(或者说转换矩阵),Emit( rgb2TCP )为手眼标定的结果,表示相机的 rgb 坐标系到机器人法兰盘坐标系的坐转换矩阵,前者连接到 Transform 算子的左侧 relative 端口,后者连接到 Transform 算子的左侧 base 端口,表示前者矩阵左乘后者矩阵,继而可得相机的rgb坐标系到机器人坐标系的转换矩阵,以 pose 的形式输出到 Transform 算子的右侧 transformed 端口。

另外,上图中的 Emit 算子( TCP2robot 以及 rgb2TCP ),不仅有一个 pose 端口输出,还有一个 inverse_pose 端口输出,后者表示前者的逆矩阵。

单位变换

Pose 的单位可以从米/毫米、角度/弧度之间相互切换,对应算子为 ScalePose 。设置其 XYZ比例 :0.001,即可从米切换为毫米。设置其 RPY 比例:0.01745329 即可将角度切换为弧度。类似的,可以反向切换。

scalepose

Pose 默认的旋转方式绕着 Z-Y-X 的顺序对不固定轴进行旋转,可以切换成欧拉角(绕着 X-Y-Z 的顺序对固定轴进行旋转),对应算子为 ConvertPose 算子中,type 属性为 EulerToPose 以及 PoseToEuler。

convertpose

AI模块

RVS 软件嵌入了前沿的 CNN 深度学习模块,可以对 rgb 图像进行目标检测、实例分割。我们分别提供了算子进行数据的训练与识别。

AITrain

Aitrain

训练前需要进行数据集的准备,具体操作详见自动拆垛—AI训练模块。

标注 RotatedYOLO 网络的训练数据时,如果目标是箱子这样的矩形目标,建议每一个目标只标注四个点。如果是多边形目标,可以标注任意多个点(实际运行时,算法会自动根据标注点来生成四个点的旋转矩形)。

注意:对于 RotatedYOLO ,在训练时请确保至少使用两个类别的数据进行训练,单类别训练的效果较差。如果确实只有一个类别的数据,建议额外增加一个当前项目用不到的其他数据一起训练。

另外,为了保证训练效果,每一类的物体数量应不低于200个目标个数(一张图中一般会有多个目标)。

标注 KeyPoint 网络的训练数据时,有两类标注对象。

  1. 是标注目标本身,在 Labelme 软件标注时选择 “ 多边形 / PolyRect ” 的标注工具,每个标注点都必须沿着目标的轮廓,此时的标注方法等同于 MaskRCNN 网络的数据标注。

  2. 是目标内的关键点标注,在 Labelme 软件标注时选择 “点 / Point ”的标注工具,同时关键点的位置必须位于所属的目标内。比如我们的标注对象是桌子,设计的关键点是桌角,并且已经给桌子标注了一个四边形的区域,则此时给桌角标注关键点时,这个标注点必须在桌子所标注的四边形区域内部,不能在边界上,也不能在边界外。如果多个目标的标注区域有重叠,比如同时标注箱子以及箱子上面的条码区,则我们设计的关键点不允许标注在箱子条形码区域内,因为条形码区域是重叠区域。

AITrain 算子在实际执时,会自动对标注好的数据集进行格式转换并进行训练。目前 RVS 支持 3 类神经网络,分别是 MaskRCNN 、KeyPoint 、RotatedYOLO 。

在运行之前,需要手动新建一个以 “.txt” 结尾命名的类别标签文件。

对于 MaskRCNN 以及 RotatedYOLO 两类网络,其类别标签文件中,每一个类别单独占一行,比如: apple banana pear

上述的类别名称“ apple 、banana 、pear ”即为数据标注时所定义的实际类别名称,每一行的名称中不允许带有空格。

对于 KeyPoint 网络,其类别标签文件中每一行还可以额外包含有对应的关键点名称。如: pear banana top bottom orange

banana 后面的 top 以及 bottom 表示对于 banana 这一类目标,设置了两个关键点。

创建上述文件后,将该文件作为 AITrain 算子的 classnames_filepath 属性输入。并将标注好的训练数据所在的文件夹作为算子的 data_directory 属性输入。

该算子用于神经网络的训练,训练完成后会自动生成一个 train_output 的文件夹。而对于 RotatedYOLO 网络,训练结束后,一般需要 box_loss 降低到0.03以下才能达到较好的训练效果,且其训练完成后,会在 used_data / 目录下自动创建 train_output 文件夹,里面包含训练好的权重文件:

used_data

  • train_output

    • weights

    • best.pt

    • last.pt

其中,train_output 文件夹里面会基于最后的 best.pt ,随机选取一部分图像数据进行推理测试并将结果保存为图像文件,其中,val_batch? _ labels.jpg 是原始标注数据,对应的 val_batch?_pred.jpg 是推理数据,可以据此粗略查看训练效果。

更详细的算子属性说明请参照 AITrain 算子说明文档。

AIDetectGPU

AIDetectGPU

该算子可以调用 AITrain 算子在 MaskRCNN 以及 KeyPoint 网络下的训练结果,对于一张输入图像进行一次推理,进而获得目标检测或实例分割的结果。

MaskRCNNGPU 在同一个 RVS 中可以启动多个。使用该算子,必须安装 nvidia 的独立显卡,且显存不低于 4G 。

推理完成后,会将目标的推理掩码以图像列表的形式输出到 obj_list 输出端口,其中的每一张图像对应一个检测目标的掩码图。掩码图长宽同原图保持一致,并且是一张灰度图,背景灰度为 0,检测目标的位置区域用灰度 255 填充。

AIDetectGPU 算子除了输出掩码图列表以及结果显示图,还会输出所有推理结果的类名,均以 list 形式输出,里面的序号一一对应。额外的,对于 KeyPoint 网络,还额外给出每个目标含有的关键点信息列表(keypt_list)。

类名文件路径:对于 MaskRCNN 网络,可以直接使用训练时所用的类名文件,即以 txt 作为文件后缀(或者以 names 为文件名后缀),但是对于 RVS1.3 及以前旧版本的训练方式,也可以选择训练数据转换时生成的 annotations.json 文件作为该命名文件。而对于 KeyPoint 网络,只能选择训练过程中生成的annotations.json文件作为该命名文件。

权重文件地址:对于 RVS1.3 及以前旧版本的训练方式,该属性不应该输入任何参数。对于现有的训练方式,在该属性中输入训练时所生成的 train_output/config.yaml 文件。

更详细的算子属性说明请参照 AIDetectGPU 算子说明文档。

AIDetectCPU

AIdetectCPU

该算子适用于没有 nvidia 显卡的纯 cpu 机器推理使用。参数与 AIDetectGPU 一致。

更详细的算子属性说明请参照 AIDetectCPU 算子说明文档。

RotatedYOLO

rotatedyolo

该算子可以调用 AITrain 算子在 RotatedYOLO 网络下的训练结果,对于一张输入图像进行一次推理,进而获得目标检测结果。该算子在同一个 RVS 中可以启动多个。该算子支持 GPU 以及 CPU 两种模式,使用该算子的 GPU 模式,必须安装 nvidia 的独立显卡。

RotatedYOLO 深度学习模块同 AIDetectGPU/AIDetectCPU 推理算子彼此不互斥,也同 python 算子不互斥,且均可以在同一个 RVS 软件中运行多个。

由于 RotatedYOLO 模型相对简单,则推理速度更快,但是相应的,其训练收敛所需要的标注数据也会远大于 MaskRCNN ,每次训练的时长也往往大于 3 个小时,并且最终的目标推理精度相比与 MaskRCNN 也会有所欠缺。

更详细的算子属性说明请参照 RotatedYOLO 算子说明文档。

ProjectMask

projectmask1

ProjectMask 算子可以把 AI 算子的 rgb 目标分割结果转换到点云图中,进而生成多个目标点云列表 cloudlist 。更详细的算子属性说明请参照 ProjectMask 算子说明文档。

ProjectPoints

ProjectPoints 算子可以把 rgb 图像中的像素点转换到点云中的 3D 点(以 Pose 形式呈现),进而生成一系列的 Poselist。

projectpoints

更详细的算子属性说明请参照 ProjectPoints 算子说明文档。

机器人仿真

仿真机器人资源算子

RVS 软件已为国内外多款常用机器人创建仿真数模,文件格式为“ *.rob ”,并且数模文件库还在不断扩大更新中。通过数模文件,可以在 RVS 软件内控制机器人仿真移动与姿态控制。

在算子列表中找到发布 SimulatedRobotResource 算子,将该算子放置到 ResourceGroup 中。

simulatedrobotrsource

一般需要将机器人的自动启动(机器人资源自动运行)、打开机器人可视化属性。另外,在运行之前需要将机器人模型文件属性更改为自己需要的机器人 rob 文件(需要提前向图漾技术支持人员申请所需要的机器人数模文件)。同时如果为机器人定制了夹具吸盘等工具,可以在工具模型属性中添加进去。控制速度的四个属性:

  • 最大关节速度:用于控制机器人 MoveJoints 时的关节最大速度。单位:弧度每秒。

  • 最大关节加速度:用于控制机器人 MoveJoints 时的关节最大加速度。单位:弧度每平方秒。

  • 最大线性速度:用于控制机器人线性运动时的最大线速度。单位:米每秒。

  • 最大线性加速度:用于控制机器人线性运动时的线速最大加速度。单位:米每平方秒。

    机器人运行后的显示画面效果如图所示。

robot

机器人控制面板

鼠标双击上 3D 视图中的机器人,可以弹出机器人控制面板:

robotpanel

可以通过在关节值编辑栏(上图黄色框)中输入对应的角度来调整机器人关节角度,也可以直接拖动右侧的浮标(上图绿色框)控制机器人关节转动。也可以转动旋钮来调节姿态 x 、y 、z 、rx 、ry 、rz ,如上图红色框所示。所有的当前姿态 pose 数值会在上方蓝色框显示出来,并且可以调节显示单位(上图紫色框)。

还可以主动控制机器人移动到某个位置,继而再查看此时的姿态。首先单击 RVS 软件左上角的停止 键,然后勾选上图蓝色框中的 ROBOT TCP,此时可以查看到机器人末端的 TCP pose 姿态,如下图所示。拖动图上的这些箭头,可以带动整个机器人进行移动。移动过程中的机器人姿态信息可以随时在控制面板中查阅。

tool1

通过算子控制机器人仿真移动

在项目实际使用时,往往是已知目标位姿,需要将机器人移动过去进行仿真显示,此时可以使用 RobotMovement 中 MoveTCP 算子,如下图所示。使用时,需要将机器人移动前的关节坐标连接到左侧 ref_joint,并将需要移动的目标姿态(或者姿态列表)连接到左侧 goal_pose ,运行完成后,会将机器人移动后的关节坐标输出到右侧 ik_solution_joint 。可以调整算子的速度以及加速属性来调整算子当前运动的速度和加速度。调整 线性运动 属性来决定是否直线运动。

movetcp

如果已知机器人需要移动到某个位置的关节坐标,则可以使用 RobotMovement 中 MoveJoint 算子。使用时,需要将机器人需要移动的关节坐标连接到左侧 joint 。

movejoints