MoveIt控制机械臂的运动实现——机器人抓取系统基础系列(二)

文章目录

    • 概要
    • 1 用户接口和代码案例
    • 2 不同的规划类型
      • 2.1 关节空间规划
      • 2.2 工作空间规划
      • 2.3 笛卡尔空间规划
    • 3 MoveIt运行实操
    • 4 相关资料推荐
    • 小结

概要

MoveIt为开发者提供了针对机械臂的集成化开发平台,由一系列操作相关的功能包组成,包括运动规划、操作控制、3D感知、运动学、导航算法等。

MoveIt实现机械臂控制包含四个步骤,分别是组装机器人URDF模型;配置MoveIt规划功能包;驱动设置;控制与规划实现。

在UR机械臂的ROS驱动安装官方教程详解——机器人抓取系统基础系列(一)博文中,当完成UR机械臂的ROS驱动配置之后,实际上前三步都已经完成了,本文主要关注第四步,重点介绍MoveIt的规划类型及其实现。

1 用户接口和代码案例

MoveIt的核心节点move_group的用户接口如下图所示,包括C++,Python,Rviz交互接口等。其能够获取机器人的内部(如关节)和外部(如视觉)信息,来控制真实或者仿真中的机械臂运动。
MoveIt核心节点move_group

参考:配图来源于书籍《ROS机器人开发实践》,胡春旭编著。

这里先展示一个Python案例代码,先初步了解一下Moveit的控制流程。

import rospy, sys
import moveit_commanderclass MoveItFkDemo:def __init__(self):# 初始化move_group的APImoveit_commander.roscpp_initialize(sys.argv)# 初始化ROS节点rospy.init_node('moveit_fk_demo', anonymous=True)# 初始化需要使用move group控制的机械臂中的arm grouparm = moveit_commander.MoveGroupCommander('manipulator')# 设置机械臂运动的允许误差值arm.set_goal_joint_tolerance(0.001)# 设置允许的最大速度和加速度arm.set_max_acceleration_scaling_factor(0.5)arm.set_max_velocity_scaling_factor(0.5)# 控制机械臂先回到初始化位置arm.set_named_target('home')arm.go()rospy.sleep(1)# 设置机械臂的目标位置,使用六轴的位置数据进行描述(单位:弧度)joint_positions = [0.391410, -0.676384, -0.376217, 0.0, 1.052834, 0.454125]arm.set_joint_value_target(joint_positions)# 控制机械臂完成运动arm.go()rospy.sleep(1)# 控制机械臂先回到初始化位置arm.set_named_target('home')arm.go()rospy.sleep(1)# 关闭并退出moveitmoveit_commander.roscpp_shutdown()moveit_commander.os._exit(0)if __name__ == "__main__":try:MoveItFkDemo()except rospy.ROSInterruptException:pass

该代码案例中,展示了基本的Python控制接口。包括创建规划组的控制对象,然后设置关节空间运动的目标位姿,最后完成机械臂的运动。

机械臂一共经历了三个状态,即从Home位到设定的joint_positions,再回到Home位姿。Home位姿位事先定义的位姿。

2 不同的规划类型

MoveIt的规划类型包括关节空间规划、工作空间规划和笛卡尔空间规划。下面分别阐述每种规划类型的定义,用法和相关的API。

2.1 关节空间规划

关节空间规划:这种规划方式直接在机械臂的关节角度上进行,通常用于精确控制机器人的每个关节。
在关节空间规划中,你可以指定一系列关节角度作为目标,MoveIt将计算出一个运动路径,使得机械臂能够从当前状态平滑地移动到目标状态。
关节空间规划通常用于需要精确控制关节角度的场景。

本文第1节中展示的案例代码就是关节空间运动规划的实现,关节空间运动规划的核心API如下:

arm = moveit_commander.MoveGroupCommander('manipulator') # 设置规划组的控制对象
arm.set_joint_value_target(joint_positions) # 设置关节空间的目标位姿
arm.go() # 控制机械臂完成运动

