睿尔曼超轻量仿人机械臂之在ROS里引用正逆解函数库

一、机械臂运动学正逆解说明

机械臂运动学就是根据未端执行器与所选参考坐标系之间的几何关系,确定末端执行器的空间位置和姿态与各关节变量之间的数学关系。包括正运动学 (Forward Kinematics)和逆运动学 (Inverse  Kinematics)两部分。

机械臂运动分为关节空间运动和笛卡尔空间运动2种方式,2种运动方式分别对应机械臂运动学算法的正解和逆解,在不同的应用场景下可以使用不同的运动方式。

两种运动方式之间的不同可总结为以下几点:

  1. 表示方式不同。关节空间运动发给机械臂的是机械臂各个关节的角度,从而控制机械臂运动到某个位置;笛卡尔空间运动发给机械臂的是在笛卡尔空间种机械臂末端的位置和姿态(简称为位姿),目前大多数机械臂用来表达位姿使用(x,y,z,rx,ry,rz),其中姿态表达为欧拉角;
  2. 控制方式不同。在关节空间中,通过控制各个关节的角度实现控制机械臂运动;在笛卡尔空间中,通过控制机械臂末端的位置和姿态实现控制机械臂运动;
  3. 运动规划不同。关节空间运动规划是对每个关节进行规划,计算每个关节的插补点;笛卡尔空间运动规划是在笛卡尔空间规划末端轨迹,然后每个插补点再去逆解,计算对应的每个关节的角度。
  4. 控制自由度不同。使用笛卡尔空间运动时,机械臂可以由N个自由度组成,只需确保机械臂的末端到达所发位姿即可;关节空间运动时,需要根据机械臂的实际自由度发送相对应数量的关节角度;

 睿尔曼六轴机械臂关节运动可使用机械臂示教器、JSON协议、API等多种方式进行控制。

二、RM-65B ROS包架构简析

三、系统环境要求

经过睿尔曼测试的操作系统版本: Ubuntu 20.04

经过睿尔曼测试的ROS版本: ROS1 Noetic

未经过测试的操作系统版本与ROS版本,用户根据需求,可自行尝试可行性

四、在ROS里引用正逆解函数库

1、创建一个功能包或者进入现有ROS功能包,新建"include"以及"lib"文件夹(如果不存在)。

2、将API中提供的头文件复制到"include"文件夹,将"Linux"文件夹中的对应版本的so库文件复制到"lib"文件夹。

3、在ROS功能包中的CMakeLists.txt文件中,添加对引用库的依赖

include_directories(

   include

  ${catkin_INCLUDE_DIRS}

)

link_directories(

  ${catkin_LIB_DIRS} lib

)

4、编译功能包

5、引用头文件,在ROS代码中使用API库中的算法接口:

extern "C"{

#include "rm_base.h"

}

#include <math.h>

#include <ros/ros.h>

#include <rm_msgs/MoveJ.h>

#include <rm_msgs/MoveJ_P.h>

#include <rm_msgs/Plan_State.h>

using namespace std;

// 接收到订阅的机械臂执行状态消息后,会进入消息回调函数

void planStateCallback(const rm_msgs::Plan_State::ConstPtr& msg)

{

    // 将接收到的消息打印出来,显示机械臂是否完成运动

    if(msg->state)

    {

        ROS_INFO("*******Plan State OK");

    } else {

        ROS_INFO("*******Plan State Fail");

    }

}

int main(int argc, char **argv)

{

// 初始化ROS节点

    ros::init(argc, argv, "kinematics_demo");

    // 创建节点句柄

    ros::NodeHandle nh;

    

// 声明spinner对象,参数2表示并发线程数,默认处理全局Callback队列

    ros::AsyncSpinner spin(2);

    // 启动两个spinner线程并发执行可用回调

    spin.start();

    

    // 空间规划指令Publisher

    ros::Publisher moveJ_P_pub = nh.advertise<rm_msgs::MoveJ_P>("/rm_driver/MoveJ_P_Cmd", 10);

  

    // 订阅机械臂执行状态话题

     ros::Subscriber planState_sub = nh.subscribe("/rm_driver/Plan_State", 10, planStateCallback);

    

    //初始化

    int dmode = ARM_65;

    RobotType rbt_type = RM65B;

    Algo_Init_Sys_Data(dmode,rbt_type);

    //设置安装角度

    Algo_Set_Angle(-90,90,0);    

    ros::Duration(2.0).sleep();

//joint记录机械臂的目标角度

float joint[6] = {81.001717,104.540276,-104.602264,-158.27413,78.476189,77.162445};

    float q_out[6];

//调用运动学正解api,输入为目标位置关节角度,输出为目标位置机械比位姿(位置+欧拉角形式)

    Pose now = Algo_Forward_Kinematics(joint);

    ROS_INFO("Now Flange: %f, %f, %f, %f, %f, %f\n",now.position.x,now.position.y,now.position.z,now.quaternion.x,now.quaternion.y,now.quaternion.z,now.quaternion.w);

    ros::waitForShutdown();

    return 0;

}

