RoboDK论坛
教学目标表面可打印版本

+ - RoboDK论坛(//www.w5838.com/forum)
+ - - -论坛:RoboDK (EN) (//www.w5838.com/forum/Forum-RoboDK-EN)
+ - - -论坛:RoboDK API (//www.w5838.com/forum/Forum-RoboDK-API)
+ - - -线程:教目标表面(/ Thread-Teach-Target-On-Surface)



教学目标表面- - - - - -Michaelw46- - - - - -05-07-2019

RoboDK GUI应用程序中的“项目”下拉菜单下有一种选择叫教目标表面(s)的自动导向机器人工具垂直于物体的表面,让用户选择保存一个目标表面的对象。我试图写一个Python代码,做同样的事给的坐标点表面的对象而不是让用户手动选择目标,但似乎没有任何实现的“教目标表面(s)”选项在Python API。有什么方法可以通过API访问这个选项吗?如果没有,类似的事情怎么可能使用API实现吗?


RE:教学目标表面- - - - - -艾伯特- - - - - -05-09-2019

是的,这是可能的。可以提取选定的点对象的点作为XYZijk (6 d数组XYZ的位置和法向量ijk表面在这一点上)。

这是可能使用SelectedFeature和GetPoints。更多信息:
//www.w5838.com/doc/en/PythonAPI/robolink.html robolink.Item.SelectedFeature

你可以反复检查如果用户选择一个特定的对象:

代码:
从robolink进口* # API与RoboDK沟通

#开始RoboDK API
RDK = Robolink ()

对象= 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)
我选择打印(“% (%):% s % s“% (feature_id feature_type, str (point_mouse) name_feature))


xyzijk GetPoints返回6维向量。

你可以假设正常的表面是Z轴和创建一个使用这样一个函数:
//www.w5838.com/doc/en/PythonAPI/robodk.html robodk.point_Zaxis_2_pose

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

代码:
/ /得到机器人参考系
RoboDK。项robot_ref = ROBOT.getLink (ITEM_TYPE_FRAME);
如果(! robot_ref.Valid ())
{
控制台。WriteLine(“机器人没有参照系选择。选择一个机器人参考系(或做一个参考系主动要求添加一个目标)。”);
返回;
}

int feature_type = 1;
int feature_id = 1;

/ /记住信息选择的点(XYZ,表面正常)。
/ /检索这些值在绝对坐标系(对车站)。
双[]point_xyz =零;
双[]point_ijk =零;

而(真)
{
var obj_selected = RDK.GetSelectedItems ();
如果(obj_selected。数= = 1 & & obj_selected [0] .Type () = = ITEM_TYPE_OBJECT)
{
var obj = obj_selected [0];
/ / RDK.SetSelectedItems ();/ /理想情况下我们需要这个功能明确的选择
var is_Selected = obj。SelectedFeature (feature_type, feature_id);
如果(is_Selected & & feature_type = = RoboDK.FEATURE_SURFACE)
{
垫point_list;
字符串描述= obj。GetPoints (feature_type feature_id point_list);
/ /太好了,我们得到了从表面。这将是大小6 x1
控制台。WriteLine(“信息:”+描述);
如果(point_list。关口< 1 | | point_list。行< 6)
{
/ /是错了!这应该不会发生....
Console.WriteLine (point_list.ToString ());
继续;
}
双[]价值= point_list.GetCol (0) .ToDoubles ();
point_xyz = new双[]{价值[0],[1],[2]价值};
/ /反转IJK值(RoboDK提供正常的表面但我们通常希望Z轴进入对象)
point_ijk = new双[]{价值[3],价值[4],价值[5]};
垫obj_pose_abs = obj.PoseAbs ();

/ /计算绝对坐标点(对车站)
point_xyz = obj_pose_abs * point_xyz;
point_ijk = obj_pose_abs.Rot3x3 () * point_ijk;
打破;
}
}
}


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

/ /计算绝对构成机器人的工具
垫robot_pose_abs = ref_pose_abs * robot_ref.Pose ();

/ /计算选定目标的机器人位姿和使用该工具Y轴作为参考
/ /(我们试图得到Y轴的姿势尽可能当前机器人位置)
垫pose_surface_abs = Mat.xyzijk_2_pose (point_xyz、point_ijk robot_pose_abs.VY ());

如果(! pose_surface_abs.IsHomogeneous ())
{
控制台。WriteLine(“错”);
返回;
}

/ /计算目标的构成(相对于参考系)
垫pose_surface_rel = ref_pose_abs.inv () * pose_surface_abs;

/ /添加一个目标和更新
var target_new = RDK。AddTarget (T1, robot_ref,机器人);
target_new.setAsCartesianTarget ();
target_new.setJoints (ROBOT.Joints ());/ /这是只有重要的如果我们想记住当前配置
target_new.setPose (pose_surface_rel);