ROS 机械臂通过Pinocchio逆解直接控制关节位置仿真
配置机械臂Ref: link注意如果只是仿真的话需要配置使用gazebo参数Pinocchiopythoncondainstallpinocchio-cconda-forgepythoncsudoaptinstall-qqylsb-releasecurlsudomkdir-p/etc/apt/keyringscurlhttp://robotpkg.openrobots.org/packages/debian/robotpkg.asc\|sudotee/etc/apt/keyrings/robotpkg.ascechodeb [archamd64 signed-by/etc/apt/keyrings/robotpkg.asc] http://robotpkg.openrobots.org/packages/debian/pub$(lsb_release-cs)robotpkg\|sudotee/etc/apt/sources.list.d/robotpkg.listsudoaptupdatesudoaptinstall-qqyrobotpkg-py3*-pinocchioAdd env varible to ~/.bashrcexportPATH/opt/openrobots/bin:$PATHexportPKG_CONFIG_PATH/opt/openrobots/lib/pkgconfig:$PKG_CONFIG_PATHexportLD_LIBRARY_PATH/opt/openrobots/lib:$LD_LIBRARY_PATHexportPYTHONPATH/opt/openrobots/lib/python3.8/site-packages:$PYTHONPATH# Adapt your desired python version hereexportCMAKE_PREFIX_PATH/opt/openrobots:$CMAKE_PREFIX_PATHref: pinocchio installation确定关节位置接口这里关注controller配置:controllers_gazebocontroller_manager_ns:controller_managercontroller_list:-name:arm/arm_joint_controlleraction_ns:follow_joint_trajectorytype:FollowJointTrajectorydefault:truejoints:-joint1-joint2-joint3-joint4-joint5-joint6-joint7那么可以确定动作接口为arm/arm_joint_controller/follow_joint_trajectory对应代码中的self.client actionlib.SimpleActionClient(/arm/arm_joint_controller/follow_joint_trajectory, FollowJointTrajectoryAction)这里还和大家说一声, 有些关节控制采用类似如下形式:rrbot:# Publish all joint states -----------------------------------joint_state_controller:type:joint_state_controller/JointStateControllerpublish_rate:50# Position Controllers ---------------------------------------joint1_position_controller:type:effort_controllers/JointPositionControllerjoint:joint1pid:{p:100.0,i:0.01,d:10.0}joint2_position_controller:type:effort_controllers/JointPositionControllerjoint:joint2pid:{p:100.0,i:0.01,d:10.0}那么在控制接口上需要进行修改可以直接话题控制,参考https://blog.csdn.net/huangjunsheng123/article/details/108393690数值优化逆解下图展示了数值优化逆解算法的迭代求解流程是否开始初始配置将目标位姿与初始关节角转换为 SE3 与 q迭代求解正向运动学计算当前 q 对应的末端位姿 oMi位姿误差计算dM target_pose⁻¹ · oMi对数映射err log(dM).vector收敛判断norm(err) eps ?收敛成功返回 True, qJacobian 计算J ∂oM/∂q更新关节配置v -Jᵀ(JJᵀ damp·I)⁻¹ errq integrate(q, v·DT)结束defgetIk(self,target_pos:np.ndarray,target_orientation:np.ndarray,joint_seed:np.ndarray,ik_weight:np.ndarrayNone):Computes the inverse kinematics for a given target pose.ifnotisinstance(target_pos,np.ndarray)\ortarget_pos.shape!(3,):raiseValueError(target_pose must be a 1x3 numpy array)ifnotisinstance(target_orientation,np.ndarray)\ortarget_orientation.shape!(4,):raiseValueError(target_orientation must be a 1x4 numpy array)ifnotisinstance(joint_seed,np.ndarray):raiseValueError(joint_seed must be of type np.ndarray)target_pose_SE3pinocchio.SE3(pinocchio.Quaternion(target_orientation),target_pos)# q deepcopy(joint_seed).astype(np.float64)qnp.copy(joint_seed).astype(np.float64)foriinrange(self.IT_MAX):pinocchio.forwardKinematics(self.model,self.model_data,q)end_poseself.model_data.oMi[self.end_joint_id]error_posetarget_pose_SE3.actInv(end_pose)# T_sd*T_sb^(-1)errpinocchio.log(error_pose).vector# transform rotation to rotate vector by Rodrigues’ rotation formulaifnorm(err)self.eps:qself.qpos_to_limits(q,self.model.upperPositionLimit,self.model.lowerPositionLimit,joint_seed,ik_weight)ifself.is_log:print(Convergence iteration )print(Pin:{} error {}!.format(i,err.T))self.getFk(q)returnTrue,q Jpinocchio.computeJointJacobian(self.model,self.model_data,q,self.end_joint_id)v_e-solve(J.dot(J.T)self.damp*np.eye(6),err)#Levenberg-MarquardtLMv_jJ.T.dot(v_e)# map to joint spaceqpinocchio.integrate(self.model,q,v_j*self.DT)# delta q_k1 q_k \delta qifnoti%10andself.is_log:print(Pin:{} error {}!.format(i,err.T))print(Pin:The iterative algorithm has not reached convergence to the desired precision)returnFalse,q初始配置将初始位姿转换se3,为什么要做这一步呢这是希望将误差变换矩阵映射到​​李代数空间​​而李代数提供​​可微的旋转误差表示​​。注意这个向量是6维的位置差和3维轴角2个轴方向参数1个角度参数描述的旋转误差。迭代求解:正向运动学: 计算当前关节配置 ( q ) 的正向运动学得到末端执行器的位置和方向。位姿误差计算:d M i target_pose − 1 ⋅ o M i dM_i \text{target\_pose}^{-1} \cdot oMidMi​target_pose−1⋅oMi其中 ( oMi ) 是当前配置的末端位姿( dM_i ) 是位姿的误差。对数映射: 计算 ( dM_i ) 的对数映射得到位置误差e r r log ( d M i ) err \text{log}(dM_i)errlog(dMi​)收敛判断: 如果error误差小于阈值eps认为已经收敛。Jacobian 和速度计算:Jacobian计算:J ∂ o M ∂ q Jacobian matrix J \frac{\partial oM}{\partial q} \quad \text{Jacobian matrix}J∂q∂oM​Jacobian matrix更新关节配置:v − J T ( J J T damp ⋅ I ) − 1 e r r v - J^T (J J^T \text{damp} \cdot I)^{-1} errv−JT(JJTdamp⋅I)−1err用( v ) ( v )(v)和时间步长( D T ) ( DT )(DT)更新关节位置q integrate ( q , v ⋅ D T ) q \text{integrate}(q, v \cdot DT)qintegrate(q,v⋅DT)这里可以参考现代机器人学第六章数值求解部分, 不过这里的数值优化方法采用的是 LM方法Levenberg-Marquardt 最小二乘优化运行roslaunch rm_gazebo arm_75_bringup_moveit.launchsourcedevel/setup.bash# or setup.zshrosrun inv_pino.py开源代码在这里如果有帮助的话,给个星吧Refhttps://blog.csdn.net/weixin_39284111/article/details/141307019https://zhuanlan.zhihu.com/p/42415718https://blog.csdn.net/huangjunsheng123/article/details/108393690

