Moveit!入门——古月居机械臂开发笔记(二)

  • 引言
  • ROS机械臂开发_机器视觉与物体抓取
    • 1、ROS中的运动学插件
    • 2、Moveit!碰撞检测
      • 规划场景
    • 3、Pick and Place
    • 4、ROS中的机器视觉
      • ROS中的图像数据
      • 摄像头标定
      • ROS+OpenCV
      • ORK(Object Recognition Kitchen)
    • 5、Moveit!视觉集成
  • 后记

引言

接上次笔记(一)Moveit!和机械臂控制,这一次主要为:ROS机械臂开发_机器视觉与物体抓取

ROS机械臂开发_机器视觉与物体抓取

1、ROS中的运动学插件

参考https://www.guyuehome.com/1921
       在Moveit!setup assistant配置中会选择一个运动学求解器,用于运动学反解。

KDL

很多点求解不出来,求解时间过长,i7处理器,一个姿态求解时间大概在0.01s-0.1s。

TRAC_IK
       求解速度和求解成功率均高于KDL。但是TRAC-IK也有问题,它是一种数值算法,每次求解得到的关节位置不一定相同。

使用方法——ROS的软件源中已经集成了TRAC-IK的安装包,可以直接使用以下命令安装:

sudo apt-get install ros-melodic-trac-ik-kinematics-plugin

然后修改机械臂MoveIt!配置功能包下的kinematics.yaml文件就可以使用啦:

 kinematics_solver: trac_ik_kinematics_plugin/TRAC_IKKinematicsPluginkinematics_solver_attempts: 3kinematics_solver_search_resolution: 0.005kinematics_solver_timeout: 0.05

此时运行配置功能包中的demo.launch使用的就是TRAC_IK求解器了。

IKFAST
       IKFAST是一种基于解析算法的运动学插件,可以保证每次求解的一致性。相比KDL和TRAC-IK,IKFAST的安装过程就比较复杂了,不过就笔者的使用经验来讲,IKFAST的效果还是很推荐的,所以不妨一试,
       Moveit官方教程配置方法

2、Moveit!碰撞检测

规划场景

这一块即指在场景中添加障碍物体,在规划轨迹时考虑避障。需要我们做的不多,只需要添加物体,规划是自动进行的。
:这里我理解的添加障碍物体是在Moveit!中添加,让其知道环境中有这么一个物体。而gazebo是仿真世界,在gazebo中的模型Moveit!不会主动避障,即需要3D sensors来做实时避障。

在上一篇笔记中提到的轨迹约束中的运动规划器,使用OMPL中的算法。OMPL (Open Motion Planning Library) 是一个开源的运动规划库,主要是执行随机规划器。MoveIt直接整合OMPL,使用其库里的运动规划器作为主要/默认的一套规划器。

Moveit!内部实现方法——Moveit!中有一个重要的功能模块叫规划场景监听器

这一块均参考https://www.guyuehome.com/17370

       可以通过RVIZ(Publish Scene)来往场景添加物体,也可以通过编程(Moveit官方教程中有),还可以用ROBOT 3D Sensors实时检测场景中的障碍物。

同时Moveit!也可以做到将被抓取物体纳入避障规划。

3、Pick and Place

  1. 创建抓取的目标物体(已知物体的位置)
  2. 设置目标物体的放置位置
  3. 生成抓取姿态(生成一系列姿态,姿态之间轻微变化,防止无法求解)
# 将目标位置设置为机器人的抓取目标位置
grasp_pose = target_pose
# 生成抓取姿态
grasps = self.make_grasps(grasp_pose,  [target_id])
# 将抓取姿态发布,可以在rviz中显示
for grasp in grasps:self.gripper_pose_pub.publish(grasp.grasp_pose)rospy.sleep(0.2)
  1. Pick:
# 追踪抓取是否成功, 以及抓取的尝试次数
result = None
n_attempts = 0
# 重复尝试抓取,直到成功或超过最大尝试次数
while result != MoveItErrorCodes.SUCCESS and n_attempts < max_pick_attempts:n_attempts += 1rospy.loginfo('Pick attempt:' + str(n_attempts))result = arm.pick(target_id, grasps) # 上层的接口,类似arm.plan, arm.go类似rospy.sleep(0.2)
  1. Place:
# 如果pick成功,则进入place阶段
if result == MoveItErrorCodes.SUCCESS:result = Nonen_attempts = 0# 生成放置姿态places = self.make_places(place_pose)# 重复尝试放置,直到成功或超过最大尝试次数while result != MoveItErrorCodes.SUCCESS and  n_attempts < max_place_attempts:n_attempts += 1rospy.loginfo('Place attempt:' + str(n_attempts))for place in places:result = arm.place(target_id, place) # 上层的操作接口if result == MoveItErrorCodes.SUCCESS:breakrospy.sleep(0.2)if result != MoveItErrorCodes.SUCCESS:rospy.loginfo('Place operation failed after ' + str(n_attempts))

