Delta并联机械手-Codesys代数法正解和雅可比矩阵计算

        之前我有一篇文章是介绍利用 向量法对Delta并联机械手的正解。今天我来分享代数法的正解,同时在代数法的基础上计算雅可比矩阵。

Delta并联机械手代数法正解

        Delta并联机械手的从动臂的上下节点的距离即为从动臂长,因此,每个主动臂可以得到相应三元二次方程组。三个主动臂就有3个三元二次方程。

        △r 是 静平台与动平台的半径差值。α主动臂垂直角度,θ是静平台主动臂水平角度,w是主动臂长度,l是从动臂长度。

        根据这个方程,我们会发现,3个主动臂上节点和动平台中心,是球表面3个点与球心的关系,而且已知球半径。借助《C# 求取圆心/球心坐标 ∈ C# 编程笔记_已知空间上四点坐标,求球心坐标c#代码-CSDN博客》,我们可以求出球心坐标,也就是动平台的坐标。具体实现,下面以下是代码展示。

(*
#@Copyright:
#@License:
#@Birth:            created by Along on 2023-05-25
#@Content:          Final_DirectTripod3A_Algebraic-代数法-正解Tripod机械手子程序FB
#@Version:          0.0.1
#@Revision:         last revised by Along on 2023-05-25
#@brief             代数法-正解Tripod机械手子程序 , Final不可继承          

根据《Delta并联机器人运动空间的几何作图求解》 https://www.docin.com/p-912524846.html 的方法进行计算。

即:

1,根据 Delta并联机械手的结构特点,从动臂上节点与下节点 之间的距离 = 从动臂, 构建 3个球方程。
2,由于动平台中心点,到3个从动臂上节点的距离都是 从动臂长。即已知 球表面3个点和球半径,求 球心坐标。
3,根据 https://blog.csdn.net/Gou_Hailong/article/details/106686355 的3点+半径的 算法,算出球心。
*)

FUNCTION_BLOCK PUBLIC FINAL Final_DirectTripod3A_Algebraic
VAR_INPUT
lr_ag21					:LREAL;			// 静平台 臂1 水平度角 
lr_ag22					:LREAL;			// 静平台 臂2 水平度角
lr_ag23					:LREAL;			// 静平台 臂3 水平度角
lr_ag1					:LREAL;			// 静平台 臂1 (水平180度角) 主动臂角度
lr_ag2					:LREAL;			// 静平台 臂2 (水平60度角) 主动臂角度
lr_ag3					:LREAL;			// 静平台 臂3 (水平-60度角) 主动臂角度
lr_r_top				:LREAL;			// 静平台 半径
lr_r_plate				:LREAL;			// 动平台 半径
lr_driven_arm			:LREAL;			// 主动臂长度
lr_passtive_arm			:LREAL;			// 从动臂长度
END_VAR

VAR_OUTPUT
lr_out_x				:LREAL;	
lr_out_y				:LREAL;	
lr_out_z				:LREAL;	
END_VAR
VAR

