MoveIt编程实现机械臂自主避障运动

2023-05-16

Moveit在规划路径的时候考虑如何躲避障碍物的问题,Moveit可以实时的检测空间中的障碍物,并规划处轨迹绕过障碍物。

在场景中加入障碍物方式

在Moveit中 具有一个规划场景监听器的模块结构,可以用来检测机器人场景中是否存在障碍物。障碍物有几种方式可以告诉监听器:

  1. 通过Rviz界面的形式添加。
  2. 通过程序(C++/Python)编程进行添加。
  3. 通过机器人的外部传感器,例如通过Kinect深度相机实时检测到的信息加入到场景中。

在这篇文章中主要介绍前两种方法,后续还会专门介绍第三种方法。

通过Rviz界面

运行以下命令在Rviz中打开机械臂模型:

roslaunch probot_anno_moveit_config demo.launch

启动之后,在如图所示位置有Scene Objects选项卡,用来添加场景物体,可以添加已有模型或者Solidwors构建的模型:

点击左下角的Import Flie可以添加一些模型进来,例如我们直接用.gazebo中的离线模型:

我们选择一个碗的模型添加进来,通过箭头调整碗的位置:

点击Publish Scene将障碍物的位置发布出去:

再次回到Plan选项卡中,拖拽机械臂,使机械臂碰撞障碍物,就会发现机械臂发生碰撞的部分变成了红色。 

再次进行归经规划的时候,机械臂就会自动避开障碍物:

编程形式添加障碍物

当机械臂抓取到某个物体之后没,它的轨迹进行规划的时候,需要将抓取得到的物体当作机械臂本身的一部分,必涨的时候要考虑抓取到的物体也不能发生碰撞。

打开模型:

roslaunch probot_anno_moveit_config demo.launch

附着物体避障: 

rosrun probot_demo moveit_attached_object_demo.py

运行结果:

运行过程中,抓取到的物体也会进行避障,不会碰到上面绿色的桌面。

Python源码解析:

import rospy, sys
import thread, copy
import moveit_commander
from moveit_commander import RobotCommander, MoveGroupCommander, PlanningSceneInterface
from geometry_msgs.msg import PoseStamped, Pose
from moveit_msgs.msg import CollisionObject, AttachedCollisionObject, PlanningScene
from math import radians
from copy import deepcopy

class MoveAttachedObjectDemo:
    def __init__(self):
        # 初始化move_group的API
        moveit_commander.roscpp_initialize(sys.argv)
        
        # 初始化ROS节点
        rospy.init_node('moveit_attached_object_demo')
        
        # 初始化场景对象,用来监听外部环境的变化
        scene = PlanningSceneInterface()
        rospy.sleep(1)
                                
        # 初始化需要使用move group控制的机械臂中的arm group
        arm = MoveGroupCommander('manipulator')
        
        # 获取终端link的名称
        end_effector_link = arm.get_end_effector_link()
        
        # 设置位置(单位:米)和姿态(单位:弧度)的允许误差
        arm.set_goal_position_tolerance(0.01)
        arm.set_goal_orientation_tolerance(0.05)
       
        # 当运动规划失败后,允许重新规划
        arm.allow_replanning(True)
        arm.set_planning_time(10)

        # 控制机械臂回到初始化位置
        arm.set_named_target('home')
        arm.go()
        
        # 移除场景中之前运行残留的物体
        scene.remove_attached_object(end_effector_link, 'tool')
        scene.remove_world_object('table') 
        scene.remove_world_object('target')

        # 设置桌面的高度
        table_ground = 0.6
        
        # 设置table和tool的三维尺寸
        table_size = [0.1, 0.7, 0.01]  //设置长宽高
        tool_size = [0.2, 0.02, 0.02]
        
        # 设置tool的位姿
        p = PoseStamped() 
        #tool放置位置的参考坐标系
        p.header.frame_id = end_effector_link
        
        #tool的具体位置姿态
        p.pose.position.x = tool_size[0] / 2.0 - 0.025
        p.pose.position.y = -0.015
        p.pose.position.z = 0.0
        p.pose.orientation.x = 0
        p.pose.orientation.y = 0
        p.pose.orientation.z = 0
        p.pose.orientation.w = 1
        
        # 将tool附着到机器人的终端,该函数为附着某物体到机器人上
        scene.attach_box(end_effector_link, 'tool', p, tool_size)

        # 将table加入场景当中
        table_pose = PoseStamped()
        table_pose.header.frame_id = 'base_link'
        table_pose.pose.position.x = 0.25
        table_pose.pose.position.y = 0.0
        table_pose.pose.position.z = table_ground + table_size[2] / 2.0
        table_pose.pose.orientation.w = 1.0
        scene.add_box('table', table_pose, table_size)  #添加障碍物
        
        rospy.sleep(2)  

        # 更新当前的位姿
        arm.set_start_state_to_current_state()

        # 设置机械臂的目标位置,使用六轴的位置数据进行描述(单位:弧度)
        joint_positions = [0.827228546495185, 0.29496592875743577, 1.1185644936946095, -0.7987583317769674, -0.18950024740190782, 0.11752152218233858]
        arm.set_joint_value_target(joint_positions)
                 
        # 控制机械臂完成运动
        arm.go()
        rospy.sleep(1)
        
        # 控制机械臂回到初始化位置
        arm.set_named_target('home')
        arm.go()

        moveit_commander.roscpp_shutdown()
        moveit_commander.os._exit(0)

