Moveit编程——moveit 编程技巧笔记——圆弧轨迹规划+修改轨迹

2023-10-30

moveit 编程技巧笔记——圆弧轨迹规划+修改轨迹

1 笛卡尔空间圆弧轨迹规划

之前学习过笛卡尔空间下轨迹规划API:(plan, fraction) = arm.compute_cartesian_path
返回值:
plan:规划出来的运动轨迹
fraction:描述规划成功的轨迹在给定路径点列表的覆盖率【0~1】。如果fraction小于1,说明给定的路径点列表没有办法完整规划

如果将圆弧轨迹微分为一段段的小直线段,就能通过调用上述API构建出圆弧轨迹。

#include<math.h>
#include<ros/ros.h>
#include<moveit/move_group_interface/move_group_interface.h>
#include<moveit/robot_trajectory/robot_trajectory.h>

int main(int argc, char **argv)
{
    ros::init(argc,argv,"moveit_circle_demo");
    ros::AsyncSpinner spinner(1);
    spinner.start();

    moveit::planning_interface::MoveGroupInterface arm("xmate_arm");
    std::string end_effector_link = arm.getEndEffectorLink();
    std::string reference_frame = "base_link";
    arm.setPoseReferenceFrame(reference_frame);

    //当运动规划失败后,允许重新规划
    arm.allowReplanning(true);

    //设置位置(单位:米)和姿态(单位:弧度)的允许误差
    arm.setGoalPositionTolerance(0.001);
    arm.setGoalOrientationTolerance(0.01);

    //设置允许的最大速度和加速度
    arm.setMaxAccelerationScalingFactor(0.8);
    arm.setMaxVelocityScalingFactor(0.8);

    // 控制机械臂先回到初始化位置
    arm.setNamedTarget("home");
    arm.move();
    sleep(1);

    // 设置机器人终端的目标位置
    geometry_msgs::Pose target_pose;//设定圆心的位置
    target_pose.orientation.x = 0.14858;
    target_pose.orientation.y = 0.73236;
    target_pose.orientation.z = -0.03444;
    target_pose.orientation.w = 0.66362;

    target_pose.position.x = -0.050308;
    target_pose.position.y = -0.039851;
    target_pose.position.z = 0.78264;

    arm.setPoseTarget(target_pose);
    arm.move();//首先运动到圆心的位置
    sleep(1);


	std::vector<geometry_msgs::Pose> waypoints;

    //将初始位姿加入路点列表
	waypoints.push_back(target_pose);

    double centerA = target_pose.position.x;
    double centerB = target_pose.position.z;
    double radius = 0.13;

    for(double th=0.0; th<6.28; th=th+0.01)
    {
        target_pose.position.y = centerA + radius * cos(th);
        target_pose.position.z = centerB + radius * sin(th);
        waypoints.push_back(target_pose);
    }

	// 笛卡尔空间下的路径规划
	moveit_msgs::RobotTrajectory trajectory;
	const double jump_threshold = 0.0;
	const double eef_step = 0.01;
	double fraction = 0.0;
    int maxtries = 100;   //最大尝试规划次数
    int attempts = 0;     //已经尝试规划次数

    while(fraction < 1.0 && attempts < maxtries)
    {
        fraction = arm.computeCartesianPath(waypoints, eef_step, jump_threshold, trajectory);
        attempts++;
        
        if(attempts % 10 == 0)
            ROS_INFO("Still trying after %d attempts...", attempts);
    }
    
    if(fraction == 1)
    {   
        ROS_INFO("Path computed successfully. Moving the arm.");

	    // 生成机械臂的运动规划数据
	    moveit::planning_interface::MoveGroupInterface::Plan plan;
	    plan.trajectory_ = trajectory;

	    // 执行运动
	    arm.execute(plan);
        sleep(1);
    }
    else
    {
        ROS_INFO("Path planning failed with only %0.6f success after %d attempts.", fraction, maxtries);
    }

    // 控制机械臂先回到初始化位置
    arm.setNamedTarget("home");
    arm.move();
    sleep(1);

	ros::shutdown(); 
	return 0;
}    

2 轨迹重定义(修改moveit生成的轨迹数据)

