fs100_cmd.cpp
Go to the documentation of this file.
00001 /*********************************************************************
00002  *
00003  * C++ class for continous trajectory point streaming using FS100 controller mh5l robot
00004  * Author: Asger Winther-Jørgensen (awijor@elektro.dtu.dk)
00005  *
00006  * Software License Agreement (LGPL License)
00007  *
00008  *  Copyright (c) 2014, Technical University of Denmark
00009  *  All rights reserved.
00010  
00011  *  This program is free software; you can redistribute it and/or modify  
00012  *  it under the terms of the GNU Lesser General Public License as        
00013  *  published by the Free Software Foundation; either version 2 of the    
00014  *  License, or (at your option) any later version.                       
00015  *                                                                        
00016  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00017  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00018  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00019  *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00020  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00021  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00022  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00023  *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00024  *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00025  *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00026  *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00027  *  POSSIBILITY OF SUCH DAMAGE.
00028  *********************************************************************/
00029 
00030 #include "fs100_cmd.h"
00031 
00032 int Fs100Cmd::init()
00033 {
00034     /*
00035     Initializes the class instance, setting up sockect and variables.
00036     
00037     */
00038     sockfd = socket(AF_INET, SOCK_STREAM, 0);
00039     int opt = setsockopt( sockfd, IPPROTO_TCP, TCP_NODELAY, (void *)&i, sizeof(i));
00040     setsockopt( sockfd, IPPROTO_TCP, TCP_QUICKACK, (void *)&i, sizeof(i));
00041     setsockopt( sockfd, IPPROTO_TCP, TCP_QUICKACK, (void *)&i, sizeof(i));
00042     if (sockfd < 0) 
00043         socketError("ERROR opening socket");
00044     server = gethostbyname(IP);
00045     if (server == NULL)
00046     {
00047         fprintf(stderr,"ERROR, no such host\n");
00048         return 1;
00049     }
00050     bzero((char *) &serv_addr, sizeof(serv_addr));
00051     serv_addr.sin_family = AF_INET;
00052     bcopy((char *)server->h_addr, 
00053          (char *)&serv_addr.sin_addr.s_addr,
00054          server->h_length);
00055     serv_addr.sin_port = htons(portno);
00056     thread_sleep = 1000; //microseconds for thread to sleep
00057 
00058     
00059     printf("robot commander init done\n");
00060     seq = 0;
00061     stop_all = false;
00062     return 0;
00063 }
00064 
00065 
00066 
00067 int Fs100Cmd::makeConnect()
00068 {
00069     /*
00070     Connects to the robot controller motion server.
00071     */
00072     if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
00073     {
00074         socketError("ERROR connecting");
00075         return 1;
00076     }
00077     return 0;    
00078 }
00079 
00080 void *Fs100Cmd::cmdPushThread(void *This)
00081 {
00082     /*
00083     Function wrapper for starting thread inside class.
00084     */
00085     ((Fs100Cmd *) This)->cmdPush();
00086 }
00087 
00088 void Fs100Cmd::cmdPush()
00089 {
00090     /*
00091     Sends the next trajectory point in queue to the robot controller. 
00092     Tries to send until point has been accepted whereafter it is popped from queue.
00093     */    
00094     while(run_thread && !stop_all)
00095     {
00096         
00097         int retry = 1;
00099         while(!cmdList.empty())
00100         { //executing list as fast as posible
00101             
00102             //get next command in queue
00103             cmd currentCmd = cmdList.front();
00104             
00105             
00106             pushTraj(currentCmd.pos,currentCmd.vel,currentCmd.time,seq);
00107             
00108             
00109             
00110             seq ++;
00111             cmdList.pop();
00112         }
00113         usleep(thread_sleep); //wait for non empty cmd list
00114 
00115     }
00116 
00117 }
00118 
00119 int Fs100Cmd::start(int retry)
00120 {
00121     /*
00122     Starts the first trajectory by sending start trajectory message to robot controller.
00123     */
00124     abs_time = 0.0;
00125     run_thread = 1;
00126     char motion_buf[68];
00127     char motion_reply_buffer[76];
00128     
00129     SimpleMsg traj_start, motion_check;
00130     
00131     printf("sending motion check message\n");
00132     /*
00133     motion_ready(&motion_check);
00134     serialize(&motion_check,motion_buf,sizeof(motion_buf));
00135     byte_swap(motion_buf,sizeof(motion_buf));
00136     n = write(sockfd,motion_buf,sizeof(motion_buf));
00137     if (n < 0) 
00138         socket_error("ERROR writing motion check to socket");
00139     n = recv(sockfd,motion_reply_buffer,sizeof(motion_reply_buffer),0);
00140     byte_swap(motion_reply_buffer,sizeof(motion_reply_buffer));
00141     deserialize_motion_reply(motion_reply_buffer,&motion_rpl);
00142     if (motion_rpl.body.motionReply.result == 0){
00143         retry = 0;
00144     }
00145     else{
00146         print_error_code_msg(&motion_rpl);
00147         print_motion_reply(&motion_rpl);
00148         //return 1;
00149     }
00150     printf("seq: %d\n",seq);
00151 
00152     
00153     printf("\n\nmotion ready sent, reply:\n");
00154 
00155     print_error_code_msg(&motion_rpl);
00156     
00157     usleep(2000000); //2 second
00158     */ //Code not used. Motion check message returns error if servo is off (trajectory not started)
00159     printf("sending trajecotry start message\n");
00160     int last_result = 0;
00161     int last_subcode = 0;
00162     int result;
00163     int subcode;
00164     while(retry && !stop_all)
00165     {
00166         trajectoryStart(&traj_start);
00167         serialize(&traj_start,motion_buf,sizeof(motion_buf));
00168         byteSwap(motion_buf,sizeof(motion_buf));
00169         n = write(sockfd,motion_buf,sizeof(motion_buf));
00170         if (n < 0) 
00171             socketError("ERROR writing trajectory start to socket");
00172         n = recv(sockfd,motion_reply_buffer,sizeof(motion_reply_buffer),0);
00173         byteSwap(motion_reply_buffer,sizeof(motion_reply_buffer));
00174         deserializeMotionReply(motion_reply_buffer,&motion_rpl);
00175         result = motion_rpl.body.motionReply.result;
00176         subcode = motion_rpl.body.motionReply.subcode;
00177         if (motion_rpl.body.motionReply.result != 0)
00178         { //no success
00179             if (last_result != result || last_subcode != subcode)
00180                 printErrorCodeMsg(&motion_rpl);
00181         }
00182         else
00183         {
00184             retry = 0;
00185         }
00186         last_subcode = subcode;
00187         last_result = result;
00188     }
00189     printErrorCodeMsg(&motion_rpl);
00190     
00191     
00192     
00193     pthread_create(&cmdthreadID,NULL,cmdPushThread,this);
00194     return 0; 
00195 }
00196 
00197 bool Fs100Cmd::pushTraj(float pos[6],float vel[6],float time,int seq)
00198 {
00199     /*
00200     Sends the given data as a trajectoryPointFull to robot controller.
00201     */
00202     abs_time += time;
00203     //printf("abs time sent: %f\n",abs_time);
00204     SimpleMsg traj;
00205     buildTrajFull(&traj,pos,vel,abs_time,seq);
00206     serialize(&traj,traj_buffer,sizeof(traj_buffer));
00207     byteSwap(traj_buffer,sizeof(traj_buffer));
00208     int retry = 1;
00209     while(retry && !stop_all)
00210     {
00211         write(sockfd,traj_buffer,sizeof(traj_buffer));
00212         recv(sockfd,motion_reply_buffer,sizeof(motion_reply_buffer),0);
00213         byteSwap(motion_reply_buffer,sizeof(motion_reply_buffer));
00214         deserializeMotionReply(motion_reply_buffer,&motion_rpl);
00215         
00216         if(motion_rpl.body.motionReply.result == 1); //printf("result: BUSY\n");
00217         else if (motion_rpl.body.motionReply.result == 0)
00218         {
00219             retry = 0;
00220         }
00221         else
00222         {
00223             printErrorCodeMsg(&motion_rpl);
00224             retry = 0;
00225         }
00226 
00227     }
00228     return true;
00229 
00230 }
00231 
00232 bool Fs100Cmd::addCmdToQueue(cmd cmd_point)
00233 {
00234     /*
00235     Adds trajectory point in cmd_point format to queue.
00236     */
00237     cmdList.push(cmd_point);
00238 }
00239 
00240 bool Fs100Cmd::addPointToQueue(float pos[6],float vel[6],float time)
00241 {
00242     /*
00243     add data to cmd queue.
00244     */
00245     cmd temp;
00246     for(int i=0;i<6;i++)
00247     {
00248         temp.pos[i] = pos[i];
00249         temp.vel[i] = vel[i];
00250     }
00251     temp.time = time;
00252     cmdList.push(temp);
00253 }
00254 
00255 bool Fs100Cmd::resetTrajectory(int *retry)
00256 {
00257     /*
00258     Resets the trajectory by stopping trajectory, reseting variables and starting new trajectory.
00259     */
00260     //stop current trajectory, if any
00261     printf("reseting buffer\n");
00262     SimpleMsg traj_stop, m_reply;
00263     char motion_buf[68];
00264     char motion_reply_buffer[76];
00265     trajectoryStop(&traj_stop);
00266     serialize(&traj_stop,motion_buf,sizeof(motion_buf));
00267     byteSwap(motion_buf,sizeof(motion_buf));
00268     n = write(sockfd,motion_buf,sizeof(motion_buf));
00269     if (n < 0) 
00270         socketError("ERROR writing trajectory stop to socket");
00271     n = recv(sockfd,motion_reply_buffer,sizeof(motion_reply_buffer),0);
00272     byteSwap(motion_reply_buffer,sizeof(motion_reply_buffer));
00273     deserializeMotionReply(motion_reply_buffer,&m_reply);
00274     printf("reset:\n");
00275     printErrorCodeMsg(&m_reply);
00276     
00277     // start new trajectory
00278     SimpleMsg traj_start;
00279     printf("sending trajecotry start message\n");
00280     int last_result = 0;
00281     int last_subcode = 0;
00282     int result;
00283     int subcode;
00284     bool run = true;
00285     while(*retry && run)
00286     {
00287         //printf("alive and stop_all is %d\n",stop_all);
00288         trajectoryStart(&traj_start);
00289         serialize(&traj_start,motion_buf,sizeof(motion_buf));
00290         byteSwap(motion_buf,sizeof(motion_buf));
00291         n = write(sockfd,motion_buf,sizeof(motion_buf));
00292         if (n < 0) 
00293             socketError("ERROR writing trajectory start to socket");
00294         n = recv(sockfd,motion_reply_buffer,sizeof(motion_reply_buffer),0);
00295         byteSwap(motion_reply_buffer,sizeof(motion_reply_buffer));
00296         deserializeMotionReply(motion_reply_buffer,&m_reply);
00297         
00298         result = m_reply.body.motionReply.result;
00299         subcode = m_reply.body.motionReply.subcode;
00300         if (m_reply.body.motionReply.result != 0)
00301         { //no success
00302             if (last_result != result || last_subcode != subcode)
00303                 printErrorCodeMsg(&m_reply);
00304         }
00305         else
00306         {
00307             last_subcode = subcode;
00308             last_result = result;
00309             run = false;
00310         }
00311 
00312         last_subcode = subcode;
00313         last_result = result;
00314     }
00315     printErrorCodeMsg(&m_reply);
00316     abs_time = 0.0;
00317     seq = 0;
00318     
00319     
00320     return true;
00321 }
00322 
00323 void Fs100Cmd::socketError(const char *msg)
00324 {
00325     /*
00326     print sockect error
00327     */
00328     perror(msg);
00329     return;
00330 }
00331 
00332 void Fs100Cmd::byteSwap(char* data,int length)
00333 { //destructive
00334     /*
00335     Swap endian of integer/float array
00336     */
00337     char buffer[length];
00338     memcpy(buffer,data,length);
00339     for(int i=0;i<length/4;i++)
00340     { //number of int/float
00341         for(int k = 0;k<4;k++)
00342         { //for every byte in int/float
00343             data[(i*4)+k] = buffer[(i*4)+(3-k)];
00344             
00345         }
00346     }
00347 }
00348 
00349 void Fs100Cmd::serialize(SimpleMsg *msg, char *data,int size)
00350 {
00351     memcpy(data,msg,size);
00352 }
00353 
00354 
00355 
00356 void Fs100Cmd::deserializeMotionReply(char *data,SimpleMsg *msg)
00357 {
00358     /*
00359     inteprets serialized SimpleMsg and stores in provided SimpleMsg address.
00360     */
00361     int *q = (int*)data;
00362     //prefix
00363     msg->prefix.length =  *q; q++;
00364     //header
00365     msg->header.msgType = (SmMsgType) *q; q++;
00366     msg->header.commType =(SmCommType) *q; q++;
00367     msg->header.replyType = (SmReplyType) *q; q++;
00368     //body
00369     msg->body.motionReply.groupNo = *q; q++;
00370     msg->body.motionReply.sequence = *q; q++;
00371     msg->body.motionReply.command = *q; q++;
00372     msg->body.motionReply.result = (SmResultType) *q; q++;
00373     msg->body.motionReply.subcode = *q; q++;
00374     for(int i=0;i<10;i++){
00375         msg->body.motionReply.data[i] = *(float*)q; q++;
00376     }    
00377 }
00378 
00379 void Fs100Cmd::printMotionReply(SimpleMsg *msg)
00380 {
00381     /*
00382     For easy printing of motion reply msg to terminal.
00383     */
00384     printf("Prefix:\n");
00385     printf("  length: %d\n",msg->prefix.length);
00386     printf("header:\n");
00387     printf("  msgType: %d\n",msg->header.msgType);
00388     printf("  commType: %d\n",msg->header.commType);
00389     printf("  replyType: %d\n",msg->header.replyType);
00390     printf("body:\n");
00391     printf("  motionReply:\n");
00392     printf("    groupNo: %d\n",msg->body.motionReply.groupNo);
00393     printf("    sequence: %d\n",msg->body.motionReply.sequence);
00394     printf("    command: %d\n",msg->body.motionReply.command);
00395     printf("    result: %d\n",msg->body.motionReply.result);
00396     printf("    subcode: %d\n",msg->body.motionReply.subcode);
00397     printf("    data:\n");
00398     for(int i=0;i<10;i++){
00399         printf("      data[%d]: %f\n",i,msg->body.motionReply.data[i]);
00400     }
00401 }
00402     
00403 void Fs100Cmd::printTrajFull(SimpleMsg *msg)
00404 {
00405     /*
00406     For easy printing of joint trajectory point full msg to terminal.
00407     */
00408     printf("Prefix:\n");
00409     printf("  length: %d\n",msg->prefix.length);
00410     printf("header:\n");
00411     printf("  msgType: %d\n",msg->header.msgType);
00412     printf("  commType: %d\n",msg->header.commType);
00413     printf("  replyType: %d\n",msg->header.replyType);
00414     printf("body:\n");
00415     printf("  jointTrajData:\n");
00416     printf("    groupNo: %d\n",msg->body.jointTrajData.groupNo);
00417     printf("    validFields: %d\n",msg->body.jointTrajData.validFields);
00418     printf("    sequence: %d\n",msg->body.jointTrajData.sequence);
00419     printf("    time: %f\n",msg->body.jointTrajData.time);
00420     printf("    pos:\n");
00421     for(int i=0;i<10;i++)
00422     {
00423         printf("      joint[%d]: %f\n",i+1,msg->body.jointTrajData.pos[i]);
00424     }
00425     printf("    vel:\n");
00426     for(int i=0;i<10;i++)
00427     {
00428         printf("      joint[%d]: %f\n",i+1,msg->body.jointTrajData.vel[i]);
00429     }
00430     printf("    acc:\n");
00431     for(int i=0;i<10;i++)
00432     {
00433         printf("      joint[%d]: %f\n",i+1,msg->body.jointTrajData.acc[i]);
00434     }
00435 }
00436 
00437 void Fs100Cmd::printErrorCodeMsg(SimpleMsg *msg)
00438 {
00439     /*
00440     print error code from motion reply. Can be used to gain information about type of error.
00441     */
00442     printf("Result code: ");
00443     int result = msg->body.motionReply.result;
00444     int subcode = msg->body.motionReply.subcode;
00445     if (result == ROS_RESULT_SUCCESS || result == ROS_RESULT_TRUE){
00446         printf("success\n");
00447     }
00448     else printf("error!\n");
00449     printf("  Result type: %d, ",result);
00450     if(result == ROS_RESULT_SUCCESS) printf("success/true\n");
00451     else if(result == ROS_RESULT_TRUE) printf("success/true\n");
00452     else if(result == ROS_RESULT_BUSY) printf("busy\n");
00453     else if(result == ROS_RESULT_FAILURE) printf("failure/false\n");
00454     else if(result == ROS_RESULT_FALSE) printf("failure/false\n");
00455     else if(result == ROS_RESULT_INVALID) printf("invalid\n");
00456     else if(result == ROS_RESULT_ALARM) printf("alarm\n");
00457     else if(result == ROS_RESULT_NOT_READY) printf("not ready\n");
00458     else if(result == ROS_RESULT_MP_FAILURE) printf("mp failure\n");
00459     if (result != ROS_RESULT_SUCCESS && result!=ROS_RESULT_TRUE)
00460     {
00461         printf("  Subcode type: %d, ",subcode);
00462         if(subcode == ROS_RESULT_INVALID_UNSPECIFIED) printf("invalid unspecified\n");
00463         else if (subcode == ROS_RESULT_INVALID_MSGSIZE) printf("invalid message size\n");
00464         else if (subcode == ROS_RESULT_INVALID_MSGHEADER) printf("invalid message header\n");
00465         else if (subcode == ROS_RESULT_INVALID_MSGTYPE) printf("invalid message type\n");
00466         else if (subcode == ROS_RESULT_INVALID_GROUPNO) printf("invalid groupno\n");
00467         else if (subcode == ROS_RESULT_INVALID_SEQUENCE) printf("invalid sequence\n");
00468         else if (subcode == ROS_RESULT_INVALID_COMMAND) printf("invalid command\n");
00469         else if (subcode == ROS_RESULT_INVALID_DATA) printf("invalid data\n");
00470         else if (subcode == ROS_RESULT_INVALID_DATA_START_POS) printf("invalid data start position\n");
00471         else if (subcode == ROS_RESULT_INVALID_DATA_POSITION) printf("invalid data position\n");
00472         else if (subcode == ROS_RESULT_INVALID_DATA_SPEED) printf("invalid data speed\n");
00473         else if (subcode == ROS_RESULT_INVALID_DATA_ACCEL) printf("invalid data acceleration\n");
00474         else if (subcode == ROS_RESULT_INVALID_DATA_INSUFFICIENT) printf("invalid data insufficient\n");
00475         else if (subcode == ROS_RESULT_NOT_READY_UNSPECIFIED) printf("not ready unspecified\n");
00476         else if (subcode == ROS_RESULT_NOT_READY_ALARM) printf("not ready alarm\n");
00477         else if (subcode == ROS_RESULT_NOT_READY_ERROR) printf("not ready error\n");
00478         else if (subcode == ROS_RESULT_NOT_READY_ESTOP) printf("not ready emergency stop\n");
00479         else if (subcode == ROS_RESULT_NOT_READY_NOT_PLAY) printf("not ready not in play\n");
00480         else if (subcode == ROS_RESULT_NOT_READY_NOT_REMOTE) printf("not ready not in remote\n");
00481         else if (subcode == ROS_RESULT_NOT_READY_SERVO_OFF) printf("not ready servo power off\n");
00482         else if (subcode == ROS_RESULT_NOT_READY_HOLD) printf("not ready hold\n");
00483         else if (subcode == ROS_RESULT_NOT_READY_NOT_STARTED) printf("not ready not started\n");
00484         else if (subcode == ROS_RESULT_NOT_READY_WAITING_ROS) printf("not ready waiting for ROS\n");
00485         else if (subcode == ROS_RESULT_NOT_READY_SKILLSEND) printf("not ready skillsend\n");
00486     }
00487     else printf("  Subcode type: 0, success\n");
00488 }
00489 
00490 
00491 int Fs100Cmd::buildTrajPos(SimpleMsg *tm,float pos[6],float time,int seq)
00492 {
00493     /*
00494     build trajectory point position (vel and acc = 0) message using provided data.
00495     */
00496     // set prefix: length of message excluding the prefix
00497         tm->prefix.length = sizeof(SmHeader) + sizeof(SmBodyJointTrajPtFull);
00498         
00499         // set header information
00500         tm->header.msgType = ROS_MSG_JOINT_TRAJ_PT_FULL;
00501         tm->header.commType = ROS_COMM_SERVICE_RESQUEST;
00502         tm->header.replyType = ROS_REPLY_INVALID;
00503         
00504         // set body
00505         tm->body.jointTrajData.groupNo = 0;
00506         tm->body.jointTrajData.validFields = 7;
00507         tm->body.jointTrajData.sequence = seq;
00508         tm->body.jointTrajData.time = time;
00509         for(int i=0;i<6;i++)
00510         {
00511         tm->body.jointTrajData.pos[i] = pos[i];
00512         tm->body.jointTrajData.vel[i] = (float)0.0;
00513         tm->body.jointTrajData.acc[i] = (float)0.0;
00514         }
00515         for(int i=6;i<10;i++)
00516         {
00517         tm->body.jointTrajData.pos[i] = (float)0.0;
00518         tm->body.jointTrajData.vel[i] = (float)0.0;
00519         tm->body.jointTrajData.acc[i] = (float)0.0;
00520         }
00521 
00522 }
00523 
00524 int Fs100Cmd::buildTrajFull(SimpleMsg *tm,float pos[6],float vel[6],float time,int seq)
00525 {
00526     /*
00527     build trajectory point full message using provided data.
00528     */
00529     // set prefix: length of message excluding the prefix
00530         tm->prefix.length = sizeof(SmHeader) + sizeof(SmBodyJointTrajPtFull);
00531         
00532         // set header information
00533         tm->header.msgType = ROS_MSG_JOINT_TRAJ_PT_FULL;
00534         tm->header.commType = ROS_COMM_SERVICE_RESQUEST;
00535         tm->header.replyType = ROS_REPLY_INVALID;
00536         
00537         // set body
00538         tm->body.jointTrajData.groupNo = 0;
00539         tm->body.jointTrajData.validFields = 7;
00540         tm->body.jointTrajData.sequence = seq;
00541         tm->body.jointTrajData.time = time;
00542         for(int i=0;i<6;i++)
00543         {
00544         tm->body.jointTrajData.pos[i] = pos[i];
00545         tm->body.jointTrajData.vel[i] = vel[i];
00546         tm->body.jointTrajData.acc[i] = (float)0.0;
00547         }
00548         for(int i=6;i<10;i++)
00549         {
00550         tm->body.jointTrajData.pos[i] = (float)0.0;
00551         tm->body.jointTrajData.vel[i] = (float)0.0;
00552         tm->body.jointTrajData.acc[i] = (float)0.0;
00553         }
00554 
00555 }
00556 
00557 int Fs100Cmd::getLength(char* data)
00558 {
00559     /*
00560     returns length of provided serialized Simplemsg.
00561     */
00562     int length = *(int*) data;
00563     return length;
00564 }
00565 
00566 void Fs100Cmd::motionReady(SimpleMsg *msg)
00567 {
00568     /*
00569     Create and return motion check ready Simplemsg.
00570     */
00571     //prefix
00572     msg->prefix.length = sizeof(SmHeader) + sizeof(SmBodyMotoMotionCtrl);
00573     //header
00574     msg->header.msgType = ROS_MSG_MOTO_MOTION_CTRL;
00575     msg->header.commType = ROS_COMM_SERVICE_RESQUEST;
00576     msg->header.replyType = ROS_REPLY_INVALID;
00577     //body
00578     msg->body.motionCtrl.groupNo = 0;
00579     msg->body.motionCtrl.sequence = 0;
00580     msg->body.motionCtrl.command = ROS_CMD_CHECK_MOTION_READY;
00581     for(int i=0;i<10;i++)
00582     {
00583         msg->body.motionCtrl.data[i] = (float) 0.0;
00584     }
00585 }
00586 
00587 void Fs100Cmd::trajectoryStart(SimpleMsg *msg)
00588 {
00589     /*
00590     Create and return trajectory start Simplemsg.
00591     */
00592     //prefix
00593     msg->prefix.length = sizeof(SmHeader) + sizeof(SmBodyMotoMotionCtrl);
00594     //header
00595     msg->header.msgType = ROS_MSG_MOTO_MOTION_CTRL;
00596     msg->header.commType = ROS_COMM_SERVICE_RESQUEST;
00597     msg->header.replyType = ROS_REPLY_INVALID;
00598     //body
00599     msg->body.motionCtrl.groupNo = 0;
00600     msg->body.motionCtrl.sequence = 0;
00601     msg->body.motionCtrl.command = ROS_CMD_START_TRAJ_MODE;
00602     for(int i=0;i<10;i++)
00603     {
00604         msg->body.motionCtrl.data[i] = (float) 0.0;
00605     }
00606 }
00607 
00608 void Fs100Cmd::trajectoryStop(SimpleMsg *msg)
00609 {
00610     /*
00611     Create and retyrn trajectory stop Simplemsg.
00612     */
00613     //prefix
00614     msg->prefix.length = sizeof(SmHeader) + sizeof(SmBodyMotoMotionCtrl);
00615     //header
00616     msg->header.msgType = ROS_MSG_MOTO_MOTION_CTRL;
00617     msg->header.commType = ROS_COMM_SERVICE_RESQUEST;
00618     msg->header.replyType = ROS_REPLY_INVALID;
00619     //body
00620     msg->body.motionCtrl.groupNo = 0;
00621     msg->body.motionCtrl.sequence = 0;
00622     msg->body.motionCtrl.command = ROS_CMD_STOP_TRAJ_MODE;
00623     for(int i=0;i<10;i++)
00624     {
00625         msg->body.motionCtrl.data[i] = (float) 0.0;
00626     }
00627 }
00628 
00629 void Fs100Cmd::pgmClose()
00630 {
00631     /*
00632     Send trajectory stop message, closes socket connection and joins threads.
00633     */
00634     stop_all = true;
00635     if (run_thread == 1)
00636     {
00637         run_thread = 0;
00638         pthread_join(cmdthreadID,NULL);
00639     }
00640     SimpleMsg traj_stop;
00641     char motion_buf[68];
00642     char motion_reply_buffer[76];
00643     trajectoryStop(&traj_stop);
00644     serialize(&traj_stop,motion_buf,sizeof(motion_buf));
00645     byteSwap(motion_buf,sizeof(motion_buf));
00646     n = write(sockfd,motion_buf,sizeof(motion_buf));
00647     if (n < 0) 
00648          socketError("ERROR writing trajectory stop to socket");
00649 
00650         n = recv(sockfd,motion_reply_buffer,sizeof(motion_reply_buffer),0);
00651         byteSwap(motion_reply_buffer,sizeof(motion_reply_buffer));
00652         deserializeMotionReply(motion_reply_buffer,&motion_rpl);
00653     printf("\n\ntrajectory stop sent, reply:\n");
00654     printErrorCodeMsg(&motion_rpl);
00655     
00656     close(sockfd);
00657 }


fs100_motoman
Author(s): Asger Winther-Jørgensen (Technical Univeristy of Denmark)
autogenerated on Fri Aug 28 2015 10:42:16