// //将目标位姿通过moveJ_P发送给机械臂,控制机械臂运动到目标位姿

rm_msgs::MoveJ_P moveJ_P_target;

moveJ_P_target.Pose.position.x = now.position.x;

moveJ_P_target.Pose.position.y = now.position.y;

moveJ_P_target.Pose.position.z = now.position.z;

moveJ_P_target.Pose.orientation.x = now.quaternion.x;

moveJ_P_target.Pose.orientation.y = now.quaternion.y;

moveJ_P_target.Pose.orientation.z = now.quaternion.z;

    moveJ_P_target.Pose.orientation.w= now.quaternion.w;

moveJ_P_target.speed = 0.3;

   moveJ_P_pub.publish(moveJ_P_target);

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

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

相关文章

Unity 中画线

前言&#xff1a; 在Unity项目中&#xff0c;调试和可视化是开发过程中不可或缺的部分。其中&#xff0c;绘制线条是一种常见的手段&#xff0c;可以用于在Scene场景和Game视图中进行调试和展示。本篇博客将为你介绍多种不同的绘制线条方法&#xff0c;帮助你轻松应对各种调试…

数据可视化-ECharts Html项目实战(11)

在之前的文章中&#xff0c;我们学习了如何在ECharts中特殊图表的双y图以及自定义形状词云图。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 数据可视化-ECh…

Java数据结构二叉树

概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合&#xff1a; 1. 或者为空 2. 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。 从上图可以看出&#xff1a; 1. 二叉树不存在度大于2的结点 2. 二叉树的子树有左右之分&#xff0c;次序不能颠倒&#x…

医疗器械FDA | 常见的网络安全材料发补问题都有哪些?

FDA网络安全资料发补咨询点此​​获取https://work.weixin.qq.com/ca/cawcde5ee29d239046 ————————--- 01 安全文档编写问题 FDA网络安全文档编写格式、内容、可读性等未满足官方要求&#xff0c;则将可能被要求发补整改编写后的文档。 02 安全管理问题 a. 网络安…

【机器学习】K-means聚类算法:原理、应用与优化

一、引言 1、简述聚类分析的重要性及其在机器学习中的应用 聚类分析&#xff0c;作为机器学习领域中的一种无监督学习方法&#xff0c;在数据探索与知识发现过程中扮演着举足轻重的角色。它能够在没有先验知识或标签信息的情况下&#xff0c;通过挖掘数据中的内在结构和规律&a…

深度学习学习日记4.7

1.梯度下降 w 新 w旧 - 学习率梯度 训练的目的就是让 loss 减小 2.前向传播进行预测&#xff0c; 反向传播进行训练(每一个参数通过梯度下降进行更新参数)&#xff0c;(1前向传播 2求 loss 3反向传播 4梯度更新) 能够让损失下降的参数&#xff0c;就是更好的参数。 损失…

数据分析-数据清洗8大类方法|数据采集|电商数据API接口

数据分析首先我们需要坐数据采集 jd API 接入说明 API地址: 调用示例&#xff1a; 参数说明 通用参数说明 url说明 ……/平台/API类型/ 平台&#xff1a;淘宝&#xff0c;京东等&#xff0c; API类型:[item_search,item_get,item_search_shop等]version:API版本key:调用key,…

阿里云微调chatglm3-6b---只有一个python解释器但gradio要求版本不兼容怎么办

