前言

  • 这一节有一点高级了

参考

Mastering ROS

学习记录

使用3D视觉传感器

  • 这是实现抓取任务的基础
  • 注意!传感器可以由Gazebo模拟,也可以直接和物理设备相连传入Gazebo中
确认Gazebo插件正确工作
  • 使用RViz查看Gazebo插件传出的点云数据
roslaunch seven_dof_arm_gazebo seven_dof_arm_bringup_grasping
# 这个命令打开gazebo,关节控制器,gazebo视觉传感器插件



  • 在gazebo中添加桌子和物体
  • 打开RViz查看点云信息
构件机器人环境
  • 写一些配置文件配置Moveit的插件(内置的OctoMap Updater)将Gazebo仿真出来的点云数据输入到Moveit规划场景中
  • 机器人环境一般用八叉树来表示,OctoMap已经是Moveit的一个插件,叫做Occupany Map Updater插件,能够从不同的传感器源生成八叉树,目前有两种更新器
  • PointCloud Occupancy Map Updater: This plugin can take input in the form of point clouds (sensor_msgs/PointCloud2)
  • Depth Image Occupancy Map Updater: This plugin can take input in the form of input depth images (sensor_msgs/Image)
  • 第一步就是为这些插件写一些配置文件,来定义使用的插件及其属性
# seven_dof_arm_config/config/sensors_rgbd.yaml
sensors:
- sensor_plugin: occupancy_map_monitor/PointCloudOctomapUpdater
point_cloud_topic: /rgbd_camera/depth/points # 订阅的主题
max_range: 10 # 加入规划场景处理的范围
padding_offset: 0.01 # 其他定义
padding_scale: 1.0
point_subsample: 1
filtered_cloud_topic: output_cloud



  • 第二步就是写启动文件
# seven_dof_arm_config/launch/seven_dof_arm_moveit_sensor_manager.launch
<launch>
<rosparam command="load" file="$(find seven_dof_arm_config)/config/
sensors_rgbd.yaml" />
</launch> # 简单地加载参数到参数服务器



# sensor_manager.launch
<launch>
<!-- This file makes it easy to include the settings for sensor
managers -->
<!-- Params for the octomap monitor -->
<!-- <param name="octomap_frame" type="string" value="some frame in
which the robot moves" /> -->
# 这句话是注释的,因为书本上的示例机器人是静止的,如果机械臂固结在移动机器人上,那么需要定义八叉树地图的坐标系
<param name="octomap_resolution" type="double" value="0.015" />
<param name="max_range" type="double" value="5.0" />
# 这是分辨率和范围
<!-- Load the robot specific sensor manager; this sets the moveit_
sensor_manager ROS parameter -->
<arg name="moveit_sensor_manager" default="seven_dof_arm" />
<include file="$(find seven_dof_arm_config)/launch/$(arg moveit_
sensor_manager)_moveit_sensor_manager.launch.xml" />
</launch>



启动文件



roslaunch seven_dof_arm_gazebo seven_dof_arm_bringup_grasping.launch
# 启动gazebo,加入桌子和物体
roslaunch seven_dof_arm_config moveit_planning_execution.launch
# 启动Moveit规划器,这是在RViz中的规划界面
# 现在RViz中可以看到八叉树地图了



实现抓取任务

  • 有一个现成的包,叫做moveit_simple_grasps,这是一个简单的抓取动作生成器,它接收被抓取物体的姿态数据,生成抓取物体的动作序列,通过多线程的IK解算器来过滤和去掉不合法的抓取动作。这个包包括抓取生成器grasp generators, grasp filters, visualization tools。这个工具已经支持一些机械臂和机器人,我们可以通过简单的修改就可以支持自己的机械臂。
  • 复制moveit-simpl-grasps文件夹到项目中
roslaunch seven_dof_arm_gazebo grasp_generator_server.launch



  • 我们需要向服务器提供机械臂的planning group和end-effector group,所以需要在启动文件中做一些定义
<launch>
  <arg name="robot" default="cyton_gamma_1500"/>

  <arg name="group"        default="arm"/>
  <arg name="end_effector" default="gripper"/>


  <node pkg="moveit_simple_grasps" type="moveit_simple_grasps_server" name="moveit_simple_grasps_server">
    <param name="group"        value="$(arg group)"/>
    <param name="end_effector" value="$(arg end_effector)"/>

    <rosparam command="load" file="$(find gamma_1500_gazebo)/config/$(arg robot)_grasp_data.yaml"/>

  </node>


</launch>



  • 接下来需要定义grasp_data.yaml
base_link: 'base_link'

gripper:
  end_effector_name: 'gripper'

  # Default grasp params
  joints: ['gripper_joint', 'gripper_joint2']

  pregrasp_posture: [0.0, 0.0]
  pregrasp_time_from_start: 4.0

  grasp_posture: [1.0, 1.0]
  grasp_time_from_start: 4.0

  postplace_time_from_start: 4.0

  # Desired pose from end effector to grasp [x, y, z] + [R, P, Y]
  grasp_pose_to_eef: [0.0, 0.0, 0.0]
  grasp_pose_to_eef_rotation: [0.0, 0.0, 0.0]

  end_effector_parent_link: 'wrist_roll'



建立客户端和服务端

  • 有多种方式实现抓取任务,1)提前定义一系列的关节角值,这种方法需要我们把被抓取物体放在预定义的位置2)通过逆运动学来抓取,需要手动提供被抓取物体的位姿3)通过视觉伺服的方式来抓取,同样依赖逆运动学,不过是通过视觉来获取被抓取物体的位姿
  • 在这里我们直接提供被抓取物体的位姿
在moveit demo中仿真
  • 使用python grasp client
roslaunch seven_dof_config demo.launch
# 启动RViz界面
roslaunch seven_dof_arm_gazebo grasp_generator_server
# 启动moveit grasp 服务器
rosrun seven_dof_arm_gazebo pick_and_place.py
# 启动python客户端



  • 抓取流程可分为六步
  1. 客户端在场景中创建被抓取物体,提供位姿信息
  2. 得到位姿信息后,将其发送到抓取服务器grasp server,进行逆运动学解算,如果解算出来,则机械臂会过去
  3. 放置动作place action
python客户端源码解读
  • 一个重要的是,我们在gazebo中创建的物理环境信息应该在client中体现出来,所以我们在client中也要添加障碍物和被抓取物体的信息,不过由于grasp server是简单的,所以最好添加简单的几何物体。
  • 还有一些消息订阅和发布的函数定义
  • 动作客户端的定义
在gazebo中仿真



roslaunch seven_dof_arm_gazebo seven_dof_arm_bringup_grasping.launch
roslaunch seven_dof_arm_config moveit_planning_execution.launch
roslaunch seven_dof_arm_gazebo grasp_generator_server
rosrun seven_dof_arm_gazebo pick_and_place.py



  • 在真机上也是一样的,只是还要加上电机控制器controller