lr_cos1					:LREAL;				//臂1 垂直角度(伺服) COS
lr_sin1					:LREAL;				//臂1 垂直角度(伺服) SIN
lr_cos2					:LREAL;				//臂2 垂直角度(伺服) COS
lr_sin2					:LREAL;				//臂2 垂直角度(伺服) SIN
lr_cos3					:LREAL;				//臂3 垂直角度(伺服) COS
lr_sin3					:LREAL;				//臂3 垂直角度(伺服) SIN
lr_cos21				:LREAL;				//臂1 水平角度(静平台) COS
lr_sin21				:LREAL;				//臂1 水平角度(静平台) SIN
lr_cos22				:LREAL;				//臂2 水平角度(静平台) COS
lr_sin22				:LREAL;				//臂2 水平角度(静平台) SIN
lr_cos23				:LREAL;				//臂3 水平角度(静平台) COS
lr_sin23				:LREAL;				//臂3 水平角度(静平台) SIN
lr_l1					:LREAL;
lr_l2					:LREAL;
lr_l3					:LREAL;
lr_l21					:LREAL;
lr_l22					:LREAL;
lr_l23					:LREAL;
lr_x1					:LREAL;
lr_y1					:LREAL;
lr_z1					:LREAL;
lr_x2					:LREAL;
lr_y2					:LREAL;
lr_z2					:LREAL;
lr_x3					:LREAL;
lr_y3					:LREAL;
lr_z3					:LREAL;
lr_M1					:LREAL;
lr_M2					:LREAL;
lr_M3					:LREAL;
lr_C12					:LREAL;
lr_C23					:LREAL;
lr_C1					:LREAL;
lr_C2					:LREAL;
lr_D1					:LREAL;
lr_D2					:LREAL;
lr_A					:LREAL;
lr_B					:LREAL;
lr_C					:LREAL;
lr_x21					:LREAL;
lr_y21					:LREAL;
lr_z21					:LREAL;
lr_x32					:LREAL;
lr_y32					:LREAL;
lr_z32					:LREAL;
lr_B4AC					:LREAL;
lr_cal_x				:LREAL;	
lr_cal_y				:LREAL;	
lr_cal_z				:LREAL;	
lr_cal_x2				:LREAL;	
lr_cal_y2				:LREAL;	
lr_cal_z2				:LREAL;	
END_VAR



//垂直角三角函数
lr_cos1	:= COS( lr_ag1 * glvars.const_lr_pi / 180 ) ;
lr_sin1	:= SIN( lr_ag1 * glvars.const_lr_pi / 180 ) ;
lr_cos2	:= COS( lr_ag2 * glvars.const_lr_pi / 180 ) ;
lr_sin2	:= SIN( lr_ag2 * glvars.const_lr_pi / 180 ) ;
lr_cos3	:= COS( lr_ag3 * glvars.const_lr_pi / 180 ) ;
lr_sin3	:= SIN( lr_ag3 * glvars.const_lr_pi / 180 ) ;


//水平角三角函数
lr_cos21	:= COS( lr_ag21 * glvars.const_lr_pi / 180 ) ;
lr_sin21	:= SIN( lr_ag21 * glvars.const_lr_pi / 180 ) ;
lr_cos22	:= COS( lr_ag22 * glvars.const_lr_pi / 180 ) ;
lr_sin22	:= SIN( lr_ag22 * glvars.const_lr_pi / 180 ) ;
lr_cos23	:= COS( lr_ag23 * glvars.const_lr_pi / 180 ) ;
lr_sin23	:= SIN( lr_ag23 * glvars.const_lr_pi / 180 ) ;


//构建3个球方程组。
lr_x1 := (lr_r_top - lr_r_plate + lr_driven_arm * lr_cos1) * lr_cos21;
lr_y1 := (lr_r_top - lr_r_plate + lr_driven_arm * lr_cos1) * lr_sin21;
lr_z1 := lr_driven_arm * lr_sin1 + glvars.const_lr_z_zerohei;


lr_x2 := (lr_r_top - lr_r_plate + lr_driven_arm * lr_cos2) * lr_cos22;
lr_y2 := (lr_r_top - lr_r_plate + lr_driven_arm * lr_cos2) * lr_sin22;
lr_z2 := lr_driven_arm * lr_sin2 + glvars.const_lr_z_zerohei;


lr_x3 := (lr_r_top - lr_r_plate + lr_driven_arm * lr_cos3) * lr_cos23;
lr_y3 := (lr_r_top - lr_r_plate + lr_driven_arm * lr_cos3) * lr_sin23;
lr_z3 := lr_driven_arm * lr_sin3 + glvars.const_lr_z_zerohei;

lr_M1 := lr_x1 * lr_x1 + lr_y1 * lr_y1 + lr_z1 * lr_z1 ;
lr_M2 := lr_x2 * lr_x2 + lr_y2 * lr_y2 + lr_z2 * lr_z2 ;
lr_M3 := lr_x3 * lr_x3 + lr_y3 * lr_y3 + lr_z3 * lr_z3 ;

lr_C12 := lr_M1 - lr_M2 ;
lr_C23 := lr_M2 - lr_M3 ;