if __name__ == "__main__":
    MoveAttachedObjectDemo()

关键API:scene.attach_box(end_effector_link, 'tool', p, tool_size)

  • end_effector_link为机械臂终端的坐标系
  • 'tool'是要附着的对象
  • p为附着物的位置
  • tool_size为附着物体的尺寸

scene.add_box('table', table_pose, table_size)

  • 'table'是要添加的障碍物对象
  • table_pose为障碍物的姿态信息
  • table_size为障碍物的大小
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MoveIt编程实现机械臂自主避障运动 的相关文章

  • 规划人生之一: 嵌入式系统开发or算法开发

    这些天一直为一个问题所烦扰 不知道今后改把精力投入到嵌入式系统如arm dsp等的开发上还是在图像的压缩算法上 由于我们做的是嵌入式系统 在arm开发上还有嵌入式os 所以比较烦杂 而在dsp上还要进行mpeg以及264的开发 不知道那个更
  • vue中点击获取相应元素

    在vue中通过点击事件获取上一个标签 父标签 第一个子标签等元素 以下元素都是以所点击的元素进行查找 e target 获取当前点击的元素 e currentTarget 获取绑定事件的元素 e currentTarget previous
  • http-parser解析http报文详解

    说明 项目里用到力http parser xff0c 在这里简单说明一下其用法吧 下载地址 xff1a https github com joyent http parser 其使用说明很详细 开源用例 开源tcpflow 1 4 4中使用
  • BGP协议介绍

    一 BGP协议概述 BGP用于在不同的自治系统 xff08 AS xff09 之间交换路由信息 当两个AS需要交换路由信息时 xff0c 每个AS都必须指定一个运行BGP的节点 xff0c 来代表AS与其他的AS交换路由信息 通常是路由器来
  • nuxt asyncData extendRoutes nuxtServerInit

    材料来源 realworld 开源项目 asyncData 仅支持服务端 xff0c 页面初始化 xff0c 组件加载之前 xff0c 不能this调用 案例 官方 nuxt config js module span class toke
  • STM32F107的串口通讯总结

    STM32F107的串口通讯总结 STM32F107 的串口通讯总结 1 STM32 的一般规律 xff0c 首先要使用串口必先使能串口时钟 xff0c 比如串口1 xff1a RCC APB2PeriphClockCmd RCC APB2
  • STM32——高级定时器、通用定时器、基本定时器的区别

    TIM1 和 TIM8 定时器的功能包括 增强型 xff1a 16 位向上 向下 向上 下自动装载计数器 16 位可编程 可以实时修改 预分频器 xff0c 计数器时钟频率的分频系数为 1 xff5e 65535 之间的任意数值 多达 4
  • STM32F107的通用定时器中断实验总结

    1 STM32F107 的通用定时器是指 xff1a TIM2 TIM3 TIM4 TIM5 STM32F107 的高级定时器是指 xff1a TIM1 TIM8 STM32F107 的基本定时器是指 xff1a TIM6 TIM7 2 S
  • STM32F107的通用定时器PWM实验总结

    STM32F107 的通用定时器PWM 实验总结 1 STM32F107 的通用定时器是指 xff1a TIM2 TIM3 TIM4 TIM5 2 STM32F107 的通用定时器 xff08 TIM2 TIM3 TIM4 TIM5 xff
  • 鸿蒙WIFI-IoT开发板RTC时钟模块功能实现

    1 RTC时钟模块硬件准备 RTC时钟模块 RTC时钟模块在WiFiIoT套件上的连接 2 RTC时钟模块硬件介绍 RTC时钟模块使用I2C接口为I2C0 xff0c 对应管脚连接说明 xff1a SDA 底板的TX GPIO 13 SCL
  • Android studio新建项目之后由于gradle配置问题导致项目无法运行的个人解决方案分享

    本文主要针对本人自己新建Android Stuido项目的时候遇到的问题的一个经验总结 说明 xff1a IDE为 Android studio 2 1 Preview 1 Windows 8系统 现象描述 xff1a 一路默认设置来创建一
  • VS Code如何在win10环境下运行C/C++

    本篇文章适合有一定基础的同学 一 准备工作 1 安装VS Code xff0c 并且安装C C 43 43 插件 链接 xff1a https code visualstudio com 2 安装MinGW 链接 xff1a http ww
  • 百度2014校招笔试题(一)

    算法和程序设计题 xff1a 1 题意 xff1a 一幢大楼的底层有1001根电线 xff0c 这些电线一直延伸到大楼楼顶 xff0c 你需要确定底层的1001个线头和楼顶的1001次线头的对应关系 你有一个电池 xff0c 一个灯泡 xf
  • 【Python数据分析】Numpy常用操作(二)

    一 常用的数学和统计方法 1 一维数组 span class token comment np random randn 生成随机数组 每运行一次会改变一次 span arr span class token operator 61 spa
  • 【Python数据分析】Pandas常用操作(一)

    pandas基于Numpy构建 xff0c 最初被作为金融数据分析工具使用因此pandas为时间序列分析做了很好的支持 pandas的两种数据结构 xff1a Series和DataFrame 一 Series xff08 index va
  • 【Python数据分析】Pandas常用操作(二)

    一 Pandas中的常用方法 span class token comment 创建一个数据框 span span class token keyword import span numpy span class token keyword
  • 【Python数据分析】Pandas中的绘图函数

    Pandas中有许多能够利用DataFrame对象数据特点来创建标准图表的高级绘图方法 1 折线图 y span class token operator 61 span df span class token punctuation sp
  • 【Python数据分析】matplotlib绘图

    matplotlib 是一个 Python 的 2D绘图库 xff0c 用于数据可视化 它可以函数的方式操作各个绘图命令 xff08 类似Matlab软件 xff0c Matplotlib名字的含义就是Matlab风格的绘图库 xff09
  • PPT模板、素材下载网站(纯干货,建议收藏)

    清平乐博主精心收集PPT模板 xff0c 纯干货 xff01 一 OfficePlus 网址 xff1a https www officeplus cn 特点 xff1a 下载全部免费 xff1b 质量高 微软Office官方在线模板网站
  • Impala时间函数总结

    Impala 使用impala 您可以使用传统的SQL知识以极快的速度处理存储在HDFS中的数据 Impala是基于hive并使用内存进行计算 在查询过程中 并未进行MR转换 而是采用与商用并行关系数据库类似的分布式查询引擎 直接与HDFS

