前言
- 這一節有一點高級了
參考
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客戶端
- 抓取流程可分為六步
-
- 客戶端在場景中創建被抓取物體,提供位姿信息
-
- 得到位姿信息后,將其發送到抓取服務器grasp server,進行逆運動學解算,如果解算出來,則機械臂會過去
-
- 放置動作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