相关新闻

Unity ECS 1.3.0实战:从OOP到数据导向的性能革命

Unity ECS 1.3.0实战:从OOP到数据导向的性能革命

1. 项目概述:为什么Unity ECS值得你投入时间?如果你是一位Unity开发者,尤其是对性能有极致追求,或者正在被传统面向对象编程(OOP)模式下的复杂对象管理、GC(垃圾回收)卡顿所困扰&…

2026/10/17 8:40:41 阅读更多 →
Prisma与TypeORM的对比以及在Nest.js中的优劣点分析

Prisma与TypeORM的对比以及在Nest.js中的优劣点分析

Prisma 介绍 Prisma 是一个现代化的 ORM(对象关系映射工具),旨在简化数据库交互并提高开发效率。它支持多种数据库(如 PostgreSQL、MySQL、SQLite 等),提供了一个类型安全的 API,使得在 TypeScr…

2026/10/18 8:05:35 阅读更多 →
MTK Bypass Utility深度解析:高级Bootrom保护绕过技术实战指南

MTK Bypass Utility深度解析:高级Bootrom保护绕过技术实战指南

MTK Bypass Utility深度解析:高级Bootrom保护绕过技术实战指南 【免费下载链接】bypass_utility 项目地址: https://gitcode.com/gh_mirrors/by/bypass_utility MTK Bypass Utility是一款专为MediaTek芯片设备设计的开源解锁工具,通过精密的硬件…

