44 from sensor_msgs.msg
import JointState
50 qx, qy, qz, qw = T.M.GetQuaternion()
51 return 'PyKDL.Frame(PyKDL.Rotation.Quaternion({}, {}, {}, {}), PyKDL.Vector({}, {}, {}))'.format(qx, qy, qz, qw, T.p.x(), T.p.y(), T.p.z())
57 assert arm_name
in (
'right',
'left')
59 js_pub = rospy.Publisher(
'/joint_states', JointState, queue_size=1000)
65 js_msg.name.append(
'{}_arm_{}_joint'.format(arm_name, i))
66 js_msg.position.append(0.0)
68 js_msg.name.append(
'torso_0_joint')
69 js_msg.position.append(0.0)
72 while not rospy.is_shutdown():
73 q = [ math.sin(phase),
82 T_A0_A7 = solv.calculateFk( q )
84 m_id = m_pub.publishFrameMarker(T_A0_A7, m_id, scale=0.5,
85 frame=
'calib_{}_arm_base_link'.format(arm_name), namespace=
'default')
86 js_msg.header.stamp = rospy.Time.now()
88 js_msg.position[i] = q[i]
89 js_pub.publish(js_msg)
94 limits = [[-2.96, 2.96],
104 for q0
in np.linspace(limits[0][0], limits[0][1], samples, endpoint=
True):
105 for q1
in np.linspace(limits[1][0], limits[1][1], samples, endpoint=
True):
106 for q2
in np.linspace(limits[2][0], limits[2][1], samples, endpoint=
True):
107 for q3
in np.linspace(limits[3][0], limits[3][1], samples, endpoint=
True):
108 for q4
in np.linspace(limits[4][0], limits[4][1], samples, endpoint=
True):
109 for q5
in np.linspace(limits[5][0], limits[5][1], samples, endpoint=
True):
110 for q6
in np.linspace(limits[6][0], limits[6][1], samples, endpoint=
True):
111 result.append( (q0, q1, q2, q3, q4, q5, q6) )
118 samples_count = len(samples)
119 print(
'Number of samples: {}'.format(samples_count))
121 for sample_idx, sample
in enumerate(samples):
124 print(
'sample: {} / {}'.format(sample_idx, samples_count))
125 T_A0_A7d = solv.calculateFk( q )
128 for elbow_circle_angle
in np.linspace(-math.pi, math.pi, 10, endpoint=
True):
130 iq = solv.calculateIk(T_A0_A7d, elbow_circle_angle,
False,
False,
False)
131 T_A0_A7 = solv.calculateFk( iq )
133 diff = PyKDL.diff(T_A0_A7, T_A0_A7d, 1.0)
134 if diff.vel.Norm() > 0.00001
or diff.rot.Norm() > 0.00001:
135 print(
'ERROR: {}: {}, {}, {}, {}'.format(sample_idx, sample, elbow_circle_angle,
strFrame(T_A0_A7d),
strFrame(T_A0_A7)))
139 assert arm_name
in (
'right',
'left')
142 js_pub = rospy.Publisher(
'/joint_states', JointState, queue_size=1000)
147 js_msg = JointState()
149 js_msg.name.append(
'{}_arm_{}_joint'.format(arm_name, i))
150 js_msg.position.append(0.0)
152 js_msg.name.append(
'torso_0_joint')
153 js_msg.position.append(0.0)
155 base_link_name =
'calib_{}_arm_base_link'.format(arm_name)
157 while not rospy.is_shutdown():
158 tx = ampl * math.sin(phase)
159 ty = ampl * math.sin(phase*1.1)
160 tz = ampl * math.sin(phase*1.2)
161 T_A0_A7d2 = PyKDL.Frame(PyKDL.Rotation(), PyKDL.Vector(tx, ty, tz)) * T_A0_A7d
162 elbow_circle_angle = phase*1.3
165 flip_elbow = (math.sin(phase*1.51) > 0)
166 flip_ee = (math.sin(phase*1.93) > 0)
167 flip_shoulder = (math.sin(phase*2.73) > 0)
168 q = solv.calculateIk(T_A0_A7d2, elbow_circle_angle, flip_shoulder, flip_elbow, flip_ee)
169 pt_shoulder = solv.getDebug(
'pt_shoulder')
170 elbow_pt = solv.getDebug(
'elbow_pt')
171 ee_pt = solv.getDebug(
'ee_pt')
174 if not pt_shoulder
is None and not ee_pt
is None:
175 m_id = m_pub.publishVectorMarker(pt_shoulder, ee_pt, m_id, 1, 0, 0, a=1,
176 frame=base_link_name, namespace=
'default', scale=0.01)
177 if not pt_shoulder
is None and not elbow_pt
is None:
178 m_id = m_pub.publishVectorMarker(pt_shoulder, elbow_pt, m_id, 1, 0, 0, a=1,
179 frame=base_link_name, namespace=
'default', scale=0.01)
181 m_id = m_pub.publishFrameMarker(T_A0_A7d2, m_id, scale=0.1,
182 frame=base_link_name, namespace=
'default')
183 js_msg.header.stamp = rospy.Time.now()
186 js_msg.position[i] = 0.0
188 js_msg.position[i] = q[i]
189 js_pub.publish(js_msg)
195 qx = random.gauss(0.0, 1.0)
196 qy = random.gauss(0.0, 1.0)
197 qz = random.gauss(0.0, 1.0)
198 qw = random.gauss(0.0, 1.0)
199 q_len = math.sqrt( qx**2 + qy**2 + qz**2 + qw**2 )
205 return PyKDL.Rotation.Quaternion(qx, qy, qz, qw)
208 assert arm_name
in (
'right',
'left')
211 js_pub = rospy.Publisher(
'/joint_states', JointState, queue_size=1000)
215 for flip_shoulder
in (
True,
False):
216 for flip_elbow
in (
True,
False):
217 for flip_ee
in (
True,
False):
218 flips.append( (flip_shoulder, flip_elbow, flip_ee) )
223 if arm_name ==
'right':
224 central_point = PyKDL.Vector( 0.7, -0.7, 1.4 )
226 central_point = PyKDL.Vector( 0.7, 0.7, 1.4 )
228 js_msg = JointState()
230 js_msg.name.append(
'{}_arm_{}_joint'.format(arm_name, i))
231 js_msg.position.append(0.0)
233 js_msg.name.append(
'torso_0_joint')
234 js_msg.position.append(torso_angle)
236 base_link_name =
'calib_{}_arm_base_link'.format(arm_name)
238 while not rospy.is_shutdown():
240 T_B_A7d = PyKDL.Frame(
randomOrientation(), central_point + PyKDL.Vector(random.uniform(-0.4, 0.4), random.uniform(-0.4, 0.4), random.uniform(-0.4, 0.4)))
243 m_id = m_pub.publishFrameMarker(T_B_A7d, m_id, scale=0.1,
244 frame=
'world', namespace=
'default')
246 for flip_shoulder, flip_elbow, flip_ee
in flips:
247 for elbow_circle_angle
in np.linspace(-math.pi, math.pi, 20):
248 arm_q = solv.calculateIkArm(arm_name, T_B_A7d, torso_angle, elbow_circle_angle, flip_shoulder, flip_elbow, flip_ee)
250 if not arm_q[0]
is None:
251 js_msg.header.stamp = rospy.Time.now()
253 js_msg.position[i] = arm_q[i]
254 js_pub.publish(js_msg)
256 if rospy.is_shutdown():
258 if rospy.is_shutdown():
263 rospy.init_node(
'test_velma_ik_geom', anonymous=
False)
272 printFrame( v_solv.getLeftArmFk(0.0, [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]) )
273 printFrame( v_solv.getRightArmFk(0.0, [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]) )
283 if __name__ ==
"__main__":
def testIk2(arm_name, T_A0_A7d, ampl)
This class is an interface to ROS markers publisher.
Kinematics solver (FK, IK) for WUT Velma robot.
Kinematics solver (FK, IK) for Kuka LWR 4+.