00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "universalservo.h"
00039 #include <assert.h>
00040
00041 namespace lpzrobots {
00042
00043 UniversalServo::UniversalServo(UniversalJoint* joint, double min1, double max1, double power1,
00044 double min2, double max2, double power2)
00045 : pid1(power1, 2.0, 0.3 ), pid2(power2, 2.0, 0.3 ), joint(joint)
00046 {
00047 assert(min1 <= 0 && min1 <= max1);
00048 assert(min2 <= 0 && min2 <= max2);
00049 this->min1 = min1;
00050 this->max1 = max1;
00051 this->min2 = min2;
00052 this->max2 = max2;
00053 }
00054
00055 void UniversalServo::set(double pos1, double pos2){
00056 if(pos1 > 0){
00057 pos1 *= max1;
00058 }else{
00059 pos1 *= -min1;
00060 }
00061 pid1.setTargetPosition(pos1);
00062 double force1 = pid1.stepWithD(joint->getPosition1(), joint->getPosition1Rate());
00063 if(pos2 > 0){
00064 pos2 *= max2;
00065 }else{
00066 pos2 *= -min2;
00067 }
00068 pid2.setTargetPosition(pos2);
00069 double force2 = pid2.stepWithD(joint->getPosition2(), joint->getPosition2Rate());
00070
00071 joint->addTorques(force1, force2);
00072 }
00073
00074 double UniversalServo::get1(){
00075 double pos = joint->getPosition1();
00076 if(pos > 0){
00077 pos /= max1;
00078 }else{
00079 pos /= -min1;
00080 }
00081 return pos;
00082 }
00083
00084 double UniversalServo::get2(){
00085 double pos = joint->getPosition2();
00086 if(pos > 0){
00087 pos /= max2;
00088 }else{
00089 pos /= -min2;
00090 }
00091 return pos;
00092 }
00093
00094 void UniversalServo::get(double& p1, double& p2){
00095 p1 = get1();
00096 p2 = get2();
00097 }
00098
00099
00100 void UniversalServo::setPower(double power1, double power2){
00101 pid1.setKP(power1);
00102 pid2.setKP(power2);
00103 }
00104
00105
00106 }