在上面使用了非常上层的接口PICK/PLACE,其中具体怎么样去夹,怎么样去放,我们不知道其内部实现。

这里有一个疑问是,Pick和Place都是对于机械臂本身的,并没有涉及夹具的open,close操作,那它是怎么完成抓取放置这些动作的呢?

4、ROS中的机器视觉

参考https://www.guyuehome.com/262?replytocom=49154

ROS中的图像数据

图像数据消息类型如下图:

       针对压缩图像CompressedImage

       针对点云PointCloud2

摄像头标定

摄像头这种精密仪器对光学器件的要求较高,由于摄像头内部与外部的一些原因,生成的物体图像往往会发生畸变,为了避免数据源造成的误差,需要针对摄像头的参数进行标定。ROS官方提供了用于双目和单目摄像头标定的功能包——camera_calibration。
ROS官方单目标定教程

或许可以拿笔记本自带摄像头试试内参标定(后面再试试)
这里提到的是内参标定,还需要外参标定,即眼在手上或眼在手外。
       安装标定功能包

sudo apt-get install ros-melodic-camera-calibration

简要过程:

  1. 启动摄像头,读取摄像头视频信息
 sudo apt-get install ros-melodic-usb-camroslaunch usb_cam-test.launchrqt_image_view

这个时候 调用的是你自己的笔记本上的摄像头,要去launch文件中把video0改成video1就可以调用外接摄像头啦!(一般默认笔记本自带摄像头是video0)

  1. 启动标定程序,eg:

    rosrun camera_calibration cameracalibrator.py --size 11x8 --square 0.03 image:=/usb_cam/image_raw camera:=/usb_cam
    # size:标定棋盘格内部角点个数,这里使用的棋盘格一共有8行,每行11个
    # square:每个棋盘格的边长,单位米
    # image、camera:设置摄像头发布的图像话题
    
  2. 如果是Kinect等深度相机,除了彩色摄像头还有红外深度摄像头,还需要进行一次标定
  3. 摄像头使用标定结果文件(.yaml),在启动摄像头的Launch文件中添加参数

ROS+OpenCV

sudo apt-get install ros-melodic-vision-opencv libopencv-dev python-opencv

主要是通过CVBridge将ROS的图像数据转换成OpenCV的图像格式,进行图像处理后,再将OpenCV格式的图像数据转换成ROS图像消息,发布。
CVBridge官方教程:介绍了如何转换

imgmsg_to_cv2():将ROS图像消息转换成OpenCV的图像数据;
       cv2_to_imgmsg():将OpenCV格式的图像数据转换成ROS图像消息;

ORK(Object Recognition Kitchen)

ORK是ROS集成的物体识别库,其中有很多物体识别算法,如LineMod。

5、Moveit!视觉集成

首先阐述一下我对这一块的理解,即它存在的意义。当在gazebo中仿真kinect模型时,可以获得仿真世界的RGBD信息,而这些信息Moveit!是不知道的,即在rviz界面是没有仿真物体的。这个时候可以添加相应的配置,利用Moveit!的场景监听器,将点云等数据传给Moveit!,使Moveit!将这些物体纳入路径规划

这一步应该是十分重要的,与此前我做的将机械臂移动到已知的指定位置完全不同。

需要两步:

  1. 修改Moveit配置包config文件夹中的sensors_3d.yaml如下
# The name of this file shouldn't be changed, or else the Setup Assistant won't detect it
sensors:- sensor_plugin: occupancy_map_monitor/PointCloudOctomapUpdaterpoint_cloud_topic: //kinect_V2/depth/pointsmax_range: 5.0frame_subsample: 1point_subsample: 1padding_offset: 0.1padding_scale: 1.0max_update_rate: 1.0filtered_cloud_topic: filtered_cloud
  1. 修改配置包launch文件夹中的ur5_moveit_sensor_manager.launch.xml修改如下:
<launch><rosparam command="load" file="$(find ur5_single_arm_moveit_config)/config/sensors_3d.yaml" /><param name="octomap_frame" type="string" value="base_link" /><param name="octomap_resolution" type="double" value="0.04" /><param name="max_range" type="double" value="5.0" />
</launch>

其中第二个参数是你想要将八叉树地图发布在那个坐标系,第三个参数为方格的分辨率,最后一个为显示范围。

这里有碰到一个奇怪的现象,设置octomap_resolution为0.05时,运行grasp_demo.py,机械臂到不了预定位置,设为0.04,0.03时又可以,初步猜测为0.05精度太低,在本应到达的抓取位置会与物体相碰,就没有执行到那步路径?

同时由于kinect2把待抓取物体也纳入了障碍,导致要抓取的那一步规划出错。

综合来看,要实现Pick&Place需要以下几步:

  1. 摄像头标定(内参,外参)
  2. 物体识别
  3. 抓取姿态分析
  4. 机械臂运动规划

