kinova-jaco2使用Moveit!控制真实机械臂抓取固定点物体

2023-11-13

一、机械臂坐标系

1、坐标系方向

遵循右手法则:右手手背正对机械臂数据接口槽,四指方向为x,拇指方向为z,垂直手心方向为y
在这里插入图片描述

2、位姿方向

逆时针为正
在这里插入图片描述

3、z轴的起始点

由下图可以看出
origin所在平面z值为0,j2n6s300_end_effector的位置为第六个关节向下160mm处,实物上即最后一节手指关节上螺丝的上端。
在这里插入图片描述

二、启动机械臂和Moveit!

   sudo cp ~/jaco2_ws/src/kinova-ros-master/kinova_driver/udev/10-kinova-arm.rules /etc/udev/rules.d/
   roslaunch kinova_bringup kinova_robot.launch kinova_robotType:=j2n6s300
   roslaunch j2n6s300_moveit_config j2n6s300_demo.launch 

三、实现抓取

1、python代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy, sys
import moveit_commander
from moveit_commander import PlanningSceneInterface
from geometry_msgs.msg import PoseStamped

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

        # 初始化ROS节点
        rospy.init_node('real_jaco_moveit_fixed_grasp')

        # 初始化需要使用move group控制的机械臂中的arm group
        arm = moveit_commander.MoveGroupCommander('arm')

        # 初始化需要使用move group控制的机械臂中的gripper group
        gripper = moveit_commander.MoveGroupCommander('gripper')

        # 获取终端link的名称
        end_effector_link = arm.get_end_effector_link()

        # 设置目标位置所使用的参考坐标系
        reference_frame = 'world'
        arm.set_pose_reference_frame(reference_frame)

        # 当运动规划失败后,允许重新规划
        arm.allow_replanning(True)

        # 设置位置(单位:米)和姿态(单位:弧度)的允许误差
        arm.set_goal_position_tolerance(0.001)
        arm.set_goal_orientation_tolerance(0.001)
        gripper.set_goal_joint_tolerance(0.001)

        # 设置允许的最大速度和加速度
        arm.set_max_acceleration_scaling_factor(0.5)
        arm.set_max_velocity_scaling_factor(0.5)

        # 初始化场景对象
        scene = PlanningSceneInterface()
        rospy.sleep(1)

        # 控制机械臂先回到初始化位置,手爪打开
        arm.set_named_target('Home')
        arm.go()
        gripper.set_named_target('Open')
        gripper.go()
        rospy.sleep(1)

        # 设置机械臂工作空间中的目标位姿,位置使用x、y、z坐标描述,
        # 姿态使用四元数描述,基于base_link坐标系
        target_pose = PoseStamped()
        target_pose.header.frame_id = reference_frame
        target_pose.header.stamp = rospy.Time.now()
        target_pose.pose.position.x = 0.32
        target_pose.pose.position.y = 0.2
        target_pose.pose.position.z = 0
        target_pose.pose.orientation.x = 0.14578
        target_pose.pose.orientation.y = 0.98924
        target_pose.pose.orientation.z = -0.0085346
        target_pose.pose.orientation.w = 0.0084136
        # thing_pose.pose.orientation.x =  -0.59375
        # thing_pose.pose.orientation.y = -0.60903
        # thing_pose.pose.orientation.z = -0.13927
        # thing_pose.pose.orientation.w = 0.5071
        # 设置机器臂当前的状态作为运动初始状态
        arm.set_start_state_to_current_state()
        # 设置机械臂终端运动的目标位姿
        arm.set_pose_target(target_pose, end_effector_link)
        # 规划运动路径
        traj = arm.plan()
        # 按照规划的运动路径控制机械臂运动
        arm.execute(traj)
        rospy.sleep(1)
        # 设置夹爪的目标位置,并控制夹爪运动
        gripper.set_named_target('Close')
        gripper.go()
        rospy.sleep(1)



        # # 控制机械臂先回到初始化位置,手爪闭合
        # arm.set_named_target('Home')
        # arm.go()
        # gripper.set_named_target('Close')
        # gripper.go()

        # 关闭并退出moveit
        moveit_commander.roscpp_shutdown()
        moveit_commander.os._exit(0)


