Skip to content

Visual_Servoing_Demo_cn

Juan Rojas edited this page Dec 2, 2016 · 1 revision

<< back to Mainpage

EN | 中文

#演示 6 - 视觉伺服

#####导航栏

  1. 总结
  2. 运行
  3. 概览
  4. 程序框架
  5. 视频
  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

##运行

  1. 同步sysu_baxter仓库,确保visual_servoing_setup.py, visual_servoing.py 两个文件在 sysu_baxter/demos文件夹中。
  2. 运行Run catkin_makesource devel/setup.bash
  3. 在运行程序之前,确认电脑已经连接上Baxter。
  4. 运行visual_servoing_setup.py,设置Baxter使用的手臂并测量手部相机到桌面的距离: $ rosrun visual_servoing visual_servoing_setup.py
  5. 运行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中:

  1. 设置Baxter要使用的手臂
  2. 使用手部的红外线传感器记录手部相机到桌面的距离

visual_servoing.py中:

  1. 首先用IK server将手臂移动到球盒所在的大概位置。
  2. 用手部相机拍摄图片,转为灰阶图,然后使用openCV的Canny边距检测算法,根据图片中的球盒轮廓找到球盒,定位其边距,并设置球所放置的位置。Baxter会不断调整手臂位置直到手臂处在球盒上方的合适位置。
  3. 首先用IK server将手臂移动到乒乓球所在的大概位置。
  4. 用手部相机拍摄图片,转为灰阶图,然后使用openCV的Hough变换算法检测图片中的圆形,找到乒乓球。当找不到球的时候程序停止。
  5. 选择其中一个球,计算手部相机和球在x-y平面上的实际距离,使用IK移动手臂使得相机在球的正上方,然后调整为夹子在球的正上方。
  6. 向下移动手臂,关闭夹子抓起球,然后抬起手臂,移动到球盒上方,向下移动手臂,打开夹子放下球,之后抬起手臂,移动回球的上方。
  7. 重复第三步最多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) 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) 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) 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: 将图片的像素点转换为位置点

##视频

IMAGE ALT TEXT

##常见问题

Q1: 无法运行visual_servoing_setup.pyvisual_servoing.py
A1: 请确认电脑已经连接上Baxter,运行语句rostopic list检查. 如果已连接上,尝试运行chmod +x visual_servoing_setup.pychmod +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上。