2.2 工作空间规划

工作空间规划:与关节空间规划不同,工作空间规划关注的是机械臂末端执行器在空间中的位置和姿态。
在这种规划中,你可以指定末端执行器需要达到的位姿(位置和姿态),MoveIt将根据逆运动学计算出相应的关节角度变化,以实现这一目标。
工作空间规划适用于那些更关注末端执行器位置而非具体关节角度的场景。

工作空间中运动控制的核心API使用流程如下:

arm = moveit_commander.MoveGroupCommander('manipulator') # 初始化需要使用move group 
end_effector_link = arm.get_end_effector_link() # 获取终端link的名称reference_frame = 'base_link' 
arm.set_pose_reference_frame(reference_frame) # 设置目标位置所使用的参考坐标系arm.set_start_state_to_current_state() # 设置机器臂当前的状态作为运动初始状态
arm.set_pose_target(target_pose, end_effector_link) # 设置机械臂终端运动的目标位姿traj = arm.plan() # 规划运动路径
arm.execute(traj) # 按照规划的运动路径控制机械臂运动arm.shift_pose_target(1, -0.05, end_effector_link) # 也可以对机械臂的单轴进行运动控制
arm.go()

首先需要创建规划组的控制对象;然后获取机器人终端link名称;其次设置目标位姿对应的参考坐标系、起始和终止位姿;最后进行规划并控制机器人运动。

2.3 笛卡尔空间规划

笛卡尔空间规划:笛卡尔空间规划是指在笛卡尔坐标系(即直角坐标系)中进行的运动规划。
这种规划方式允许你指定机械臂末端执行器在笛卡尔空间中的路径,例如直线或圆弧运动。
MoveIt可以使用这种规划来生成复杂的轨迹,使得机械臂能够沿着预定的路径移动,同时避开障碍物。

笛卡尔运动规划的核心API如下:

