Shane Smiskol 606943010e Reapply "joystickd is a real process (#33490)" (#33514) 1 月之前
..
tests 9da055853f LogReader clean ups (#33446) 1 月之前
README.md cc77d0ca34 segment range docs update (#31560) 8 月之前
__init__.py 99c5800ea5 merge in tools 4 年之前
api.py 3358745103 ruff: enable UP 5 月之前
auth.py 9bd90112d0 use pyupgrade to update to new typing syntax (#31580) 8 月之前
auth_config.py e91032efb3 replace common.file_helpers.mkdirs_exists_ok with python os.makedirs funtion (#30618) 10 月之前
azure_container.py 786aff27da azure_container: pass the filename explicitely when using get_url (#33407) 1 月之前
bootlog.py 9bd90112d0 use pyupgrade to update to new typing syntax (#31580) 8 月之前
cache.py e91032efb3 replace common.file_helpers.mkdirs_exists_ok with python os.makedirs funtion (#30618) 10 月之前
comma_car_segments.py 4f019b5f60 move selfdrive/car to opendbc (#32630) 2 月之前
exceptions.py 99c5800ea5 merge in tools 4 年之前
filereader.py 937ed5f700 Add testing closet to LogReader source (#33242) 2 月之前
framereader.py a544533476 framereader: eliminate tempfile usage (#30289) 1 年之前
helpers.py 539c828861 tools: keep re pattern file small (#33084) 2 月之前
kbhit.py 606943010e Reapply "joystickd is a real process (#33490)" (#33514) 1 月之前
live_logreader.py 4efe8d8118 Fix msgq context overrides (#33014) 3 月之前
logreader.py 1e92af9b3c [bot] Update Python packages (#33436) 1 月之前
openpilotci.py 09b95b715c cleanup azure handling (#31034) 9 月之前
openpilotcontainers.py 09b95b715c cleanup azure handling (#31034) 9 月之前
route.py 309ccf6482 LogReader: support multiple log extensions in route (#33066) 3 月之前
sanitizer.py b29eea47ce sanitizer: sanitize vin number (#31090) 9 月之前
url_file.py 6c51d1563d URLFile: add typing and internalize pool manager (#31466) 8 月之前
vidindex.py 9bd90112d0 use pyupgrade to update to new typing syntax (#31580) 8 月之前

README.md

LogReader

Route is a class for conveniently accessing all the logs from your routes. The LogReader class reads the non-video logs, i.e. rlog.bz2 and qlog.bz2. There's also a matching FrameReader class for reading the videos.

from openpilot.tools.lib.route import Route
from openpilot.tools.lib.logreader import LogReader

r = Route("a2a0ccea32023010|2023-07-27--13-01-19")

# get a list of paths for the route's rlog files
print(r.log_paths())

# and road camera (fcamera.hevc) files
print(r.camera_paths())

# setup a LogReader to read the route's first rlog
lr = LogReader(r.log_paths()[0])

# print out all the messages in the log
import codecs
codecs.register_error("strict", codecs.backslashreplace_errors)
for msg in lr:
  print(msg)

# setup a LogReader for the route's second qlog
lr = LogReader(r.log_paths()[1])

# print all the steering angles values from the log
for msg in lr:
  if msg.which() == "carState":
    print(msg.carState.steeringAngleDeg)

Segment Ranges

We also support a new format called a "segment range":

344c5c15b34f2d8a   /   2024-01-03--09-37-12   /     2:6    /       q
[   dongle id     ] [       timestamp        ] [ selector ]  [ query type]

you can specify which segments from a route to load

lr = LogReader("a2a0ccea32023010|2023-07-27--13-01-19/4")   # 4th segment
lr = LogReader("a2a0ccea32023010|2023-07-27--13-01-19/4:6") # 4th and 5th segment
lr = LogReader("a2a0ccea32023010|2023-07-27--13-01-19/-1")  # last segment
lr = LogReader("a2a0ccea32023010|2023-07-27--13-01-19/:5")  # first 5 segments
lr = LogReader("a2a0ccea32023010|2023-07-27--13-01-19/1:")  # all except first segment

and can select which type of logs to grab

lr = LogReader("a2a0ccea32023010|2023-07-27--13-01-19/4/q") # get qlogs
lr = LogReader("a2a0ccea32023010|2023-07-27--13-01-19/4/r") # get rlogs (default)