Skip to content

Commit e7a01b2

Browse files
committed
[FEAT]增加正解C_PiperForwardKinematics类的偏移判断,如果is_offset为0则DH 参数是未偏移的版本,如果为1则为j1j2偏移2°的版本,可以在创建interface实例时将dh_is_offset设置为0/1来切换dh参数;在C_PiperForwardKinematics类中增加末端初始位置数值self.init_pos
1 parent c577e53 commit e7a01b2

File tree

4 files changed

+51
-21
lines changed

4 files changed

+51
-21
lines changed

interface/piper_interface.py

+25-14
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ class C_PiperInterface():
2929
judge_flag(bool): Determines if the CAN port is functioning correctly.
3030
When using a PCIe-to-CAN module, set to false.
3131
can_auto_init(bool): Determines if the CAN port is automatically initialized.
32+
dh_is_offset([0,1] -> default 0): Does the j1-j2 offset by 2° in the DH parameters?
33+
0 -> No offset
34+
1 -> Offset applied
3235
'''
3336
class ArmStatus():
3437
'''
@@ -352,7 +355,8 @@ def __new__(cls,
352355
def __init__(self,
353356
can_name:str="can0",
354357
judge_flag=True,
355-
can_auto_init=True) -> None:
358+
can_auto_init=True,
359+
dh_is_offset: int = 0) -> None:
356360
if getattr(self, "_initialized", False):
357361
return # 避免重复初始化
358362
self.__can_channel_name:str
@@ -363,7 +367,8 @@ def __init__(self,
363367
self.__can_judge_flag = judge_flag
364368
self.__can_auto_init = can_auto_init
365369
self.__arm_can=C_STD_CAN(can_name, "socketcan", 1000000, judge_flag, can_auto_init, self.ParseCANFrame)
366-
self.__piper_fk = C_PiperForwardKinematics()
370+
self.__dh_is_offset = dh_is_offset
371+
self.__piper_fk = C_PiperForwardKinematics(self.__dh_is_offset)
367372
# protocol
368373
self.__parser: Type[C_PiperParserBase] = C_PiperParserV1()
369374
# thread
@@ -1114,55 +1119,61 @@ def __UpdateDriverInfoHighSpdFeedback(self, msg:PiperMessage):
11141119
with self.__arm_motor_info_high_spd_mtx:
11151120
if(msg.type_ == ArmMsgType.PiperMsgHighSpdFeed_1):
11161121
self.__fps_counter.increment("ArmMotorDriverInfoHighSpd_1")
1117-
self.__arm_time_stamp.time_stamp_motor_low_spd_1 = time.time_ns()
1122+
self.__arm_time_stamp.time_stamp_motor_high_spd_1 = time.time_ns()
11181123
self.__arm_motor_info_high_spd.motor_1.can_id = msg.arm_high_spd_feedback_1.can_id
11191124
self.__arm_motor_info_high_spd.motor_1.motor_speed = msg.arm_high_spd_feedback_1.motor_speed
11201125
self.__arm_motor_info_high_spd.motor_1.current = msg.arm_high_spd_feedback_1.current
11211126
self.__arm_motor_info_high_spd.motor_1.pos = msg.arm_high_spd_feedback_1.pos
1127+
self.__arm_motor_info_high_spd.motor_1.effort = msg.arm_high_spd_feedback_1.cal_effort()
11221128
elif(msg.type_ == ArmMsgType.PiperMsgHighSpdFeed_2):
11231129
self.__fps_counter.increment("ArmMotorDriverInfoHighSpd_2")
1124-
self.__arm_time_stamp.time_stamp_motor_low_spd_2 = time.time_ns()
1130+
self.__arm_time_stamp.time_stamp_motor_high_spd_2 = time.time_ns()
11251131
self.__arm_motor_info_high_spd.motor_2.can_id = msg.arm_high_spd_feedback_2.can_id
11261132
self.__arm_motor_info_high_spd.motor_2.motor_speed = msg.arm_high_spd_feedback_2.motor_speed
11271133
self.__arm_motor_info_high_spd.motor_2.current = msg.arm_high_spd_feedback_2.current
11281134
self.__arm_motor_info_high_spd.motor_2.pos = msg.arm_high_spd_feedback_2.pos
1135+
self.__arm_motor_info_high_spd.motor_2.effort = msg.arm_high_spd_feedback_2.cal_effort()
11291136
elif(msg.type_ == ArmMsgType.PiperMsgHighSpdFeed_3):
11301137
self.__fps_counter.increment("ArmMotorDriverInfoHighSpd_3")
1131-
self.__arm_time_stamp.time_stamp_motor_low_spd_3 = time.time_ns()
1138+
self.__arm_time_stamp.time_stamp_motor_high_spd_3 = time.time_ns()
11321139
self.__arm_motor_info_high_spd.motor_3.can_id = msg.arm_high_spd_feedback_3.can_id
11331140
self.__arm_motor_info_high_spd.motor_3.motor_speed = msg.arm_high_spd_feedback_3.motor_speed
11341141
self.__arm_motor_info_high_spd.motor_3.current = msg.arm_high_spd_feedback_3.current
11351142
self.__arm_motor_info_high_spd.motor_3.pos = msg.arm_high_spd_feedback_3.pos
1143+
self.__arm_motor_info_high_spd.motor_3.effort = msg.arm_high_spd_feedback_3.cal_effort()
11361144
elif(msg.type_ == ArmMsgType.PiperMsgHighSpdFeed_4):
11371145
self.__fps_counter.increment("ArmMotorDriverInfoHighSpd_4")
1138-
self.__arm_time_stamp.time_stamp_motor_low_spd_4 = time.time_ns()
1146+
self.__arm_time_stamp.time_stamp_motor_high_spd_4 = time.time_ns()
11391147
self.__arm_motor_info_high_spd.motor_4.can_id = msg.arm_high_spd_feedback_4.can_id
11401148
self.__arm_motor_info_high_spd.motor_4.motor_speed = msg.arm_high_spd_feedback_4.motor_speed
11411149
self.__arm_motor_info_high_spd.motor_4.current = msg.arm_high_spd_feedback_4.current
11421150
self.__arm_motor_info_high_spd.motor_4.pos = msg.arm_high_spd_feedback_4.pos
1151+
self.__arm_motor_info_high_spd.motor_4.effort = msg.arm_high_spd_feedback_4.cal_effort()
11431152
elif(msg.type_ == ArmMsgType.PiperMsgHighSpdFeed_5):
11441153
self.__fps_counter.increment("ArmMotorDriverInfoHighSpd_5")
1145-
self.__arm_time_stamp.time_stamp_motor_low_spd_5 = time.time_ns()
1154+
self.__arm_time_stamp.time_stamp_motor_high_spd_5 = time.time_ns()
11461155
self.__arm_motor_info_high_spd.motor_5.can_id = msg.arm_high_spd_feedback_5.can_id
11471156
self.__arm_motor_info_high_spd.motor_5.motor_speed = msg.arm_high_spd_feedback_5.motor_speed
11481157
self.__arm_motor_info_high_spd.motor_5.current = msg.arm_high_spd_feedback_5.current
11491158
self.__arm_motor_info_high_spd.motor_5.pos = msg.arm_high_spd_feedback_5.pos
1159+
self.__arm_motor_info_high_spd.motor_5.effort = msg.arm_high_spd_feedback_5.cal_effort()
11501160
elif(msg.type_ == ArmMsgType.PiperMsgHighSpdFeed_6):
11511161
self.__fps_counter.increment("ArmMotorDriverInfoHighSpd_6")
1152-
self.__arm_time_stamp.time_stamp_motor_low_spd_6 = time.time_ns()
1162+
self.__arm_time_stamp.time_stamp_motor_high_spd_6 = time.time_ns()
11531163
self.__arm_motor_info_high_spd.motor_6.can_id = msg.arm_high_spd_feedback_6.can_id
11541164
self.__arm_motor_info_high_spd.motor_6.motor_speed = msg.arm_high_spd_feedback_6.motor_speed
11551165
self.__arm_motor_info_high_spd.motor_6.current = msg.arm_high_spd_feedback_6.current
11561166
self.__arm_motor_info_high_spd.motor_6.pos = msg.arm_high_spd_feedback_6.pos
1167+
self.__arm_motor_info_high_spd.motor_6.effort = msg.arm_high_spd_feedback_6.cal_effort()
11571168
else:
11581169
pass
11591170
# 更新时间戳,取筛选ID的最新一个
1160-
self.__arm_motor_info_high_spd.time_stamp = max(self.__arm_time_stamp.time_stamp_motor_low_spd_1,
1161-
self.__arm_time_stamp.time_stamp_motor_low_spd_2,
1162-
self.__arm_time_stamp.time_stamp_motor_low_spd_3,
1163-
self.__arm_time_stamp.time_stamp_motor_low_spd_4,
1164-
self.__arm_time_stamp.time_stamp_motor_low_spd_5,
1165-
self.__arm_time_stamp.time_stamp_motor_low_spd_6) / 1_000_000_000
1171+
self.__arm_motor_info_high_spd.time_stamp = max(self.__arm_time_stamp.time_stamp_motor_high_spd_1,
1172+
self.__arm_time_stamp.time_stamp_motor_high_spd_2,
1173+
self.__arm_time_stamp.time_stamp_motor_high_spd_3,
1174+
self.__arm_time_stamp.time_stamp_motor_high_spd_4,
1175+
self.__arm_time_stamp.time_stamp_motor_high_spd_5,
1176+
self.__arm_time_stamp.time_stamp_motor_high_spd_6) / 1_000_000_000
11661177
# print(self.__arm_motor_info_high_spd)
11671178
return self.__arm_motor_info_high_spd
11681179

interface/piper_interface_v1.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ class C_PiperInterface_V1():
2929
judge_flag(bool): Determines if the CAN port is functioning correctly.
3030
When using a PCIe-to-CAN module, set to false.
3131
can_auto_init(bool): Determines if the CAN port is automatically initialized.
32+
dh_is_offset([0,1] -> default 0): Does the j1-j2 offset by 2° in the DH parameters?
33+
0 -> No offset
34+
1 -> Offset applied
3235
'''
3336
class ArmStatus():
3437
'''
@@ -352,7 +355,8 @@ def __new__(cls,
352355
def __init__(self,
353356
can_name:str="can0",
354357
judge_flag=True,
355-
can_auto_init=True) -> None:
358+
can_auto_init=True,
359+
dh_is_offset: int = 0) -> None:
356360
if getattr(self, "_initialized", False):
357361
return # 避免重复初始化
358362
self.__can_channel_name:str
@@ -363,7 +367,8 @@ def __init__(self,
363367
self.__can_judge_flag = judge_flag
364368
self.__can_auto_init = can_auto_init
365369
self.__arm_can=C_STD_CAN(can_name, "socketcan", 1000000, judge_flag, can_auto_init, self.ParseCANFrame)
366-
self.__piper_fk = C_PiperForwardKinematics()
370+
self.__dh_is_offset = dh_is_offset
371+
self.__piper_fk = C_PiperForwardKinematics(self.__dh_is_offset)
367372
# protocol
368373
self.__parser: Type[C_PiperParserBase] = C_PiperParserV1()
369374
# thread

interface/piper_interface_v2.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ class C_PiperInterface_V2():
2929
judge_flag(bool): Determines if the CAN port is functioning correctly.
3030
When using a PCIe-to-CAN module, set to false.
3131
can_auto_init(bool): Determines if the CAN port is automatically initialized.
32+
dh_is_offset([0,1] -> default 0): Does the j1-j2 offset by 2° in the DH parameters?
33+
0 -> No offset
34+
1 -> Offset applied
3235
'''
3336
class ArmStatus():
3437
'''
@@ -368,7 +371,8 @@ def __new__(cls,
368371
def __init__(self,
369372
can_name:str="can0",
370373
judge_flag=True,
371-
can_auto_init=True) -> None:
374+
can_auto_init=True,
375+
dh_is_offset: int = 0) -> None:
372376
if getattr(self, "_initialized", False):
373377
return # 避免重复初始化
374378
self.__can_channel_name:str
@@ -379,7 +383,8 @@ def __init__(self,
379383
self.__can_judge_flag = judge_flag
380384
self.__can_auto_init = can_auto_init
381385
self.__arm_can=C_STD_CAN(can_name, "socketcan", 1000000, judge_flag, can_auto_init, self.ParseCANFrame)
382-
self.__piper_fk = C_PiperForwardKinematics()
386+
self.__dh_is_offset = dh_is_offset
387+
self.__piper_fk = C_PiperForwardKinematics(self.__dh_is_offset)
383388
# protocol
384389
self.__parser: Type[C_PiperParserBase] = C_PiperParserV2()
385390
# thread

kinematics/piper_fk.py

+12-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import math
2+
from typing_extensions import (
3+
Literal,
4+
)
25

36
class C_PiperForwardKinematics():
4-
def __init__(self):
7+
def __init__(self, dh_is_offset: Literal[0x00, 0x01] = 0x00):
58
self.RADIAN = 180 / math.pi
69
self.PI = math.pi
710
# Denavit-Hartenberg parameters for each link
@@ -12,9 +15,15 @@ def __init__(self):
1215
self._a = [0 , 0 , 285.03 , -21.98 , 0 , 0 ]
1316
self._alpha = [0 , -self.PI / 2 , 0 , self.PI / 2 , -self.PI / 2 , self.PI / 2]
1417
self._theta = [0 , -self.PI * 174.22 / 180, -100.78 / 180 * self.PI , 0 , 0 , 0 ]
15-
# self._theta = [0 , -self.PI * 172.22 / 180, -102.78 / 180 * self.PI , 0 , 0 , 0 ]
1618
self._d = [123 , 0 , 0 , 250.75 , 0 , 91 ]
17-
# self.zero = [56.128, 0, 213.266, 0.0, 85.0, 0.0]
19+
self.init_pos = [55.0 , 0.0 , 205.0 , 0.0 , 85.0 , 0.0] # unit xyz-mm, rpy-degree
20+
# if j2, j3 offset 2°
21+
if(dh_is_offset == 0x01):
22+
self._a = [0 , 0 , 285.03 , -21.98 , 0 , 0 ]
23+
self._alpha = [0 , -self.PI / 2 , 0 , self.PI / 2 , -self.PI / 2 , self.PI / 2]
24+
self._theta = [0 , -self.PI * 172.22 / 180, -102.78 / 180 * self.PI , 0 , 0 , 0 ]
25+
self._d = [123 , 0 , 0 , 250.75 , 0 , 91 ]
26+
self.init_pos = [56.128, 0.0 , 213.266 , 0.0 , 85.0 , 0.0] # unit xyz-mm, rpy-degree
1827
def __MatrixToeula(self, T):
1928
'''
2029
Convert a transformation matrix to Euler angles (roll, pitch, yaw).

0 commit comments

Comments
 (0)