denso_robot_rc8.cpp
Go to the documentation of this file.
1 
26 
27 #define BCAP_ROBOT_EXECUTE_ARGS (3)
28 #define BCAP_ROBOT_HALT_ARGS (2)
29 #define BCAP_ROBOT_MOVE_ARGS (4)
30 #define BCAP_ROBOT_SPEED_ARGS (3)
31 #define BCAP_ROBOT_CHANGE_ARGS (2)
32 
33 #define NAME_MOVESTRING "_MoveString"
34 #define NAME_MOVEVALUE "_MoveValue"
35 #define NAME_DRIVEEXSTRING "_DriveExString"
36 #define NAME_DRIVEEXVALUE "_DriveExValue"
37 #define NAME_DRIVEAEXSTRING "_DriveAExString"
38 #define NAME_DRIVEAEXVALUE "_DriveAExValue"
39 #define NAME_SPEED "_Speed"
40 #define NAME_CHANGETOOL "_ChangeTool"
41 #define NAME_CHANGEWORK "_ChangeWork"
42 
43 namespace denso_robot_core {
44 
45 enum {
47  NUM_JOINT = 8,
48  NUM_TRANS = 10
49 };
50 
51 enum {
52  ACT_RESET = -1,
53  ACT_NONE = 0,
60 };
61 
63  Service_Vec& service, Handle_Vec& handle,
64  const std::string& name, const int* mode)
65  : DensoRobot(parent, service, handle, name, mode),
66  m_curAct(ACT_RESET), m_memTimeout(0), m_memRetry(0),
67  m_tsfmt(0), m_timestamp(0),
68  m_sendfmt(0), m_send_miniio(0), m_send_handio(0),
69  m_recvfmt(0), m_recv_miniio(0), m_recv_handio(0),
70  m_send_userio_offset(UserIO::MIN_USERIO_OFFSET),
71  m_send_userio_size(1),
72  m_recv_userio_offset(UserIO::MIN_USERIO_OFFSET),
73  m_recv_userio_size(1)
74 {
76 
78 
81 }
82 
84 {
85 
86 }
87 
89 {
90  std::string tmpName = DensoBase::RosName();
91 
92  if(*m_mode == 0) {
93  m_subSpeed = node.subscribe<Float32>(
94  tmpName + NAME_SPEED, MESSAGE_QUEUE,
96 
97  m_subChangeTool = node.subscribe<Int32>(
98  tmpName + NAME_CHANGETOOL, MESSAGE_QUEUE,
99  boost::bind(&DensoRobotRC8::Callback_Change, this, "Tool", _1));
100 
101  m_subChangeWork = node.subscribe<Int32>(
102  tmpName + NAME_CHANGEWORK, MESSAGE_QUEUE,
103  boost::bind(&DensoRobotRC8::Callback_Change, this, "Work", _1));
104 
105  m_actMoveString = boost::make_shared<SimpleActionServer<MoveStringAction> >
107  boost::bind(&DensoRobotRC8::Callback_MoveString, this, _1), false);
108 
109  m_actMoveString->registerPreemptCallback(
110  boost::bind(&DensoRobotRC8::Callback_Cancel, this));
111 
112  m_actMoveString->start();
113 
114  m_actMoveValue = boost::make_shared<SimpleActionServer<MoveValueAction> >
116  boost::bind(&DensoRobotRC8::Callback_MoveValue, this, _1), false);
117 
118  m_actMoveValue->registerPreemptCallback(
119  boost::bind(&DensoRobotRC8::Callback_Cancel, this));
120 
121  m_actMoveValue->start();
122 
123  m_actDriveExString = boost::make_shared<SimpleActionServer<DriveStringAction> >
125  boost::bind(&DensoRobotRC8::Callback_DriveString, this, "DriveEx", _1), false);
126 
127  m_actDriveExString->registerPreemptCallback(
128  boost::bind(&DensoRobotRC8::Callback_Cancel, this));
129 
130  m_actDriveExString->start();
131 
132  m_actDriveExValue = boost::make_shared<SimpleActionServer<DriveValueAction> >
134  boost::bind(&DensoRobotRC8::Callback_DriveValue, this, "DriveEx", _1), false);
135 
136  m_actDriveExValue->registerPreemptCallback(
137  boost::bind(&DensoRobotRC8::Callback_Cancel, this));
138 
139  m_actDriveExValue->start();
140 
141  m_actDriveAExString = boost::make_shared<SimpleActionServer<DriveStringAction> >
143  boost::bind(&DensoRobotRC8::Callback_DriveString, this, "DriveAEx", _1), false);
144 
145  m_actDriveAExString->registerPreemptCallback(
146  boost::bind(&DensoRobotRC8::Callback_Cancel, this));
147 
148  m_actDriveAExString->start();
149 
150  m_actDriveAExValue = boost::make_shared<SimpleActionServer<DriveValueAction> >
152  boost::bind(&DensoRobotRC8::Callback_DriveValue, this, "DriveAEx", _1), false);
153 
154  m_actDriveAExValue->registerPreemptCallback(
155  boost::bind(&DensoRobotRC8::Callback_Cancel, this));
156 
157  m_actDriveAExValue->start();
158  }
159 
161 
162  m_curAct = ACT_NONE;
163 
164  return S_OK;
165 }
166 
168 {
170 
171  m_mtxAct.lock();
173  m_mtxAct.unlock();
174 
178  m_actMoveString.reset();
179  m_actMoveValue.reset();
180  m_actDriveExString.reset();
181  m_actDriveExValue.reset();
182  m_actDriveAExString.reset();
183  m_actDriveAExValue.reset();
184 
185  return S_OK;
186 }
187 
189 {
190  if(!DensoRobot::Update()) return false;
191 
192  boost::mutex::scoped_lock lockSrv(m_mtxSrv);
193  if(!m_serving) return false;
194 
195  Action_Feedback();
196 
197  return true;
198 }
199 
201 {
202  int argc;
203  VARIANT_Vec vntArgs;
204  VARIANT_Ptr vntRet(new VARIANT());
205  int32_t *pval;
206 
207  VariantInit(vntRet.get());
208 
209  for(argc = 0; argc < BCAP_ROBOT_EXECUTE_ARGS; argc++) {
210  VARIANT_Ptr vntTmp(new VARIANT());
211  VariantInit(vntTmp.get());
212 
213  switch(argc) {
214  case 0:
215  vntTmp->vt = VT_UI4;
216  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
217  break;
218  case 1:
219  vntTmp->vt = VT_BSTR;
220  vntTmp->bstrVal = SysAllocString(L"TakeArm");
221  break;
222  case 2:
223  vntTmp->vt = (VT_ARRAY | VT_I4);
224  vntTmp->parray = SafeArrayCreateVector(VT_I4, 0, 2);
225  SafeArrayAccessData(vntTmp->parray, (void**)&pval);
226  pval[0] = m_ArmGroup; // Arm group
227  pval[1] = 1L; // Keep
228  SafeArrayUnaccessData(vntTmp->parray);
229  break;
230  }
231 
232  vntArgs.push_back(*vntTmp.get());
233  }
234 
235  return m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_EXECUTE, vntArgs, vntRet);
236 }
237 
239 {
240  int argc;
241  VARIANT_Vec vntArgs;
242  VARIANT_Ptr vntRet(new VARIANT());
243 
244  VariantInit(vntRet.get());
245 
246  for(argc = 0; argc < BCAP_ROBOT_EXECUTE_ARGS; argc++) {
247  VARIANT_Ptr vntTmp(new VARIANT());
248  VariantInit(vntTmp.get());
249 
250  switch(argc) {
251  case 0:
252  vntTmp->vt = VT_UI4;
253  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
254  break;
255  case 1:
256  vntTmp->vt = VT_BSTR;
257  vntTmp->bstrVal = SysAllocString(L"GiveArm");
258  break;
259  }
260 
261  vntArgs.push_back(*vntTmp.get());
262  }
263 
264  return m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_EXECUTE, vntArgs, vntRet);
265 }
266 
268  int comp, const VARIANT_Ptr& pose, const std::string& option)
269 {
270  HRESULT hr;
271 
272  hr = ExecTakeArm();
273  if(SUCCEEDED(hr)) {
274  int argc;
275  VARIANT_Vec vntArgs;
276  VARIANT_Ptr vntRet(new VARIANT());
277 
278  VariantInit(vntRet.get());
279 
280  for(argc = 0; argc < BCAP_ROBOT_MOVE_ARGS; argc++) {
281  VARIANT_Ptr vntTmp(new VARIANT());
282  VariantInit(vntTmp.get());
283 
284  switch(argc) {
285  case 0:
286  vntTmp->vt = VT_UI4;
287  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
288  break;
289  case 1:
290  vntTmp->vt = VT_I4;
291  vntTmp->lVal = comp;
292  break;
293  case 2:
294  VariantCopy(vntTmp.get(), pose.get());
295  break;
296  case 3:
297  vntTmp->vt = VT_BSTR;
298  vntTmp->bstrVal = ConvertStringToBSTR(option);
299  break;
300  }
301 
302  vntArgs.push_back(*vntTmp.get());
303  }
304 
305  hr = m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_MOVE, vntArgs, vntRet);
306 
307  ExecGiveArm();
308  }
309 
310  return hr;
311 }
312 
314  const std::string& name, const VARIANT_Ptr& option)
315 {
316  HRESULT hr;
317 
318  hr = ExecTakeArm();
319  if(SUCCEEDED(hr)) {
320  int argc;
321  VARIANT_Vec vntArgs;
322  VARIANT_Ptr vntRet(new VARIANT());
323 
324  VariantInit(vntRet.get());
325 
326  for(int argc = 0; argc < BCAP_ROBOT_EXECUTE_ARGS; argc++) {
327  VARIANT_Ptr vntTmp(new VARIANT());
328  VariantInit(vntTmp.get());
329 
330  switch(argc) {
331  case 0:
332  vntTmp->vt = VT_UI4;
333  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
334  break;
335  case 1:
336  vntTmp->vt = VT_BSTR;
337  vntTmp->bstrVal = ConvertStringToBSTR(name);
338  break;
339  case 2:
340  VariantCopy(vntTmp.get(), option.get());
341  break;
342  }
343 
344  vntArgs.push_back(*vntTmp.get());
345  }
346 
347  hr = m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_EXECUTE, vntArgs, vntRet);
348 
349  ExecGiveArm();
350  }
351 
352  return hr;
353 }
354 
356 {
357  HRESULT hr;
358 
359  hr = ExecTakeArm();
360  if(SUCCEEDED(hr)) {
361  int argc;
362  VARIANT_Vec vntArgs;
363  VARIANT_Ptr vntRet(new VARIANT());
364 
365  VariantInit(vntRet.get());
366 
367  for(argc = 0; argc < BCAP_ROBOT_SPEED_ARGS; argc++) {
368  VARIANT_Ptr vntTmp(new VARIANT());
369  VariantInit(vntTmp.get());
370 
371  switch(argc) {
372  case 0:
373  vntTmp->vt = VT_UI4;
374  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
375  break;
376  case 1:
377  vntTmp->vt = VT_I4;
378  vntTmp->lVal = -1;
379  break;
380  case 2:
381  vntTmp->vt = VT_R4;
382  vntTmp->fltVal = value;
383  break;
384  }
385 
386  vntArgs.push_back(*vntTmp.get());
387  }
388 
389  hr = m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_SPEED, vntArgs, vntRet);
390 
391  ExecGiveArm();
392  }
393 
394  return hr;
395 }
396 
397 HRESULT DensoRobotRC8::ExecChange(const std::string& value)
398 {
399  HRESULT hr;
400 
401  hr = ExecTakeArm();
402  if(SUCCEEDED(hr)) {
403  int argc;
404  VARIANT_Vec vntArgs;
405  VARIANT_Ptr vntRet(new VARIANT());
406 
407  VariantInit(vntRet.get());
408 
409  for(argc = 0; argc < BCAP_ROBOT_CHANGE_ARGS; argc++) {
410  VARIANT_Ptr vntTmp(new VARIANT());
411  VariantInit(vntTmp.get());
412 
413  switch(argc) {
414  case 0:
415  vntTmp->vt = VT_UI4;
416  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
417  break;
418  case 1:
419  vntTmp->vt = VT_BSTR;
420  vntTmp->bstrVal = ConvertStringToBSTR(value);
421  break;
422  }
423 
424  vntArgs.push_back(*vntTmp.get());
425  }
426 
427  hr = m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_CHANGE, vntArgs, vntRet);
428 
429  ExecGiveArm();
430  }
431 
432  return hr;
433 }
434 
436 {
437  int argc;
438  VARIANT_Vec vntArgs;
439  VARIANT_Ptr vntRet(new VARIANT());
440 
441  for(argc = 0; argc < BCAP_ROBOT_HALT_ARGS; argc++) {
442  VARIANT_Ptr vntTmp(new VARIANT());
443 
444  VariantInit(vntTmp.get());
445 
446  switch(argc) {
447  case 0:
448  vntTmp->vt = VT_UI4;
449  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_WATCH];
450  break;
451  case 1:
452  vntTmp->vt = VT_BSTR;
453  vntTmp->bstrVal = SysAllocString(L"");
454  break;
455  }
456 
457  vntArgs.push_back(*vntTmp.get());
458  }
459 
460  return m_vecService[DensoBase::SRV_WATCH]->ExecFunction(ID_ROBOT_HALT, vntArgs, vntRet);
461 }
462 
463 HRESULT DensoRobotRC8::ExecCurJnt(std::vector<double>& pose)
464 {
465  HRESULT hr;
466 
467  int argc;
468  VARIANT_Vec vntArgs;
469  VARIANT_Ptr vntRet(new VARIANT());
470 
471  VariantInit(vntRet.get());
472 
473  for(argc = 0; argc < BCAP_ROBOT_EXECUTE_ARGS; argc++) {
474  VARIANT_Ptr vntTmp(new VARIANT());
475  VariantInit(vntTmp.get());
476 
477  switch(argc) {
478  case 0:
479  vntTmp->vt = VT_UI4;
480  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_WATCH];
481  break;
482  case 1:
483  vntTmp->vt = VT_BSTR;
484  vntTmp->bstrVal = SysAllocString(L"HighCurJntEx");
485  break;
486  }
487 
488  vntArgs.push_back(*vntTmp.get());
489  }
490 
491  hr = m_vecService[DensoBase::SRV_WATCH]->ExecFunction(ID_ROBOT_EXECUTE, vntArgs, vntRet);
492 
493  if(SUCCEEDED(hr) &&
494  (vntRet->vt == (VT_ARRAY | VT_R8)))
495  {
496  uint32_t num;
497  double *pdblval;
498 
499  num = vntRet->parray->rgsabound->cElements;
500  SafeArrayAccessData(vntRet->parray, (void**)&pdblval);
501  pose.resize(num - 1);
502  std::copy(&pdblval[1], &pdblval[num], pose.begin());
503  SafeArrayUnaccessData(vntRet->parray);
504  }
505 
506  return hr;
507 }
508 
510  const std::vector<double>& pose, std::vector<double>& joint)
511 {
512  HRESULT hr = S_OK;
513  int argc;
514  VARIANT_Vec vntArgs;
515  VARIANT_Ptr vntRet(new VARIANT());
516 
517  VariantInit(vntRet.get());
518 
519  for(argc = 0; argc < BCAP_ROBOT_EXECUTE_ARGS; argc++) {
520  VARIANT_Ptr vntTmp(new VARIANT());
521  VariantInit(vntTmp.get());
522 
523  switch(argc) {
524  case 0:
525  vntTmp->vt = VT_UI4;
526  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
527  break;
528  case 1:
529  vntTmp->vt = VT_BSTR;
530  vntTmp->bstrVal = SysAllocString(L"slvMove");
531  break;
532  case 2:
533  hr = CreateSendParameter(pose, vntTmp,
537  m_send_userio);
538  if(FAILED(hr)) return hr;
539  break;
540  }
541 
542  vntArgs.push_back(*vntTmp.get());
543  }
544 
545  hr = m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_EXECUTE, vntArgs, vntRet);
546  if(SUCCEEDED(hr)) {
547  HRESULT hrTmp = ParseRecvParameter(vntRet,
551 
552  joint = m_joint;
553 
554  if(FAILED(hrTmp)) {
555  hr = hrTmp;
556  }
557  }
558 
559  return hr;
560 }
561 
563 {
564  HRESULT hr = S_OK;
565 
566  if(*m_mode == 0) {
567  // Change to slave mode
568  if(mode != 0) {
569  hr = ExecSlaveMode("slvSendFormat", m_sendfmt);
570  if(FAILED(hr)) return hr;
571 
572  hr = ExecSlaveMode("slvRecvFormat", m_recvfmt, m_tsfmt);
573  if(FAILED(hr)) return hr;
574 
575  hr = ExecTakeArm();
576  if(FAILED(hr)) return hr;
577 
578  hr = ExecSlaveMode("slvChangeMode", mode);
579  if(FAILED(hr)) return hr;
580 
581  m_memTimeout = m_vecService[DensoBase::SRV_ACT]->get_Timeout();
583  m_vecService[DensoBase::SRV_ACT]->put_Timeout(8);
584  m_vecService[DensoBase::SRV_ACT]->put_Retry(3);
585  }
586  } else {
589 
590  hr = ExecSlaveMode("slvChangeMode", mode);
591  ExecGiveArm();
592  }
593 
594  return hr;
595 }
596 
598  const std::string& name, int32_t format, int32_t option)
599 {
600  int argc;
601  VARIANT_Vec vntArgs;
602  VARIANT_Ptr vntRet(new VARIANT());
603  int32_t *pval;
604 
605  VariantInit(vntRet.get());
606 
607  for(argc = 0; argc < BCAP_ROBOT_EXECUTE_ARGS; argc++) {
608  VARIANT_Ptr vntTmp(new VARIANT());
609  VariantInit(vntTmp.get());
610 
611  switch(argc) {
612  case 0:
613  vntTmp->vt = VT_UI4;
614  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
615  break;
616  case 1:
617  vntTmp->vt = VT_BSTR;
618  vntTmp->bstrVal = ConvertStringToBSTR(name);
619  break;
620  case 2:
621  if(option == 0) {
622  vntTmp->vt = VT_I4;
623  vntTmp->lVal = format;
624  } else {
625  vntTmp->vt = (VT_ARRAY | VT_I4);
626  vntTmp->parray = SafeArrayCreateVector(VT_I4, 0, 2);
627  SafeArrayAccessData(vntTmp->parray, (void**)&pval);
628  pval[0] = format;
629  pval[1] = option;
630  SafeArrayUnaccessData(vntTmp->parray);
631  }
632  break;
633  }
634 
635  vntArgs.push_back(*vntTmp.get());
636  }
637 
638  return m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_EXECUTE, vntArgs, vntRet);
639 }
640 
642  const std::vector<double>& pose, VARIANT_Ptr& send,
643  const int miniio, const int handio,
644  const int recv_userio_offset, const int recv_userio_size,
645  const int send_userio_offset, const int send_userio_size,
646  const std::vector<uint8_t>& send_userio)
647 {
648  int type = *m_mode & SLVMODE_POSE;
649 
650  // Check pose type
651  int joints = 0;
652  switch(type) {
653  case SLVMODE_POSE_P:
654  joints = NUM_POSITION;
655  break;
656  case SLVMODE_POSE_J:
657  joints = NUM_JOINT;
658  break;
659  case SLVMODE_POSE_T:
660  joints = NUM_TRANS;
661  break;
662  default:
663  return E_FAIL;
664  }
665 
666  if(joints < pose.size()) {
667  return E_FAIL;
668  }
669 
670  // Check send format
671  bool send_hio, send_mio, send_uio, recv_uio;
672  send_hio = m_sendfmt & SENDFMT_HANDIO;
673  send_mio = m_sendfmt & SENDFMT_MINIIO;
674  send_uio = m_sendfmt & SENDFMT_USERIO;
675 
676  if(send_uio) {
677  if(send_userio_size < send_userio.size()) {
678  return E_FAIL;
679  }
680  }
681 
682  // Check receive format
683  recv_uio = m_recvfmt & RECVFMT_USERIO;
684 
685  // Number of arguments
686  int num = 1 + send_hio + send_mio + 3 * send_uio + 2 * recv_uio;
687 
688  VARIANT *pvnt;
689  double *pdbl;
690  uint8_t *pbool;
691 
692  if(num == 1) {
693  // Pose only
694  send->vt = (VT_ARRAY | VT_R8);
695  send->parray = SafeArrayCreateVector(VT_R8, 0, joints);
696  SafeArrayAccessData(send->parray, (void**)&pdbl);
697  memset(pdbl, 0, joints * sizeof(double));
698  std::copy(pose.begin(), pose.end(), pdbl);
699  SafeArrayUnaccessData(send->parray);
700  } else {
701  send->vt = (VT_ARRAY | VT_VARIANT);
702  send->parray = SafeArrayCreateVector(VT_VARIANT, 0, num);
703 
704  SafeArrayAccessData(send->parray, (void**)&pvnt);
705 
706  int offset = 0;
707 
708  // Pose
709  {
710  pvnt[offset].vt = (VT_ARRAY | VT_R8);
711  pvnt[offset].parray = SafeArrayCreateVector(VT_R8, 0, joints);
712  SafeArrayAccessData(pvnt[offset].parray, (void**)&pdbl);
713  memset(pdbl, 0, joints * sizeof(double));
714  std::copy(pose.begin(), pose.end(), pdbl);
715  SafeArrayUnaccessData(pvnt[offset].parray);
716 
717  offset++;
718  }
719 
720  // Mini I/O
721  if(send_mio) {
722  pvnt[offset].vt = VT_I4;
723  pvnt[offset].lVal = miniio;
724 
725  offset++;
726  }
727 
728  // Send User I/O
729  if(send_uio) {
730  pvnt[offset+0].vt = VT_I4;
731  pvnt[offset+0].lVal = send_userio_offset;
732 
733  pvnt[offset+1].vt = VT_I4;
734  pvnt[offset+1].lVal = send_userio_size * UserIO::USERIO_ALIGNMENT;
735 
736  pvnt[offset+2].vt = (VT_ARRAY | VT_UI1);
737  pvnt[offset+2].parray = SafeArrayCreateVector(VT_UI1, 0, send_userio_size);
738  SafeArrayAccessData(pvnt[offset+2].parray, (void**)&pbool);
739  memset(pbool, 0, send_userio_size * sizeof(uint8_t));
740  std::copy(send_userio.begin(), send_userio.end(), pbool);
741  SafeArrayUnaccessData(pvnt[offset+2].parray);
742 
743  offset+=3;
744  }
745 
746  // Receive User I/O
747  if(recv_uio) {
748  pvnt[offset+0].vt = VT_I4;
749  pvnt[offset+0].lVal = recv_userio_offset;
750 
751  pvnt[offset+1].vt = VT_I4;
752  pvnt[offset+1].lVal = recv_userio_size * UserIO::USERIO_ALIGNMENT;
753 
754  offset+=2;
755  }
756 
757  // Hand I/O
758  if(send_hio) {
759  pvnt[offset].vt = VT_I4;
760  pvnt[offset].lVal = handio;
761 
762  offset++;
763  }
764 
765  SafeArrayUnaccessData(send->parray);
766  }
767 
768  return S_OK;
769 }
770 
772  const VARIANT_Ptr& recv,
773  std::vector<double>& position, std::vector<double>& joint, std::vector<double>& trans,
774  int& miniio, int& handio, int& timestamp,
775  std::vector<uint8_t>& recv_userio,
776  std::vector<double>& current)
777 {
778  int type = m_recvfmt & SLVMODE_POSE;
779 
780  // Check pose type
781  int j = 0, j1 = 0, j2 = 0, joints = 0;
782  std::vector<double> *pose1 = NULL, *pose2 = NULL;
783 
784  switch(type) {
785  case RECVFMT_POSE_P:
786  j1 = NUM_POSITION;
787  pose1 = &position;
788  break;
789  case RECVFMT_POSE_J:
790  j1 = NUM_JOINT;
791  pose1 = &joint;
792  break;
793  case RECVFMT_POSE_T:
794  j1 = NUM_TRANS;
795  pose1 = &trans;
796  break;
797  case RECVFMT_POSE_PJ:
798  j1 = NUM_POSITION;
799  j2 = NUM_JOINT;
800  pose1 = &position;
801  pose2 = &joint;
802  break;
803  case RECVFMT_POSE_TJ:
804  j1 = NUM_TRANS;
805  j2 = NUM_JOINT;
806  pose1 = &trans;
807  pose2 = &joint;
808  break;
809  default:
810  return E_FAIL;
811  }
812 
813  joints = j1 + j2;
814 
815  // Check receive format
816  bool recv_ts, recv_hio, recv_mio, recv_uio, recv_crt;
817  recv_ts = m_recvfmt & RECVFMT_TIME;
818  recv_hio = m_recvfmt & RECVFMT_HANDIO;
819  recv_mio = m_recvfmt & RECVFMT_MINIIO;
820  recv_uio = m_recvfmt & RECVFMT_USERIO;
821  recv_crt = m_recvfmt & RECVFMT_CURRENT;
822 
823  // Number of arguments
824  int num = 1 + recv_ts + recv_hio + recv_mio + recv_uio + recv_crt;
825 
826  HRESULT hr = S_OK;
827  VARIANT *pvnt;
828  double *pdbl;
829  uint8_t *pbool;
830 
831  if(recv->vt == (VT_ARRAY | VT_R8)) {
832  if(joints != recv->parray->rgsabound->cElements) {
833  return E_FAIL;
834  }
835 
836  // Pose only
837  SafeArrayAccessData(recv->parray, (void**)&pdbl);
838  pose1->resize(j1);
839  std::copy(pdbl, &pdbl[j1], pose1->begin());
840  if(pose2 != NULL) {
841  pose2->resize(j2);
842  std::copy(&pdbl[j1], &pdbl[joints], pose2->begin());
843  }
844  SafeArrayUnaccessData(recv->parray);
845  }
846  else if(recv->vt == (VT_ARRAY | VT_VARIANT)) {
847  if(num != recv->parray->rgsabound->cElements) {
848  return E_FAIL;
849  }
850 
851  SafeArrayAccessData(recv->parray, (void**)&pvnt);
852 
853  int offset = 0;
854 
855  // Timestamp
856  if(recv_ts) {
857  if(pvnt[offset].vt != VT_I4) {
858  hr = E_FAIL;
859  goto exit_proc;
860  }
861 
862  timestamp = pvnt[offset].lVal;
863 
864  offset++;
865  }
866 
867  // Pose
868  {
869  if((pvnt[offset].vt != (VT_ARRAY | VT_R8))
870  || (joints != pvnt[offset].parray->rgsabound->cElements))
871  {
872  hr = E_FAIL;
873  goto exit_proc;
874  }
875 
876  SafeArrayAccessData(pvnt[offset].parray, (void**)&pdbl);
877  pose1->resize(j1);
878  std::copy(pdbl, &pdbl[j1], pose1->begin());
879  if(pose2 != NULL) {
880  pose2->resize(j2);
881  std::copy(&pdbl[j1], &pdbl[joints], pose2->begin());
882  }
883  SafeArrayUnaccessData(pvnt[offset].parray);
884 
885  offset++;
886  }
887 
888  // Mini I/O
889  if(recv_mio) {
890  if(pvnt[offset].vt != VT_I4) {
891  hr = E_FAIL;
892  goto exit_proc;
893  }
894 
895  miniio = pvnt[offset].lVal;
896 
897  offset++;
898  }
899 
900  // User I/O
901  if(recv_uio) {
902  if(pvnt[offset].vt != (VT_ARRAY | VT_UI1))
903  {
904  hr = E_FAIL;
905  goto exit_proc;
906  }
907 
908  SafeArrayAccessData(pvnt[offset].parray, (void**)&pbool);
909  recv_userio.resize(pvnt[offset].parray->rgsabound->cElements);
910  std::copy(pbool, &pbool[pvnt[offset].parray->rgsabound->cElements], recv_userio.begin());
911  SafeArrayUnaccessData(pvnt[offset].parray);
912 
913  offset++;
914  }
915 
916  // Hand I/O
917  if(recv_hio) {
918  if(pvnt[offset].vt != VT_I4) {
919  hr = E_FAIL;
920  goto exit_proc;
921  }
922 
923  handio = pvnt[offset].lVal;
924 
925  offset++;
926  }
927 
928  // Current
929  if(recv_crt) {
930  if((pvnt[offset].vt != (VT_ARRAY | VT_R8))
931  || (8 != pvnt[offset].parray->rgsabound->cElements))
932  {
933  hr = E_FAIL;
934  goto exit_proc;
935  }
936 
937  SafeArrayAccessData(pvnt[offset].parray, (void**)&pdbl);
938  current.resize(8);
939  std::copy(pdbl, &pdbl[8], current.begin());
940  SafeArrayUnaccessData(pvnt[offset].parray);
941 
942  offset++;
943  }
944 
945 exit_proc:
946  SafeArrayUnaccessData(recv->parray);
947  } else {
948  return E_FAIL;
949  }
950 
951  return hr;
952 }
953 
954 void DensoRobotRC8::Callback_MoveString(const MoveStringGoalConstPtr& goal)
955 {
956  HRESULT hr;
957  MoveStringResult res;
958 
959  // Set current action
960  boost::mutex::scoped_lock lockAct(m_mtxAct);
961  if(m_curAct != ACT_NONE) {
962  if(m_curAct != ACT_RESET) {
963  res.HRESULT = E_FAIL;
964  m_actMoveString->setAborted(res);
965  }
966  return;
967  }
969  lockAct.unlock();
970 
971  VARIANT_Ptr vntPose(new VARIANT());
972  VariantInit(vntPose.get());
973  vntPose->vt = VT_BSTR;
974  vntPose->bstrVal = ConvertStringToBSTR(goal->pose);
975 
976  hr = ExecMove(goal->comp, vntPose, goal->option);
977 
978  // Reset current action
979  m_mtxAct.lock();
980  if(m_curAct == ACT_MOVESTRING) {
981  if(SUCCEEDED(hr)) {
982  res.HRESULT = S_OK;
983  m_actMoveString->setSucceeded(res);
984  } else {
985  res.HRESULT = hr;
986  m_actMoveString->setAborted(res);
987  }
988  m_curAct = ACT_NONE;
989  }
990  m_mtxAct.unlock();
991 }
992 
993 void DensoRobotRC8::Callback_MoveValue(const MoveValueGoalConstPtr& goal)
994 {
995  HRESULT hr;
996  MoveValueResult res;
997 
998  // Set current action
999  boost::mutex::scoped_lock lockAct(m_mtxAct);
1000  if(m_curAct != ACT_NONE) {
1001  if(m_curAct != ACT_RESET) {
1002  res.HRESULT = E_FAIL;
1003  m_actMoveValue->setAborted(res);
1004  }
1005  return;
1006  }
1008  lockAct.unlock();
1009 
1010  VARIANT_Ptr vntPose(new VARIANT());
1011  VariantInit(vntPose.get());
1012  CreatePoseData(goal->pose, *vntPose.get());
1013 
1014  hr = ExecMove(goal->comp, vntPose, goal->option);
1015 
1016  // Reset current action
1017  m_mtxAct.lock();
1018  if(m_curAct == ACT_MOVEVALUE) {
1019  if(SUCCEEDED(hr)){
1020  res.HRESULT = S_OK;
1021  m_actMoveValue->setSucceeded(res);
1022  }else{
1023  res.HRESULT = hr;
1024  m_actMoveValue->setAborted(res);
1025  }
1026  m_curAct = ACT_NONE;
1027  }
1028  m_mtxAct.unlock();
1029 }
1030 
1032  const std::string& name, const DriveStringGoalConstPtr& goal)
1033 {
1034  HRESULT hr;
1035  DriveStringResult res;
1036  BSTR *pbstr;
1037 
1038  int act = 0;
1040 
1041  if(!name.compare("DriveEx")) {
1042  act = ACT_DRIVEEXSTRING;
1043  actSvr = m_actDriveExString;
1044  }
1045  else if(!name.compare("DriveAEx")) {
1046  act = ACT_DRIVEAEXSTRING;
1047  actSvr = m_actDriveAExString;
1048  }
1049  else return;
1050 
1051  // Set current action
1052  boost::mutex::scoped_lock lockAct(m_mtxAct);
1053  if(m_curAct != ACT_NONE) {
1054  if(m_curAct != ACT_RESET) {
1055  res.HRESULT = E_FAIL;
1056  actSvr->setAborted(res);
1057  }
1058  return;
1059  }
1060  m_curAct = act;
1061  lockAct.unlock();
1062 
1063  VARIANT_Ptr vntOpt(new VARIANT());
1064  VariantInit(vntOpt.get());
1065  vntOpt->vt = (VT_ARRAY | VT_BSTR);
1066  vntOpt->parray = SafeArrayCreateVector(VT_BSTR, 0, 2);
1067  SafeArrayAccessData(vntOpt->parray, (void**)&pbstr);
1068  pbstr[0] = ConvertStringToBSTR(goal->pose);
1069  pbstr[1] = ConvertStringToBSTR(goal->option);
1070  SafeArrayUnaccessData(vntOpt->parray);
1071 
1072  hr = ExecDrive(name, vntOpt);
1073 
1074  // Reset current action
1075  m_mtxAct.lock();
1076  if(m_curAct == act) {
1077  if(SUCCEEDED(hr)) {
1078  res.HRESULT = S_OK;
1079  actSvr->setSucceeded(res);
1080  } else {
1081  res.HRESULT = hr;
1082  actSvr->setAborted(res);
1083  }
1084  m_curAct = ACT_NONE;
1085  }
1086  m_mtxAct.unlock();
1087 }
1088 
1090  const std::string& name, const DriveValueGoalConstPtr& goal)
1091 {
1092  HRESULT hr;
1093  DriveValueResult res;
1094  VARIANT *pvntval, *pvntjnt;
1095 
1096  int act = 0;
1098 
1099  if(!name.compare("DriveEx")) {
1100  act = ACT_DRIVEEXVALUE;
1101  actSvr = m_actDriveExValue;
1102  }
1103  else if(!name.compare("DriveAEx")) {
1104  act = ACT_DRIVEAEXVALUE;
1105  actSvr = m_actDriveAExValue;
1106  }
1107  else return;
1108 
1109  // Set current action
1110  boost::mutex::scoped_lock lockAct(m_mtxAct);
1111  if(m_curAct != ACT_NONE) {
1112  if(m_curAct != ACT_RESET) {
1113  res.HRESULT = E_FAIL;
1114  actSvr->setAborted(res);
1115  }
1116  return;
1117  }
1118  m_curAct = act;
1119  lockAct.unlock();
1120 
1121  VARIANT_Ptr vntOpt(new VARIANT());
1122  VariantInit(vntOpt.get());
1123 
1124  vntOpt->vt = (VT_ARRAY | VT_VARIANT);
1125  vntOpt->parray = SafeArrayCreateVector(VT_VARIANT, 0, 2);
1126 
1127  SafeArrayAccessData(vntOpt->parray, (void**)&pvntval);
1128 
1129  pvntval[0].vt = (VT_ARRAY | VT_VARIANT);
1130  pvntval[0].parray = SafeArrayCreateVector(VT_VARIANT, 0, goal->pose.size());
1131 
1132  SafeArrayAccessData(pvntval[0].parray, (void**)&pvntjnt);
1133 
1134  for(int i = 0; i < goal->pose.size(); i++) {
1135  PoseData pd;
1136  pd.value.push_back(goal->pose.at(i).joint);
1137  pd.value.push_back(goal->pose.at(i).value);
1138  pd.type = -1;
1139  pd.pass = (i == 0) ? goal->pass : 0;
1140  CreatePoseData(pd, pvntjnt[i]);
1141  }
1142 
1143  SafeArrayUnaccessData(pvntval[0].parray);
1144 
1145  pvntval[1].vt = VT_BSTR;
1146  pvntval[1].bstrVal = ConvertStringToBSTR(goal->option);
1147 
1148  SafeArrayUnaccessData(vntOpt->parray);
1149 
1150  hr = ExecDrive(name, vntOpt);
1151 
1152  // Reset current action
1153  m_mtxAct.lock();
1154  if(m_curAct == act) {
1155  if(SUCCEEDED(hr)) {
1156  res.HRESULT = S_OK;
1157  actSvr->setSucceeded(res);
1158  }else{
1159  res.HRESULT = hr;
1160  actSvr->setAborted(res);
1161  }
1162  m_curAct = ACT_NONE;
1163  }
1164  m_mtxAct.unlock();
1165 }
1166 
1167 void DensoRobotRC8::Callback_Speed(const Float32::ConstPtr& msg)
1168 {
1169  ExecSpeed(msg->data);
1170 }
1171 
1173  const std::string& name, const Int32::ConstPtr& msg)
1174 {
1175  std::stringstream ss;
1176  ss << name << msg->data;
1177  ExecChange(ss.str());
1178 }
1179 
1181 {
1182  boost::mutex::scoped_lock lockAct(m_mtxAct);
1183 
1184  if(m_curAct > ACT_NONE) {
1185  ExecHalt();
1186 
1187  switch(m_curAct){
1188  case ACT_MOVESTRING:
1189  m_actMoveString->setPreempted();
1190  break;
1191  case ACT_MOVEVALUE:
1192  m_actMoveValue->setPreempted();
1193  break;
1194  case ACT_DRIVEEXSTRING:
1195  m_actDriveExString->setPreempted();
1196  break;
1197  case ACT_DRIVEEXVALUE:
1198  m_actDriveExValue->setPreempted();
1199  break;
1200  case ACT_DRIVEAEXSTRING:
1201  m_actDriveAExString->setPreempted();
1202  break;
1203  case ACT_DRIVEAEXVALUE:
1204  m_actDriveAExValue->setPreempted();
1205  break;
1206  }
1207 
1208  m_curAct = ACT_NONE;
1209  }
1210 }
1211 
1213 {
1214  boost::mutex::scoped_lock lockAct(m_mtxAct);
1215 
1216  if(m_curAct > ACT_NONE) {
1217  HRESULT hr;
1218  std::vector<double> pose;
1219 
1220  MoveStringFeedback fbMvStr;
1221  MoveValueFeedback fbMvVal;
1222  DriveStringFeedback fbDrvStr;
1223  DriveValueFeedback fbDrvVal;
1224 
1225  hr = ExecCurJnt(pose);
1226 
1227  if(SUCCEEDED(hr)) {
1228  switch(m_curAct){
1229  case ACT_MOVESTRING:
1230  fbMvStr.pose = pose;
1231  m_actMoveString->publishFeedback(fbMvStr);
1232  break;
1233  case ACT_MOVEVALUE:
1234  fbMvVal.pose = pose;
1235  m_actMoveValue->publishFeedback(fbMvVal);
1236  break;
1237  case ACT_DRIVEEXSTRING:
1238  fbDrvStr.pose = pose;
1239  m_actDriveExString->publishFeedback(fbDrvStr);
1240  break;
1241  case ACT_DRIVEEXVALUE:
1242  fbDrvVal.pose = pose;
1243  m_actDriveExValue->publishFeedback(fbDrvVal);
1244  break;
1245  case ACT_DRIVEAEXSTRING:
1246  fbDrvStr.pose = pose;
1247  m_actDriveAExString->publishFeedback(fbDrvStr);
1248  break;
1249  case ACT_DRIVEAEXVALUE:
1250  fbDrvVal.pose = pose;
1251  m_actDriveAExValue->publishFeedback(fbDrvVal);
1252  break;
1253  }
1254  }
1255  }
1256 }
1257 
1259 {
1260  return m_sendfmt;
1261 }
1262 
1264 {
1265  switch(format) {
1266  case SENDFMT_NONE:
1267  case SENDFMT_HANDIO:
1268  case SENDFMT_MINIIO:
1270  case SENDFMT_USERIO:
1272  m_sendfmt = format;
1273  break;
1274  default:
1275  ROS_WARN("Failed to put_SendFormat.");
1276  break;
1277  }
1278 }
1279 
1281 {
1282  return m_recvfmt;
1283 }
1284 
1286 {
1287  int pose = format & RECVFMT_POSE;
1288  if((RECVFMT_NONE <= pose)
1289  && (pose <= RECVFMT_POSE_TJ))
1290  {
1291  switch(format & ~RECVFMT_POSE) {
1292  case RECVFMT_NONE:
1293  case RECVFMT_TIME:
1294  case RECVFMT_HANDIO:
1295  case RECVFMT_CURRENT:
1296  case RECVFMT_MINIIO:
1297  case RECVFMT_USERIO:
1315  m_recvfmt = format;
1316  break;
1317  default:
1318  ROS_WARN("Failed to put_RecvFormat.");
1319  break;
1320  }
1321  }
1322  else
1323  {
1324  ROS_WARN("Failed to put_RecvFormat.");
1325  }
1326 }
1327 
1329 {
1330  return m_tsfmt;
1331 }
1332 
1334 {
1335  if((format == TSFMT_MILLISEC)
1336  || (format == TSFMT_MICROSEC))
1337  {
1338  m_tsfmt = format;
1339  }
1340  else
1341  {
1342  ROS_WARN("Failed to put_TimeFormat.");
1343  }
1344 }
1345 
1347 {
1348  return m_recv_miniio;
1349 }
1350 
1352 {
1353  m_send_miniio = value;
1354 }
1355 
1357 {
1358  return m_recv_handio;
1359 }
1360 
1362 {
1363  m_send_handio = value;
1364 }
1365 
1366 void DensoRobotRC8::put_SendUserIO(const UserIO& value)
1367 {
1368  if(value.offset < UserIO::MIN_USERIO_OFFSET)
1369  {
1370  ROS_WARN("User I/O offset has to be greater than %d.",
1371  UserIO::MIN_USERIO_OFFSET - 1);
1372  return;
1373  }
1374 
1375  if(value.offset % UserIO::USERIO_ALIGNMENT)
1376  {
1377  ROS_WARN("User I/O offset has to be multiple of %d.",
1378  UserIO::USERIO_ALIGNMENT);
1379  return;
1380  }
1381 
1382  if(value.size <= 0)
1383  {
1384  ROS_WARN("User I/O size has to be greater than 0.");
1385  return;
1386  }
1387 
1388  if(value.size < value.value.size())
1389  {
1390  ROS_WARN("User I/O size has to be equal or greater than the value length.");
1391  return;
1392  }
1393 
1394  m_send_userio_offset = value.offset;
1395  m_send_userio_size = value.size;
1396  m_send_userio = value.value;
1397 }
1398 
1399 void DensoRobotRC8::put_RecvUserIO(const UserIO& value)
1400 {
1401  if(value.offset < UserIO::MIN_USERIO_OFFSET)
1402  {
1403  ROS_WARN("User I/O offset has to be greater than %d.",
1404  UserIO::MIN_USERIO_OFFSET - 1);
1405  return;
1406  }
1407 
1408  if(value.offset % UserIO::USERIO_ALIGNMENT)
1409  {
1410  ROS_WARN("User I/O offset has to be multiple of %d.",
1411  UserIO::USERIO_ALIGNMENT);
1412  return;
1413  }
1414 
1415  if(value.size <= 0)
1416  {
1417  ROS_WARN("User I/O size has to be greater than 0.");
1418  return;
1419  }
1420 
1421  m_recv_userio_offset = value.offset;
1422  m_recv_userio_size = value.size;
1423 }
1424 
1425 void DensoRobotRC8::get_RecvUserIO(UserIO& value) const
1426 {
1427  value.offset = m_recv_userio_offset;
1428  value.size = m_recv_userio.size();
1429  value.value = m_recv_userio;
1430 }
1431 
1432 void DensoRobotRC8::get_Current(std::vector<double> &current) const
1433 {
1434  current = m_current;
1435 }
1436 
1438 {
1439  return m_timestamp;
1440 }
1441 
1442 }
#define NAME_CHANGETOOL
VT_UI1
void get_RecvUserIO(UserIO &value) const
HRESULT SafeArrayUnaccessData(SAFEARRAY *psa)
#define NAME_MOVEVALUE
#define NAME_MOVESTRING
#define BCAP_ROBOT_CHANGE_ARGS
unsigned uint32_t
void Callback_Change(const std::string &name, const Int32::ConstPtr &msg)
SAFEARRAY * SafeArrayCreateVector(uint16_t vt, int32_t lLbound, uint32_t cElements)
#define NAME_CHANGEWORK
HRESULT ParseRecvParameter(const VARIANT_Ptr &recv, std::vector< double > &position, std::vector< double > &joint, std::vector< double > &trans, int &miniio, int &handio, int &timestamp, std::vector< uint8_t > &recv_userio, std::vector< double > &current)
HRESULT StartService(ros::NodeHandle &node)
void Callback_DriveString(const std::string &name, const DriveStringGoalConstPtr &goal)
void put_RecvUserIO(const UserIO &value)
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
#define S_OK
std::vector< uint8_t > m_recv_userio
wchar_t * BSTR
void Callback_Speed(const Float32::ConstPtr &msg)
std::vector< VARIANT, VariantAllocator< VARIANT > > VARIANT_Vec
std::vector< uint32_t > Handle_Vec
Definition: denso_base.h:67
#define ID_ROBOT_EXECUTE
int32_t lVal
boost::shared_ptr< SimpleActionServer< DriveValueAction > > m_actDriveExValue
unsigned char uint8_t
BSTR bstrVal
#define FAILED(hr)
#define ROS_WARN(...)
HRESULT ExecSlaveMode(const std::string &name, int32_t format, int32_t option=0)
VT_I4
VT_BSTR
std::vector< uint8_t > m_send_userio
std::vector< BCAPService_Ptr > Service_Vec
Definition: denso_base.h:68
void VariantInit(VARIANT *pvarg)
void Callback_MoveString(const MoveStringGoalConstPtr &goal)
#define NAME_DRIVEAEXSTRING
std::vector< double > m_position
#define E_FAIL
#define NAME_DRIVEEXVALUE
int32_t HRESULT
HRESULT ExecChange(const std::string &value)
HRESULT ExecSlaveMove(const std::vector< double > &pose, std::vector< double > &joint)
#define MESSAGE_QUEUE
Definition: denso_base.h:61
BSTR SysAllocString(const wchar_t *sz)
std::vector< double > m_trans
VT_ARRAY
std::vector< double > m_current
_DN_EXP_COMMON HRESULT VariantCopy(VARIANT *pvargDest, const VARIANT *pvargSrc)
HRESULT ExecCurJnt(std::vector< double > &pose)
VT_UI4
#define BCAP_ROBOT_SPEED_ARGS
boost::interprocess::unique_ptr< VARIANT, variant_deleter > VARIANT_Ptr
#define NAME_SPEED
SAFEARRAY * parray
HRESULT SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
VT_VARIANT
static BSTR ConvertStringToBSTR(const std::string &str)
Definition: denso_base.cpp:48
#define SUCCEEDED(hr)
boost::shared_ptr< SimpleActionServer< DriveStringAction > > m_actDriveExString
uint16_t vt
void Callback_MoveValue(const MoveValueGoalConstPtr &goal)
boost::shared_ptr< SimpleActionServer< DriveStringAction > > m_actDriveAExString
HRESULT ExecDrive(const std::string &name, const VARIANT_Ptr &option)
VT_R8
#define ID_ROBOT_CHANGE
void get_Current(std::vector< double > &current) const
#define ID_ROBOT_SPEED
#define BCAP_ROBOT_MOVE_ARGS
HRESULT ExecMove(int comp, const VARIANT_Ptr &pose, const std::string &option)
HRESULT CreateSendParameter(const std::vector< double > &pose, VARIANT_Ptr &send, const int miniio=0, const int handio=0, const int recv_userio_offset=0, const int recv_userio_size=0, const int send_userio_offset=0, const int send_userio_size=0, const std::vector< uint8_t > &send_userio=std::vector< uint8_t >())
#define BCAP_ROBOT_EXECUTE_ARGS
int int32_t
boost::shared_ptr< SimpleActionServer< MoveValueAction > > m_actMoveValue
DensoRobotRC8(DensoBase *parent, Service_Vec &service, Handle_Vec &handle, const std::string &name, const int *mode)
virtual HRESULT StartService(ros::NodeHandle &node)
Definition: denso_robot.cpp:50
boost::shared_ptr< SimpleActionServer< MoveStringAction > > m_actMoveString
VT_R4
#define ID_ROBOT_MOVE
boost::shared_ptr< SimpleActionServer< DriveValueAction > > m_actDriveAExValue
virtual HRESULT StopService()
Definition: denso_robot.cpp:73
#define NAME_DRIVEAEXVALUE
#define ID_ROBOT_HALT
void put_SendUserIO(const UserIO &value)
std::string RosName() const
Definition: denso_base.cpp:62
#define NAME_DRIVEEXSTRING
#define BCAP_ROBOT_HALT_ARGS
HRESULT CreatePoseData(const PoseData &pose, VARIANT &vnt)
std::vector< double > m_joint
void Callback_DriveValue(const std::string &name, const DriveValueGoalConstPtr &goal)


denso_robot_core
Author(s): DENSO WAVE INCORPORATED
autogenerated on Mon Jun 10 2019 13:12:27