在很多时候会发现 Moveit 规划出的轨迹数据并不一定满足我们的需求。比如速度、加速度、时间、位置等,这时就需要我们在 plan 和 excute 之间对这条轨迹进行重新的修改和定义,之后再执行就会变成我们想要的。

问题的关键就在于我们怎么样才能对轨迹进行修改,主要就是这个函数,函数的入口参数为:

  • movieit 规划后的轨迹数据 moveit::planning_interface::MoveGroupInterface::Plan &plan
  • 一个是速度的尺度因子 double scale

想要对轨迹数据进行修改的话,就必须首先了解这个 plan 的数据结构,了解 trajectory 的这些 points 是如何保存的,这就需要查找 moveit 的官方 API 文档了。
复制moveit::planning_interface::MoveGroupInterface::Plan到浏览器,查看官方API 文档:moveit::planning_interface::MoveGroup Class Reference
在这里插入图片描述点击 plan
在这里插入图片描述发现 plan 有三个公共属性,复制 moveit_msgs::RobotTrajectory到浏览器,查看这个数据结构:moveit_msgs/RobotTrajectory Message
在这里插入图片描述一般情况下用的是第一个,所以,进入第一个
在这里插入图片描述里边包含关节的名字,还有轨迹点,每一个路经点包含每一个关节的位置、速度、加速度和时间,点进去
在这里插入图片描述到此 Plan 的数据结构就非常清晰了,想要变动里边的参数就可以操作了。
在这里插入图片描述

void scale_trajectory_speed(moveit::planning_interface::MoveGroupInterface::Plan &plan, double scale)//引用 & 作函数参数,形参可以修饰实参
{
    int n_joints = plan.trajectory_.joint_trajectory.joint_names.size();//获取关节个数
    
    for(int i=0; i<plan.trajectory_.joint_trajectory.points.size(); i++)//通过for循环对plan中所有的轨迹点作一个遍历
    {
        plan.trajectory_.joint_trajectory.points[i].time_from_start *= 1/scale;//速度变慢,时间变长为 1/scale 倍
        
        for(int j=0; j<n_joints; j++)//遍历各个关节,每一个关节的速度和加速度数据都要作一个尺度的变化
        {
            plan.trajectory_.joint_trajectory.points[i].velocities[j] *= scale;//速度变化为原来的 scale
            plan.trajectory_.joint_trajectory.points[i].accelerations[j] *= scale*scale;//加速度变化为原来的 scale * scale
        }
    }
}

结合画圆的案例,实现先用 moveit 规划的 plan 走一遍,再轨迹重定义(调整运行速度为原来的 scale倍)走一遍。
在这里插入图片描述 ROS机械臂开发:MoveIt!中的潜规则

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

Moveit编程——moveit 编程技巧笔记——圆弧轨迹规划+修改轨迹 的相关文章

