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

news2024/9/25 23:05:39

文章目录

    • 概要
    • 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_commander

class MoveItFkDemo:
    def __init__(self):
        # 初始化move_group的API
        moveit_commander.roscpp_initialize(sys.argv)

        # 初始化ROS节点
        rospy.init_node('moveit_fk_demo', anonymous=True)
 
        # 初始化需要使用move group控制的机械臂中的arm group
        arm = 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)
        
        # 关闭并退出moveit
        moveit_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.coloradmin.cn/o/2165056.html

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

相关文章

一、人物朝向摄像机移动

一、导入插件Cinemachine 重命名为ThirdPersonCamera Follow和LookAt 选择为player 镜像Y轴&#xff0c;取消X轴 摄像机绑定模式为World Space 二、挂载代码PlayerController using System.Collections; using System.Collections.Generic; using UnityEngine;public class…

查询最近正在执行的sql(DM8 : 达梦数据库)

查询最近正在执行的sql DM8 : 达梦数据库 1 查询最近正在执行的sql2 更多达梦数据库学习使用列表 1 查询最近正在执行的sql 迁移数据时 , 业务无响应 , 查看最近活动的sql , 有没有迁移相关的表 , 通过最后的时间字段 , 判断会话是否正在执行 SELECT SESS_ID, SQL_TEXT, STATE…

三条命令实现linux内核升级

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm 如果报&#xff1a;curl: (35) Peer reports incompatible or unsupported protocol version. 执行命令&#xff1a; yum update -y nss curl libcurl 2.yum --enablerepoelrepo-kernel install …

iOS六大设计原则设计模式

六大设计原则&#xff1a; 一、单一职责原则 一个类或者模块只负责完成一个职责或者功能。 类似于&#xff1a;UIView 和 CALayer 二、开放封闭原则 对扩展开放&#xff0c;对修改封闭。 我们要尽量通过扩展软件实体来解决需求变化&#xff0c;而不是通过修改已有的代码来…

Redis主从集群搭建

一、什么是主从复制 主从复制&#xff0c;是指将一台redis服务的数据复制到集群中其他的redis服务&#xff0c;前者称(Maste)&#xff0c;后者称(Slave)&#xff1b;数据的复制是单向的&#xff0c;只能从主节点复制到从节点&#xff0c;一个主节点可以有多个从节点&#xff0…

【CubeMX学习笔记】关于CAN通信协议

目录 一、CAN通信简介 二、CAN数据帧类型 三、格式帧 四、位同步 传输数据时可能遇到的问题 最小时间单位 硬同步 再同步 波特率的计算 STM32中的CAN外设 一、原理图 二、标识符筛选 三、配置单个邮箱&#xff08;正常模式或自发自收只需要修改模式&#xff09; …

探索 ShellGPT:终端中的 AI 助手

文章目录 探索 ShellGPT&#xff1a;终端中的 AI 助手背景介绍ShellGPT 是什么&#xff1f;如何安装 ShellGPT&#xff1f;简单的库函数使用方法场景应用常见问题及解决方案总结 探索 ShellGPT&#xff1a;终端中的 AI 助手 背景介绍 在当今快速发展的技术领域&#xff0c;命…

人体动捕相关算法

SMPL、SMPLify SMPL&#xff08;Skinned Multi-Person Linear (SMPL) Model&#xff09;Keep it SMPL: Automatic Estimation of 3D Human Pose and Shape from a Single Image&#xff0c;2015 SMPL 关节点数量&#xff1a;K23&#xff0c;其中0号节点&#xff08;不在K之…

一区黏菌算法+双向深度学习+注意力机制!SMA-BiTCN-BiGRU-Attention黏菌算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测

一区黏菌算法双向深度学习注意力机制&#xff01;SMA-BiTCN-BiGRU-Attention黏菌算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测 目录 一区黏菌算法双向深度学习注意力机制&#xff01;SMA-BiTCN-BiGRU-Attention黏菌算法优化双向时间卷积双向门控循环单元…

keil的debug功能

文章目录 一.窗口介绍二.功能2.1 debug断点调试和窗口变量2.2 四个花括号功能2.2.1 进去函数和下一步功能2.2.2 跳过函数和跳过该行代码功能2.2.3 函数内部跳出功能2.2.4 执行到光标处 2.3 查看内部寄存器 一.窗口介绍 二.功能 2.1 debug断点调试和窗口变量 先打开下图debug断…

