平面二连杆逆运动学仿真Vrep_matlab
平面二连杆逆运动学仿真 Vrep_matlab
1.创建平面二连杆模型
-
打开vrep,新建scene。
-
点击Add->Dummy,调整Dummy大小、颜色、位置。命名为Base.
-
点击Add->Joint->Revolute,命名为j1。双击j1,在scene object properties中将Mode设置为Inverse kinematics mode。length设置为0.15、Diameter设置为0.04。
-
点击Add->Primitive shape->Cylinder,设置参数X-size为0.05m,Z-size为0.5m。并调整颜色、位置。如下图。
-
按照上述创建关节与连杆的方式,再创建关节二,参数设置与上述相同。
-
再按下图调整各部件的关系图。
-
添加dummy对,点击Add添加dummy,命名为tip,并调整其大小、位置。再添加target,同样设置其参数。最后调整层次结构。配对dummy对,如图(其实可以不添加)
至此,模型创建完成。 此处模型购买链接,提供咨询服务。
2.推导平面逆运动学方程
由余弦定理得
又由三角学知识可得
代入上式求得
求解关节角 θ1,得
再次应用余弦定理得
其中β∈(0,π)
当![](https://img-blog.csdnimg.cn/20200713214602226.png)
当![](https://img-blog.csdnimg.cn/20200713214602321.png)
3.Matlab代码实现
在matlab中新建函数,函数名为InverseKinematics,添加如下代码。
function [theta1,theta2] = InverseKinematics(Px,Py,a1,a2) % 此处显示详细说明 if Px^2+Py^2<=(a1+a2)^2 %关节2角度 theta2=acos((Px^2+Py^2-a1^2-a2^2)/(2*a1*a2)); %关节1角度 if (Px<0 && Py>0) alaph=-pi+atan(Py/Px); elseif (Px<0 && Py<0) alaph=pi+atan(Py/Px); else alaph=atan(Py/Px); end beta=acos((Px^2+Py^2+a1^2-a2^2)/(2*a1*sqrt(Px^2+Py^2))); if theta2>=0 theta1=alaph-beta; else theta1=alaph+beta; end fprintf("alaph: %f° , beta: %f \n",alaph*180/pi,beta*180/pi); fprintf("theta1: %f°, theta2: %f°\n",theta1*180/pi,theta2*180/pi); else disp('目标点不在工作范围内!'); end end
添加新脚本
%两连杆机械臂控制脚本 %建立matlab与vrep通信通道 disp('Program started'); % sim=remApi('remoteApi','extApi.h'); % using the header (requires a compiler) sim=remApi('remoteApi'); % using the prototype file (remoteApiProto.m) sim.simxFinish(-1); % just in case, close all opened connections clientID=sim.simxStart('127.0.0.1',19999,true,true,5000,5); %获取vrep模型参数 if (clientID>-1) disp('Connected to remote API server!!!!'); end a1=0.5; a2=0.5; %Position=[0,0]; %取得目标点句柄 [returnCode,P_handle]=sim.simxGetObjectHandle(clientID,'target',sim.simx_opmode_oneshot_wait); %基坐标系句柄 [returnCode,Base_handle]=sim.simxGetObjectHandle(clientID,'base',sim.simx_opmode_oneshot_wait); %取得目标点坐标 [returnCode,Position]=sim.simxGetObjectPosition(clientID,P_handle,Base_handle,sim.simx_opmode_oneshot_wait); Px=Position(1); Py=Position(2); fprintf("Px: %f ,Py: %f \n",Px,Py); %逆运动学解算 [theta1,theta2]=InverseKinematics(Px,Py,a1,a2); %关节角发送至vrep %关节句柄 [returnCode,J1_handle]=sim.simxGetObjectHandle(clientID,'j1',sim.simx_opmode_oneshot_wait); [returnCode,J2_handle]=sim.simxGetObjectHandle(clientID,'j2',sim.simx_opmode_oneshot_wait); %设置关节角度 sim.simxSetJointPosition(clientID,J1_handle,theta1,sim.simx_opmode_oneshot); sim.simxSetJointPosition(clientID,J2_handle,theta2,sim.simx_opmode_oneshot);
视频观看地址 https://www.bilibili.com/video/bv1Xg4y1v7pR
vrep Q群 609286340
vrep_matlab平面二连杆逆运动学仿真
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!