Dofbot机械臂从零部署笔记(4)——ROS之Moveit下实现实机逆向运动学规划

2023-11-10


本节接上节,实现逆向运动学规划。
本节源代码位于( /home/jetson/dofbot_ws/src/dofbot_moveit/scripts)
我们将 02_motion_plan.py 复制到上面的scripts文件夹下。

编译代码

02_motion_plan.py 复制到上面的scripts文件夹后,检查一下是否开启运行权限(py文件右键properties→permission→Execute打勾)。
回工作空间目录catkin_make一下就可以待运行了(其实melodic不catkin_make也可以,强迫症犯了)。

逆向运动学规划例子

需要将源码中初始化机械臂时传入的“dofbot”改成我们在之前moveit规划时设置的规划组“xiaok”

代码和运行效果

#!/usr/bin/env python
# coding: utf-8
import rospy
from math import pi
from time import sleep
from geometry_msgs.msg import Pose
from moveit_commander.move_group import MoveGroupCommander
from tf.transformations import quaternion_from_euler

# 角度转弧度
DE2RA = pi / 180

if __name__ == '__main__':
    # 初始化节点
    rospy.init_node("dofbot_motion_plan_py")
    # 初始化机械臂
    dofbot = MoveGroupCommander("xiaok")
    # 当运动规划失败后,允许重新规划
    dofbot.allow_replanning(True)
    dofbot.set_planning_time(5)
    # 尝试规划的次数
    dofbot.set_num_planning_attempts(10)
    # 设置允许目标位置误差
    dofbot.set_goal_position_tolerance(0.01)
    # 设置允许目标姿态误差
    dofbot.set_goal_orientation_tolerance(0.01)
    # 设置允许目标误差
    dofbot.set_goal_tolerance(0.01)
    # 设置最大速度
    dofbot.set_max_velocity_scaling_factor(1.0)
    # 设置最大加速度
    dofbot.set_max_acceleration_scaling_factor(1.0)
    # 设置"down"为目标点
    dofbot.set_named_target("down")
    dofbot.go()
    sleep(0.5)
    # 创建位姿实例
    pos = Pose()
    # 设置具体的位置
    pos.position.x = 0.0
    pos.position.y = 0.0597016
    pos.position.z = 0.168051
    # RPY的单位是角度值
    roll = -140.0
    pitch = 0.0
    yaw = 0.0
    # RPY转四元素
    q = quaternion_from_euler(roll * DE2RA, pitch * DE2RA, yaw * DE2RA)
    # pos.orientation.x = 0.940132
    # pos.orientation.y = -0.000217502
    # pos.orientation.z = 0.000375234
    # pos.orientation.w = -0.340811
    pos.orientation.x = q[0]
    pos.orientation.y = q[1]
    pos.orientation.z = q[2]
    pos.orientation.w = q[3]
    # 设置目标点
    dofbot.set_pose_target(pos)
    # 多次执行,提高成功率
    for i in range(5):
        # 运动规划
        plan = dofbot.plan()
        if len(plan.joint_trajectory.points) != 0:
            print ("plan success")
            # 规划成功后运行
            dofbot.execute(plan)
            break
        else:
            print ("plan error")

运行,分别打开demo和rviz,最后运行该程序:

roslaunch xiaok_moveit_config demo.launch
rosrun rviz rviz
rosrun xiaok_moveit_config 02_motion_plan.py

在这里插入图片描述
可以看到机械臂先来到之前设定好的“down”位置后,通过Plan,Execute到了指定的空间位置和角度。
我们可以看rivz,Display中打开MotionPlanning→Planned Path→Links→Link5,观察规划运动完后Positon和Orientation的值,应该和代码中我们预设的位姿值相近。

关于老是规划失败

我们在代码里设了5次循环,可以看到失败率是挺高的,第4次才成功规划并运行到指定位置。其实很有可能一直不成功。
猜测原因:
1.可能和默认的运动学算法 KDL 有关,这个算法求逆向运动学的特点就是计算精确,但是效率低下,失败率高。可以更换算法试试,不过网上说更换成TRAC-IK我个人感觉没什么差别。
2.可能和Jetson Nano的CPU性能有关,可以试着调整一下moveit中的规划相关的参数。比如:
dofbot.set_planning_time(10) 给它调成10秒。
规划时间给增多一点,实测也有几率plan成功。
3. set_goal_tolerance(0.03) 允许目标误差设得大一点。
然后for循环range()给个20次,多试几次。

如果有知道其他原因的小伙伴还请指教。

逆向运动学Moveit编程步骤,代码修正

程序2大致的步骤和之前程序1一样大致为:
・创建 Move group 对象
・设置目标位姿
・修改参数
・执行运动规划

但是这个步骤并不具体细致,落实到逆向运动学,我们没有设定以哪个末端link来定位目标位姿Pose,我们也没有指定以哪个参考坐标系进行运动,而是让程序默认去识别。

