机器人学基础——正运动学(理论推导及c++实现)
机器人正运动学
机器人正运动学一般是指从机器人的关节位置到基于参考坐标系下末端执行器的位置。
平移变换和旋转变换
平移变换
假设我们有两个坐标系A和B,坐标系A与B的方位相同,xyz轴的指向都是一致的,即没有旋转变换。有一点p,则在A坐标系下从A坐标原点到p的位置矢量即为在B坐标系下p的位置矢量加上在A坐标系下B原点的位置矢量,公式如下
旋转变换
类似上述平移变换,我们假设坐标系A与坐标系B没有平移变换及原点位置一致,只有方位上的变换。如下
这个坐标系A和坐标系B原点一致并且在方位上不同,可以看成将坐标系A经过某个旋转变换进程为了B坐标系的方位。我们将这个变换的过程记为
上标为参考坐标系,这个变换也可以解释为B坐标系在A坐标系下的方位
复合变换
当两个坐标系之间的关系坐标原点没有重合方位也不是一致的时候我们该怎么描述这个变换过程呢?
当坐标系A与B无法使用单独的平移变换或者单独的旋转变换来描述时,我们可以将这个过程看作是先经过平移后经过旋转或者先经过旋转再经过平移来描述。由于这个过程都是的参考系都是A坐标系即参考坐标系是固定的,所以先平移还是先旋转是没有区别的。
假设有一点p,在A坐标系下位置是,在B坐标系下的描述为
,从坐标系A到B的旋转变换为
,坐标系A到B的平移变换为
A到B的平移变换即为平移变换部分讲的在A坐标系下B的坐标原点的矢量。那么具有下面这个关系
数学描述
对平移变换和旋转的概念大致有了一个了解,那么具体应该应该怎么计算呢?不管是平移变换还是旋转变换我们都可以使用矩阵来描述这个过程。
平移矩阵
我们知道在三维空间中描述点或者矢量可以用x,y,z三个量来表达和描述。
而平移变换的本质上即为从坐标系A(参考坐标系)原点到坐标系B(目标坐标系)原点的一个矢量,所以平移矩阵的数学表达可以这样表示
[x,y,z],即为在A坐标系下B坐标系原点的位置
旋转矩阵
坐标系经过旋转变换之后,相对应的点的位置描述也要被改变,那么要怎么使用数学语言来描述这个变换呢
我们可以将从坐标系A到坐标系B的旋转变换分解为绕A(参考坐标系)系的X轴旋转α°,绕Y轴旋转β°,转z轴旋转γ°,三种基本的旋转,其他都可以看作是这三种基础旋转的叠加旋转。
使用矩阵来表示这三种旋转方式
绕x转α°:
绕y轴旋转:
绕z轴旋转
c++实现
根据以上基础理论我们大致了解了机器人正运动学中基础的旋转变换和平移变换,接下来我们就可以使用这些来进行机器人正解我们使用c++来完成这个过程,假设我们有一个urdf模型,那么第一步我们需要对这个模型进行解析
导入解析urdf模型
打开一个终端,进入之前下载的frank机械臂的工作空间内,我们新创建一个功能包frank_fk,用来表示正运动学求解的功能包
~/franka/src/franka_ros$ catkin_create_pkg franka_fk rospy roscpp std_msgs
我们新建一个cpp
~/franka/src/franka_ros/franka_fk/src$ touch frank_fk.cpp
~/franka/src/franka_ros/franka_fk/include/franka_fk$ touch frank_fk.h
在panda机器人里面使用的是.urdf.xacore文件,我们需要对这个文件进行预处理变成urdf格式的文件才可以使用c++的接口对其进行读取解析
使用终端命令行将这个.urdf.xacore转换成urdf格式的文件
cd franka/
source ./devel/setup.bash
rosrun xacro xacro src/franka_ros/franka_description/robots/panda/panda.urdf.xacro > panda.urdf
可以看到在franka下生成了一个panda.urdf文件,我们将它移动到panda.urdf.xacore路径下
使用vscode打开刚才创建的frank_fk
键入以下代码
franka_fk.h
#include <eigen3/Eigen/Dense>
#include <urdf/model.h>
#include <string>
#include <fstream>
#include <sstream>
#include <stdexcept>
#include <cstdlib>
#include <map>class ROBOTFK
{
public:int Readmodel(std::string modelpath);Eigen::Matrix4d GetEndPos(std::map<std::string,double> jointname);
private:Eigen::Matrix3d GetJointpos();urdf::Model pdmodel;};
franka_fk.cpp
#include <iostream>
#include <urdf_model/model.h>
#include <frank_fk.h>
#include <ros/ros.h>
int ROBOTFK::Readmodel(const std::string modelpath)
{int a = pdmodel.initFile(modelpath);std::cout << "Robot Name: " << pdmodel.getName() << std::endl;return a;
}
bool fileExists(const std::string& path) {std::ifstream file(path);return file.good();
}
int main()
{ROBOTFK robotfk;int success = robotfk.Readmodel("src/franka_ros/franka_description/robots/panda/panda.urdf");return 0;
}
cmakelistcmake_minimum_required(VERSION 3.0.2)
project(franka_fk)#add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTSroscpprospyurdfstd_msgs
)catkin_package(INCLUDE_DIRS include/franka_fk
)include_directories(include/franka_fk${catkin_INCLUDE_DIRS}
)${catkin_EXPORTED_TARGETS})add_executable(main src/frank_fk.cpp)target_link_libraries(main${catkin_LIBRARIES}
)
可以使用这个cpp暂时来进行urdf模型文件的读取,查看是否可以读取到正确的文件,接下来来进行一个简单的编译和运行
catkin_make
source ./devel/setup.bash
rosrun franka_fk main
可以看到运行结果是这样的
Robot Name: panda
这说明已经检测到正确的urdf文件并且读取出来我们的机器人名称为:panda
单关节旋转矩阵的计算
接下来我们对机器人单关节的变换矩阵进行c++的实现,需要从urdf模型中获取到我门制定关节对应的旋转轴(旋转类型)和相对上一关节位置的位移量,所以我们对Eigen::Matrix3d GetJointpos();这个函数进行填充
后面会补充…
相关文章:

