基于ROS搭建机器人仿真环境——A ROS based Open Source Simulation Environment for Robotics Beginners

本文主要是介绍基于ROS搭建机器人仿真环境——A ROS based Open Source Simulation Environment for Robotics Beginners,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A ROS based Open Source Simulation Environment for Robotics Beginners

基于ROS搭建的机器人仿真环境。其中设计了机器人研究过程中需要预先进行的几个重要实验如各种标定(相机标定,深度图配准,手眼标定),还在仿真环境中实现了两种抓取算法的仿真,一种是传统方法(几何方法)一种是机器学习的方法(GPD),最后一个实验是模拟机械臂采集数据的场景。
视频链接–>Bilibili&YouTube
开源代码链接

Author苏一休
E-mail2270678755@qq.com

image

目录

  • 搭建
  • 在仿真环境中进行相机标定
  • 在仿真环境中进行深度图配准
  • 在仿真环境中进行手眼标定
  • 在仿真环境中抓取
    • 基于几何方法的抓取
    • 基于机器学习方法的抓取
  • 在仿真环境中进行数据采集

搭建

此功能包在Ubuntu16.04上经过测试,应该适用于其他Linux版本。在你的Catkin工作空间中需要有

  • 负责计算aruco二维码位姿态的aruco_ros;
  • 使用点云的基于深度学习的抓取位姿检测gpd_ros(这个包还需要编译安装GPD library);
  • 手眼标定功能包easy_handeye;
  • UR机械臂的ROS功能包universal_robot;
  • 此外在robot_sim/package中有一些需要用到的但我在上面进行过一些修改的包,如解决gazebo中抓取物体会莫名抖动的包gazebo-pkgs,大寰机器人二指抓手AG-95的ROS功能包dh_gripper_ros以及其他依赖等。
  • 非常感谢以上作者的无私奉献。

以下是如何安装和搭建本ROS功能包

cd ~/catkin_ws/src
git clone -b kinetic-devel https://github.com/pal-robotics/aruco_ros                #aruco_ros
git clone https://github.com/atenpas/gpd_ros/                                       #gpd_ros
git clone https://github.com/IFL-CAMP/easy_handeye                                  #easy_handeye
cd easy_handeye
git reset --hard 64b8b88                                                            #使用的是这个版本
cd ..
git clone -b kinetic-devel https://github.com/ros-industrial/universal_robot.git    #universal_robot
git clone https://github.com/Suyixiu/robot_sim                                      #本功能包
rosdep install --from-paths src --ignore-src --rosdistro=kinetic                    #安装依赖
catkin_makecp -r ./src/robot_sim/experiment/hand_eye_calibration/urdf/aruco/ ~/.gazebo/models  #复制aruco模型到gazebo默认模型文件夹中

在仿真环境中进行相机标定

首先是将相机模型还有标定板模型load进来

cd ~/your_catkin_ws/
roslaunch robot_sim camera_calibration.launch

之后便可以看到RealSense D435i RGBD相机与标定板,其中这里使用的是7x6内角点,块块大小0.01m的标定板。若想使用其他尺寸的标定板可更改experiment/camera_calibration/urdf/create_chessboard.py脚本中的标定板参数后运行以在experiment/camera_calibration/urdf目录下生成你所需要的标定板,随后修改camera_calibration.launch要load的标定板即可。

其中相机的URDF文件中使用的相机插件设置的相机视角是57°,图像分辨率是1280x720,所以根据相机内参各个参数的的定义算出该相机模型的内参真实值。这个计算与camera_info这个topic中的信息一致。

此时相机已以30帧往外发布图像信息。可以使用ROS自带的标定包来进行实时的标定,也可以把图片保存下来后用相机标定工具如Matlab中的相机标定包进行内参的计算。这里以ROS功能包camera_calibration中的cameracalibrator.py脚本为例。你可以选择你所需要标定的相机。

rosrun camera_calibration cameracalibrator.py --size 7x6 --square 0.01 image:=/camera/rgb/image_raw camera:=/camera/rgb     #RGB相机
rosrun camera_calibration cameracalibrator.py --size 7x6 --square 0.01 image:=/camera/ir/image_raw camera:=/camera/ir       #IR相机

接下来是移动标定板,程序中设定的是1秒钟产生一个随机位置并移动标定板,若相机能正确识别出标定板角点则将此时的照片保存,有深度图,红外相机的图还有RGB图存放在save_checkboard_img目录中。当你觉得采的图片足够多之后即可停止这个程序。

rosrun robot_sim camera_calibration

这里我们提供了一个python的脚本camera_calibration.py,位于robot_sim/experiment/camera_calibration/scripts,用于载入前面保存的图片以计算RGB相机与IR相机的内参并分别保存在IR_cameraintrinsic_parameters.npzRGB_cameraintrinsic_parameters.npz中,直接python运行此脚本即可。你也可以自己写程序来计算内参,并与前面公式计算的结果像对比以验证你的标定算法的准确性与误差。

cd ~/your_catkin_ws/src/robot_sim/experiment/camera_calibration/scripts
python3 camera_calibration.py

在仿真环境中进行深度图配准

此实验将用到实验一中采集的两个相机拍摄的标定板的图片,这里我们提供了一个python脚本depth_image_registration.py来计算配准矩阵并将其前两行存放在Registration_matrix.txt中,因为实际remap深度图的时候也只会用到前两行。

cd ~/your_catkin_ws/src/robot_sim/experiment/depth_image_registration/scripts
python3 depth_image_registration.py

随后可以随便拿一对RGB图与深度图来观察配准矩阵对不对,因为后面会用到这个矩阵所以这里直接就是写成CPP了。