所以我们对程序进行修改:
我们把Pose()类换成PoseStamped()类,PoseStamped包含了位姿更多的信息。类名对应了ROS中的消息名,我们通过rosmsg show来查看它们俩的区别:
在这里插入图片描述可以看到PoseStamped包含了一个head头信息,包括frame_id(以哪个坐标系定义位姿)和stamp(时间戳)。

同时我们通过get_end_effector_link()方法获取终端Link名称,set_pose_reference_frame()方法置目标位置所使用的参考坐标系。
再在set_pose_target(target_pose, end_effector_link)传入PoseStamped和终端Link名。
具体修正代码 02_motion_plan2.py 见下:

#!/usr/bin/env python
# coding: utf-8
import rospy
from math import pi
from time import sleep
from geometry_msgs.msg import PoseStamped, Pose
from moveit_commander.move_group import MoveGroupCommander
from tf.transformations import quaternion_from_euler

# 角度转弧度
DE2RA = pi / 180

if __name__ == '__main__':
    # 初始化节点
    rospy.init_node("dofbot_motion_plan_py")
    # 初始化机械臂
    dofbot = MoveGroupCommander("xiaok")

    # 获取终端link的名称
    end_effector_link = dofbot.get_end_effector_link()
    print(end_effector_link)
    # 设置目标位置所使用的参考坐标系
    reference_frame = 'base_link'
    dofbot.set_pose_reference_frame(reference_frame)

    # 当运动规划失败后,允许重新规划
    dofbot.allow_replanning(True)
    dofbot.set_planning_time(5)
    # 尝试规划的次数
    dofbot.set_num_planning_attempts(10)
    # 设置允许目标位置误差
    dofbot.set_goal_position_tolerance(0.01)
    # 设置允许目标姿态误差
    dofbot.set_goal_orientation_tolerance(0.01)
    # 设置允许目标误差
    dofbot.set_goal_tolerance(0.01)
    # 设置最大速度
    dofbot.set_max_velocity_scaling_factor(1.0)
    # 设置最大加速度
    dofbot.set_max_acceleration_scaling_factor(1.0)
    # 设置"down"为目标点
    dofbot.set_named_target("down")
    dofbot.go()
    sleep(0.5)

    # 创建位姿实例
    target_pose = PoseStamped()
    target_pose.header.frame_id = reference_frame
    target_pose.header.stamp = rospy.Time.now()
    # 设置具体的位置
    target_pose.pose.position.x = 0.0
    target_pose.pose.position.y = 0.0597016
    target_pose.pose.position.z = 0.168051
    # RPY的单位是角度值
    roll = -140.0
    pitch = 0.0
    yaw = 0.0
    # RPY转四元素
    q = quaternion_from_euler(roll * DE2RA, pitch * DE2RA, yaw * DE2RA)
    print(q)
    target_pose.pose.orientation.x = q[0]
    target_pose.pose.orientation.y = q[1]
    target_pose.pose.orientation.z = q[2]
    target_pose.pose.orientation.w = q[3]

    # 设置机器臂当前的状态作为运动初始状态
    dofbot.set_start_state_to_current_state()

    # 设置目标点
    dofbot.set_pose_target(target_pose, end_effector_link)

    # 多次执行,提高成功率
    for i in range(5):
        # 运动规划
        traj = dofbot.plan()
        if len(traj.joint_trajectory.points) != 0:
            print ("plan success")
            # 规划成功后运行
            dofbot.execute(traj)
            break
        else:
            print ("plan error")

总结一下步骤:
・创建 Move group 对象
・获取终端Link名称
・设置目标位姿对应的参考坐标系,设定起始、终止位姿
・执行运动规划

因为规划失败率高,耗时长,实机同步省略(实现思路和订阅Joint State一样)。

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

Dofbot机械臂从零部署笔记(4)——ROS之Moveit下实现实机逆向运动学规划 的相关文章