机器人学基础——正运动学(理论推导及c++实现)
机器人正运动学 机器人正运动学一般是指从机器人的关节位置到基于参考坐标系下末端执行器的位置。 平移变换和旋转变换 平移变换 假设我们有两个坐标系A和B,坐标系A与B的方位相同,xyz轴的指向都是一致的,即没有旋转变换。有一点p…...

[网页五子棋][对战模块]处理连接成功,通知玩家就绪,逻辑问题(线程安全,先手判定错误)
文章目录 处理连接成功通知玩家就绪逻辑图问题 1:线程安全问题 2:先手判定错误两边都是提示:轮到对方落子 处理连接成功 实现 GameAPI 的 afterC…...
TensorFlow Extended (TFX) 生产环境模型版本控制与回滚实战指南
TFX 版本控制核心架构 TFX 通过以下组件构建完整的模型生命周期管理系统: ML Metadata (MLMD):记录所有实验和管道的元数据Pusher 组件:负责模型部署与版本标记Model Registry:集中式模型存储库&#x…...

【Web应用】若依框架:基础篇11功能详解-系统接口
文章目录 ⭐前言⭐一、课程讲解⭐二、自己动手实操⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈(,NET/Java/Python/C)、数据库、操作系统、大数据、人工智能、工控、网络、…...