安装LLAMA参考博文http://t.csdnimg.cn/6yYwG 在用LLAMA微调大模型的时候总是出现connected error out并且出现这样的界面 这是由于LLMA所要求的gradio版本>4.0.0,<4.2.0&#xff0c;然而chatglm3-6b要求的gradio版本需要gradio3.39.0才能显示出web_demo_gradio.py渲染…

C++反向迭代器的实现

一、反向迭代器的定义 在容器中从尾元素向首元素反向移动的迭代器 对于反向迭代器&#xff0c;递增和递减的含义会颠倒过来 递增一个反向迭代器会移动到前一个元素 递减一个迭代器会移动到下一个元素 二、反向迭代器的实现 // 适配器 -- 复用 template<class Iterator,…

Weblogic任意文件上传漏洞(CVE-2018-2894)漏洞复现(基于vulhub)

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

数据库安全(二),3天拿到网易网络安全岗offer

数据脱敏厂家 国外&#xff1a;Informatica国内&#xff1a;比特信安、美创、安华、神州数码 由于敏感数据的重要性以及特殊性&#xff0c;一般不建议使用国外产品。 数据库漏扫 又叫数据库安全评估系统 漏扫对象 DBMS脆弱点&#xff1a;已知的DBMS自身存在的漏洞弱口令缺…

力扣HOT100 - 160. 相交链表

解题思路&#xff1a; /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if…

笔记本会不会自动升级win11,win10会自动升级到win11吗

众所周知,win11是微软新推出的pc端操作系统,从发布到现在也有一年的时间了,不少用户想要安装使用。但是问题来了,笔记本会不会自动升级win11呢?答案是,并不会自动更新,如果你是正版win10系统,可以通过收到的升级通知进行升级win11。 win10会自动升级到win11吗 升级win1…

批量修改文件名后缀,支持自定义重命名并更改扩展名,高效管理文件

你是否曾经因为需要修改大量文件的扩展名而头疼不已&#xff1f;手动一个个修改&#xff0c;既耗时又容易出错。现在&#xff0c;有了这款批量修改文件名后缀的神器&#xff0c;只需一键操作&#xff0c;即可轻松完成所有文件的扩展名修改。无论是图片、文档、视频还是音频&…

关于QEMU模拟器本身以及和CXL功能模拟相关内容的学习

前言&#xff1a;在写Paper的时候&#xff0c;发现直接引用QEMU官网关于QEMU的介绍实在是一个图省事儿的方法&#xff0c;但是并不可取。即使是一小段&#xff0c;也要去真正了解QEMU的基本原理&#xff0c;如何实现功能模拟&#xff0c;以及目前实现的与CXL相关的内容。 注&am…

成功的环保企业:四大核心能力的深度剖析|中联环保圈

在追求可持续发展的道路上&#xff0c;环保企业不仅承载着社会责任&#xff0c;还要面对市场的考验。为了在激烈的竞争中脱颖而出&#xff0c;环保企业需要练就四大基本功&#xff1a;挣钱、要钱、省钱和花钱。这四大能力相互关联&#xff0c;共同构成了企业稳健运营的基石&…

Web 前端性能优化之七:数据存储与缓存技术

7、数据存储 在开发Web应用的过程中&#xff0c;会涉及一些数据的存储需求&#xff0c;常见的存储方式可能有&#xff1a; 保存登录态的Cookie&#xff1b; 使用浏览器本地存储进行保存的Local Storage和Session Storage&#xff1b; 客户端数据持久化存储方案涉及的Web SQ…

关于MCU产品开发参数存储的几种方案

关于MCU产品开发参数存储的几种方案 Chapter1 关于MCU产品开发参数存储的几种方案Chapter2 单片机参数处理[保存与读取]Chapter3 嵌入式设备参数存储技巧Chapter4 STM32硬件I2C的一点心得(AT24C32C和AT24C64C) Chapter1 关于MCU产品开发参数存储的几种方案 原文链接 在工作中…

【随笔】Git 高级篇 -- 纠缠不清的分支 rebase | cherry-pick(二十四)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

位图布隆过滤器的原理及实现

目录 位图的概念&#xff1a; 位图的前置知识&#xff1a;位运算 位图的实现&#xff1a; 位图的基本参数和构造方法&#xff1a; 位图的插入&#xff1a; 位图的查找&#xff1a; 位图的删除&#xff1a; 布隆过滤器概念&#xff1a; 布隆过滤器的实现&#xff1a; …