lr_x21 := lr_x2 - lr_x1 ;
lr_y21 := lr_y2 - lr_y1 ;
lr_z21 := lr_z2 - lr_z1 ;

lr_x32 := lr_x3 - lr_x2 ;
lr_y32 := lr_y3 - lr_y2 ;
lr_z32 := lr_z3 - lr_z2 ;

IF  lr_x32 * lr_z21 - lr_x21 * lr_z32 = 0 THEN
	lr_C1 := 0 ;
ELSE
	lr_C1 := (lr_C23 * lr_x21 - lr_C12 * lr_x32 ) / (2 * ( lr_x32 * lr_z21 - lr_x21 * lr_z32 ) );
END_IF

IF  lr_x32 * lr_z21 - lr_x21 * lr_z32 = 0 THEN
	lr_C2 := 0 ;
ELSE
	lr_C2 := - ( lr_x32 * lr_y21 - lr_x21 * lr_y32 ) / ( lr_x32 * lr_z21 - lr_x21 * lr_z32 ) ;
END_IF

IF lr_y21 + lr_z21 * lr_C2 = 0 THEN
	lr_D1 := 0;
ELSE
	lr_D1 := - (lr_C12 + 2 * lr_C1 * lr_z21 ) / (2 * ( lr_y21 + lr_z21 * lr_C2 )) ;
END_IF

IF lr_y21 + lr_z21 * lr_C2 = 0 THEN
	lr_D2 := 0;
ELSE
	lr_D2 := -( lr_x21 / (lr_y21 + lr_z21 * lr_C2) );
END_IF

(*
 通过消元法 获得的 3个 三元一次方程组,其是一个 三维直线,有无数解。
只有把这个直线的 xyz的关系,代入球方程,才能求出 直线与球的交点,才是我们所需要的解。 
*)


//把 y0,z0带入 球方程,获得 一元二次方程。
lr_A := 1 + lr_D2 * lr_D2 + lr_C2 * lr_C2 * lr_D2 * lr_D2 ;

lr_B := -2 * lr_x1 - 2 * lr_y1 * lr_D2 - 2 * lr_z1 * lr_C2 * lr_D2 + 2 * lr_D1 * lr_D2 + 2 * (lr_C1 + lr_C2 * lr_D1) * lr_C2 * lr_D2 ;

lr_C := lr_x1 * lr_x1 + lr_y1 * lr_y1 + lr_z1 * lr_z1 - 2 * lr_y1 * lr_D1 -  2 * lr_z1 * (lr_C1 + lr_C2 * lr_D1) + lr_D1 * lr_D1 + (lr_C1 + lr_C2 * lr_D1) * (lr_C1 + lr_C2 * lr_D1) - lr_passtive_arm * lr_passtive_arm ;

//判断二元一次方程,解的类型
lr_B4AC :=  lr_B * lr_B - 4 * lr_A * lr_C ;

IF lr_B4AC > 0 THEN
//有2个解

	lr_cal_x := (-lr_B + SQRT( lr_B4AC )) / (2 * lr_A) ;
	
	lr_cal_y := lr_cal_x * lr_D2 + lr_D1 ;
	
	lr_cal_z := lr_C1 + lr_C2 * lr_cal_y ;
	
	
	lr_cal_x2 := (-lr_B - SQRT( lr_B4AC )) / (2 * lr_A) ;
	
	lr_cal_y2 := lr_cal_x2 * lr_D2 + lr_D1 ;
	
	lr_cal_z2 := lr_C1 + lr_C2 * lr_cal_y2 ;
	
ELSE 
	IF lr_B4AC  = 0 THEN
		//唯一解
		lr_cal_x := -lr_B  / (2 * lr_A) ;
		lr_cal_y := lr_cal_x * lr_D2 + lr_D1 ;
		lr_cal_z := lr_C1 + lr_C2 * lr_cal_y ;
		
		lr_cal_x2 := lr_cal_x ;
		lr_cal_y2 := lr_cal_Y ;
		lr_cal_z2 := lr_cal_z ;

	ELSE
		//无解
		lr_cal_x := 0 ;
		lr_cal_y := 0 ;
		lr_cal_z := 0 ;
		
		lr_cal_x2 := lr_cal_x ;
		lr_cal_y2 := lr_cal_Y ;
		lr_cal_z2 := lr_cal_z ;
	
	END_IF
