@@ -60,6 +60,7 @@ struct haldata {
6060 hal_float_t * y_offset ;
6161 hal_float_t * z_offset ;
6262 hal_float_t * tool_offset ;
63+ hal_bit_t * conventional_directions ; // default: false
6364} * haldata ;
6465
6566
@@ -140,6 +141,8 @@ int trtKinematicsSetup(const int comp_id,
140141 "%s.z-offset" ,kp -> halprefix );
141142 res += hal_pin_float_newf (HAL_IN , & (haldata -> tool_offset ), comp_id ,
142143 "%s.tool-offset" ,kp -> halprefix );
144+ res += hal_pin_bit_newf (HAL_IN , & (haldata -> conventional_directions ), comp_id ,
145+ "%s.conventional-directions" , kp -> halprefix );
143146 if (res ) {goto error ;}
144147 return 0 ;
145148
@@ -155,31 +158,31 @@ int xyzacKinematicsForward(const double *joints,
155158{
156159 (void )fflags ;
157160 (void )iflags ;
158- double x_rot_point = * (haldata -> x_rot_point );
159- double y_rot_point = * (haldata -> y_rot_point );
160- double z_rot_point = * (haldata -> z_rot_point );
161- double dt = * (haldata -> tool_offset );
162- double dy = * (haldata -> y_offset );
163- double dz = * (haldata -> z_offset );
164- double a_rad = joints [JA ]* TO_RAD ;
165- double c_rad = joints [JC ]* TO_RAD ;
166-
167- dz = dz + dt ;
168-
169- pos -> tran .x = + cos (c_rad ) * (joints [JX ] - x_rot_point )
170- + sin (c_rad ) * cos (a_rad ) * (joints [JY ] - dy - y_rot_point )
171- + sin (c_rad ) * sin (a_rad ) * (joints [JZ ] - dz - z_rot_point )
172- + sin (c_rad ) * dy
161+ const double x_rot_point = * (haldata -> x_rot_point );
162+ const double y_rot_point = * (haldata -> y_rot_point );
163+ const double z_rot_point = * (haldata -> z_rot_point );
164+ const double dt = * (haldata -> tool_offset );
165+ const double dy = * (haldata -> y_offset );
166+ const double dz = * (haldata -> z_offset ) + dt ;
167+ const double a_rad = joints [JA ]* TO_RAD ;
168+ const double c_rad = joints [JC ]* TO_RAD ;
169+
170+ const real_t con = * ( haldata -> conventional_directions ) ? 1.0 : -1.0 ;
171+
172+ pos -> tran .x = + cos (c_rad ) * (joints [JX ] - x_rot_point )
173+ - con * sin (c_rad ) * cos (a_rad ) * (joints [JY ] - dy - y_rot_point )
174+ + sin (c_rad ) * sin (a_rad ) * (joints [JZ ] - dz - z_rot_point )
175+ - con * sin (c_rad ) * dy
173176 + x_rot_point ;
174177
175- pos -> tran .y = - sin (c_rad ) * (joints [JX ] - x_rot_point )
176- + cos (c_rad ) * cos (a_rad ) * (joints [JY ] - dy - y_rot_point )
177- + cos (c_rad ) * sin (a_rad ) * (joints [JZ ] - dz - z_rot_point )
178- + cos (c_rad ) * dy
178+ pos -> tran .y = + con * sin (c_rad ) * (joints [JX ] - x_rot_point )
179+ + cos (c_rad ) * cos (a_rad ) * (joints [JY ] - dy - y_rot_point )
180+ - con * cos (c_rad ) * sin (a_rad ) * (joints [JZ ] - dz - z_rot_point )
181+ + cos (c_rad ) * dy
179182 + y_rot_point ;
180183
181184 pos -> tran .z = + 0
182- - sin (a_rad ) * (joints [JY ] - dy - y_rot_point )
185+ + con * sin (a_rad ) * (joints [JY ] - dy - y_rot_point )
183186 + cos (a_rad ) * (joints [JZ ] - dz - z_rot_point )
184187 + dz
185188 + z_rot_point ;
@@ -203,36 +206,36 @@ int xyzacKinematicsInverse(const EmcPose * pos,
203206{
204207 (void )iflags ;
205208 (void )fflags ;
206- double x_rot_point = * (haldata -> x_rot_point );
207- double y_rot_point = * (haldata -> y_rot_point );
208- double z_rot_point = * (haldata -> z_rot_point );
209- double dy = * (haldata -> y_offset );
210- double dz = * (haldata -> z_offset );
211- double dt = * (haldata -> tool_offset ) ;
212- double a_rad = pos -> a * TO_RAD ;
213- double c_rad = pos -> c * TO_RAD ;
209+ const double x_rot_point = * (haldata -> x_rot_point );
210+ const double y_rot_point = * (haldata -> y_rot_point );
211+ const double z_rot_point = * (haldata -> z_rot_point );
212+ const double dy = * (haldata -> y_offset );
213+ const double dt = * (haldata -> tool_offset );
214+ const double dz = * (haldata -> z_offset ) + dt ;
215+ const double a_rad = pos -> a * TO_RAD ;
216+ const double c_rad = pos -> c * TO_RAD ;
214217
215- EmcPose P ; // computed position
218+ const real_t con = * ( haldata -> conventional_directions ) ? 1.0 : -1.0 ;
216219
217- dz = dz + dt ;
220+ EmcPose P ; // computed position
218221
219- P .tran .x = + cos (c_rad ) * (pos -> tran .x - x_rot_point )
220- - sin (c_rad ) * (pos -> tran .y - y_rot_point )
222+ P .tran .x = + cos (c_rad ) * (pos -> tran .x - x_rot_point )
223+ + con * sin (c_rad ) * (pos -> tran .y - y_rot_point )
221224 + x_rot_point ;
222225
223- P .tran .y = + sin (c_rad ) * cos (a_rad ) * (pos -> tran .x - x_rot_point )
224- + cos (c_rad ) * cos (a_rad ) * (pos -> tran .y - y_rot_point )
225- - sin (a_rad ) * (pos -> tran .z - z_rot_point )
226- - cos (a_rad ) * dy
227- + sin (a_rad ) * dz
226+ P .tran .y = - con * sin (c_rad ) * cos (a_rad ) * (pos -> tran .x - x_rot_point )
227+ + cos (c_rad ) * cos (a_rad ) * (pos -> tran .y - y_rot_point )
228+ + con * sin (a_rad ) * (pos -> tran .z - z_rot_point )
229+ - cos (a_rad ) * dy
230+ - con * sin (a_rad ) * dz
228231 + dy
229232 + y_rot_point ;
230233
231- P .tran .z = + sin (c_rad ) * sin (a_rad ) * (pos -> tran .x - x_rot_point )
232- + cos (c_rad ) * sin (a_rad ) * (pos -> tran .y - y_rot_point )
233- + cos (a_rad ) * (pos -> tran .z - z_rot_point )
234- - sin (a_rad ) * dy
235- - cos (a_rad ) * dz
234+ P .tran .z = + sin (c_rad ) * sin (a_rad ) * (pos -> tran .x - x_rot_point )
235+ - con * cos (c_rad ) * sin (a_rad ) * (pos -> tran .y - y_rot_point )
236+ + cos (a_rad ) * (pos -> tran .z - z_rot_point )
237+ + con * sin (a_rad ) * dy
238+ - cos (a_rad ) * dz
236239 + dz
237240 + z_rot_point ;
238241
@@ -264,31 +267,31 @@ int xyzbcKinematicsForward(const double *joints,
264267 (void )fflags ;
265268 (void )iflags ;
266269 // Note: 'principal' joints are used
267- double x_rot_point = * (haldata -> x_rot_point );
268- double y_rot_point = * (haldata -> y_rot_point );
269- double z_rot_point = * (haldata -> z_rot_point );
270- double dx = * (haldata -> x_offset );
271- double dz = * (haldata -> z_offset );
272- double dt = * (haldata -> tool_offset ) ;
273- dz = dz + dt ;
274- double b_rad = joints [JB ]* TO_RAD ;
275- double c_rad = joints [ JC ] * TO_RAD ;
276-
277-
278- pos -> tran .x = cos (c_rad ) * cos (b_rad ) * (joints [JX ] - dx - x_rot_point )
279- + sin (c_rad ) * (joints [JY ] - y_rot_point )
280- - cos (c_rad ) * sin (b_rad ) * (joints [JZ ] - dz - z_rot_point )
281- + cos (c_rad ) * dx
270+ const double x_rot_point = * (haldata -> x_rot_point );
271+ const double y_rot_point = * (haldata -> y_rot_point );
272+ const double z_rot_point = * (haldata -> z_rot_point );
273+ const double dx = * (haldata -> x_offset );
274+ const double dt = * (haldata -> tool_offset );
275+ const double dz = * (haldata -> z_offset ) + dt ;
276+ const double b_rad = joints [ JB ] * TO_RAD ;
277+ const double c_rad = joints [JC ]* TO_RAD ;
278+
279+ const real_t con = * ( haldata -> conventional_directions ) ? 1.0 : -1.0 ;
280+
281+ pos -> tran .x = cos (c_rad ) * cos (b_rad ) * (joints [JX ] - dx - x_rot_point )
282+ - con * sin (c_rad ) * (joints [JY ] - y_rot_point )
283+ + con * cos (c_rad ) * sin (b_rad ) * (joints [JZ ] - dz - z_rot_point )
284+ + cos (c_rad ) * dx
282285 + x_rot_point ;
283286
284- pos -> tran .y = - sin (c_rad ) * cos (b_rad ) * (joints [JX ] - dx - x_rot_point )
285- + cos (c_rad ) * (joints [JY ] - y_rot_point )
286- + sin (c_rad ) * sin (b_rad ) * (joints [JZ ] - dz - z_rot_point )
287- - sin (c_rad ) * dx
287+ pos -> tran .y = + con * sin (c_rad ) * cos (b_rad ) * (joints [JX ] - dx - x_rot_point )
288+ + cos (c_rad ) * (joints [JY ] - y_rot_point )
289+ + sin (c_rad ) * sin (b_rad ) * (joints [JZ ] - dz - z_rot_point )
290+ + con * sin (c_rad ) * dx
288291 + y_rot_point ;
289292
290- pos -> tran .z = sin (b_rad ) * (joints [JX ] - dx - x_rot_point )
291- + cos (b_rad ) * (joints [JZ ] - dz - z_rot_point )
293+ pos -> tran .z = - con * sin (b_rad ) * (joints [JX ] - dx - x_rot_point )
294+ + cos (b_rad ) * (joints [JZ ] - dz - z_rot_point )
292295 + dz
293296 + z_rot_point ;
294297
@@ -311,33 +314,34 @@ int xyzbcKinematicsInverse(const EmcPose * pos,
311314{
312315 (void )iflags ;
313316 (void )fflags ;
314- double x_rot_point = * (haldata -> x_rot_point );
315- double y_rot_point = * (haldata -> y_rot_point );
316- double z_rot_point = * (haldata -> z_rot_point );
317- double dx = * (haldata -> x_offset );
318- double dz = * (haldata -> z_offset );
319- double dt = * (haldata -> tool_offset );
320- dz = dz + dt ;
321- double b_rad = pos -> b * TO_RAD ;
322- double c_rad = pos -> c * TO_RAD ;
323- double dpx = - cos (b_rad )* dx - sin (b_rad )* dz + dx ;
324- double dpz = sin (b_rad )* dx - cos (b_rad )* dz + dz ;
317+ const double x_rot_point = * (haldata -> x_rot_point );
318+ const double y_rot_point = * (haldata -> y_rot_point );
319+ const double z_rot_point = * (haldata -> z_rot_point );
320+ const double dx = * (haldata -> x_offset );
321+ const double dt = * (haldata -> tool_offset );
322+ const double dz = * (haldata -> z_offset ) + dt ;
323+ const double b_rad = pos -> b * TO_RAD ;
324+ const double c_rad = pos -> c * TO_RAD ;
325+ const double dpx = - cos (b_rad )* dx + sin (b_rad )* dz + dx ;
326+ const double dpz = - sin (b_rad )* dx - cos (b_rad )* dz + dz ;
327+
328+ const real_t con = * (haldata -> conventional_directions ) ? 1.0 : -1.0 ;
325329
326330 EmcPose P ; // computed position
327331
328- P .tran .x = + cos (c_rad ) * cos (b_rad ) * (pos -> tran .x - x_rot_point )
329- - sin (c_rad ) * cos (b_rad ) * (pos -> tran .y - y_rot_point )
330- + sin ( b_rad ) * (pos -> tran .z - z_rot_point )
332+ P .tran .x = + cos (c_rad ) * cos (b_rad ) * (pos -> tran .x - x_rot_point )
333+ + con * sin (c_rad ) * cos (b_rad ) * (pos -> tran .y - y_rot_point )
334+ - con * sin ( b_rad ) * (pos -> tran .z - z_rot_point )
331335 + dpx
332336 + x_rot_point ;
333337
334- P .tran .y = + sin (c_rad ) * (pos -> tran .x - x_rot_point )
335- + cos (c_rad ) * (pos -> tran .y - y_rot_point )
338+ P .tran .y = - con * sin (c_rad ) * (pos -> tran .x - x_rot_point )
339+ + cos (c_rad ) * (pos -> tran .y - y_rot_point )
336340 + y_rot_point ;
337341
338- P .tran .z = - cos (c_rad ) * sin (b_rad ) * (pos -> tran .x - x_rot_point )
339- + sin (c_rad ) * sin (b_rad ) * (pos -> tran .y - y_rot_point )
340- + cos ( b_rad ) * (pos -> tran .z - z_rot_point )
342+ P .tran .z = + con * cos (c_rad ) * sin (b_rad ) * (pos -> tran .x - x_rot_point )
343+ + sin (c_rad ) * sin (b_rad ) * (pos -> tran .y - y_rot_point )
344+ + cos ( b_rad ) * (pos -> tran .z - z_rot_point )
341345 + dpz
342346 + z_rot_point ;
343347
0 commit comments