18 #include <yarp/os/all.h>
19 #include <yarp/sig/all.h>
20 #include <yarp/dev/all.h>
21 #include <iCub/ctrl/math.h>
22 #include <iCub/skinDynLib/skinContact.h>
23 #include <iCub/skinDynLib/skinContactList.h>
26 #include "robot_interfaces.h"
28 using namespace iCub::skinDynLib;
29 using namespace yarp::os;
30 using namespace yarp::sig;
31 using namespace yarp::dev;
41 class CtrlThread:
public yarp::os::PeriodicThread
44 robot_interfaces *robot;
46 double encoders_master [16];
47 double encoders_slave [16];
52 BufferedPort<iCub::skinDynLib::skinContactList> *port_skin_contacts;
53 BufferedPort<Vector> *port_left_arm;
54 BufferedPort<Vector> *port_right_arm;
57 CtrlThread(
unsigned int _period, ResourceFinder &_rf) :
58 PeriodicThread((double)_period/1000.0)
62 left_arm_master=
false;
64 stiff = _rf.check(
"stiff");
67 virtual bool threadInit()
69 robot=
new robot_interfaces(LEFT_ARM, RIGHT_ARM);
72 port_skin_contacts =
new BufferedPort<skinContactList>;
73 port_left_arm =
new BufferedPort<Vector>;
74 port_right_arm =
new BufferedPort<Vector>;
75 port_skin_contacts->open(
"/demoForceImitation/skin_contacts:i");
76 port_left_arm->open(
"/demoForceImitation/left_arm:o");
77 port_right_arm->open(
"/demoForceImitation/right_arm:o");
81 Network::connect(
"/skinManager/skin_events:o",
"/demoForceImitation/skin_contacs:i",
"tcp",
false);
84 robot->iimp[LEFT_ARM]->setImpedance(0,0.2,0.02);
85 robot->iimp[LEFT_ARM]->setImpedance(1,0.2,0.02);
86 robot->iimp[LEFT_ARM]->setImpedance(2,0.2,0.02);
87 robot->iimp[LEFT_ARM]->setImpedance(3,0.2,0.02);
88 robot->iimp[LEFT_ARM]->setImpedance(4,0.1,0.00);
90 robot->iimp[RIGHT_ARM]->setImpedance(0,0.2,0.02);
91 robot->iimp[RIGHT_ARM]->setImpedance(1,0.2,0.02);
92 robot->iimp[RIGHT_ARM]->setImpedance(2,0.2,0.02);
93 robot->iimp[RIGHT_ARM]->setImpedance(3,0.2,0.02);
94 robot->iimp[RIGHT_ARM]->setImpedance(4,0.1,0.00);
96 yInfo(
"Going to home position...");
97 for (
int i=0; i<5; i++)
100 robot->ienc[RIGHT_ARM]->getEncoder(i,&tmp_pos);
101 robot->icmd[LEFT_ARM]->setControlMode(i, VOCAB_CM_POSITION);
102 robot->icmd[RIGHT_ARM]->setControlMode(i, VOCAB_CM_POSITION);
103 robot->iint[LEFT_ARM]->setInteractionMode(i,VOCAB_IM_STIFF);
104 robot->iint[RIGHT_ARM]->setInteractionMode(i,VOCAB_IM_STIFF);
105 robot->ipos[LEFT_ARM]->setRefSpeed(i,10);
106 robot->ipos[LEFT_ARM]->positionMove(i,tmp_pos);
112 for (
int i=0; i<5; i++)
116 robot->ienc[LEFT_ARM]->getEncoder(i,&tmp_pos_l);
117 robot->ienc[RIGHT_ARM]->getEncoder(i,&tmp_pos_r);
118 if (fabs(tmp_pos_l-tmp_pos_r)<1.0) ok++;
121 yarp::os::Time::delay(1.0);
124 while (timeout < 10);
127 yError(
"Unable to reach safe initial position! Closing module");
133 yInfo(
"Position tracking started");
138 int i_touching_left=0;
139 int i_touching_right=0;
140 int i_touching_diff=0;
143 skinContactList *skinContacts = port_skin_contacts->read(
false);
146 for(skinContactList::iterator it=skinContacts->begin(); it!=skinContacts->end(); it++){
147 if(it->getBodyPart() == LEFT_ARM)
148 i_touching_left += it->getActiveTaxels();
149 else if(it->getBodyPart() == RIGHT_ARM)
150 i_touching_right += it->getActiveTaxels();
153 i_touching_diff=i_touching_left-i_touching_right;
155 if (abs(i_touching_diff)<5)
160 if (i_touching_left>i_touching_right)
162 yInfo(
"Touching left arm! \n");
163 if (!left_arm_master) change_master();
166 if (i_touching_right>i_touching_left)
168 yInfo(
"Touching right arm! \n");
169 if (left_arm_master) change_master();
174 robot->ienc[LEFT_ARM] ->getEncoders(encoders_master);
175 robot->ienc[RIGHT_ARM]->getEncoders(encoders_slave);
176 if (port_left_arm->getOutputCount()>0)
178 port_left_arm->prepare()= Vector(16,encoders_master);
179 port_left_arm->setEnvelope(info);
180 port_left_arm->write();
182 if (port_right_arm->getOutputCount()>0)
184 port_right_arm->prepare()= Vector(16,encoders_slave);
185 port_right_arm->setEnvelope(info);
186 port_right_arm->write();
189 for (
int i=jjj; i<5; i++)
191 robot->idir[RIGHT_ARM]->setPosition(i,encoders_master[i]);
196 robot->ienc[RIGHT_ARM]->getEncoders(encoders_master);
197 robot->ienc[LEFT_ARM] ->getEncoders(encoders_slave);
198 for (
int i=jjj; i<5; i++)
200 robot->idir[LEFT_ARM]->setPosition(i,encoders_master[i]);
208 left_arm_master=(!left_arm_master);
211 for (
int i=jjj; i<5; i++)
213 robot->icmd[LEFT_ARM]->setControlMode(i, VOCAB_CM_TORQUE);
214 robot->icmd[RIGHT_ARM]->setControlMode(i, VOCAB_CM_POSITION_DIRECT);
215 if (stiff==
false) robot->iint[RIGHT_ARM]->setInteractionMode(i,VOCAB_IM_COMPLIANT);
216 else robot->iint[RIGHT_ARM]->setInteractionMode(i,VOCAB_IM_STIFF);
221 for (
int i=jjj; i<5; i++)
223 robot->icmd[LEFT_ARM]->setControlMode(i, VOCAB_CM_POSITION_DIRECT);
224 if (stiff==
false) robot->iint[LEFT_ARM]->setInteractionMode(i,VOCAB_IM_COMPLIANT);
225 else robot->iint[LEFT_ARM]->setInteractionMode(i,VOCAB_IM_STIFF);
226 robot->icmd[RIGHT_ARM]->setControlMode(i, VOCAB_CM_TORQUE);
231 void closePort(Contactable *_port)
243 virtual void threadRelease()
245 for (
int i=0; i<5; i++)
247 robot->icmd[LEFT_ARM] ->setControlMode(i, VOCAB_CM_POSITION);
248 robot->icmd[RIGHT_ARM]->setControlMode(i, VOCAB_CM_POSITION);
249 robot->iint[LEFT_ARM] ->setInteractionMode(i,VOCAB_IM_STIFF);
250 robot->iint[RIGHT_ARM]->setInteractionMode(i,VOCAB_IM_STIFF);
252 closePort(port_skin_contacts);
253 closePort(port_left_arm);
254 closePort(port_right_arm);
260 class CtrlModule:
public RFModule
263 CtrlThread *control_thr;
266 virtual bool configure(ResourceFinder &rf)
268 int rate = rf.check(
"period",Value(20)).asInt32();
269 control_thr=
new CtrlThread(rate,rf);
270 if (!control_thr->start())
278 virtual double getPeriod() {
return 1.0; }
279 virtual bool updateModule() {
return true; }
289 bool respond(
const Bottle& command, Bottle& reply)
291 yInfo(
"rpc respond, still to be implemented\n");
299 CtrlModule::CtrlModule()
304 int main(
int argc,
char * argv[])
307 rf.configure(argc,argv);
311 if (rf.check(
"help"))
313 yInfo(
"help not yet implemented\n");
319 if (!yarp.checkNetwork())
321 yError(
"Sorry YARP network does not seem to be available, is the yarp server available?\n");
327 return mod.runModule(rf);