END_IF

//根据 2个解的Z位置,判断合适的解 并输出
IF
	lr_cal_z < glvars.const_lr_z_zerohei 
THEN
	lr_out_x := lr_cal_x;
	lr_out_y := lr_cal_y;
	lr_out_z := lr_cal_z;		
ELSE
	lr_out_x := lr_cal_x2;
	lr_out_y := lr_cal_y2;
	lr_out_z := lr_cal_z2;
END_IF


Delta并联机械手雅可比矩阵

        首先感谢刘大佬的技术指导。

        利用上文的三元二次方程,两边分别求导dx/dα , dx/dα,dz/dα。

通过3个角度用矩阵表示

(*
#@Copyright:
#@License:
#@Birth:            created by Along on 2023-05-18
#@Content:          Final_Jacobian-代数法-正解Tripod机械手-- 雅可比矩阵  子程序FB
#@Version:          0.0.1
#@Revision:         last revised by Along on 2023-05-18
#@brief             代数法-正解Tripod机械手-- 雅可比矩阵  子程序FB , Final不可继承          

根据《Delta并联机器人运动空间的几何作图求解》 https://www.docin.com/p-912524846.html 的方法进行计算。

即:

1,根据 Delta并联机械手的结构特点,从动臂上节点与下节点 之间的距离 = 从动臂, 构建 3个球方程。
2,由于动平台中心点,到3个从动臂上节点的距离都是 从动臂长。即已知 球表面3个点和球半径,求 球心坐标。
3,根据 https://blog.csdn.net/Gou_Hailong/article/details/106686355 的3点+半径的 算法,算出球心。
4,根据 3点+半径的 球心算法,进行求导和矩阵运算,得出 雅可比矩阵。
*)

FUNCTION_BLOCK PUBLIC FINAL Final_Jacobian
VAR_INPUT
	
lr_x					:LREAL;			//终端X坐标
lr_y					:LREAL;			//终端Y坐标
lr_z					:LREAL;			//终端Z坐标
lr_ag_11				:LREAL;			//静平台 臂1 水平角度
lr_ag_12				:LREAL;			//静平台 臂2 水平角度
lr_ag_13				:LREAL;			//静平台 臂3 水平角度
lr_ag_21				:LREAL;			//静平台 臂1 主动臂角度
lr_ag_22				:LREAL;			//静平台 臂2 主动臂角度
lr_ag_23				:LREAL;			//静平台 臂3 主动臂角度
lr_driven_arm			:LREAL;			//主动臂长 
lr_passive_arm			:LREAL;			//从动臂长 
lr_r_top				:LREAL;			//静平台 半径
lr_r_plate				:LREAL;			//动平台 半径

END_VAR

VAR_OUTPUT
	
matrix_jaco				:ARRAY[0..2,0..2] OF LREAL;				//雅可比矩阵
bs_singular_point		:BOOL;									//信号 机械手奇异点
END_VAR
VAR

j_d_1					:Stru_tripod_Jp;						// 臂1 的 Jp结构体实例
j_d_2					:Stru_tripod_Jp;						// 臂2 的 Jp结构体实例
j_d_3					:Stru_tripod_Jp;						// 臂3 的 Jp结构体实例
matrix_jp				:ARRAY[0..2,0..2] OF LREAL;				// 矩阵 jp
matrix_jq				:ARRAY[0..2,0..2] OF LREAL;				// 矩阵 jq
matrix_jp_inv			:ARRAY[0..2,0..2] OF LREAL;				// 矩阵 jp的逆矩阵

END_VAR


//求3个臂的 Jp结构体实例
j_d_1 := METH_Jp(lr_hori_ag:= lr_ag_11, lr_arm_ag:= lr_ag_21);
j_d_2 := METH_Jp(lr_hori_ag:= lr_ag_12, lr_arm_ag:= lr_ag_22);
j_d_3 := METH_Jp(lr_hori_ag:= lr_ag_13, lr_arm_ag:= lr_ag_23);