Scanner流程控制语句

1. Scanner类 Scanner的意思是扫描 Scanner是JDK提供的一个类&#xff0c;位于java.util包下&#xff0c;所以我们如果需要使用则必须导包&#xff0c;导包的语句必须在声明包之后&#xff0c;在声明类之前 Scanner类是用来接受用户输入的各种信息 Scanner类提供了用于接受…

Ubuntu中交叉编译armdillo库

网上关于交叉编译armdillo库比较少&#xff0c;借鉴了一些但是在前几天编译时总是磕磕绊绊&#xff0c;于是写一个详细的编译过程。 交叉编译armdillo库包含两个步骤&#xff1a;交叉编译依赖库和交叉编译armdillo库。armdillo官网介绍依赖库如下图所示&#xff1a; 需要注意如…

01【MATLAB】最小二乘系统辨识

目录 1.系统辨识的定义及其分类 1.1 系统辨识的定义 1.2 系统辨识的分类 2.参数模型 3.系统辨识的步骤 一、最小二乘法&#xff08;Least Squares Method&#xff09;一般步骤 二、LSM原理及应用 三、LSM在控制系统建模中的应用 1.系统辨识的定义及其分类 1.1 系统辨识的…

Leetcode面试经典150题-201.数字范围按位与

给你两个整数 left 和 right &#xff0c;表示区间 [left, right] &#xff0c;返回此区间内所有数字 按位与 的结果&#xff08;包含 left 、right 端点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;left 5, right 7 输出&#xff1a;4示例 2&#xff1a; 输入&…

Kolmogorov-Arnold——代替 MLP以提高模型的代表性和性能

前言 论文地址&#xff1a;https://arxiv.org/abs/2409.10594 源码地址&#xff1a;https://github.com/Adamdad/kat.git 传统的变压器模型使用多层感知器&#xff08;MLP&#xff09;来混合通道间的信息&#xff0c;而本文则使用了科尔莫哥罗德网络&#xff08;KAN&#xff0…

微信第三方开发平台接入公众号整体技术方案

1.1 公众号简介 官网地址&#xff1a;微信公众平台 微信公众号 就像是你在微信里的一个“官方小号”&#xff0c;专门用来发布内容、和粉丝互动。用户可以关注你的公众号&#xff0c;收到你发布的消息&#xff0c;就像朋友圈那样。公众号还能提供很多实用功能&#xff0c;比如…

在 React 中模拟输入

需求 与 Bug 项目的 C# 桌面端使用 CefSharp 内嵌了一个三方网站&#xff0c;在外部实现了一个登录控件&#xff0c;外部登录后希望内嵌的三方网站自动登录&#xff0c;实现代码如下&#xff1a; browser.ExecuteScriptAsync($"document.getElementsByName(username)[0]…

s3c2440——ADC模数转换器,Linux驱动编程——u-boot

一、ADC 模拟&#xff1a;连续&#xff1b;数字&#xff1a;离散。 模拟信号一般指连续变化的电压值。转换的步骤&#xff1a;采样、量化。 ADC中soc电压转为数字信号的方法&#xff1a;逐次逼近法。 分辨率&#xff1a;nbit&#xff1b;表示一个电压比较器比较10次&#xf…

CoreDNS实现跨集群service解析实践

CoreDNS实现跨集群service解析实践 背景介绍使用条件实现方案 CoreDNS是一款使用Go语言实现的专为云原生应用而生的DNS服务器。本文介绍CoreDNS在特定实际场景下的一种进阶使用实践&#xff0c;也许能为其他也在使用CoreDNS做服务发现的同学提供一些启发和思考。 背景介绍 在…

三星推出990 EVO Plus固态硬盘,支持PCIe 4.0性能出色

容量高达4TB&#xff0c;提供增强的性能和能效。性能卓越&#xff0c;随机读写速度分别为为 1,050K IOPS 和 1,400K IOPS。 韩国——2024年9月25日—三星电子于今天宣布推出990 EVO Plus固态硬盘&#xff0c;为其固态硬盘产品线再添新成员。990 EVO Plus 支持 PCIe 4.0和最新的…