if __name__ == "__main__":
    MoveItIkDemo()


2、python文件建议直接用python启动

python2 real_jaco_moveit_fixed_grasp.py 

手臂以竖直的姿态抓取物体。

如果启动不了,在目录下给一下权限

chmod +x real_jaco_moveit_fixed_grasp.py

四、遇到的问题

1、逆运动学无解的问题

2020-5-26更新,想得到桌子上的一些点,所以重新运行了一下,但是一直报这两个错误
错误:
(1)[ERROR] [1590499013.878968250]: RRTConnect: Unable to sample any valid states for goal tree
在这里插入图片描述
(2)[ WARN] [1590499013.886385474]: Fail: ABORTED: No motion plan found. No execution attempted.
在这里插入图片描述

解决:
因为之前能用所以我以为是我重新装了ros的原因,但是我换了一台电脑有同样的错误,查了很多资料,其实就是逆运动学求解没有求到。将四元素改到两位小数精度也没有用,最后改成了[0,1,0,1]就可以了。
参考:https://blog.csdn.net/longbinliu/article/details/78850145?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-2

在这里插入图片描述

翻译:明白了。原来,[0,1,0,0]是一个有效的四元数,但是没有TRAC-IK返回有效的IK所需的精度。相反,我建议使用ROS的TF-变换方法为目标姿势构造四元数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kinova-jaco2使用Moveit!控制真实机械臂抓取固定点物体 的相关文章

