线程评分:
  • 0投票 - 0平均
  • 1
  • 2
  • 3
  • 4
  • 5
来自相机Intel D435 Realsense的目标
大家好,

我正在做一个项目,我想单击图像的单点,并在现实生活中获得该点的坐标(x,y,z)。然后在Robodk上重新创建相机的场景,然后将机器人臂(Universal Robots的UR5E)移至该点。事实是,如果我打印我从相机中获得的坐标(x,y,z),我认为它们很有意义,但是当我使用它们来为Robodk创建目标并将手臂移到那里时,它们就不会与应该走的地方匹配。

这是我正在使用的代码。
代码:
导入CV2#艺术状态计算机视觉算法库
导入Numpy作为NP#科学计算的基本软件包
导入imageio
导入matplotlib.pyplot作为PLT#2D绘图库生产出版物质量图
导入pyrealsense2为卢比
导入Win32Gui
导入Win32API
导入时间
导入Pyautogui
导入tkinter
导入tkinter.messagebox
从Robolink Import *#API与Robodk通信
来自Robodk Import *#基本矩阵操作

#与Robodk的任何互动都必须通过
rl = robolink()

top = tkinter.tk()

点= rs.points()
管道= rs.pipeline()
config = rs.config()
profile = pipe.start(config)

着色器= rs.Colorizer()
align = rs.Align(rs.Stream.Color)
state_left = win32api.getKeyState(0x01)#左键向上= 0或1。按钮down = -127或-128
设备= profile.get_device()#类型:rs.device
depth_sensor = device.first_depth_sensor()#类型:rs.depth_sensor


如果depth_sensor.supports(rs.option.depth_units):
depth_sensor.set_option(rs.option.depth_units,0.0001)

机器人= rl.item('ur5e')
帧= rl.item('frame 2')
target = rl.addtarget('target 2',帧)

尝试:
而真:
帧= pipe.wait_for_frames()
帧= Align.Process(帧)
depth_frame = frames.get_depth_frame()
color_frame = frames.get_color_frame()
如果不是depth_frame:继续
#print(宽度,高度)
depth = np.asanyarray(colorizer.Colorize(depth_frame).get_data())
color = np.asanyarray(color_frame.get_data())
图像= np.hstack(((颜色,深度)))
#cv2.namedwindow('rgb_view',cv2.window_normal)
#cv2.setwindowproperty('rgb_view',cv2.wnd_prop_fullscreen,cv2.window_fullscreen)
cv2.imshow('rgb_view',深度)
depth_intrin = depth_frame.profile.as_video_stream_profile()。
#flags,hcursor,(x,y)= win32gui.getCursorInfo()
x,y = win32api.getCursorpos()
#print(x,y)
pixel_coord = [x,y]
KeyPress = win32api.getKeystate(0x01)
key = cv2.waitkey(1)
#按ESC或“ Q”关闭图像窗口
如果键&0xff == ord('q')或key == 27:
cv2.destroyallwindows()
休息
#Calculate距离
如果KeyPressed!= state_left:
state_left =键
打印(关键)
如果Keypressed <0:
if(0 dist_to_center = depth_frame.get_distance(x,y)
dist_to_center = round(dist_to_center,4)
depth_point = rs.rs2_deproject_pixel_to_point(depth_intrin,pixel_coord,dist_to_center)
depth_point = [i * 100 for i in depth_point]
depth_point = [round(i,5)for i in depth_point]
#depth_point =(“,” .join(in in depth_point e ret(e)))
#with open('coordinates.txt','w')为f:
#f.write(“%s \ n”%depth_point)
#f.close()
打印(depth_point)
打印(“相机正面向对象:',dist_to_center,'米之外')
target.setpose(offset(eike(),depth_point [0],depth_point [1],depth_point [2],0,0,0,0))
robot.movej(目标)
时间。

最后:
pipe.stop()

如果有人知道如何旋转相机,那也将非常有用。

提前致谢,

问候。
该线程已移至API部分。
您应该首先校准相机在电池中的位置。
例如,您可以添加一个称为“相机眼”的新坐标系,该系统代表相机的位置。

您在用机器人拿着相机吗?如果是这样,则应适当地将相机相对于机器人(也称为手眼校准)。

如果相机是静态的,则可以取3个或更多参考点将相机定位(相机和机器人的共同点)。

例如,要检索目标的绝对XYZ坐标,您可以做这样的事情:
代码:
#获取相机坐标系项目
camera_eye = rdk.item(“相机眼”)

#计算绝对坐标从相机点击的绝对XYZ位置:
xyz_camera = [depth_point [0],depth_point [1],depth_point [2]]
xyz_abs = camera_eye.poseabs()*xyz_camera
然后,您可以转到这样做这样的职位:
代码:
#将当前的机器人位置作为完整的姿势(然后可以使用此方向)
target_pose = robot.pose()

#计算绝对目标坐标(世界/公共参考框架)
#target_pose_abs = target.parent()。poseabs() * target_pose
target_pose_abs = target.poseabs()#上一行相同

#该姿势的强制XYZ绝对坐标(相对于世界参考框架)
target_pose_abs.setpos(xyz_abs)

#设定给定绝对位置的目标的姿势(相应计算相对目标)
target.setposeabs(target_pose_abs)

#移至目标
robot.movej(目标)
如果有人正在寻找一种在Robodk中确定相机姿势的方法,我们在我们的Python示例中添加了使用OpenCV和Charuco Board的相机姿势估算的示例,请参见//www.w5838.com/doc/en/pythonapi/exam...amera-pose
通过访问我们在线文档通过在我们的教程上观看教程YouTube频道




用户浏览此线程:
1位客人