//构建 矩阵 jp
matrix_jp := Matrix.Fn_Matrix_Init(
							j_d_1.lr_Jx,j_d_1.lr_Jy,j_d_1.lr_Jz,
							j_d_2.lr_Jx,j_d_2.lr_Jy,j_d_2.lr_Jz,
							j_d_3.lr_Jx,j_d_3.lr_Jy,j_d_3.lr_Jz			
							);
//构建 矩阵 jq
matrix_jq := Matrix.Fn_Matrix_Init(
							j_d_1.lr_Jq,0,0,
							0,j_d_2.lr_Jq,0,
							0,0,j_d_3.lr_Jq			
							);
						
//jp的逆矩阵							
matrix_jp_inv := Matrix.Fn_Matrix_33_Inverse(matrix_jp);

//雅可比矩阵							
matrix_jaco := Matrix.Fn_Matrix_33_Cross(matrix_jp_inv,matrix_jq);

//信号 机械手奇异点
bs_singular_point := Matrix.Fn_Matrix_33_Determinant(matrix_jaco) = 0 ;





(*
#@Copyright:
#@License:
#@Birth:            created by Along on 2023-05-18
#@Content:          meth_Jp-求导的变量函数 method
#@Version:          0.0.1
#@Revision:         last revised by Along on 2023-05-18
#@brief             求导的变量函数 method
#@requirement
				
*)
METHOD PRIVATE meth_Jp : Stru_tripod_Jp
VAR_INPUT
	
lr_hori_ag			:LREAL;				//水平角度
lr_arm_ag			:LREAL;				//臂 垂直角度

END_VAR

VAR

lr_hori_cos			:LREAL;				//水平角度 cos
lr_hori_sin			:LREAL;				//水平角度 sin

lr_vert_cos			:LREAL;				//垂直角度 cos
lr_vert_sin			:LREAL;				//垂直角度 sin

lr_x_v1				:LREAL;				//公式变量x
lr_y_v1				:LREAL;				//公式变量y
lr_z_v1				:LREAL;				//公式变量z


END_VAR


//水平角三角函数
lr_hori_cos	:= COS( lr_hori_ag * glvars.const_lr_pi / 180 ) ;

IF lr_hori_ag = 0 OR lr_hori_ag = 180 THEN
	lr_hori_sin := 0;
ELSE
	lr_hori_sin	:= SIN( lr_hori_ag * glvars.const_lr_pi / 180 ) ;

END_IF



//垂直角三角函数
lr_vert_cos	:= COS( lr_arm_ag * glvars.const_lr_pi / 180 ) ;
lr_vert_sin	:= SIN( lr_arm_ag * glvars.const_lr_pi / 180 ) ;


METH_Jp.lr_Jx := lr_x - ( lr_r_top - lr_r_plate + lr_driven_arm * lr_vert_cos ) * lr_hori_cos;

METH_Jp.lr_Jy := lr_y - ( lr_r_top - lr_r_plate + lr_driven_arm * lr_vert_cos ) * lr_hori_sin ;

METH_Jp.lr_Jz := lr_z - lr_driven_arm * lr_vert_sin - glvars.const_lr_z_zerohei;


METH_Jp.lr_Jq :=  METH_Jp.lr_Jx * ( -lr_driven_arm * lr_vert_sin * lr_hori_cos ) 
		 		 + METH_Jp.lr_Jy * ( -lr_driven_arm * lr_vert_sin * lr_hori_sin )
		 		 + METH_Jp.lr_Jz * ( lr_driven_arm * lr_vert_cos );


        代码里面用到矩阵运算函数,可以到【免费】原创CODESYS操作Matrix33矩阵运算的功能块库文件资源-CSDN文库下载使用。