随机推荐

  • ag-grid 学习笔记三:ag-grid设置(定义列、选择行、复选框、设置行高列宽、置顶合计行、底部合计行、行组、客户端排序)

    目录 一 定义列 二 选择行 三 设置复选框 四 设置行高列宽 五 置顶合计行 六 底部合计行 七 行组 八 客户端排序 一 定义列 表格的列有如下常用属性 名称 说明 headerName 显示的列名称 和数据没有关系显示给用户看的 fi
  • STM32 电机教程 12 - BLDC 闭环电流控制

    前言 无刷直流 Brushless Direct Current BLDC 电机是一种正快速普及的电机类型 它可在家用电器 汽车 航空航天 消费品 医疗 工业自动化设备和仪器等行业中使用 正如名称指出的那样 BLDC 电机不用电刷来换向 而
  • FastAPI 01--快速入门FastApi

    FastAPI 01 快速入门 介绍 第一个FastApi 案例 说明 介绍 FastAPI 是一个用于构建 API 的现代 快速 高性能 的 web 框架 使用 Python 3 6 并基于标准的 Python 类型提示 快速 可与 No
  • 推荐一个冷门又逆天的副业:Python兼职可月入10k+,成年人的世界,钱才是底气

    关于穷 去年有了一个更学术的说法 隐形贫困人口 就是因为有太多 种草达人 让我们为了物质生活超前消费 再加上不理财的话 那简直是雪上加霜 看到知乎上面最近有一个很火的问题 90后的你 现在拥有多少存款 你会看到人生百态 有人父母双亡 白手起
  • 正交矩阵的列向量组是标准正交向量组

  • Android+SpringBoot前后端分离实现登录注册

    Android SpringBoot前后端分离实现登录注册 一 登录 1 界面设计 2 Android端 1 布局文件 activity login 2 java文件 LoginActivity 下面给出找到IPv4地址的步骤 1 Win
  • postman和jmeter哪个是更好的接口测试工具?

    1 关于在哪个阶段使用哪个接口测试工具 对于单个的接口测试请求 我更喜欢用postman 可能比jmeter更好定位问题 在接口调试好后 我则更喜欢用jmeter进行一些简单的自动化请求 可能代替很多手工造数据和流程性的操作 列如 在开发交
  • 从入门到放弃系列--如何成为全栈工程师02

    未来3个月 你需要的html全部在这里 用html语言 可以写出目前你见到的所有类型的电脑界面 包括app 小程序 网页 注意 我说的是界面 说这个的意思是告诉你html是基础也很实用 是帮你打开全栈工程师的大门的第一步 所以 你需要熟练掌
  • 【torch】如何把把几个 tensor 连接起来?(含源代码)

    一 cat 在 PyTorch 中 要向一个 tensor 中添加元素 你通常需要创建一个新的 tensor 然后将元素添加到新的 tensor 中 PyTorch tensors 是不可变的 所以不能像列表一样直接追加元素 以下是如何实现
  • keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect

    这里需要输入的密码不是证书的密码执行keytool import keystore file 这个命令提示需要输入密码 输入 changeit 信任证书 OK
  • opencv 通过网络连接工业相机_相机标定与测距

    0 概述 硬件 Realsense D435i 含imu AprilTag或棋盘格标定板 本文均使用棋盘格 说明 本文非手把手教你如何教程 需要一定的ROS基础和D435i相机调试基础 当然玩过其他相机也可以 写作过程参考了部分作者成果 如
  • 函数式编程—柯里化

    纯函数的作用和优势 1 可以安心的编写和使用 2 写的时候保证了函数的纯度 只是单纯实现自己的业务逻辑即可 不需要关心传入的内容是如何获得的或者依赖其他的外部变量是否已经发生了修改 3 在用的时候 确定输入的内容不会被任意篡改 并且自己确定
  • 玩具蛇

    include
  • 数据库SQLite

    数据库SQLite 了解最轻巧的数据库SQLite SQLite 是一款轻型的数据库 占用资源非常低 它的源代码不受版权限制 能够支持Windows Linux Unix等等主流的操作系统 同时能够跟很多程序语言相结合 比如 Tcl C P
  • 29 KVM管理系统资源-调整虚拟CPU绑定关系

    文章目录 29 KVM管理系统资源 调整虚拟CPU绑定关系 29 1 概述 29 2 操作步骤 29 KVM管理系统资源 调整虚拟CPU绑定关系 29 1 概述 把虚拟机的vCPU绑定在物理CPU上 即vCPU只在绑定的物理CPU上调度 在
  • 2-问过 chatgpt 的问题(天马行空想问什么问什么)

    目录 一 信号序列中大部分为 0 时 FFT 运算复杂度的计算 1 当fft运算时 大部分信号点为0的情况下 对fft的运算时间会有影响吗 2 大部分信号点为0的情况下 fft的运算复杂度计算 3 这里的时间复杂度 O N log
  • HTML5语音合成功能

    这篇文章主要介绍了HTML5语音合成功能的实现代码 本文通过实例代码给大家介绍的非常详细 具有一定的参考借鉴价值 需要的朋友参考下吧 可将该代码复制到chrome控制台中体验 let msg new SpeechSynthesisUtter
  • this和super

    this this总是置于当前对象的成员类作区分 this是当前对象的引用 就是说当前用构造函数建的对象是谁 这个this就代表谁 它是一个引用 this 总是指向自己本事 super 子类在重写了父类的方法后 常常还需要使用到父类中被重写
  • do while循环语句的学习以及练习

    今天学的是do while循环语句 先执行循环体 直到条件的表达式为false 与while循环语句的区别 while语句先判断条件 满足时执行循环体 do while语句先执行循环体 满足条件在执行 语法 do 循环体 while 条件
  • kinova-jaco2使用Moveit!控制真实机械臂抓取固定点物体

    kinova jaco2使用Moveit 控制真实机械臂抓取固定点物体 一 机械臂坐标系 坐标系方向 位姿方向 轴的起始点 二 启动机械臂和Moveit 三 实现抓取 python代码 python文件建议直接用python启动 四 遇到的