随机推荐

  • 【数仓设计】企业数仓为什么要进行分层?(六大好处)

    一 数据仓库要不要分层 数据仓库既然是数据存储计算的地方 那么为什么需要分层呢 同样也是数据规模 业务场景决定 可以说很多公司数据仓库建设刚起步时 大部分的数据都是经过粗暴的数据接入 进行ETL后就直接对接业务 生成报表或者导入业务系统直接
  • 快速搭建samba 简单samba服务

    基于RedHat service smb restart etc init d smb start 1 安装samba包 yum install samba 2 修改相关配置文件 vim etc samba smb conf 3 添加相关s
  • 程序员=加班??掌握时间才能掌握人生

    总是有些人一生中有无数作为 xff0c 而更多的人耗费一生的时间最终换来了不过四个字 死因不详 序言 近几年 xff0c 读了比较多的书 xff0c 涉猎也比较广泛 xff0c 经管 xff0c 哲学 xff0c 心理学 xff0c 成功学
  • Presto集群Web UI界面详解

    Presto Web UI 可以用来检查和监控Presto集群 xff0c 以及运行的查询 他所提供的关于查询的详细信息可以更好的理解以及调整整个集群和单个查询 Presto Web UI所展示的信息都来自于Presto系统表 当你进入Pr
  • 【好书推荐】《华为数据之道》

    数据技术要产生实际价值 xff0c 需要良好的数据治理体系保驾护航 最近华为出版了 华为数据之道 一书 xff0c 给出了非数字原生企业在数据管理方面的实战经验 xff0c 特别适合于面临数字化转型的企业管理者 数据从业者 一 整体框架 华
  • 【好书推荐】《Python编程:从入门到实践(第2版)》

    第二版是2020年底发布的 xff0c 第二版相比较第一版更新了不少新东西 不错的python入门书 xff0c 第一部分讲基础知识 xff0c 第二部分讲了三个实际的项目 xff1a 一个小游戏 xff0c 一个数据可视化程序 xff0c
  • 【小技巧】Navicat查看数据库密码

    一 导出链接 二 导出的时候一定要勾选导出密码 三 导出文件用notepad 打开 四 打开网址 将如下代码复制进去 打开这个网址 https tool lu coderunner 将如下PHP代码复制进去 span class token
  • 看《狂飙》读人生,致敬2023!

    作为2023年的第一篇博文 xff0c 我不想写代码 xff0c 我想谈谈最近看的 狂飙 xff0c 总结了十条哲理 xff0c 共勉 希望我们的2023 xff0c 未来的人生会更加出彩 01 你以为很好的关系 xff0c 其实也就那么回
  • MySQL生成排序序号RN

    有时因为业务的需求 我们需要在查询出的数据中加上排序序号 例 span class token keyword SQL span span class token keyword select span a span class token
  • MySQL实现row_number排序功能(不用函数)

    MySQL ROW NUMBER 函数为结果集中的每一行生成序列号 MySQL ROW NUMBER 从8 0版开始引入了功能 在使用8 0版之前的数据库时 往往也会用到排序逻辑 那我们如何在不使用ROW NUMBER 函数的情况下来实现排
  • 一文读懂【数据埋点】

    数据埋点是数据采集领域 xff08 尤其是用户行为数据采集领域 xff09 的术语 xff0c 指的是针对特定用户行为或事件进行捕获 处理和发送的相关技术及其实施过程 比如用户某个icon点击次数 观看某个视频的时长等等 数据分析是我们获得
  • Hive几个常用数学函数

    span class token number 1 span span class token punctuation span span class token comment round 四舍五入 span span class tok
  • ubuntu解决中文乱码

    1 查看当前系统使用的字符编码 locale LANG 61 en US LANGUAGE 61 en US LC CTYPE 61 34 en US 34 LC NUMERIC 61 34 en US 34 LC TIME 61 34 e
  • Python 中使用 Azure Blob 存储

    本文介绍如何使用适用于 Python 的 Azure 存储客户端库来上传 blob 你可以上传 blob xff0c 打开 blob 流并写入流 xff0c 或者上传带有索引标记的 blob Azure 存储中的 Blob 已组织成容器 必
  • 视频加速播放插件-Global Speed

    有时候我们觉得看视频的过程中视频播放的太慢了 xff0c 希望能够加快一点播放的速度 xff0c 谷歌浏览器里面有很多有意思的插件 例如Global Speed就可以控制视频播放的速度 1 打开谷歌浏览器 xff0c 输出商店扩展应用地址
  • 激光SLAM之图优化理论

    1 常用的两种优化方法介绍 SLAM问题的处理方法主要分为滤波和图优化两类 滤波的方法中常见的是扩展卡尔曼滤波 粒子滤波 信息滤波等 xff0c 熟悉滤波思想的同学应该容易知道这类SLAM问题是递增的 实时的处理数据并矫正机器人位姿 比如基
  • ROS常用命令合集

    一 创建 ROS 工作空间 1 启动 ROS roscore 2 创建工作环境 mkdir p catkin ws src cd catkin ws src catkin init workspace 3 编译 ROS 程序 cd catk
  • 嵌入式开发笔记——调试组件SEGGER_HardFaultHandle

    作者 xff1a zzssdd2E mail xff1a zzssdd2 64 foxmail com 一 前言 在使用Cortex M内核的MCU进行开发时 xff0c 有时候会因为对内存错误访问等原因造成程序产生异常从而进入HardFa
  • Oracle 知识篇+几种常见的关系型数据库产品发展史

    说明 xff1a 本文为几种常见的关系型数据库产品发展史的简要描述 xff0c 供RDBMS兴趣爱好者参考温馨提示 xff1a 如果本文有写的不对的地方或者需要改进的地方 xff0c 各位可以留言或私信我进行修改和升级哦 下表为几款RDBM
  • MoveIt编程实现机械臂自主避障运动

    Moveit在规划路径的时候考虑如何躲避障碍物的问题 xff0c Moveit可以实时的检测空间中的障碍物 xff0c 并规划处轨迹绕过障碍物 在场景中加入障碍物方式 在Moveit中 具有一个规划场景监听器的模块结构 xff0c 可以用来