robotiq_3f_gripper_can_client.cpp
Go to the documentation of this file.
1 // Copyright (c) 2016, Toyota Research Institute. All rights reserved.
2 
3 // Redistribution and use in source and binary forms, with or without
4 // modification, are permitted provided that the following conditions are met:
5 
6 // 1. Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 
9 // 2. Redistributions in binary form must reproduce the above copyright
10 // notice, this list of conditions and the following disclaimer in the
11 // documentation and/or other materials provided with the distribution.
12 
13 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
17 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
23 // POSSIBILITY OF SUCH DAMAGE.
24 
26 
27 using namespace robotiq_3f_gripper_control;
28 
29 namespace
30 {
31 static unsigned int kResponseOffset = 0x580;
32 static unsigned int kRequestOffset = 0x600;
33 }
34 
36  :can_id_(can_id)
37  ,driver_(driver)
38 {
39  resp_header_.id = can_id + kResponseOffset;
40 }
41 
43 {
44  driver_->shutdown();
45 }
46 
48 {
49  requestStart();
53 }
54 
56 {
60  if(driver_->getState().isReady())
61  {
62  can::Frame serial_request;
63  serial_request.id = can_id_ + kRequestOffset;
64  serial_request.dlc = (unsigned char)8;
65  serial_request.is_error = 0;
66  serial_request.is_rtr = 0;
67  serial_request.is_extended = 0;
68  serial_request.data.fill((unsigned char)0);
69 
70  serial_request.data[0] = 0x2F;
71  serial_request.data[1] = 0x00;
72  serial_request.data[2] = 0x22;
73 
74  serial_request.data[3] = 0x01; // Gripper status bits
75  serial_request.data[4] = 0x00;
76  serial_request.data[4] |= (output.rACT & 0x1) << 0;
77  serial_request.data[4] |= (output.rMOD & 0x3) << 1;
78  serial_request.data[4] |= (output.rGTO & 0x1) << 3;
79  serial_request.data[4] |= (output.rATR & 0x1) << 4;
80  if(prevCmd_.find(serial_request.data[3]) == prevCmd_.end() || prevCmd_[serial_request.data[3]]!= serial_request.data[4])
81  {
82  driver_->send(serial_request);
83  prevCmd_[serial_request.data[3]] = serial_request.data[4];
84  }
85 
86  serial_request.data[3] = 0x02; // Individual control bits
87  serial_request.data[4] = 0x00;
88  serial_request.data[4] |= (output.rICF & 0x1) << 2;
89  serial_request.data[4] |= (output.rICS & 0x1) << 3;
90  if(prevCmd_.find(serial_request.data[3]) == prevCmd_.end() || prevCmd_[serial_request.data[3]]!= serial_request.data[4])
91  {
92  driver_->send(serial_request);
93  prevCmd_[serial_request.data[3]] = serial_request.data[4];
94  }
95 
96  unsigned char subindex = 0x04;
97 
98  serial_request.data[3] = subindex++; // Finger A position
99  serial_request.data[4] = 0x00;
100  serial_request.data[4] = output.rPRA;
101  if(prevCmd_.find(serial_request.data[3]) == prevCmd_.end() || prevCmd_[serial_request.data[3]]!= serial_request.data[4])
102  {
103  driver_->send(serial_request);
104  prevCmd_[serial_request.data[3]] = serial_request.data[4];
105  }
106 
107  serial_request.data[3] = subindex++; // Finger A speed
108  serial_request.data[4] = 0x00;
109  serial_request.data[4] = output.rSPA;
110  if(prevCmd_.find(serial_request.data[3]) == prevCmd_.end() || prevCmd_[serial_request.data[3]]!= serial_request.data[4])
111  {
112  driver_->send(serial_request);
113  prevCmd_[serial_request.data[3]] = serial_request.data[4];
114  }
115 
116  serial_request.data[3] = subindex++; // Finger A force
117  serial_request.data[4] = 0x00;
118  serial_request.data[4] = output.rFRA;
119  if(prevCmd_.find(serial_request.data[3]) == prevCmd_.end() || prevCmd_[serial_request.data[3]]!= serial_request.data[4])
120  {
121  driver_->send(serial_request);
122  prevCmd_[serial_request.data[3]] = serial_request.data[4];
123  }
124 
125  serial_request.data[3] = subindex++; // Finger B position
126  serial_request.data[4] = 0x00;
127  serial_request.data[4] = output.rPRB;
128  if(prevCmd_.find(serial_request.data[3]) == prevCmd_.end() || prevCmd_[serial_request.data[3]]!= serial_request.data[4])
129  {
130  driver_->send(serial_request);
131  prevCmd_[serial_request.data[3]] = serial_request.data[4];
132  }
133 
134  serial_request.data[3] = subindex++; // Finger B speed
135  serial_request.data[4] = 0x00;
136  serial_request.data[4] = output.rSPB;
137  if(prevCmd_.find(serial_request.data[3]) == prevCmd_.end() || prevCmd_[serial_request.data[3]]!= serial_request.data[4])
138  {
139  driver_->send(serial_request);
140  prevCmd_[serial_request.data[3]] = serial_request.data[4];
141  }
142 
143  serial_request.data[3] = subindex++; // Finger B force
144  serial_request.data[4] = 0x00;
145  serial_request.data[4] = output.rFRB;
146  if(prevCmd_.find(serial_request.data[3]) == prevCmd_.end() || prevCmd_[serial_request.data[3]]!= serial_request.data[4])
147  {
148  driver_->send(serial_request);
149  prevCmd_[serial_request.data[3]] = serial_request.data[4];
150  }
151 
152  serial_request.data[3] = subindex++; // Finger C position
153  serial_request.data[4] = 0x00;
154  serial_request.data[4] = output.rPRC;
155  if(prevCmd_.find(serial_request.data[3]) == prevCmd_.end() || prevCmd_[serial_request.data[3]]!= serial_request.data[4])
156  {
157  driver_->send(serial_request);
158  prevCmd_[serial_request.data[3]] = serial_request.data[4];
159  }
160 
161  serial_request.data[3] = subindex++; // Finger C speed
162  serial_request.data[4] = 0x00;
163  serial_request.data[4] = output.rSPC;
164  if(prevCmd_.find(serial_request.data[3]) == prevCmd_.end() || prevCmd_[serial_request.data[3]]!= serial_request.data[4])
165  {
166  driver_->send(serial_request);
167  prevCmd_[serial_request.data[3]] = serial_request.data[4];
168  }
169 
170  serial_request.data[3] = subindex++; // Finger C force
171  serial_request.data[4] = 0x00;
172  serial_request.data[4] = output.rFRC;
173  if(prevCmd_.find(serial_request.data[3]) == prevCmd_.end() || prevCmd_[serial_request.data[3]]!= serial_request.data[4])
174  {
175  driver_->send(serial_request);
176  prevCmd_[serial_request.data[3]] = serial_request.data[4];
177  }
178 
179  serial_request.data[3] = subindex++; // Finger S position
180  serial_request.data[4] = 0x00;
181  serial_request.data[4] = output.rPRS;
182  if(prevCmd_.find(serial_request.data[3]) == prevCmd_.end() || prevCmd_[serial_request.data[3]]!= serial_request.data[4])
183  {
184  driver_->send(serial_request);
185  prevCmd_[serial_request.data[3]] = serial_request.data[4];
186  }
187 
188  serial_request.data[3] = subindex++; // Finger S speed
189  serial_request.data[4] = 0x00;
190  serial_request.data[4] = output.rSPS;
191  if(prevCmd_.find(serial_request.data[3]) == prevCmd_.end() || prevCmd_[serial_request.data[3]]!= serial_request.data[4])
192  {
193  driver_->send(serial_request);
194  prevCmd_[serial_request.data[3]] = serial_request.data[4];
195  }
196 
197  serial_request.data[3] = subindex++; // Finger S force
198  serial_request.data[4] = 0x00;
199  serial_request.data[4] = output.rFRS;
200  if(prevCmd_.find(serial_request.data[3]) == prevCmd_.end() || prevCmd_[serial_request.data[3]]!= serial_request.data[4])
201  {
202  driver_->send(serial_request);
203  prevCmd_[serial_request.data[3]] = serial_request.data[4];
204  }
205 
206  output_ = output;
207 
208  }
209 }
210 
212 {
213  if(driver_->getState().isReady())
214  {
215  can::Frame serial_request;
216  serial_request.id = can_id_ + kRequestOffset;
217  serial_request.dlc = static_cast<unsigned char>(8);
218  serial_request.is_error = 0;
219  serial_request.is_rtr = 0;
220  serial_request.is_extended = 0;
221  serial_request.data.fill(static_cast<unsigned char>(0));
222 
223  serial_request.data[0] = 0x4F;
224  serial_request.data[1] = 0x00;
225  serial_request.data[2] = 0x20;
226 
227  for(unsigned int i = 1; i < 16; ++i)
228  {
229  serial_request.data[3] = i;
230  if(!read_mutex.timed_lock(boost::posix_time::time_duration(0,0,1,0)))
231  {
232  std::stringstream err;
233  err<<"unable to read response on index "<<i;
234  read_mutex.unlock();
235  throw std::runtime_error(err.str().c_str());
236  }
237  driver_->send(serial_request);
238  }
240  if(!read_mutex.timed_lock(boost::posix_time::time_duration(0,0,1,0)))
241  {
242  std::stringstream err;
243  err<<"unable to read response on last index";
244  read_mutex.unlock();
245  throw std::runtime_error(err.str().c_str());
246  }
247 
248  read_mutex.unlock();
249  }
250  return input_;
251 }
252 
254 {
255  return output_;
256 }
257 
259 {
260  std::string err;
261  driver_->translateError(s.internal_error, err);
262  if(!s.internal_error)
263  {
264  ROS_INFO_STREAM("State: " <<err <<", asio: "<<s.error_code.message());
265  }
266  else
267  {
268  ROS_ERROR_STREAM("Error: "<<err<<", asio: "<<s.error_code.message());
269  throw std::runtime_error(err);
270  }
271 
272 }
273 
275 {
276  can::Frame frame = f;
277 
278  if(!frame.isValid())
279  {
280  std::stringstream err;
281  err << "Invalid frame from SocketCAN: id " <<std::hex << f.id <<", length "<<(int) f.dlc <<", is_extended: "<<f.is_extended<<", is error: "<<f.is_error<<", is_rtr: "<<f.is_rtr;
282  throw std::runtime_error(err.str().c_str());
283  }
284  if (frame.is_error)
285  {
286  throw std::runtime_error("Received frame is error");
287  }
288  if ((int)frame.dlc != 8)
289  {
290  throw std::runtime_error("Message length must be 8");
291  }
292 
293  if(f.data[0]==0x60)
294  {
296  }
297  else if (f.data[0]==0x4f && f.data[1]==0x00 && f.data[2] == 0x20)
298  {
299  switch((int)f.data[3])
300  {
301  case 0x01:
303  break;
304  case 0x02:
305  decodeObjectStatus(f.data[4]);
306  break;
307  case 0x03:
308  decodeFaultStatus(f.data[4]);
309  break;
310  case 0x04:
312  break;
313  case 0x05:
314  decodeFingerAPos(f.data[4]);
315  break;
316  case 0x06:
318  break;
319  case 0x07:
321  break;
322  case 0x08:
323  decodeFingerBPos(f.data[4]);
324  break;
325  case 0x09:
327  break;
328  case 0x0A:
330  break;
331  case 0x0B:
332  decodeFingerCPos(f.data[4]);
333  break;
334  case 0x0C:
336  break;
337  case 0x0D:
339  break;
340  case 0x0E:
341  decodeFingerSPos(f.data[4]);
342  break;
343  case 0x0F:
345  break;
346  default:
348  break;
349 
350  }
351  read_mutex.unlock();
352  }
353 }
354 
356 {
358  can::Frame iFrame;
359  iFrame.id = 0x000;
360  iFrame.is_error = 0;
361  iFrame.is_extended = 0;
362  iFrame.is_rtr = 0;
363  iFrame.dlc = (unsigned char)2;
364  iFrame.data[0] = 0x01;
365  iFrame.data[1] = (unsigned char)can_id_;
366  driver_->send(iFrame);
367 }
368 
370 {
371  input_.gACT = ((f >> 0) & 0x1);
372  input_.gMOD = ((f >> 1) & 0x3);
373  input_.gGTO = ((f >> 3) & 0x1);
374  input_.gIMC = ((f >> 4) & 0x3);
375  input_.gSTA = ((f >> 6) & 0x3);
376 }
377 
379 {
380  input_.gDTA = ((f >> 0) & 0x3);
381  input_.gDTB = ((f >> 2) & 0x3);
382  input_.gDTC = ((f >> 4) & 0x3);
383  input_.gDTS = ((f >> 6) & 0x3);
384 }
385 
387 {
388  input_.gFLT = ((f >> 0) & 0xF);
389 }
390 
392 {
393  input_.gPRA = f;
394 }
395 
397 {
398  input_.gPOA = f;
399 }
400 
402 {
403  input_.gCUA = f;
404 }
405 
407 {
408  input_.gPRB = f;
409 }
410 
412 {
413  input_.gPOB = f;
414 }
415 
417 {
418  input_.gCUB = f;
419 }
420 
422 {
423  input_.gPRC = f;
424 }
425 
427 {
428  input_.gPOC = f;
429 }
430 
432 {
433  input_.gCUC = f;
434 }
435 
437 {
438  input_.gPRS = f;
439 }
440 
442 {
443  input_.gPOS = f;
444 }
445 
447 {
448  input_.gCUS = f;
449 }
450 
robotiq_3f_gripper_articulated_msgs::Robotiq3FGripperRobotOutput GripperOutput
unsigned int is_error
boost::array< value_type, 8 > data
GripperOutput readOutputs() const
Reads set of output-register values from the gripper.
unsigned int is_extended
can::StateInterface::StateListenerConstSharedPtr state_listener_
can::CommInterface::FrameListenerConstSharedPtr frame_listener_
#define ROS_INFO_STREAM(args)
bool isValid() const
Robotiq3FGripperCanClient(unsigned int can_id, boost::shared_ptr< can::DriverInterface > driver)
robotiq_3f_gripper_articulated_msgs::Robotiq3FGripperRobotInput GripperInput
unsigned int internal_error
unsigned char dlc
#define ROS_ERROR_STREAM(args)
void writeOutputs(const GripperOutput &output)
Write the given set of control flags to the memory of the gripper.
unsigned int id
GripperInput readInputs() const
Reads set of input-register values from the gripper.
unsigned int is_rtr
boost::system::error_code error_code


robotiq_3f_gripper_control
Author(s): Nicolas Lauzier (Robotiq inc.), Allison Thackston
autogenerated on Tue Jun 1 2021 02:29:58