Skip to content

Commit 243f2d2

Browse files
- Introduce extensive debug message when data packet is lost to improve diagnostic.
- Default recorder.py mode changed to "buffered". This ensures that data packages are no dropped in recorded file. - Fix issue with binary data handling in python 3
1 parent b23ae7a commit 243f2d2

File tree

6 files changed

+62
-22
lines changed

6 files changed

+62
-22
lines changed

examples/record.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,6 @@
5555
help="data output file to write to (robot_data.csv)",
5656
)
5757
parser.add_argument("--verbose", help="increase output verbosity", action="store_true")
58-
parser.add_argument(
59-
"--buffered",
60-
help="Use buffered receive which doesn't skip data",
61-
action="store_true",
62-
)
6358
parser.add_argument(
6459
"--binary", help="save the data in binary format", action="store_true"
6560
)
@@ -114,10 +109,7 @@
114109
if args.samples > 0 and i >= args.samples:
115110
keep_running = False
116111
try:
117-
if args.buffered:
118-
state = con.receive_buffered(args.binary)
119-
else:
120-
state = con.receive(args.binary)
112+
state = con.receive_buffered(args.binary)
121113
if state is not None:
122114
writer.writerow(state)
123115
i += 1

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<modelVersion>4.0.0</modelVersion>
77
<groupId>com.ur.rtde.client</groupId>
88
<artifactId>rtde</artifactId>
9-
<version>2.7.2</version>
9+
<version>2.7.12</version>
1010
<packaging>pom</packaging>
1111

1212
<properties>

rtde/csv_binary_writer.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,12 @@ def writeheader(self):
108108
headerStr += self.__header_names[i]
109109

110110
headerStr += "\n"
111-
self.__file.write(struct.pack(str(len(headerStr)) + "s", headerStr if sys.version_info[0] < 3 else headerStr.encode("utf-8")))
111+
self.__file.write(
112+
struct.pack(
113+
str(len(headerStr)) + "s",
114+
headerStr if sys.version_info[0] < 3 else headerStr.encode("utf-8"),
115+
)
116+
)
112117

113118
# Header types
114119
typeStr = str("")
@@ -119,7 +124,12 @@ def writeheader(self):
119124
typeStr += self.getType(self.__types[i])
120125

121126
typeStr += "\n"
122-
self.__file.write(struct.pack(str(len(typeStr)) + "s", typeStr if sys.version_info[0] < 3 else typeStr.encode("utf-8")))
127+
self.__file.write(
128+
struct.pack(
129+
str(len(typeStr)) + "s",
130+
typeStr if sys.version_info[0] < 3 else typeStr.encode("utf-8"),
131+
)
132+
)
123133

124134
def packToBinary(self, vtype, value):
125135
print(vtype)

rtde/rtde.py

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ def __init__(self, hostname, port=30004):
8383
self.__input_config = {}
8484
self.__skipped_package_count = 0
8585
self.__protocolVersion = RTDE_PROTOCOL_VERSION_1
86+
self.__warning_counter = {}
8687

8788
def connect(self):
8889
if self.__sock:
@@ -206,9 +207,9 @@ def send(self, input_data):
206207
return self.__sendall(Command.RTDE_DATA_PACKAGE, config.pack(input_data))
207208

208209
def receive(self, binary=False):
209-
"""Recieve the latest data package.
210-
If muliple packages has been received, older ones are discarded
211-
and only the newest one will be returned. Will block untill a package
210+
"""Receive the latest data package.
211+
If multiple packages has been received, older ones are discarded
212+
and only the newest one will be returned. Will block until a package
212213
is received or the connection is lost
213214
"""
214215
if self.__output_config is None:
@@ -218,8 +219,8 @@ def receive(self, binary=False):
218219
return self.__recv(Command.RTDE_DATA_PACKAGE, binary)
219220

220221
def receive_buffered(self, binary=False, buffer_limit=None):
221-
"""Recieve the next data package.
222-
If muliple packages has been received they are buffered and will
222+
"""Receive the next data package.
223+
If multiple packages has been received they are buffered and will
223224
be returned on subsequent calls to this function.
224225
Returns None if no data is available.
225226
"""
@@ -301,6 +302,9 @@ def has_data(self):
301302
return len(readable) != 0
302303

303304
def __recv(self, command, binary=False):
305+
306+
previous_skipped_package_count = self.__skipped_package_count
307+
304308
while self.is_connected():
305309
try:
306310
self.__recv_to_buffer(DEFAULT_TIMEOUT)
@@ -321,16 +325,44 @@ def __recv(self, command, binary=False):
321325
if len(self.__buf) >= 3 and command == Command.RTDE_DATA_PACKAGE:
322326
next_packet_header = serialize.ControlHeader.unpack(self.__buf)
323327
if next_packet_header.command == command:
324-
_log.debug("skipping package(1)")
325328
self.__skipped_package_count += 1
326329
continue
327330
if packet_header.command == command:
331+
if (
332+
self.__skipped_package_count
333+
> previous_skipped_package_count
334+
):
335+
_log.debug(
336+
"Total number of skipped packages increased to {}".format(
337+
self.__skipped_package_count
338+
)
339+
)
340+
341+
if self.__warning_counter:
342+
for warn in self.__warning_counter:
343+
_log.debug(
344+
"A total of {} packets with command {} received, before expected command.".format(
345+
self.__warning_counter[warn], warn
346+
)
347+
)
348+
self.__warning_counter.clear()
349+
328350
if binary:
329351
return packet[1:]
330352

331353
return data
332354
else:
333-
_log.debug("skipping package(2)")
355+
if not packet_header.command in self.__warning_counter:
356+
_log.debug(
357+
"Packet with command {} doesn't match the expected command {}. It will be skipped.".format(
358+
packet_header.command, command
359+
)
360+
)
361+
self.__warning_counter[packet_header.command] = 1
362+
else:
363+
self.__warning_counter[packet_header.command] = (
364+
self.__warning_counter[packet_header.command] + 1
365+
)
334366
else:
335367
break
336368
raise RTDEException(" _recv() Connection lost ")

rtde/serialize.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2323

2424
import struct
25+
import sys
2526

2627

2728
class ControlHeader(object):
@@ -167,8 +168,13 @@ class DataConfig(object):
167168
@staticmethod
168169
def unpack_recipe(buf):
169170
rmd = DataConfig()
170-
rmd.id = struct.unpack_from(">B", buf)[0]
171-
rmd.types = buf.decode("utf-8")[1:].split(",")
171+
python_version = sys.version_info
172+
if python_version.major == 2:
173+
rmd.id = struct.unpack_from(">B", buf)[0]
174+
rmd.types = buf.decode("utf-8")[1:].split(",")
175+
else:
176+
rmd.id = buf[0]
177+
rmd.types = buf[1:].decode("utf-8").split(",")
172178
rmd.fmt = ">B"
173179
for i in rmd.types:
174180
if i == "INT32":

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@
2626
setup(
2727
name="UrRtde",
2828
packages=["rtde"],
29-
version="2.7.2",
29+
version="2.7.12",
3030
description="Real-Time Data Exchange (RTDE) python client + examples",
3131
)

0 commit comments

Comments
 (0)