cd ../src
g++ ./depth_image_registration.cpp -o depth_image_registration $(pkg-config --cflags --libs opencv)
./depth_image_registration

下面是配准前与配准后的区别。

在仿真环境中进行手眼标定

这里使用的手眼系统属于眼在手上的情况,即eye on hand,首先将我们提供的机械臂的moveit功能包跑起来,其中加载了UR10机械臂、大寰机器人的AG-95二指抓手还有D435i RGBD相机安装在UR10机械臂的末端。这里的手的link是yixiuge_ee_link,眼的link是相机的RGB光学framecamera_rgb_optical_frame。标定用到的Aruco二维码的大小是0.2m,ID是582。

roslaunch yixiuge_ur10_moveit_config yixiuge_ur_moveit.launch

需要等moveit加载完之后再加载手眼标定包,因为大寰的二指抓手开起来有点费时,如果马上开hand_eye_calibration的话可能因为找不到moveit的group而报错。

roslaunch robot_sim hand_eye_calibration.launch

之后请参照视频中的操作进行操作最后可以算出手眼矩阵。设计的17个点一般情况下不会全部满足,可以通过RVIZ中的moveit的球拖动机械臂渠道其他位置以采集更多的数据从而使标定结果更加准确,下面是我们采集了37个点之后所计算出来的结果

translation: x: -0.0171515439439y: 0.129039200607z: 0.146263405556
rotation: x: 0.999995982804y: 0.00268604823595z: 0.000687382040816w: 0.000589089946183

提供的机器人URDF文件中手眼矩阵的真实值如下,可以看出还是很准确的,误差在3,4毫米这样子。

translation: x: -0.0175y: 0.128z: 0.1425
rotation: x: 1y: 0z: 0w: 0

手眼标定完成电机save后数据会保存在~/.ros/easy_handeye/easy_handeye_eye_on_hand.yaml中,运行下面的launch文件来观察标定的结果

roslaunch robot_sim hand_eye_calibration_result.launch

在仿真环境中抓取

这里设计了两种方法的抓取,一种是使用传统的几何方法识别抓取点的抓取(参考论文),一种是基于机器学习的抓取(GPD)

基于几何方法的抓取

先把机械臂和抓取环境load进来随后启动抓取。

cd ~/your_catkin_ws/
roslaunch robot_sim geometric_method_grasp.launch 
rosrun robot_sim geometric_method_grasp

我们这里提供的方法主要原理是先将物体从桌面分割,这里的分割使用的是直接将相机当前画面减去一个mask,然后设置阈值二值化。因为是仿真环境所以这样做还是比较稳定的,分割效果也是没有问题的。但这种超级简单的做法仅限于环境固定的情况,实际使用的话还是建议使用其他分割算法,比如用深度图生成掩模来提取物体。

分割出物体之后便是滤波然后提取轮廓,膨胀后再腐蚀以连接成闭合的轮廓,随后选择最大的轮廓作为机械臂要抓取的物体。计算轮廓的一阶矩得到物体的重心,这里假设物体的质量分布均匀。随后使用PCA计算轮廓的主方向和垂直主方向的副方向,这里也可使用轮廓的二阶矩来获得。随后计算轮廓的最小外接矩形,与副轴的两个交点连成一条直线,随后遍历这条直线上的点找到副轴与轮廓的两个交点作为抓取点,随后绘制抓取矩形框。详细实现请见代码。

基于机器学习方法的抓取

这里使用的是atenpas的GPD这个方法,具体原理可见论文,这里不再赘述。在搭建GPD库的时候你可能会遇到某些问题,倘若GPD2.0.0版本出现问题则建议使用GPD1.5.0。这里在我们的仿真环境中成功运行了这一算法。我们提供的代码使用的是GPD的sample方式,使用的是caffe的cfg文件。再运行这部分代码的时候请注意调整cfg文件到正确的路径。此外这里的分割使用的是根据距离风格,而实际更为鲁棒的做法应该是使用RGB图生成掩模来分割点云。

roslaunch robot_sim GPD_method_grasp.launch
roslaunch robot_sim gpd_run.launch type:=2 topic:=/cloud_sample

关于gazebo中抓手抓取物体会莫名抖动

这是因为抓手的控制是位置控制而不是力控制所造成的。我们是使用JenniferBuehler编写的gazebo插件gazebo-pkgs来解决这个问题的。具体原理是插件会检测手指与物体接触,设定一些阈值当达到条件之后将物体与抓手的相对位置进行固定并失能物体的collision属性从而解决这一抖动的问题。

在仿真环境中进行数据采集

主要原理是围绕物体生成若干个位姿,随后驱动机械臂运动到指定位姿之后拍照,保存数据

roslaunch robot_sim data_collection.launch
rosrun robot_sim data_collection

其中采样点的多少以及位置等都是可以认为调节的,以下是56个的采样点

这篇关于基于ROS搭建机器人仿真环境——A ROS based Open Source Simulation Environment for Robotics Beginners的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/319537

相关文章

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

安装nodejs环境

本文介绍了如何通过nvm(NodeVersionManager)安装和管理Node.js及npm的不同版本,包括下载安装脚本、检查版本并安装特定版本的方法。 1、安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 2、查看nvm版本 nvm --version 3、安装

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

高并发环境中保持幂等性

在高并发环境中保持幂等性是一项重要的挑战。幂等性指的是无论操作执行多少次,其效果都是相同的。确保操作的幂等性可以避免重复执行带来的副作用。以下是一些保持幂等性的常用方法: 唯一标识符: 请求唯一标识:在每次请求中引入唯一标识符(如 UUID 或者生成的唯一 ID),在处理请求时,系统可以检查这个标识符是否已经处理过,如果是,则忽略重复请求。幂等键(Idempotency Key):客户端在每次

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用