当前位置: 首页 > news >正文

ROS 机械臂通过Pinocchio逆解直接控制关节位置仿真

配置

机械臂

Ref: link
注意如果只是仿真的话需要配置使用gazebo参数

Pinocchio

python

condainstallpinocchio-cconda-forge

python&&c++

sudoaptinstall-qqylsb-releasecurlsudomkdir-p/etc/apt/keyringscurlhttp://robotpkg.openrobots.org/packages/debian/robotpkg.asc\|sudotee/etc/apt/keyrings/robotpkg.ascecho"deb [arch=amd64 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*-pinocchio

Add env varible to ~/.bashrc

exportPATH=/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_PATH

ref: pinocchio installation

确定关节位置接口

这里关注controller配置:
controllers_gazebo

controller_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, q

Jacobian 计算
J = ∂oM/∂q

更新关节配置
v = -Jᵀ(JJᵀ + damp·I)⁻¹ err
q = integrate(q, v·DT)

结束

defgetIk(self,target_pos:np.ndarray,target_orientation:np.ndarray,joint_seed:np.ndarray,ik_weight:np.ndarray=None):"""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_SE3=pinocchio.SE3(pinocchio.Quaternion(target_orientation),target_pos)# q = deepcopy(joint_seed).astype(np.float64)q=np.copy(joint_seed).astype(np.float64)foriinrange(self.IT_MAX):pinocchio.forwardKinematics(self.model,self.model_data,q)end_pose=self.model_data.oMi[self.end_joint_id]error_pose=target_pose_SE3.actInv(end_pose)# T_sd*T_sb^(-1)err=pinocchio.log(error_pose).vector# transform rotation to rotate vector by Rodrigues’ rotation formulaifnorm(err)<self.eps:q=self.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 J=pinocchio.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-Marquardt(LM)v_j=J.T.dot(v_e)# map to joint spaceq=pinocchio.integrate(self.model,q,v_j*self.DT)# delta q_k+1 =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
  1. 初始配置
    将初始位姿转换se3,为什么要做这一步呢?这是希望将误差变换矩阵映射到​​李代数空间​​,而李代数提供​​可微的旋转误差表示​​。注意这个向量是6维的,位置差和3维轴角(2个轴方向参数+1个角度参数)描述的旋转误差。

  2. 迭代求解:

    • 正向运动学: 计算当前关节配置 ( q ) 的正向运动学,得到末端执行器的位置和方向。

    • 位姿误差计算:

      d M i = target_pose − 1 ⋅ o M i dM_i = \text{target\_pose}^{-1} \cdot oMidMi=target_pose1oMi

      其中 ( oMi ) 是当前配置的末端位姿,( dM_i ) 是位姿的误差。

    • 对数映射: 计算 ( dM_i ) 的对数映射,得到位置误差:

      e r r = log ( d M i ) err = \text{log}(dM_i)err=log(dMi)

  3. 收敛判断: 如果error误差小于阈值eps,认为已经收敛。

  4. Jacobian 和速度计算:

    • Jacobian计算:

      J = ∂ o M ∂ q (Jacobian matrix) J = \frac{\partial oM}{\partial q} \quad \text{(Jacobian matrix)}J=qoMJacobian 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(JJT+dampI)1err

    • ( v ) ( v )(v)和时间步长( D T ) ( DT )(DT)更新关节位置:

      q = integrate ( q , v ⋅ D T ) q = \text{integrate}(q, v \cdot DT)q=integrate(q,vDT)

这里可以参考现代机器人学第六章数值求解部分, 不过这里的数值优化方法采用的是 LM方法

Levenberg-Marquardt 最小二乘优化

运行

roslaunch rm_gazebo arm_75_bringup_moveit.launch
sourcedevel/setup.bash# or setup.zshrosrun inv_pino.py

开源代码在这里
如果有帮助的话,给个星吧

Ref

https://blog.csdn.net/weixin_39284111/article/details/141307019
https://zhuanlan.zhihu.com/p/42415718
https://blog.csdn.net/huangjunsheng123/article/details/108393690

http://www.jsqmd.com/news/1328796/

相关文章:

  • SmudgeKit使用误区与解决方案:新手必看的避坑指南
  • 2026东莞衣柜橱柜定制避坑标准|靠谱工厂榜+完整价格表 - 优企甄选
  • 口碑好的陪玩管理系统公司有哪些开发,功能规划、架构设计与源码实现解析
  • QT dump文件分析——定位不到源码位置
  • 终极指南:如何用Palworld存档工具解决3个常见游戏问题
  • 2026年澳洲留学哪家咨询服务好:五家优选深度解析 - 科技焦点
  • 2026南通酒店宾馆布草实力厂家:沙漠船纺织品全维度解析 - 卓企推荐
  • h264 extradata解析,提取参数集SPS/PPS
  • 如何快速掌握AKShare:面向金融数据获取的完整指南
  • 3分钟快速上手:Wand-Enhancer终极指南,免费解锁WeMod全部高级功能
  • TQVaultAE:泰坦之旅玩家的终极装备管理解决方案,告别仓库焦虑时代
  • AI模型说用户会流失,但实际没走?揭秘留存预测中F1-score失灵背后的2大分布漂移真相
  • Unity Scene文件深度解析:数字世界的“建筑蓝图“
  • 3分钟学会FanControl:Windows电脑风扇控制终极解决方案
  • 2026年英国留学中介哪家性价比高:五家优选深度解析 - 科技焦点
  • 办理香港投资移民推荐机构怎么选?这3个风险提示比宣传更重要 - 北极星移民
  • AI Coding 时代,Java 程序员的 3 条活路
  • 2026亚马逊多店铺运营的环境隔离架构与合规实践
  • AtlasOS:Windows系统优化的革命性模块化解决方案
  • 网盘下载速度慢?LinkSwift直链解析工具让你体验满速下载
  • AI写的高抛低吸策略,胜率还不错
  • OpenHarmony 标准/小型/轻量 系统编译
  • DDrawCompat完整指南:让经典DirectX游戏在现代Windows上重生
  • Unity为啥不使用继承?——一场“血统枷锁“的技术反思
  • 为什么你用AI做了10个小程序却没赚到1分钱?资深变现顾问连夜整理的7条反直觉真相
  • WPF基础知识汇总一(命令,样式)
  • CPPS培训费和考试费要分开交吗? - 众智商学院官方
  • U盘文件被病毒隐藏?用CMD的attrib命令一键恢复全攻略
  • 2026年全国成人学历提升机构口碑综合评测 - 互联网科技品牌测评
  • Java开发者收藏:轻松掌握AI,1个月落地项目,直接涨薪!