【Docker项目实战篇】Docker部署PDF查看器PdfDing
【Docker项目实战篇】Docker部署PDD查看器PdfDing 一、PdfDing介绍1.1 PdfDing简介1.2 PdfDing主要特点1.3 主要使用场景 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Pd…...
Redis 常用数据类型和命令使用
目录 1 string 2 hash 3 list 4 set集合 5 zset有序集合 1 string 值可以是字符串、数字和二进制的value,值最大不能超过512MB 应用场景: 应用程序缓存 计数器 web共享session 限速 1.1 设置单个键值 set <key> value [EX seconds|PX…...

【Linux系统】第八节—进程概念(上)—冯诺依曼体系结构+操作系统+进程及进程状态+僵尸进程—详解!
hi,我是云边有个稻草人 偶尔中二的博主^(* ̄(oo) ̄)^,与你分享专业知识,祝博主们端午节快乐! Linux—本节博客所属专栏—持续更新中—欢迎订阅! 目录 一、冯诺依曼体系结构 二、操作系统(Opera…...
WPF 全局加载界面、多界面实现渐变过渡效果
WPF 全局加载界面与渐变过渡效果 完整实现方案 MainWindow.xaml <Window x:Class"LoadingScreenDemo.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml&quo…...
WebSocket与实时对话式AI服务的集成
WebSocket与实时对话式AI服务的集成 在现代对话式AI系统中,传统的HTTP请求-响应模型已难以满足实时交互的体验需求。特别是用户对响应速度、逐字输出、会话上下文保持等方面提出更高要求时,需要一种能够建立持久连接并支持双向通信的协议。WebSocket正是在这一背景下,成为A…...
【xmb】】内部文档148344599
这里写自定义目录标题 CyberDog 2 仿真智能物流配送系统 – 初赛设计报告摘要目录1 引言2 任务与需求分析3 系统总体设计4 核心算法与模块实现5 仿真测试与结果分析6 结论与展望 CyberDog 2 仿真智能物流配送系统 – 初赛设计报告 团队名称: (晚点写&am…...
MobaXterm国内下载与安装使用教程
MobaXterm是一款为 Windows 用户量身打造的远程终端工具,它将多种网络功能集成在一个轻量级、便携式的界面中,尤其适合需要频繁与远程主机交互的开发者、系统运维工程师以及科研技术人员。无论是管理 Linux 服务器、远程执行命令,还是图形化运…...

数据结构——优先级队列(PriorityQueue)
1.优先级队列 优先级队列可以看作队列的另一个版本,队列的返回元素是由是由插入顺序决定的,先进先出嘛,但是有时我们可能想要返回优先级较高的元素,比如最大值?这种场景下就由优先级队列登场。 优先级队列底层是由堆实…...

代谢组数据分析(二十六):LC-MS/MS代谢组学和脂质组学数据的分析流程
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包依赖包安装包加载需要的R包数据下载以及转换mzML数据预处理代谢物注释LipidFinder过滤MultiABLER数据预处理过滤补缺失值对数变换数据标准化下游数据分析总结系统信息参考介…...
服务器上用脚本跑python深度学习的注意事项(ubantu系统)
bash: $\r: command not found 问题原因: 出现 bash: $\r: command not found 以及路径中出现 \r 通常是因为脚本文件是在Windows系统下编辑,然后在Linux(如Ubuntu)系统中运行。在Windows系统中,文本文件的换行符是 \…...

【ARM】【FPGA】【硬件开发】Chapter.1 AXI4总线协议
Chapter.1 AXI4总线协议 作者:齐花Guyc(CAUC) 一、总线介绍 AXI4总线 AXI4总线就像是SoC内部的“高速公路”,负责在不同硬件模块之间高效传输数据。 AXI4协议通过 5个独立通道 传输数据和控制信号,每个通道都有自己的信号线,互…...
青少年编程与数学 02-020 C#程序设计基础 10课题、桌面应用开发
青少年编程与数学 02-020 C#程序设计基础 10课题、桌面应用开发 一、桌面应用1. 主要特点2. 常见类型3. 优势4. 局限性 二、开发步骤1. 准备工作2. 创建项目3. 开发应用4. 运行调试5. 打包发布 三、Windows 窗体应用(一)定义(二)特…...

把 jar 打包成 exe
1. 把自己的项目先正常打成jar包 2. 使用exe4j工具将jar转换为exe 2.1 exe4j下载地址:https://www.ej-technologies.com/download/exe4j/files 2.2 下载完成之后激活 2.3 可以点击Change License,输入秘钥L-g782dn2d-1f1yqxx1rv1sqd 2.4 直接下一步…...

【目标检测】检测网络中neck的核心作用
1. neck最主要的作用就是特征融合,融合就是将具有不同大小感受野的特征图进行了耦合,从而增强了特征图的表达能力。 2. neck决定了head的数量,进而潜在决定了不同尺度样本如何分配到不同的head,这一点可以看做是将整个网络的多尺…...

【经验】Ubuntu中设置terminator的滚动行数、从Virtualbox复制到Windows时每行后多一空行
1、设置terminator的滚动行数 1.1 问题描述 在终端 terminator 中,调试程序时,只能查看有限行数的打印日志,大约是500行,怎么能增加行数 1.2 解决方法 1)安装terminator sudo apt install terminator和 terminato…...

使用微软最近开源的WSL在Windows上优雅的运行Linux
install wsl https://github.com/microsoft/WSL/releases/download/2.4.13/wsl.2.4.13.0.x64.msi install any distribution from microsoft store, such as kali-linux from Kali office website list of distribution PS C:\Users\50240> wsl -l -o 以下是可安装的有…...

HackMyVM-Teacher
信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-01 01:02 EDT Nmap scan report for 192.168.43.1 Host is up (0.0084s latency). MAC Address: C6:45:66:05:91:88 (Unknow…...

BugKu Web渗透之矛盾
开启场景,打开网页。发现是一段php代码。 这段代码也很好理解,就是get方式传参num,如果num不是数字类型,那么输出num的值,并且num1时,输出flag的值。 首先看看is_numeric的意思。 开始我想到了使用科学技术…...
hot100 -- 4.子串系列
1.和为 K 的子数组 问题: 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 方法1:暴力枚举 # 方法1:暴力枚举(遍历子数组起点和终点&…...

Python实现P-PSO优化算法优化卷积神经网络CNN回归模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着人工智能和深度学习技术的快速发展,卷积神经网络(CNN)在图像分类、目标检测…...

ssm 学习笔记day03
环境搭建 spring配置数据库 1.在pom.xml安装相应的依赖 2.在properties里面配置数据库的相关信息,需要强调的一点是,一定不要在properties里面添加任何空格,否则就会像我一样搞了两小时,数据一直报错,然后发现是空格的…...

mkdir: cannot create directory ‘gitlab-stu’: No space left on device
Linux中创建目录时报错“mkdir: cannot create directory ‘gitlab-stu’: No space left on device”,磁盘空间不足。 使用df命令查看,发现 / 下面use%占满了: 查看inode使用情况: 可以看到docker的数据大部分存放在/var/lib/do…...
【前端面经】云智慧一面
写在前面:面经只是记录博主遇到的题目。每题的答案在编写文档的时候已经有问过deepseek,它只是一种比较普世的答案,要学得深入还是靠自己 Q:手撕代码,两个有序数组排序 A: function mysort(arr1, arr2) {…...

ESP8285乐鑫SOCwifi芯片32bit MCU和2.4 GHz Wi-Fi
简介 ESP8285 拥有完整的且⾃成体系的 Wi-Fi ⽹络功能,既能够独⽴应⽤,也可以作为从机搭载于其他主机 MCU 运⾏。当 ESP8285 独⽴应⽤时,能够直接从外接 flash 中启动。内置的⾼速缓冲存储器有利于提⾼系统性能,并且优化存储系统。…...

DL00916-基于深度学习的金枪鱼各类别目标检测含完整数据集
文末有获取方式 🚀 基于深度学习的金枪鱼目标检测——开创智能识别新领域! 在计算机视觉和深度学习的快速发展中,目标检测 技术已成为提升行业效率的核心利器。而对于海洋生物领域,尤其是金枪鱼的 目标检测,更是填补了…...

不可变集合类型转换异常
记录一个异常:class java.util.ImmutableCollections$ListN cannot be cast to class java.util.ArrayList (java.util.ImmutableCollections$ListN and java.util.ArrayList 文章目录 1、原因2、解决方式一3、解决方式二4、关于不可变集合的补充4.1 JDK8和9的对比4…...