线程评级:
从摄像头英特尔d435 Realsense瞄准
# 1
大家好!

我正在做一个项目,我想点击一个图像的单点,并获得该点在现实生活中的坐标(x, y, z)。然后在robodk上重新创建摄像机的场景,并将机械臂(通用机器人的ur5e)移动到该点。问题是,如果我打印坐标(x, y, z),我从相机,我认为他们是有意义的,但当我用他们为robodk创建一个目标和移动手臂,他们不匹配的点应该去哪里。

这是我正在使用的代码。
代码:
导入cv2 #最先进的计算机视觉算法库
导入numpy作为科学计算的nnp # basic包
进口imageio
进口matplotlib。pyplot作为plt# 2D绘图库,生成发布质量图
将pyrealsense2导入为rs
进口win32gui
进口win32api
导入的时间
进口pyautogui
进口tkinter
进口tkinter.messagebox
从robolink导入* # API与RoboDK通信
从robodk导入* #基本矩阵操作

任何与RoboDK的互动都必须通过
RL = Robolink()

top = tkinter.Tk()

积分= rs.points()
Pipe = rs.pipeline()
Config = rs.config()
Profile = pipe.start(config)

Colorizer = rs.colorizer()
Align = rs.align(rs.stream.color)
state_left = win32api.GetKeyState(0x01) #左按钮向上= 0或1。Button 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)

robot = RL.Item('UR5e')
frame = RL。项目(第二帧)
目标= RL。AddTarget('Target 2', frame)

试一试:
而真正的:
Frames = pipe.wait_for_frames()
帧= align.process(帧)
Depth_frame = frames.get_depth_frame()
Color_frame = frames.get_color_frame()
如果不是depth_frame:继续
#打印(宽度、高度)
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。cv2 setWindowProperty(“RGB_View”。WND_PROP_FULLSCREEN cv2.WINDOW_FULLSCREEN)
cv2。imshow(“RGB_View”、深度)
Depth_intrin = depth_frame.profile.as_video_stream_profile().intrinsic
#flags, hcursor, (x,y) = win32gui.GetCursorInfo()
x, y = win32api.GetCursorPos()
#打印(x, y)
Pixel_coord = [x, y]
keypressed = win32api.GetKeyState(0x01)
key = cv2.waitKey(1)
#按“esc”或“q”关闭图像窗口
if key & 0xFF == ord('q')或key == 27:
cv2.destroyAllWindows ()
打破
#计算距离
如果keypressed != state_left:
State_left = keypressed
打印(keypressed)
如果按键< 0:
如果(0Dist_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)
[i * 100 for i in Depth_point]
ddepth_point = [round(i, 5) for i in Depth_point]
#depth_point =(", "。Join (repr(e) for e in depth_point))
#用open('Coordinates.txt', 'w')作为f:
# f.write("%s\n" % depth_point)
# f.close ()
打印(depth_point)
print('相机正对着一个对象:',dist_to_center,'米远')
Target.setPose(Offset(eye(), depth_point[0], depth_point[1], depth_point[2], 0,0,0))
robot.MoveJ(目标)
time . sleep (0.7)

最后:
pipe.stop ()

如果有人知道如何得到相机的旋转,这将是非常有用的。

提前谢谢你,

的问候。
此线程已移动到API部分。
# 3
你应该首先校准相机在牢房中的位置。
例如,您可以添加一个名为“Camera Eye”的新坐标系统来表示相机的位置。

你是用机器人拿着相机吗?如果是这样,你应该正确放置相机相对于机器人(也称为手眼校准)。

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

例如,要检索一个目标的绝对XYZ坐标,你可以这样做:
代码:
#获取相机坐标系统项
camera_eye = RDK。项目(“过目不忘”)

计算从相机点击的绝对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() # previous line做同样的事情

#强制这个姿势的XYZ绝对坐标(相对于世界参考系)
target_pose_abs.setPos (xyz_abs)

#在给定绝对位置的情况下设置目标的姿态(相对目标是相应计算的)
target.setPoseAbs (target_pose_abs)

#移动到目标
robot.MoveJ(目标)
# 4
如果有人正在寻找一种在RoboDK中以编程方式确定摄像机姿态的方法,我们在我们的Python示例中添加了一个使用OpenCV和ChAruCo板的摄像机姿态估计示例,请参见//www.x7093.com/doc/en/PythonAPI/exam...amera-pose
有关RoboDK及其功能的有用信息,请访问我们的爱游戏ayx高尔夫球在线文档通过观看我们的教程YouTube频道




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