随机推荐

  • QT CREATOR 插件开发:添加新的工程类型(上)

    Qt Creator 中 新的工程类型将出现在 文件 gt 新建 菜单项中 我们可以通过打开的选择工程类型的对话框来找到所需要的工程 在本章中 我们将学习如何向上面所示的对话框中添加新的工程类型 Core IWizard接口 Qt Crea
  • 基于富芮坤fr8016 蓝牙5.0 芯片设计的BLE HID Joystick 游戏摇杆设备

    文章目录 ble hid 学习笔记 HID报告描述符与BLE HID profile之间关系 1 HID报告描述符 富芮坤fr8016 设计Joystick例子 1 描述X轴Y轴Z轴 2 描述按钮 3 Joystick 报告描述符 4 程序
  • Linux服务 Nginx(二)

    Linux服务 Nginx 二 最权威的资料 官方文档http nginx org en docs 主配置段的指令 正常运行的必备配置 1 user USERNAME GROUPNAME 指定运行worker进程的用户和组 Syntax u
  • c语言利用穷举法求1-100内的质数

    方法 include
  • 广告数据集mapreduce实验(词频统计)

    本实验是使用广告数据集 通过mapreduce获取购买者年龄人数分布 数据列分别为 ad id xyz campaign id age gender Impressions Clicks Total Conversion Approved
  • 基于MNIST实现GAN(pytorch)

    基于MNIST实现生成对抗网络 pytorch逐行实现 本文是pytorch逐行实现GAN网络 作为一个基础GAN框架来学习 以后编写复杂的GAN的衍生网络框架都是同样的思想 import numpy as np import torch
  • Linux 下获取Root权限的几种方法

    方法分为永久性获取root权限以及非永久性获取Root权限 非永久性获取Root权限 非永久性获取Root权限可以在我们要键入的命令之前加上sudo前缀 如我们要键入的命令是 rm 以Root用户执行的方式就是 sudo rm 这样在每个需
  • 苹果的AI野心:内耗、反击与挑战

    图片来源 由无界AI生成 作者丨山核 苹果一年一度的秋季 春晚 时间越来越近 但在大模型浪潮下 苹果何时推出自己的 苹果GPT 成了另一个关注的话题 毕竟 前有华为 后有小米 在中国手机厂商争相将大模型装进移动终端的同时 苹果却依旧对AI大
  • ubuntu16.04 conda新建环境安装新版gcc教程

    首先 使用conda新建环境 conda create name yourenvname python 3 x 最新版的gcc移步链接 上面是我所选择的版本号 选择了第一个命令 创建一个如上图类似的软链接即可 这一步一定要寻找bin下面的新
  • Mysql的explain官方文档翻译

    原文地址 https dev mysql com doc refman 5 7 en explain output html explain extra information 先复制进来 每天翻译一段 有兴趣的小伙伴可以一块加入进来翻译
  • iOS进阶_GCD(二.GCD串行队列&并发队列)

    GCD 核心概念 将任务添加到队列 指定任务执行的方法 任务 使用block封装 block 就是一个提前准备好的代码块 在需要的时候执行 队列 负责调度任务 串行队列 一个接一个的调度任务 并发队列 可以同时调度多个任务 任务执行函数 任
  • 差分进化算法在图像处理中的应用研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 文献来源 生物的进化普遍遵循达尔文的 物竞
  • FreeSWITCH 架构

    从来章开始 我们正式开始我们的 FreeSWITCH 之旅 今后我们不再用单独的章节来讲述VoIP中的其它要素和概念 而是在用到时穿插于各个章节之中 总体结构 FreeSWITCH 由一个稳定的核心及外围模块组成 下图来自 FreeSWIT
  • linux gcc 头文件搜索路径

    linux gcc 头文件搜索路径 2011 02 15 13 40 423人阅读 评论 0 收藏 举报 一 头文件 gcc 在编译时寻找所需要的头文件 搜寻会从 I开始 然后找gcc的环境变量 C INCLUDE PATH CPLUS I
  • locust

    python做性能测试首选库 内部使用requests库 可以基本将接口自动化的代码搬过来 稍微修改即可 内部使用协程的模式 单机并发远超jmeter 第一步 安装 pip install locust 第二步 使用 创建一个locustf
  • semtic kityy数据集信息和工具可视化

    0 sem11 21的提交测试地址 https competitions codalab org competitions 24025 learn the details evaluation 1 数据集结构 instance是panopt
  • 模板全特化和偏特化

    模板特化就是告诉编译器我这有更好的实现 走我这边 能更快的执行 类模板特化分为全特化和偏特化 全特化就是对所有的模板类型给一个限定 偏特化只限定一部分 可分为个数偏 范围偏 具体如下代码 模板类 tempalte
  • CHECK TABLE语法--MySql数据库

    CHECK TABLE tbl name tbl name option option QUICK FAST MEDIUM EXTENDED CHANGED 检查一个或多个表是否有错误 CHECK TABLE对MyISAM和InnoDB表有
  • 正一派道家奇门遁甲排盘算法python程序

    正一派道家奇门遁甲排盘算法python程序程序 首先声明 这篇文章可能很快就会消失了 毕竟已经2020年了 还有很多人觉得奇门遁甲是 剪纸成人 撒豆成兵 的法术 其实奇门遁甲是一种符号预测学 这里我写了一个python程序来排盘 因为奇门遁
  • Moveit编程——moveit 编程技巧笔记——圆弧轨迹规划+修改轨迹

    moveit 编程技巧笔记 圆弧轨迹规划 修改轨迹 1 笛卡尔空间圆弧轨迹规划 2 轨迹重定义 修改moveit生成的轨迹数据 1 笛卡尔空间圆弧轨迹规划 之前学习过笛卡尔空间下轨迹规划API plan fraction arm compu