Bipod setup
I'm trying to setup an inverted bipod, for studying purpose.
looked around for a lot, but still I didn't get to the point.
I'm trying to modify the file tripodkins.c to have my_bipod.c to compile, but I'm not sure if what I changed is ok.
I've read about in later versions of EMC2 there was a bipod.c already in ..src/emc/kinematics, but now there's not anymore.
do someone have this file to give me, or can tell me where to find it? ..so i can compare and find out any error.
thanks, dab.
Please Log in or Create an account to join the conversation.
- step4linux
- Offline
- Premium Member
- Posts: 115
- Thank you received: 5
www.linuxcnc.org/docview/html//motion_kinematics.html
Please Log in or Create an account to join the conversation.
in a lot of thread there is a suggestion to read that link, so i found it and read it already many times, and if also i found it very interesting, it doesn't help much, because doesn't tell you how to write the .c kins.
I did modify the file trivkins.cand compiled in this way:
********************************************************************/
#include "kinematics.h" /* these decls */
#include "rtapi_math.h"
int kinematicsForward(const double *joints,
EmcPose * pos,
const KINEMATICS_FORWARD_FLAGS * fflags,
KINEMATICS_INVERSE_FLAGS * iflags)
{ double Bx = 800;
double AD2 = joints[0] * joints[0];
double BD2 = joints[1] * joints[1];
double x = (AD2 - BD2 + Bx * Bx) / (2 * Bx);
double y2 = AD2 - x * x;
if(y2 < 0) return -1;
pos->tran.x = x;
pos->tran.y = sqrt(y2);
return 0;
}
int kinematicsInverse(const EmcPose * pos,
double *joints,
const KINEMATICS_INVERSE_FLAGS * iflags,
KINEMATICS_FORWARD_FLAGS * fflags)
{ double Bx = 800;
double x2 = pos->tran.x * pos->tran.x;
double y2 = pos->tran.y * pos->tran.y;
double xx2 = (Bx - pos->tran.x) * (Bx - pos->tran.x);
joints[0] = sqrt(x2 + y2);
joints[1] = sqrt(xx2 + y2);
return 0;
}
/* implemented for these kinematics as giving joints preference */
int kinematicsHome(EmcPose * world,
double *joint,
KINEMATICS_FORWARD_FLAGS * fflags,
KINEMATICS_INVERSE_FLAGS * iflags)
{
*fflags = 0;
*iflags = 0;
return kinematicsForward(joint, world, fflags, iflags);
}
KINEMATICS_TYPE kinematicsType()
{
return KINEMATICS_BOTH;
}
#include "rtapi.h" /* RTAPI realtime OS API */
#include "rtapi_app.h" /* RTAPI realtime module decls */
#include "hal.h"
EXPORT_SYMBOL(kinematicsType);
EXPORT_SYMBOL(kinematicsForward);
EXPORT_SYMBOL(kinematicsInverse);
MODULE_LICENSE("GPL");
int comp_id;
int rtapi_app_main(void) {
comp_id = hal_init("trivkins");
if(comp_id > 0) {
hal_ready(comp_id);
return 0;
}
return comp_id;
}
void rtapi_app_exit(void) { hal_exit(comp_id); }
then when compiling:
dab-cnc@dab-cnc-desktop:~$ sudo comp --compile trivkins.c
make -C /usr/src/linux-headers-2.6.24-16-rtai SUBDIRS=`pwd` CC=gcc V=0 -o /Module.symvers modules
make[1]: ingresso nella directory «/usr/src/linux-headers-2.6.24-16-rtai»
CC [M] /tmp/tmp04BYj4/trivkins.o
Building modules, stage 2.
MODPOST 1 modules
WARNING: "hal_init" [/tmp/tmp04BYj4/trivkins.ko] undefined!
WARNING: "hal_exit" [/tmp/tmp04BYj4/trivkins.ko] undefined!
WARNING: "hal_ready" [/tmp/tmp04BYj4/trivkins.ko] undefined!
CC /tmp/tmp04BYj4/trivkins.mod.o
LD [M] /tmp/tmp04BYj4/trivkins.ko
make[1]: uscita dalla directory «/usr/src/linux-headers-2.6.24-16-rtai»
dab-cnc@dab-cnc-desktop:~$ sudo cp trivkins.ko /usr/realtime-2.6.24-16-rtai/modules/emc2/
dab-cnc@dab-cnc-desktop:~$
then when i run the machine in joint mode it's all ok, then i zero my axes, but when i try to change into world mode i have this error (in the terminal):
dab-cnc@dab-cnc-desktop:~$ emc /home/dab-cnc/emc2/configs/Prova_Bipod/Prova_Bipod.ini
EMC2 - 2.4.3
Machine configuration directory is '/home/dab-cnc/emc2/configs/Prova_Bipod'
Machine configuration file is 'Prova_Bipod.ini'
Starting EMC2...
*********************************WARN_ONCE*********************************
File r300_render.c function r300Fallback line 470
Software fallback:ctx->Line.StippleFlag
***************************************************************************
[b]joint 1 following error
emc/task/taskintf.cc 611: Error on axis 1, command number 111[/b]
Shutting down and cleaning up EMC2...
Cleanup done
dab-cnc@dab-cnc-desktop:~$
Can you help me?
Please Log in or Create an account to join the conversation.
- step4linux
- Offline
- Premium Member
- Posts: 115
- Thank you received: 5
I did a dualbipod, and started like you did with trivkins.
You can find it here code.google.com/p/emc2hotwinch/ .
From your code two things I see:
1. You must insert the name of your own kinematics here, instead of trivkins:
comp_id = hal_init("trivkins");
EDIT: okay I have seen you still use the the name trivkins for your own kinematics
2. you should leave all the simple equations in the code, like
joints[2] = pos.tran->z
etc
pos.tran->z = joints[2]
etc
for all joints and all axis.
EDIT: of course except for those you have your own equation.
Gerd
Please Log in or Create an account to join the conversation.
thanks!
Please Log in or Create an account to join the conversation.
it return the same error.
code now is:
#include "kinematics.h" /* these decls */
#include "rtapi_math.h"
int kinematicsForward(const double *joints,
EmcPose * pos,
const KINEMATICS_FORWARD_FLAGS * fflags,
KINEMATICS_INVERSE_FLAGS * iflags)
{ double Bx = 800;
double AD2 = joints[0] * joints[0];
double BD2 = joints[1] * joints[1];
double x = (AD2 - BD2 + Bx * Bx) / (2 * Bx);
double y2 = AD2 - x * x;
if(y2 < 0) return -1;
pos->tran.x = x;
pos->tran.y = sqrt(y2);
pos->tran.z = joints[2];
pos->a = joints[3];
pos->b = joints[4];
pos->c = joints[5];
pos->u = joints[6];
pos->v = joints[7];
pos->w = joints[8];
return 0;
}
int kinematicsInverse(const EmcPose * pos,
double *joints,
const KINEMATICS_INVERSE_FLAGS * iflags,
KINEMATICS_FORWARD_FLAGS * fflags)
{ double Bx = 800;
double x2 = pos->tran.x * pos->tran.x;
double y2 = pos->tran.y * pos->tran.y;
double xx2 = (Bx - pos->tran.x) * (Bx - pos->tran.x);
joints[0] = sqrt(x2 + y2);
joints[1] = sqrt(xx2 + y2);
joints[2] = pos->tran.z;
joints[3] = pos->a;
joints[4] = pos->b;
joints[5] = pos->c;
joints[6] = pos->u;
joints[7] = pos->v;
joints[8] = pos->w;
return 0;
}
/* implemented for these kinematics as giving joints preference */
int kinematicsHome(EmcPose * world,
double *joint,
KINEMATICS_FORWARD_FLAGS * fflags,
KINEMATICS_INVERSE_FLAGS * iflags)
{
*fflags = 0;
*iflags = 0;
return kinematicsForward(joint, world, fflags, iflags);
}
KINEMATICS_TYPE kinematicsType()
{
return KINEMATICS_BOTH;
}
#include "rtapi.h" /* RTAPI realtime OS API */
#include "rtapi_app.h" /* RTAPI realtime module decls */
#include "hal.h"
EXPORT_SYMBOL(kinematicsType);
EXPORT_SYMBOL(kinematicsForward);
EXPORT_SYMBOL(kinematicsInverse);
MODULE_LICENSE("GPL");
int comp_id;
int rtapi_app_main(void) {
comp_id = hal_init("trivkins");
if(comp_id > 0) {
hal_ready(comp_id);
return 0;
}
return comp_id;
}
void rtapi_app_exit(void) { hal_exit(comp_id); }
any other idea?
Please Log in or Create an account to join the conversation.
any other idea?
Have you checked that the forward and inverse kinematics are exactly equivalent? If you run one then the other, you should end up where you started from. Excel can be useful for checking these things.
I am not sure overwriting trivkins was a great plan.
You probably should use comp --install rather than --compile.
Please Log in or Create an account to join the conversation.
- step4linux
- Offline
- Premium Member
- Posts: 115
- Thank you received: 5
I think you can compile with --compile, and then install it manually with something like
sudo cp dualbipod.ko /usr/realtime-2.6.24-16-rtai/modules/emc2/
Gerd
Please Log in or Create an account to join the conversation.
yes, that's exactly how i'm compiling till now.
and ok, i'm going to change the name of the module, promise..
@andypugh:
what do you mean for "exactly equivalent?"
the formulas i've wrote are perfectly the same that you find on the kinematics documentation
linuxcnc.org/docs/html/motion_kinematics.html . I just copied the kins formulas to 'evaluate' the bipod functionality, but it doesn't work.
can be maybe 'cause I have EMC2 (2.4.3) installed natively with the UBU8.04_emc2, ant then I downloaded the src packet to take the kins*.c to modify?
Help!!
Please Log in or Create an account to join the conversation.
what do you mean for "exactly equivalent?"
I mean "Is one the exact inverse of the other for all input values?"
Apologies for being too lazy to go through your code, but one possibility is that the equations break down for negative values.
can be maybe 'cause I have EMC2 (2.4.3) installed natively with the UBU8.04_emc2, ant then I downloaded the src packet to take the kins*.c to modify?
That shouldn't matter. You might need to sudo comp --install, but I think you are probably already doing that.
Please Log in or Create an account to join the conversation.