以上。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CodeSys是一种可编程控制器软件(PLC),在机械手控制中被广泛应用。CodeSys提供了强大的功能和工具,用于编写和执行机械手控制程序。 首先,使用CodeSys可以轻松地创建和编辑机械手的控制程序。通过CodeSys的图形化界面,用户可以直观地设计机械手的运动轨迹,设置操作参数和条件。CodeSys还提供了丰富的函数库和算法,以支持复杂的运动控制和路径规划。 其次,CodeSys提供了丰富的通信接口和协议,可以方便地与机械手的各个部件进行通信。用户可以使用CodeSys机械手的传感器和执行器进行数据交换,实现实时的位置和力检测,以及精确的运动控制。 此外,CodeSys还支持多种编程语言,如Ladder Diagram(LD)、Structured Text(ST)和Function Block Diagram(FBD),满足不同用户的编程需求。用户可以选择最适合自己的编程语言,并根据需要进行灵活的编程。 最后,CodeSys不仅可以用于简单的机械手控制任务,还可以应用于复杂的自动化系统中。它可以与其他设备和系统集成,实现更高级的控制和协作。同时,CodeSys还提供了强大的调试和监控工具,方便用户进行调试和优化。 综上所述,CodeSys是一种功能强大的软件平台,适用于机械手的控制。它提供了丰富的功能和工具,可以帮助用户实现高效精确的机械手控制,满足不同应用需求。 ### 回答2: CODESYS是一款广泛使用的工业自动化编程软件,常用于编程控制机械设备和机器人CODESYS可以用于控制各种类型的机械手,来完成各种工业自动化任务。 在使用CODESYS控制机械手时,首先需要创建一个项目,并选择合适的目标设备,例如PLC(可编程逻辑控制器)。接下来,可以使用CODESYS提供的函数库和工具,编写程序来控制机械手的运动和操作。 一个典型的CODESYS程序包含了几个重要的部分,包括初始化、运动控制、逻辑控制和安全控制。在初始化部分,需要对机械手进行参数设置和初始化工作,例如设置初始位置和速度。运动控制部分包括了对机械手运动轨迹的控制,可以通过编程来实现机械手的移动、旋转和抓取动作。逻辑控制部分则负责根据输入信号和逻辑条件,决定机械手的具体操作,例如判断是否抓取物体或释放物体。最后,安全控制部分可以确保机械手的运动是安全的,防止发生意外事故。 CODESYS提供了直观易用的编程界面,可以通过拖拽、点击和输入代码来完成机械手的控制。同时,CODESYS还支持与其他设备和系统的通信,可以与人机界面(HMI)进行交互,或者通过网络与其他设备进行数据交换。 总之,使用CODESYS可以方便快捷地实现对机械手的控制。通过编写程序,可以实现对机械手的各种运动和操作,从而满足不同工业自动化需求。CODESYS的强大功能和灵活性,使其成为许多工业领域中控制机械手的首选软件之一。 ### 回答3: CODESYS (Controller Development System) 是一种通用的软件开发工具,用于编程和控制各种自动化系统,包括机械手控制。 CODESYS提供了一个强大的编程环境,允许用户使用各种编程语言(如Ladder Diagram,Structured Text,Function Block Diagram等)来编写自定义的控制逻辑。这些编程语言允许用户创建算法,处理输入和输出信号,控制运动轴和执行多种操作。 机械手控制是CODESYS的一个重要应用领域。通过CODESYS,用户可以使用其丰富的机械手控制函数库,来编写用于机械手运动和操作的控制程序。这些函数库提供了各种运动控制功能,如坐标转换、速度控制、轨迹规划等。用户可以根据应用需求选择适当的函数和参数,以实现机械手在不同场景中的灵活控制。 CODESYS还提供了与多种硬件设备和传感器的接口功能。用户可以通过适当的硬件配置和通信设置,将CODESYS机械手的电机、编码器、传感器等进行连接,以实现对机械手的实时监控和控制。此外,CODESYS还支持与外部设备的通信,如人机界面(HMI)和控制台等。 总之,CODESYS是一种强大的软件开发工具,适用于各种自动化系统的控制编程,包括机械手控制。通过CODESYS,用户可以使用丰富的函数库和编程语言,实现对机械手的各种运动和操作的控制,并与硬件设备和传感器进行连接和通信。CODESYS机械手控制提供了高度灵活和可定制的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值