线程评级:
在表面上教授目标
# 1
在RoboDK GUI应用程序的“Program”下拉菜单下,有一个名为“Teach Target(s) on Surface”的选项,该选项自动将机器人工具垂直于物体表面,并为用户提供在该物体表面保存目标的选项。我试图写一个Python代码,做同样的事情,给定对象表面上一个点的坐标,而不是让用户手动选择目标,但在Python API中似乎没有任何“教目标(s)在表面”选项的实现。有没有办法通过API访问这个选项?如果不是,如何使用API实现类似的东西呢?
是的,这是可能的。您可以提取一个对象的选定点作为XYZijk (6D数组作为XYZ位置和该点表面的ijk法向量)。

这可以使用SelectedFeature和GetPoints。更多信息请点击这里:
//www.w5838.com/doc/en/PythonAPI/robo...tedFeature

你可以反复检查用户是否选择了一个特定的对象:

代码:
从robolink导入* # API与RoboDK通信

#启动RoboDK API
RDK = Robolink()

Object = rdk。ItemUserPick("选择对象",ITEM_TYPE_OBJECT)

而真正的:
暂停(0.2)
is_selected, feature_type, feature_id = OBJECT.SelectedFeature()
如果不是is_selected:
打印(“没有选择”)
继续

point_mouse, name_feature = OBJECT.GetPoints(FEATURE_SURFACE)
print(" select %i (%i): %s %s" % (feature_id, feature_type, str(point_mouse), name_feature))


GetPoints返回一个6D向量xyzijk。

然后你可以假设曲面的法线是Z轴,并使用如下函数创建一个姿态:
//www.w5838.com/doc/en/PythonAPI/robo...xis_2_pose

这是c#中一个更完整的例子:

代码:
//获取机器人参考系
RoboDK。项目robot_ref = ROBOT.getLink(ITEM_TYPE_FRAME);
如果(! robot_ref.Valid ())

控制台。这个机器人没有选择参考系。选择机器人参考系(或使参考系活跃需要添加一个目标)。”);
返回;
}

Int feature_type = -1;
Int feature_id = -1;

//记住与选定点(XYZ和曲面法线)相关的信息。
//这些值以绝对坐标(相对于该站)检索。
Double [] point_xyz = null;
Double [] point_ijk = null;

而(真)

var obj_selected = RDK.GetSelectedItems();
如果(obj_selected。Count == 1 && obj_selected[0].Type() == ITEM_TYPE_OBJECT)

Var obj = obj_selected[0];
/ / RDK.SetSelectedItems ();//理想情况下,我们需要这个函数来清除选择
var is_Selected = obj. var is_Selected = obj. varselect (out feature_type, out feature_id);
if (is_Selected && feature_type == RoboDK.FEATURE_SURFACE)

垫point_list;
字符串描述= obj。GetPoints(feature_type, feature_id, out point_list);
//很好,我们从表面上得到了这一点。大小是6x1
控制台。WriteLine(“点信息:”+描述);
如果(point_list。Cols < 1 || point_list。行数< 6)

//出错了!这不应该发生....
Console.WriteLine (point_list.ToString ());
继续;
}
double[] value = point_list.GetCol(0).ToDoubles();
Point_xyz = new double[]{值[0],值[1],值[2]};
//反转IJK值(RoboDK提供了正常的从表面出来,但我们通常希望Z轴进入物体)
Point_ijk = new double[] {-value[3], -value[4], -value[5]};
Mat obj_pose_abs = obj.PoseAbs();

//计算绝对坐标中的点(相对于该站)
Point_xyz = obj_pose_abs * Point_xyz;
point_ijk = obj_pose_abs.Rot3x3() * point_ijk;
打破;
}
}
}


//计算机器人参考的绝对姿态
Mat ref_pose_abs = robot_ref.PoseAbs();

//计算机器人工具的绝对位姿
Mat robot_pose_abs = ref_pose_abs * robot_ref.Pose();

//计算选定目标的机器人姿态,以刀具Y轴为参考
//(我们尝试获得Y轴与机器人当前位置尽可能接近的姿态)
Mat pose_surface_abs = Mat.xyzijk_2_pose(point_xyz, point_ijk, robot_pose_abs.VY());

如果(! pose_surface_abs.IsHomogeneous ())

控制台。WriteLine(“出问题了”);
返回;
}

//计算目标的姿态(相对于参考系)
Mat pose_surface_rel = ref_pose_abs.inv() * pose_surface_abs;

//添加目标并更新姿态
var target_new = RDK。AddTarget("T1", robot_ref, ROBOT);
target_new.setAsCartesianTarget ();
target_new.setJoints (ROBOT.Joints ());//如果我们想要记住当前的配置,这是很重要的
target_new.setPose (pose_surface_rel);




浏览此线程的用户:
1客人(年代)