2026/10/18 8:05:51 阅读更多 →

最新新闻

Flutter for OpenHarmony幸运大转盘数据统计模块实现

Flutter for OpenHarmony幸运大转盘数据统计模块实现

幸运大转盘系列写到这里,前面九篇已经把页面结构、转盘动画、抽奖算法、奖品库存、历史记录都串起来了。说实话,我自己把整个流程跑通的时候,第一反应是“终于像个完整 App 了”,但紧接着就会发现一个被忽略的问题:到底…

2026/10/19 14:43:16 阅读更多 →
LabVIEW连接泰克示波器:VISA与SCPI编程实战指南

LabVIEW连接泰克示波器:VISA与SCPI编程实战指南

简介:这份 LabVIEW 连接泰克示波器范例,面向从事电子测试与信号分析、希望用 LabVIEW 远程控制示波器并实现自动化测量的工程师,适用于从基础功能连接到批量自动化测试的进阶场景。压缩包共包含166个文件,以153个 vi 程序文件为核…

2026/10/19 14:43:16 阅读更多 →
GSWOA优化Elman网络:多输入单输出预测的精度与稳定性提升

GSWOA优化Elman网络:多输入单输出预测的精度与稳定性提升

前几天帮一位做设备状态监测的同事看了组数据:一堆传感器读数、环境变量在前面排着,后面只有一列要预测的目标值。他试过线性回归,效果惨不忍睹;又试了BP神经网络,好了一些,但每次换随机种子结果就飘得厉害…

2026/10/19 14:43:16 阅读更多 →
Artcraft:手工艺数字化的三层翻译方法论

Artcraft:手工艺数字化的三层翻译方法论

1. “Artcraft”不是新词,而是被长期误读的设计实践范式“Artcraft”这个词最近突然在设计类社区、创意工作坊和高校课程大纲里高频出现,但翻遍主流设计史文献、权威术语词典甚至近十年的国际设计期刊索引,都找不到它作为独立概念的明确定义。…

2026/10/19 14:43:16 阅读更多 →
基于MySQL的人脸识别考勤系统设计与关键实现

基于MySQL的人脸识别考勤系统设计与关键实现

1. 为什么要自己动手做一套人脸识别考勤系统 先说个真实的痛点。某小型团队之前用的是那种指纹打卡机,一到冬天干燥季节,手指脱皮、静电干扰,一堆人打不上卡;后来换成刷卡,又有人忘带卡、代刷,月底对考勤记…

2026/10/19 14:43:16 阅读更多 →
国产卫星定标系数与光谱响应函数:从DN值到辐亮度的关键处理

国产卫星定标系数与光谱响应函数:从DN值到辐亮度的关键处理

简介:面向遥感数据处理、地理信息系统与地球观测应用开发者,这份数据包系统整理了高分系列(GF-1、GF-2、GF-4、GF-6)与资源系列(ZY-3、ZY-1 02C)等国产卫星的辐射定标系数和光谱响应函数,并提供…

2026/10/19 14:42:10 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →