zoukankan      html  css  js  c++  java
  • 170112-机械臂moveit!抓取

    前言

    • 这一节有一点高级了

    参考

    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. 客户端在场景中创建被抓取物体,提供位姿信息
        1. 得到位姿信息后,将其发送到抓取服务器grasp server,进行逆运动学解算,如果解算出来,则机械臂会过去
        1. 放置动作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
  • 相关阅读:
    第五周课后作业
    第五周读书笔记
    PB16120853+JL17110067
    第一次个人作业报告
    《编程匠艺》读书笔记----第四周
    软工第一次个人作业博客(一)
    软工第一次个人作业博客(二)
    《程序员修炼之道》读书笔记(二)--第三周
    关于在aspx前台使用后台变量的问题
    sql语句优化SQL Server
  • 原文地址:https://www.cnblogs.com/lizhensheng/p/11117536.html
Copyright © 2011-2022 走看看