随机推荐

  • 开源项目SMSS发开指南(四)——SSL/TLS加密通信详解

    本文将详细介绍如何在Java端 C 端和NodeJs端实现基于SSL TLS的加密通信 重点分析Java端利用SocketChannel和SSLEngine从握手到数据发送 接收的完整过程 本文也涵盖了在Ubuntu系统上利用OpenSSL
  • springBoot的序列化与反序列化

    springboot中的序列化与反序列化有一个相对比较复杂的转换过程 它主要是HTTP请求 响应的信息类型转换 包含编码 信息类型 信息转换器 注解方法的处理适配器 请求接收的信息处理器等等 我们就先从大家常用的RequestBody和Re
  • java知识结构

    基础 1 java概述 2 搭建运行环境 3 java基本语法 常变量 数据类型 运算符 标识符与关键字 4 流程控制 5 eclipse开发工具 6 面向对象编程 类和对象 包 继承 this super关键字 多态 重载 重写 抽象类f
  • systemverilog中的bind

    最早接触 bind 关键字是在assertion 当中 将assertion 与 dut 进行绑定连接 如下例子 bind cpu fpu props fpu rules 1 a b c cpu 是module 名字 fpu props 是
  • ElementUI表格的动态渲染

    在ElementUI官方文档中 描述的动态渲染只是单纯的将已知字段名称的JSON数据通过prop属性填充到页面中 下为官方文档内容
  • 轮播图背景图铺满整个div

    slider width 1224px height 458px background image url image school 1 png background size cover background repeat round p
  • Biogeochemical record of ancient humans (古人类生物地理化学记录)

    一 摘要 该文为一篇综述 全文主要介绍了如何利用生物化学记录 同位素 研究古人类饮食 营养和活动 二 作者简介 Marilyn Fogel born September 19 1952 is an American geo ecologis
  • Java程序中对Service进行Mock

    Java程序中对Service进行Mock 背景 Servie Test Service 背景 在项目中往往需要对service逻辑进行单元测试验证 这里采用mockito对dao数据进行模拟 验证service逻辑 Servie pack
  • 算法训练 大小写转换

    http lx lanqiao org problem page gpid T216 算法训练 大小写转换 时间限制 1 0s 内存限制 512 0MB 问题描述 编写一个程序 输入一个字符串 长度不超过20 然后把这个字符串内的每一个字符
  • 快速获得CNVD证书

    首先要明确什么样的通用漏洞可以发证书 收录标准 这里的收录标准是能获得证书的标准 事件型 事件型漏洞必须是三大运营商 移动 联通 电信 的中高危漏洞 或者党政机关 重要行业单位 科研院所 重要企事业单位 如 中央国有大型企业 部委直属事业单
  • maven子工程application文件失效

    按照如下进行操作
  • ubuntu下载goalng-1.9

    一 安装 这里以安装golang1 9为例 1 首先通过命令行直接安装 sudo apt get install golang 1 9 2 下载好之后 查看go的版本 catik catik Aspire V3 471 go version
  • 2023杭电暑假多校6 题解 1 2 6 10

    文章目录 1 Count 2 Pair Sum and Perfect Square https vjudge csgrandeur cn problem HDU 7337 6 Perfect square number https vju
  • C++中的拷贝构造函数

    1 拷贝构造函数 拷贝构造函数是一种特殊的构造函数 它在创建对象时 是使用同一类中之前创建的对象来初始化新创建的对象 拷贝构造函数通常用于 a 当用类的一个对象去初始化该类的另一个对象 或引用 时系统自动调用拷贝构造函数实现拷贝赋值 b 若
  • 微信小程序开发(二)微信小程序的调试和发布

    调试 编译和预览 预览 点击预览 可以使用微信扫描二维码 在手机上安装测试版小程序 或者点击自动预览 可以连接手机微信或者直接在电脑端打开小程序预览 发布 上传代码 发布项目 工具 上传 确定 编辑版本号和描述 点击上传 上传成功 点击下载
  • mysql错误代码1045的原因及解决方案、Mysql服务没找到?

    mysql错误代码1045的原因及解决方案 Mysql服务没找到 再一次接触数据库时 想要用工具连接数据库的时候 出现了错误 Acess denied for localhost 忘了 应该是服务器的问题 就去重启了一下服务器 net st
  • 【Ant Design of Vue】Tree 树形控件双击树节点禁止取消选中(两种方法)

    一 需求 Ant Design of Vue官网中 第一次点击树节点会选中 再一次点击该树节点会取消选中 如图所示 现有如下需求 根据左侧选中树节点 去请求接口获取右侧表格数据 第一次点击树节点则选中 再一次点击该树节点不会取消选中 不会取
  • 通过js date对象获取各种开始结束日期的示例

    有时候做一些任务计划的功能时候 需要提供一个开始时间或者结束时间 比如本周结束 本月结束 今天结束等等 因此 我参考网上的资料把相关的实现为一个项目 gitee https gitee com dhclly icedog date edge
  • 深度学习------tensorflow卷积神经网络:cifar数据集

    1 cifar10数据集介绍 CIFAR 10数据集由10个类的60000个32x32彩色图像组成 每个类有6000个图像 有50000个训练图像和10000个测试图像 数据集分为五个训练批次和一个测试批次 每个批次有10000个图像 测试
  • Dofbot机械臂从零部署笔记(4)——ROS之Moveit下实现实机逆向运动学规划

    文章目录 编译代码 逆向运动学规划例子 代码和运行效果 关于老是规划失败 逆向运动学Moveit编程步骤 代码修正 本节接上节 实现逆向运动学规划 本节源代码位于 home jetson dofbot ws src dofbot movei