# 尝试规划一条笛卡尔空间下的路径,依次通过所有路点
while fraction < 1.0 and attempts < maxtries:(plan, fraction) = arm.compute_cartesian_path (waypoints,   # waypoint poses,路点列表0.01,        # eef_step,终端步进值0.0,         # jump_threshold,跳跃阈值True)        # avoid_collisions,避障# 尝试次数累加attempts += 1# 打印运动规划进程if attempts % 10 == 0:rospy.loginfo("Still trying after " + str(attempts) + " attempts...")

笛卡尔路径规划的核心API——compute_cartesian_path共有四个参数:第一个参数是之前创建的路点列表;第二个参数是终端步进值;第三个参数是跳跃阈值;第四个参数用于设置运动过程中是否考虑避障。

拓展:对于圆弧轨迹的规划,其主要思路就是将其分解为多段直线,然后用compute_cartesian_path控制机器人运动。

3 MoveIt运行实操

准备工作1: 事先完成UR机械臂的ROS驱动配置工作,具体步骤参考博文UR机械臂的ROS驱动安装官方教程详解——机器人抓取系统基础系列(一)。

准备工作2: 可以《ROS机器人开发实践》书籍开源程序中的MoveIt代码为案例进行测试。事先下载本书的开源代码,下载地址为https://github.com/huchunxu/ros_exploring。其中,MoveIt规划案例功能包文件夹为ros_exploring-master\robot_marm\marm_planning。

Step1: 将下载到的MoveIt案例功能包(ros_exploring-master\robot_marm\marm_planning文件夹)复制到机器人的ROS工作空间中。ROS功能包相当于汽车的零部件可以直接拿来使用,不用做重复造轮子的事情。

Step2: 重新编译ROS工作空间;

$ catkin_make # 编译
$ source devel/setup.bash # 加载路径

Step3: 启动UR机械臂和相关软件;
参考博文UR机械臂的ROS驱动安装官方教程详解——机器人抓取系统基础系列(一)

# 同时启动机器人,MoveIt和Rviz
$ roslaunch ur_robot_driver ur5e_work_all.launch

Step4: MoveIt规划测试;

# 可以分别测试本文介绍的三种规划方法
$ rosrun marm_planning moveit_fk_demo.py # 关节空间规划
$ rosrun marm_planning moveit_ik_demo.py # 工作空间规划
$ rosrun marm_planning moveit_cartesian_demo.py _cartesian:=True # 笛卡尔空间规划

提示:
1 测试和试运行代码时,一只手保持在急停按钮上,确保可以随时按下,以保证人身安全同时避免机器人因碰撞而损坏。
2 本文只需测试MoveIt能够正常控制机械臂即可,后续系列文章将会介绍如何基于视觉信息去控制机械臂运动。

4 相关资料推荐

  • ROS MoveIt 控制机械臂速度的方法汇总https://dongyi.blog.csdn.net/article/details/139197592?spm=1001.2014.3001.5502
  • Moveit 1官网教程https://moveit.github.io/moveit_tutorials/
  • Moveit 1中文官网教程(个人翻译版)https://decyzy.github.io/moveit_tutorials/index.html
  • Moveit 2 (for ROS 2) 官网教程https://moveit.picknik.ai/main/index.html

小结

本文简单介绍了MoveIt的用户接口和规划类型,包括关节空间、工作空间、笛卡尔空间规划,然后基于UR机械臂实现MoveIt的规划控制。进一步地,如何基于视觉信息去控制机械臂运动将在后续系列文章中介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1542429.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

从 Affine Particle-In-Cell (APIC) 到 Material Point Method (MPM 物质点法)

APIC与MPM Particle-In-Cell (PIC)Affine Particle-In-Cell (APIC)Material Point Method (MPM)关于边界投影等额外操作 Material Point Method (MPM 物质点法)是一种混合欧拉-拉格朗日视角物理仿真方法。 欧拉视角即网格视角&#xff0c;将空间划分为网格&#xff0c;通过表示…

从一到无穷大 #35 Velox Parquet Reader 能力边界

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言源码分析功能描述功能展望 引言 InfluxDB IOX这样完全不使用索引&#xff0c;只…

JavaEE: 深入探索TCP网络编程的奇妙世界(四)

文章目录 TCP核心机制TCP核心机制四: 滑动窗口为啥要使用滑动窗口?滑动窗口介绍滑动窗口出现丢包咋办? TCP核心机制五: 流量控制 TCP核心机制 书接上文~ TCP核心机制四: 滑动窗口 为啥要使用滑动窗口? 之前我们讨论了确认应答策略,对每一个发送的数据段,都要给一个ACK确…

centos7下openssh升级方法(编译安装)

注意&#xff1a; 首先打开两个或以上的shell连接&#xff0c;因为在升级过程中如果升级失败会导致不发新建shell连接&#xff1b;升级后使用xshell6,7连接&#xff0c;openssh版本对应修改&#xff0c;下载地址&#xff1a; https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/por…

Servlet day2(概念理解)

Servlet体系结构 Servlet相关配置 HTTP协议内容

leetcode746. 使用最小花费爬楼梯,动态规划

leetcode746. 使用最小花费爬楼梯 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶…

计算机毕业设计 基于SpringBoot的小区运动中心预约管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Java笔试面试题AI答之设计模式(4)

文章目录 16. 简述什么是观察者模式&#xff1f;基本概念主要特点实现方式应用场景优缺点 17. 请列举观察者模式应用场景 &#xff1f;18. 请用Java代码实现观察者模式的案例 &#xff1f;19. 什么是装饰模式&#xff1f;定义与特点结构与角色工作原理优点应用场景示例 20. 请用…

基于大数据的电子产品需求数据分析系统的设计与实现(Python Vue Flask Mysql)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

【GlobalMapper精品教程】088:按点线面空间位置选择案例

按点线面空间位置选择的原则为:点线面的排列组合。 文章目录 一、选择线要素附近的点二、选择相交或触碰所选线的区和线三、选择包含点的区要素四、选择选定区域内的点要素一、选择线要素附近的点 启动该工具之前,首先要选择线,例如,选择某一段铁路5km范围之内的县城驻地。…

DeepSeek 2.5本地部署的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…

[Meachines] [Medium] Sniper RFI包含远程SMB+ powershell用户横向+CHM武器化权限提升

信息收集 IP AddressOpening Ports10.10.10.151TCP:80,135,139,445,49667 $ nmap -p- 10.10.10.151 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 80/tcp open http Microsoft IIS httpd 10.0 |_http-server-header: Microsoft-IIS/10.…

三阶魔方还原法 勾上回下 上右左左右

三阶魔方还原法&#xff1a; 1小白花 &#xff08;转3换1&#xff09; 2白十字架 (侧与中心同色 下下) 3第一层 &#xff08;找位置角块放顶点 勾上回下&#xff09; 4 第二层 &#xff08;颜色边 勾上回下 再单白边 勾上回下&#xff09; 5 黄十字架 &#xff08;无黄边 压 勾…

0.设计模式总览——设计模式入门系列

在现代软件开发中&#xff0c;设计模式为我们提供了优秀的解决方案&#xff0c;帮助我们更好地组织代码和架构。本系列专栏将对设计模式的基本思想、原则&#xff0c;以及常用的分类、实现方式&#xff0c;案例对比、以及使用建议&#xff0c;旨在提高开发者对设计模式的理解和…

【算法】BFS系列之 拓扑排序

【ps】本篇有 3 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1&#xff09;课程表 .1- 题目解析 .2- 代码编写 2&#xff09;课程表 II .1- 题目解析 .2- 代码编写 3&#xff09;火星词典 .1- 题目解析 .2- 代码编写 一、算法简介 【补】图的基本概念 &#…

HTML翻牌器:用CSS和HTML元素创造动态数字展示

HTML翻牌器&#xff1a;用CSS和HTML元素创造动态数字展示 前言 翻牌器是一种数字动态展示形式&#xff0c;在生活中常见的例如翻牌计分、翻牌时钟等。 之所以以翻牌的形式是因为其物理设计的原因使其只能滚动翻牌展示数字&#xff0c;在电子显示设备不普及时&#xff0c;使用…

Leetcode - 139双周赛

目录 一&#xff0c;3285. 找到稳定山的下标 二&#xff0c;3286. 穿越网格图的安全路径 三&#xff0c;3287. 求出数组中最大序列值 四&#xff0c;3288. 最长上升路径的长度 一&#xff0c;3285. 找到稳定山的下标 本题就是找[0&#xff0c; n-2]中&#xff0c;height[i]…

C++入门12——详解多态2

上篇文章&#xff08;C入门12——详解多态1&#xff09;中&#xff0c;我们介绍了C多态的概念和用法&#xff0c;但是只知其然而不知其所以然是万万不行的&#xff0c;所以本篇文章将从探案的角度详细介绍多态的原理。 1. 虚函数表 想要弄懂多态的原理&#xff0c;首先要了解一…

数据结构与算法学习day22-回溯算法-分割回文串、复原IP地址、子集

一、分割回文串 1.题目 131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 2.思路 分割回文串可以抽象为一棵树形结构。 递归用来纵向遍历&#xff0c;for循环用来横向遍历&#xff0c;切割线&#xff08;就是图中的红线&#xff09;切割到字符串的结尾位置&#xf…

STM32F407单片机编程入门(十三) 单片机IAP(在应用编程)详解及实战源码

文章目录 一.概要二.STM32F407VET6单片机IAP介绍1.STM32F407VET6单片机IAP基本原理2.STM32F407VET6单片机IAP基本流程 三.配置一个BOOT工程四.配置一个APP工程五.工程源代码下载六.小结 一.概要 STM32单片机程序升级方法有很多种&#xff0c;主要有以下几种&#xff1a; 1.将…