后记

在对Moveit和ros的使用流程有了基础认识之后,就要开始涉及整个完整的系统流程了,希望自己还能加油。想一想还有哪些没有完成:

  1. 相机标定(内参,外参)
  2. 一些坐标系之间的关系,还需要多实践加强认识
  3. 结合视觉,识别物体,生成抓取姿态,完成pick&place
  4. 以及最重要的如何将深度学习生成得到的抓取姿态与ros结合

Moveit!入门——古月居机械臂开发笔记(二)相关推荐

  1. Moveit!入门——古月居机械臂开发笔记(一)

    Moveit!入门--古月居机械臂开发笔记(一) 引言 Moveit!与机械臂控制 1.创作机械臂模型 2.生成配置文件 3.如何使用Moveit!实现机械臂仿真(gazebo) 完善模型 在gaze ...

  2. ros构建机器人运动学模型_古月私房课 | ROS机械臂开发中的主角MoveIt!

    ~欢迎关注~ 微信公众号:古月居 新浪微博:古月春旭 知乎专栏:古月居 原文链接:古月私房课 | ROS机械臂开发中的主角MoveIt! 大家好,这里是<ROS机械臂开发:从入门到实战>的 ...

  3. Dobot机械臂开发学习(一)

    Dobot机械臂开发学习(一) 前一段时间入手了一台Dobot桌面机械臂,号称是家用的工业级性能桌面机器人.这台四轴机械臂,承重500g,动作精度可达0.2mm,采用三台步进电机驱动,拥有两个角度传感 ...

  4. 【Visual C++】游戏开发笔记二十三 游戏基础物理建模 五 粒子系统模拟 二

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  5. 【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍

    游戏开发笔记二十七 Direct3D 11入门级知识介绍 作者:毛星云    邮箱: happylifemxy@163.com    期待着与志同道合的朋友们相互交流 上一节里我们介绍了在迈入Dire ...

  6. 【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7707628 作者:毛星云 邮箱: happ ...

  7. 【STM32】【C】【嵌入式】分享一下我的项目经验--基于stm32桌面主从机械臂设计(二弹)

    本文为原创文章,转载需要注明转载出处 前言:嵌入式开发是相比其他IT行业是比较难的行业,它不仅需要你去掌握软件的经验,还要去学习一些硬件的知识, 它是软件和硬件的一个粘合剂,起到一个至关重要的地位 下 ...

  8. 【Visual C++】游戏开发笔记二十三 游戏基础物理建模(五) 粒子系统模拟(二)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7607916 作者:毛星云    邮箱: h ...

  9. iOS工程开发笔记二

    iOS工程开发笔记<二> 在Xcode 4, 5的模板工程中可以看到Precompile Prefix Header,但是在Xcode 6被去除了. Xcode 6去掉Precompile ...

最新文章

  1. Bootstrap 模态框上下居中
  2. 10万视频,所有图像均获授权,Facebook创建大规模Deepfake数据集
  3. 简单粗暴的“Debug模式”
  4. 我们常用的撤销和恢复功能,你知道它们使用了什么设计模式吗?
  5. python随机排列图片_python 随机打乱 图片和对应的标签方法
  6. pyqt5-步长调节器
  7. Android 性能测试之方向与框架篇
  8. atitit.MIZIAN 陕北方言 特有词汇 大词典 attilax 整理 h--n v1 q31.xlsx
  9. wifislax14.0final reaver穷举PIN教程 wap,wps破解教程
  10. linux命令安装tongweb教程,【中间件】TongWeb安装
  11. java jsp中文乱码怎么解决_如何解决JSP中文乱码问题
  12. 华为储存服务器许可证,华为存储配件,华为维保服务,华为服务器
  13. Linux如何查看CPU温度
  14. 单片机 MSP430 G2553 F5529 超声波 检测原理 测距原理 SR04 串口
  15. java导出dbf_java 导出dbf格式
  16. 智能头盔 Livall携全球首款智能骑行头盔亮相CES
  17. 基础程序教学教程【语言:python3.4】
  18. 淘宝/天猫获取淘宝直播分类id接口 API 返回值说明
  19. zxing扫描条形码 ios
  20. 关于软件界面设计、控件颜色搭配、一些实用建议(偷懒技巧)总结——针对C# WinForm/WPF技术

热门文章

  1. 数据治理-数据质量-数据质量的概念和维度
  2. SpringBoot应用篇之FactoryBean及代理实现SPI机制示例
  3. C#使用FFmpeg的总结
  4. MySQL 8.0.12安装教程(windows 64位)
  5. 信息系统项目管理师-九大知识领域必备知识点整理
  6. Java常用开发软件下载地址
  7. 2020教师节送老师什么礼物好呢?
  8. CentOS 7.3上图数据库Neo4j的安装和测试
  9. win10官方iso镜像下载教程
  10. getchar ,putchar,gets,puts的辨析