教学目标表面- - - - - -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);
|