-
Notifications
You must be signed in to change notification settings - Fork 6
Visual_Servoing_Demo_cn
EN | 中文
#演示 6 - 视觉伺服
#####导航栏
本项目基于WPI University的一个已实现的视觉伺服例子程序: http://sdk.rethinkrobotics.com/wiki/Worked_Example_Visual_Servoing
项目重点在于重新使用Baxter再现视觉伺服-找球和移动球的经典案例,理解视觉伺服的原理和Baxter的相应工作方式。
在这个demo中,Baxter需要找到桌子上一个放置球的托盘和一些球(乒乓球),然后拿起一个球并放置到托盘中。Baxter将会重复取球的动作最多100次,当它找不到球时会停止。
文件位置:
sysu_baxter/demos/visual_servoing/src/visual_servoing_setup.py
sysu_baxter/demos/visual_servoing/src/visual_servoing.py
生成文件的位置:
HOME/Visual_Servoing
- 同步sysu_baxter仓库,确保
visual_servoing_setup.py
,visual_servoing.py
两个文件在sysu_baxter/demos
文件夹中。 - 运行Run
catkin_make
和source devel/setup.bash
。 - 在运行程序之前,确认电脑已经连接上Baxter。
- 运行
visual_servoing_setup.py
,设置Baxter使用的手臂并测量手部相机到桌面的距离:$ rosrun visual_servoing visual_servoing_setup.py
- 运行
visual_servoing_.py
,开始取球-放球的主程序:$ rosrun visual_servoing visual_servoing.py
实验准备:
- ROS Indigo
- Baxter Research Robot [Firmware >= v0.7.0]
- Workstation [RSDK >= v1.1.1]
- Rethink Robotics Electric Parallel Gripper
- 桌桌子
- 乒乓球
- 长方形球盒(需要让Baxter所拍摄图片能够找到边框轮廓,确定为长方形,比如一张用黑色马克笔标记了边框的白纸也可)
Visual Servoing Demo程序的概览:
在 visual_servoing_setup.py
中:
- 设置Baxter要使用的手臂
- 使用手部的红外线传感器记录手部相机到桌面的距离
在visual_servoing.py
中:
- 首先用IK server将手臂移动到球盒所在的大概位置。
- 用手部相机拍摄图片,转为灰阶图,然后使用openCV的Canny边距检测算法,根据图片中的球盒轮廓找到球盒,定位其边距,并设置球所放置的位置。Baxter会不断调整手臂位置直到手臂处在球盒上方的合适位置。
- 首先用IK server将手臂移动到乒乓球所在的大概位置。
- 用手部相机拍摄图片,转为灰阶图,然后使用openCV的Hough变换算法检测图片中的圆形,找到乒乓球。当找不到球的时候程序停止。
- 选择其中一个球,计算手部相机和球在x-y平面上的实际距离,使用IK移动手臂使得相机在球的正上方,然后调整为夹子在球的正上方。
- 向下移动手臂,关闭夹子抓起球,然后抬起手臂,移动到球盒上方,向下移动手臂,打开夹子放下球,之后抬起手臂,移动回球的上方。
- 重复第三步最多100次,或者找不到球时停止。
- visual_servoing_setup.py
- visual_servoing.py
###visaul_servoing_setup.py
####主要参数
- self.pose(
self.x
,self.y
,self.z
,self.roll
,self.pitch
,self.yaw
): 手臂的起始位置 -
self.distance
: 手部相机到桌面的距离
####主要程序结构
- (class)
golf_setup
:- (function)
__init__
: 设置参数 - (function)
baxter_ik_move
: 将手臂移动到指定位置 - (function)
get_distance
: 用红外传感器探测手部相机到桌面的距离 - (function)
save
: 将参数设置保存至文件
- (function)
- (function)
main
: 开启设置
###visual_servoing.py
####Primary Parameters
- 位置参数:
-
self.ball_tray_x/y/z
: 球盒所在位置 -
self.golf_ball_x/y/z
: 球所在位置 -
self.roll/pitch/yaw
: 手臂位置
-
- 精度参数:
-
self.ball_tolerance
: 球的计算精度 -
self.tray_tolerance
: 球盒的计算精度
-
- 相机参数:
-
self.cam_calib
: 手部相机标定 -
self.cam_x_offset
,self.cam_y_offset
: 相机到夹子的偏移 -
self.width/height
: 相机像素
-
- Hough变换算法参数:
self.hough_accumulator
self.hough_min_radius
self.hough_max_radius
- Canny变换算法参数:
self.canny_low
self.canny_high
-
self.min_area
: 球盒最小面积
####主要程序结构
- (function)
get_setup
: 读取存在visual_servoing_setup.py
的参数设置 - (function)
main
: 设置参数,并启动主要工作流程 - (class)
locate
: 操作Baxter完成找球-取球动作- (function)
__init__
: 初始化参数 - (function)
baxter_ik_move
: 将手臂移动到指定位置 - (function)
cv2array
: 将openCV图片转换为numpy的array - (function)
get_distance
: 计算手臂到最近的物体的距离 - (function)
update_pose
: 更新手臂在x-y平面的距离 - (function)
print_arm_pose
: 打印手臂的位置信息 - (function)
splash_screen
: 设置Baxter的头部屏幕显示内容 - 找到球盒:
- (function)
find_ball_tray
: 使用Canny边距检测算法找到球盒及其边距 - (function)
ball_tray_iterate
: 将相机移动到球盒上方 - (function)
dither
: 防止程序陷入不断找球盒的死循环 - (function)
canny_it
: Canny边距检测算法主体 - (function)
find_corners
: 找到球盒的四个边角 - (function)
find_places
: 找到可以防止球的位置 - (function)
look_for_ball_tray
: 忽略图片中不相关的部分,找到图片中最大的封闭长方形区域 - (functino)
flood_fill_edge
: 填充球盒的边区域
- (function)
- 找球,取球和放球:
- (function)
pick_and_place
: 找到球并取球和放球操作程序 - (function)
hough_it
: 使用Hough算法找到球 - (function)
golf_ball_iterate
: 将手臂移动到球的上方 - (function)
find_next_golf_ball
: 找下一个球 - (function)
find_gripper_angle
: 找到合适的夹子位置,以避免触碰其他的球 - (function)
is_near_ball_tray
: 检查球是否在球盒中
- (function)
- 相机相关函数:
- (function)
reset_cameras
- (funciton)
open_camera
- (function)
close_camera
- (function)
camera_callback
- (function)
left/right/head_camera_callback
- (function)
subscribe_to_camera
- (function)
baxter_to_pixel
: 将Baxter的位置点转换为像素点 - (function)
pixel_to_baxter
: 将图片的像素点转换为位置点
- (function)
- (function)
Q1: 无法运行visual_servoing_setup.py
和visual_servoing.py
A1: 请确认电脑已经连接上Baxter,运行语句rostopic list
检查. 如果已连接上,尝试运行chmod +x visual_servoing_setup.py
和 chmod +x visual_servoing.py
将文件设置为可执行脚本,然后chong
Q2: 在Baxter Gazebo模拟器中运行程序,会显示错误信息[WARN] [WallTime: 1436414658.281419] [20.609000] left_gripper custom - not capable of 'calibrate' command
A2: Baxter Gazebo模拟器中不能操作夹子部分,因此目前程序只能运行在实际的Baxter上。