diff --git a/build/camera_module/build/lib/camera_module/camera_module.py b/build/camera_module/build/lib/camera_module/camera_module.py
index bb81bb6..a4a1bfa 100644
--- a/build/camera_module/build/lib/camera_module/camera_module.py
+++ b/build/camera_module/build/lib/camera_module/camera_module.py
@@ -2,22 +2,35 @@ from ament_index_python.packages import get_package_share_directory
import os
import cv2
+import numpy as np
+from math import ceil
+from itertools import product
+from rknnlite.api import RKNNLite
from sensor_msgs.msg import CompressedImage
from cv_bridge import CvBridge
-
+import time
from camera_module.threaded_node import ThreadedNode
+from sensor_msgs.msg import CompressedImage
from std_msgs.msg import String
import rclpy
+from ament_index_python.packages import get_package_share_directory
+import os
+
+package_name = 'camera_module'
+model_path = os.path.join(get_package_share_directory(package_name), 'resource', 'model', 'RetinaFace.rknn')
class CamPublisher(ThreadedNode):
def __init__(self, rknn, cap):
super().__init__('camera_module', default_rate=5.0)
- self.string_pub = self.create_publisher(String, 'camera_module/cam_topic', 10)
- self.image_pub = self.create_publisher(CompressedImage, 'camera_module/compressed', 10)
+ #self.string_pub = self.create_publisher(String, 'camera_module/cam_topic', 10)
+ #self.image_pub = self.create_publisher(CompressedImage, 'camera_module/compressed', 10)
+ self.face_detect_pub = self.create_publisher(String, 'camera_module/face_data', 10)
+ self.face_image_pub = self.create_publisher(CompressedImage, 'camera_module/face_images', 10)
+ self.face_detect_frame_pub = self.create_publisher(CompressedImage, 'camera_module/face_detect_frame', 10)
self.rknn = rknn
self.cap = cap
self.latest_frame = None
@@ -40,10 +53,10 @@ class CamPublisher(ThreadedNode):
def on_tick(self):
# Publish string message
- msg = String()
- msg.data = 'Cam from ROS 2!'
- self.string_pub.publish(msg)
- self.get_logger().info(f'Published: {msg.data}')
+ # msg = String()
+ # msg.data = 'Cam from ROS 2!'
+ # self.string_pub.publish(msg)
+ # self.get_logger().info(f'Published: {msg.data}')
# Capture and publish image
if self.cap is None:
@@ -53,8 +66,10 @@ class CamPublisher(ThreadedNode):
ret, frame = cap.read()
if not ret:
return
+ raw_frame = frame.copy()
+
img_height, img_width, _ = frame.shape
- letterbox_img, aspect_ratio, offset_x, offset_y = letterbox_resize(frame, model_size, 114)
+ letterbox_img, aspect_ratio, offset_x, offset_y = letterbox_resize(frame, self.model_size, 114)
infer_img = np.expand_dims(letterbox_img.astype(np.uint8), axis=0)
outputs = rknn.inference(inputs=[infer_img])
@@ -62,14 +77,14 @@ class CamPublisher(ThreadedNode):
return
loc, conf, landms = outputs
- boxes = box_decode(loc.squeeze(0), priors)
- boxes *= np.array([model_size[1], model_size[0], model_size[1], model_size[0]])
+ boxes = box_decode(loc.squeeze(0), self.priors)
+ boxes *= np.array([self.model_size[1], self.model_size[0], self.model_size[1], self.model_size[0]])
boxes[:, 0::2] = np.clip((boxes[:, 0::2] - offset_x) / aspect_ratio, 0, img_width)
boxes[:, 1::2] = np.clip((boxes[:, 1::2] - offset_y) / aspect_ratio, 0, img_height)
scores = conf.squeeze(0)[:, 1]
- landms = decode_landm(landms.squeeze(0), priors)
- landms *= np.tile(np.array([model_size[1], model_size[0]]), 5)
+ landms = decode_landm(landms.squeeze(0), self.priors)
+ landms *= np.tile(np.array([self.model_size[1], self.model_size[0]]), 5)
landms[:, 0::2] = np.clip((landms[:, 0::2] - offset_x) / aspect_ratio, 0, img_width)
landms[:, 1::2] = np.clip((landms[:, 1::2] - offset_y) / aspect_ratio, 0, img_height)
@@ -85,6 +100,10 @@ class CamPublisher(ThreadedNode):
face_data = []
frame_center = np.array([img_width / 2, img_height / 2])
+ face_data = []
+ valid_dets = []
+ valid_landms = []
+
for data, landmark in zip(dets, landms):
if data[4] < 0.6:
continue
@@ -100,20 +119,59 @@ class CamPublisher(ThreadedNode):
"y": float(offset[1])
}
})
+ valid_dets.append(data)
+ valid_landms.append(landmark)
+
+
+ for data, landmark in zip(valid_dets, valid_landms):
+ x1, y1, x2, y2 = map(int, data[:4])
+ conf = data[4]
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.putText(frame, f'{conf:.4f}', (x1, y1 + 12), cv2.FONT_HERSHEY_DUPLEX, 0.5, (255, 255, 255))
for j in range(5):
lx, ly = map(int, landmark[j*2:j*2+2])
cv2.circle(frame, (lx, ly), 1, (0, 255, 255), 2)
- cv2.putText(frame, f'FPS: {fps:.2f}', (10, 30),
- cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
+ # cv2.putText(frame, f'FPS: {fps:.2f}', (10, 30),
+ # cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
if len(face_data) > 0:
print(face_data)
+ self.face_detect_pub.publish(String(data=str(face_data)))
+
+ # CROP FACES AND PUBLISH STITCHED IMAGE
+ face_crops = []
+ for data in dets:
+ if data[4] < 0.6:
+ continue
+ x1, y1, x2, y2 = map(int, data[:4])
+ face_crop = raw_frame[y1:y2, x1:x2]
+ face_crops.append(face_crop)
+ target_height = 100
+ resized_faces = [
+ cv2.resize(face, (int(face.shape[1] * target_height / face.shape[0]), target_height))
+ for face in face_crops
+ ]
+ if resized_faces:
+ stitched = cv2.hconcat(resized_faces)
+ ret, stitched_buffer = cv2.imencode('.jpg', stitched)
+ if ret:
+ msg = CompressedImage()
+ msg.header.stamp = self.get_clock().now().to_msg()
+ msg.format = 'jpeg'
+ msg.data = stitched_buffer.tobytes()
+ self.face_image_pub.publish(msg)
+
+
+
ret, buffer = cv2.imencode('.jpg', frame)
if ret:
latest_frame = buffer.tobytes()
latest_faces = face_data
+ msg = CompressedImage()
+ msg.header.stamp = self.get_clock().now().to_msg()
+ msg.format = 'jpeg'
+ msg.data = buffer.tobytes()
+ self.face_detect_frame_pub.publish(msg)
def destroy_node(self):
if self.cap:
@@ -194,7 +252,7 @@ def nms(dets, thresh):
# --- RKNN Initialization ---
rknn = RKNNLite()
-rknn.load_rknn('./RetinaFace.rknn')
+rknn.load_rknn(model_path)
rknn.init_runtime()
# --- Shared State ---
diff --git a/build/camera_module/prefix_override/__pycache__/sitecustomize.cpython-312.pyc b/build/camera_module/prefix_override/__pycache__/sitecustomize.cpython-312.pyc
index 32cecdc..bc8744f 100644
Binary files a/build/camera_module/prefix_override/__pycache__/sitecustomize.cpython-312.pyc and b/build/camera_module/prefix_override/__pycache__/sitecustomize.cpython-312.pyc differ
diff --git a/log/build_2025-11-09_19-38-47/camera_module/stderr.log b/build/voice_to_text_node/build/lib/voice_to_text_node/__init__.py
similarity index 100%
rename from log/build_2025-11-09_19-38-47/camera_module/stderr.log
rename to build/voice_to_text_node/build/lib/voice_to_text_node/__init__.py
diff --git a/build/voice_to_text_node/build/lib/voice_to_text_node/threaded_node.py b/build/voice_to_text_node/build/lib/voice_to_text_node/threaded_node.py
new file mode 100644
index 0000000..d3abe01
--- /dev/null
+++ b/build/voice_to_text_node/build/lib/voice_to_text_node/threaded_node.py
@@ -0,0 +1,115 @@
+# threaded_node.py
+import rclpy
+from rclpy.node import Node
+from rclpy.parameter import Parameter
+from rcl_interfaces.msg import SetParametersResult, ParameterEvent
+from std_msgs.msg import Bool, Float32
+
+import time
+import threading
+import queue
+from collections import deque
+
+class ThreadedNode(Node):
+ def __init__(self, name: str, default_rate: float = 1.0):
+ super().__init__(name)
+
+ # Declare and initialize publish_rate
+ self.declare_parameter('publish_rate', default_rate)
+ self.publish_rate = self.get_parameter('publish_rate').get_parameter_value().double_value
+
+ # Heartbeat publisher
+ self.heartbeat_pub = self.create_publisher(Bool, f'{name}/heartbeat', 1)
+ self.heartbeat_timer = self.create_timer(1.0, self.send_heartbeat)
+
+ # Actual FPS publisher
+ self.fps_pub = self.create_publisher(Float32, f'{name}/fps', 1)
+ buffer_size = max(5, int(self.publish_rate * 5)) # 5 seconds worth of ticks
+ self._tick_times = deque(maxlen=buffer_size)
+
+ # Work timer
+ self.timer = self.create_timer(1.0 / self.publish_rate, self.timer_callback)
+
+ # Parameter update hooks
+ self.add_on_set_parameters_callback(self.param_callback)
+ self.create_subscription(ParameterEvent, '/parameter_events', self.parameter_event_listener, 10)
+
+ self.setup_parameters()
+ self.setup_topics()
+
+ # Worker thread setup
+ self.task_queue = queue.Queue()
+ self.worker_thread = threading.Thread(target=self.worker_loop, daemon=True)
+ self.worker_thread.start()
+
+ def setup_parameters(self):
+ pass
+
+ def setup_topics(self):
+ pass
+
+ def send_heartbeat(self):
+ self.heartbeat_pub.publish(Bool(data=True))
+
+ def timer_callback(self):
+ if self.task_queue.empty():
+ self.task_queue.put_nowait('tick')
+
+
+ def worker_loop(self):
+ while rclpy.ok():
+ try:
+ task = self.task_queue.get(timeout=1.0)
+ if task == 'tick':
+ now = time.time()
+ self._tick_times.append(now)
+
+ # Call the subclass's tick logic
+ try:
+ self.on_tick()
+ except Exception as e:
+ self.get_logger().error(f'on_tick failed: {e}')
+
+ # Compute smoothed FPS
+ if len(self._tick_times) >= 2:
+ intervals = [t2 - t1 for t1, t2 in zip(self._tick_times, list(self._tick_times)[1:])]
+ avg_interval = sum(intervals) / len(intervals)
+ smoothed_fps = 1.0 / avg_interval if avg_interval > 0 else 0.0
+ else:
+ smoothed_fps = 0.0
+
+ fps_msg = Float32()
+ fps_msg.data = smoothed_fps
+ self.fps_pub.publish(fps_msg)
+
+
+ except queue.Empty:
+ continue
+
+ def on_tick(self):
+ # Override this in your subclass
+ pass
+
+ def update_publish_rate(self, new_rate):
+ self.get_logger().info(f'Updating publish rate to {new_rate} Hz')
+ self.timer.cancel()
+ self.timer = self.create_timer(1.0 / new_rate, self.timer_callback)
+ self.publish_rate = new_rate
+ self.set_parameters([Parameter('publish_rate', Parameter.Type.DOUBLE, new_rate)])
+ buffer_size = max(5, int(self.publish_rate * 5)) # 5 seconds worth of ticks
+ self._tick_times = deque(maxlen=buffer_size)
+
+ def param_callback(self, params):
+ for param in params:
+ if param.name == 'publish_rate' and param.type_ == Parameter.Type.DOUBLE:
+ new_rate = param.value
+ if new_rate > 0.0 and abs(new_rate - self.publish_rate) > 1e-6:
+ self.update_publish_rate(new_rate)
+ return SetParametersResult(successful=True)
+
+ def parameter_event_listener(self, event: ParameterEvent):
+ for changed in event.changed_parameters:
+ if changed.name == 'publish_rate':
+ new_rate = changed.value.double_value
+ if new_rate > 0.0 and abs(new_rate - self.publish_rate) > 1e-6:
+ self.update_publish_rate(new_rate)
diff --git a/build/voice_to_text_node/build/lib/voice_to_text_node/voice_to_text_node.py b/build/voice_to_text_node/build/lib/voice_to_text_node/voice_to_text_node.py
new file mode 100644
index 0000000..01c2aa2
--- /dev/null
+++ b/build/voice_to_text_node/build/lib/voice_to_text_node/voice_to_text_node.py
@@ -0,0 +1,82 @@
+from ament_index_python.packages import get_package_share_directory
+import os
+
+import time
+from voice_to_text_node.threaded_node import ThreadedNode
+
+from std_msgs.msg import String
+import rclpy
+
+from ament_index_python.packages import get_package_share_directory
+import threading
+
+
+import sounddevice as sd
+import queue
+from vosk import Model, KaldiRecognizer
+
+package_name = 'voice_to_text_node'
+model_path = os.path.join(
+ get_package_share_directory('voice_to_text_node'),
+ 'resource', 'model', 'vosk-model-small-en-us-0.15'
+)
+print("MODEL PATH: " + model_path)
+latest_partial = {"partial": ""}
+latest_result = {"text": ""}
+
+
+class VoicePublisher(ThreadedNode):
+ def __init__(self):
+ super().__init__(package_name, default_rate=5.0)
+ self.string_pub = self.create_publisher(String, package_name + '/test_topic', 10)
+
+ self.latest_partial = {"partial": ""}
+ self.latest_result = {"text": ""}
+
+ self.speech_thread = threading.Thread(target=self.speech_loop, daemon=True)
+ self.speech_thread.start()
+
+ def on_tick(self):
+ msg = String()
+ msg.data = self.latest_partial.get("partial", "") or self.latest_result.get("text", "")
+ self.string_pub.publish(msg)
+ self.get_logger().info(f'Published: {msg.data}')
+
+ def speech_loop(self):
+ model = Model(model_path)
+ rec = KaldiRecognizer(model, 16000)
+ q = queue.Queue()
+
+ def callback(indata, frames, time, status):
+ if status:
+ print(status)
+ q.put(bytes(indata))
+
+ with sd.RawInputStream(samplerate=16000, blocksize=8000, dtype='int16',
+ channels=1, callback=callback):
+ while True:
+ data = q.get()
+ if rec.AcceptWaveform(data):
+ result = json.loads(rec.Result())
+ self.latest_result = result
+ print(".", result)
+ else:
+ partial = json.loads(rec.PartialResult())
+ self.latest_partial = partial
+ print("...", partial.get("partial", ""), end='\r')
+
+ def destroy_node(self):
+ super().destroy_node()
+
+
+
+
+def main():
+ rclpy.init()
+ node = VoicePublisher()
+ rclpy.spin(node)
+ node.destroy_node()
+ rclpy.shutdown()
+
+if __name__ == '__main__':
+ main()
diff --git a/build/voice_to_text_node/colcon_build.rc b/build/voice_to_text_node/colcon_build.rc
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/build/voice_to_text_node/colcon_build.rc
@@ -0,0 +1 @@
+0
diff --git a/build/voice_to_text_node/colcon_command_prefix_setup_py.sh b/build/voice_to_text_node/colcon_command_prefix_setup_py.sh
new file mode 100644
index 0000000..f9867d5
--- /dev/null
+++ b/build/voice_to_text_node/colcon_command_prefix_setup_py.sh
@@ -0,0 +1 @@
+# generated from colcon_core/shell/template/command_prefix.sh.em
diff --git a/build/voice_to_text_node/colcon_command_prefix_setup_py.sh.env b/build/voice_to_text_node/colcon_command_prefix_setup_py.sh.env
new file mode 100644
index 0000000..2a23ff3
--- /dev/null
+++ b/build/voice_to_text_node/colcon_command_prefix_setup_py.sh.env
@@ -0,0 +1,52 @@
+AMENT_PREFIX_PATH=/opt/ros/kilted
+CMAKE_PREFIX_PATH=/opt/ros/kilted/opt/gz_math_vendor:/opt/ros/kilted/opt/gz_utils_vendor:/opt/ros/kilted/opt/gz_cmake_vendor
+COLCON=1
+COLORTERM=truecolor
+CONDA_EXE=/home/jake/miniconda3/bin/conda
+CONDA_PYTHON_EXE=/home/jake/miniconda3/bin/python
+CONDA_SHLVL=0
+DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus
+DISPLAY=10.255.255.254:0
+GIT_ASKPASS=/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/extensions/git/dist/askpass.sh
+HOME=/home/jake
+HOSTTYPE=x86_64
+LANG=C.UTF-8
+LD_LIBRARY_PATH=/opt/ros/kilted/opt/zenoh_cpp_vendor/lib:/opt/ros/kilted/opt/gz_math_vendor/lib:/opt/ros/kilted/opt/gz_utils_vendor/lib:/opt/ros/kilted/opt/rviz_ogre_vendor/lib:/opt/ros/kilted/lib/x86_64-linux-gnu:/opt/ros/kilted/opt/gz_cmake_vendor/lib:/opt/ros/kilted/lib
+LESSCLOSE=/usr/bin/lesspipe %s %s
+LESSOPEN=| /usr/bin/lesspipe %s
+LOGNAME=jake
+LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.crdownload=00;90:*.dpkg-dist=00;90:*.dpkg-new=00;90:*.dpkg-old=00;90:*.dpkg-tmp=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90:*.swp=00;90:*.tmp=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:
+NAME=DESKTOP-UFLG41E
+OLDPWD=/home/jake/ros2_ws
+PATH=/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/bin/remote-cli:/home/jake/.local/bin:/home/jake/miniconda3/condabin:/opt/ros/kilted/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Windows/System32/OpenSSH/:/mnt/c/Program Files/Docker/Docker/resources/bin:/mnt/c/Program Files/usbipd-win/:/mnt/c/Users/jake/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/jake/AppData/Local/Programs/Microsoft VS Code/bin:/snap/bin:/home/jake/.vscode-server/data/User/globalStorage/github.copilot-chat/debugCommand
+PULSE_SERVER=unix:/mnt/wslg/PulseServer
+PWD=/home/jake/ros2_ws/build/voice_to_text_node
+PYTHONPATH=/opt/ros/kilted/lib/python3.12/site-packages
+ROS_AUTOMATIC_DISCOVERY_RANGE=SUBNET
+ROS_DISTRO=kilted
+ROS_PYTHON_VERSION=3
+ROS_VERSION=2
+SHELL=/bin/bash
+SHLVL=2
+TERM=xterm-256color
+TERM_PROGRAM=vscode
+TERM_PROGRAM_VERSION=1.105.1
+USER=jake
+VSCODE_GIT_ASKPASS_EXTRA_ARGS=
+VSCODE_GIT_ASKPASS_MAIN=/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/extensions/git/dist/askpass-main.js
+VSCODE_GIT_ASKPASS_NODE=/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/node
+VSCODE_GIT_IPC_HANDLE=/run/user/1001/vscode-git-1d6e8e65c1.sock
+VSCODE_IPC_HOOK_CLI=/run/user/1001/vscode-ipc-07b86bca-e4f9-4c18-ba3e-d1abb3d5b6bc.sock
+VSCODE_PYTHON_AUTOACTIVATE_GUARD=1
+WAYLAND_DISPLAY=wayland-0
+WSL2_GUI_APPS_ENABLED=1
+WSLENV=VSCODE_WSL_EXT_LOCATION/up
+WSL_DISTRO_NAME=Ubuntu-24.04
+WSL_INTEROP=/run/WSL/440_interop
+XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
+XDG_RUNTIME_DIR=/run/user/1001/
+_=/usr/bin/colcon
+_CE_CONDA=
+_CE_M=
+_CONDA_EXE=/home/jake/miniconda3/bin/conda
+_CONDA_ROOT=/home/jake/miniconda3
diff --git a/build/voice_to_text_node/install.log b/build/voice_to_text_node/install.log
new file mode 100644
index 0000000..5cd6168
--- /dev/null
+++ b/build/voice_to_text_node/install.log
@@ -0,0 +1,30 @@
+/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__init__.py
+/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/voice_to_text_node.py
+/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/threaded_node.py
+/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__pycache__/__init__.cpython-312.pyc
+/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__pycache__/voice_to_text_node.cpython-312.pyc
+/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__pycache__/threaded_node.cpython-312.pyc
+/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/package.xml
+/home/jake/ros2_ws/install/voice_to_text_node/share/ament_index/resource_index/packages/voice_to_text_node
+/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/README
+/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/HCLr.fst
+/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/disambig_tid.int
+/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/Gr.fst
+/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int
+/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf/model.conf
+/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf/mfcc.conf
+/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/am/final.mdl
+/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.ie
+/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.dubm
+/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf
+/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.mat
+/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/splice.conf
+/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats
+/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/entry_points.txt
+/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/SOURCES.txt
+/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/zip-safe
+/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/top_level.txt
+/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/dependency_links.txt
+/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/requires.txt
+/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/PKG-INFO
+/home/jake/ros2_ws/install/voice_to_text_node/bin/voice_to_text_node
diff --git a/build/voice_to_text_node/prefix_override/__pycache__/sitecustomize.cpython-312.pyc b/build/voice_to_text_node/prefix_override/__pycache__/sitecustomize.cpython-312.pyc
new file mode 100644
index 0000000..962b877
Binary files /dev/null and b/build/voice_to_text_node/prefix_override/__pycache__/sitecustomize.cpython-312.pyc differ
diff --git a/build/voice_to_text_node/prefix_override/sitecustomize.py b/build/voice_to_text_node/prefix_override/sitecustomize.py
new file mode 100644
index 0000000..b1d5983
--- /dev/null
+++ b/build/voice_to_text_node/prefix_override/sitecustomize.py
@@ -0,0 +1,4 @@
+import sys
+if sys.prefix == '/usr':
+ sys.real_prefix = sys.prefix
+ sys.prefix = sys.exec_prefix = '/home/jake/ros2_ws/install/voice_to_text_node'
diff --git a/build/voice_to_text_node/voice_to_text_node.egg-info/PKG-INFO b/build/voice_to_text_node/voice_to_text_node.egg-info/PKG-INFO
new file mode 100644
index 0000000..1f9934d
--- /dev/null
+++ b/build/voice_to_text_node/voice_to_text_node.egg-info/PKG-INFO
@@ -0,0 +1,7 @@
+Metadata-Version: 2.1
+Name: voice-to-text-node
+Version: 0.1.0
+Summary: Manages voice to text for Little Sophia
+Maintainer: jake
+Maintainer-email: jake@example.com
+License: MIT
diff --git a/build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt b/build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt
new file mode 100644
index 0000000..e0e1bc8
--- /dev/null
+++ b/build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt
@@ -0,0 +1,27 @@
+package.xml
+setup.py
+../../build/voice_to_text_node/voice_to_text_node.egg-info/PKG-INFO
+../../build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt
+../../build/voice_to_text_node/voice_to_text_node.egg-info/dependency_links.txt
+../../build/voice_to_text_node/voice_to_text_node.egg-info/entry_points.txt
+../../build/voice_to_text_node/voice_to_text_node.egg-info/requires.txt
+../../build/voice_to_text_node/voice_to_text_node.egg-info/top_level.txt
+../../build/voice_to_text_node/voice_to_text_node.egg-info/zip-safe
+./voice_to_text_node/__init__.py
+./voice_to_text_node/threaded_node.py
+./voice_to_text_node/voice_to_text_node.py
+resource/voice_to_text_node
+resource/model/vosk-model-small-en-us-0.15/README
+resource/model/vosk-model-small-en-us-0.15/am/final.mdl
+resource/model/vosk-model-small-en-us-0.15/conf/mfcc.conf
+resource/model/vosk-model-small-en-us-0.15/conf/model.conf
+resource/model/vosk-model-small-en-us-0.15/graph/Gr.fst
+resource/model/vosk-model-small-en-us-0.15/graph/HCLr.fst
+resource/model/vosk-model-small-en-us-0.15/graph/disambig_tid.int
+resource/model/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int
+resource/model/vosk-model-small-en-us-0.15/ivector/final.dubm
+resource/model/vosk-model-small-en-us-0.15/ivector/final.ie
+resource/model/vosk-model-small-en-us-0.15/ivector/final.mat
+resource/model/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats
+resource/model/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf
+resource/model/vosk-model-small-en-us-0.15/ivector/splice.conf
\ No newline at end of file
diff --git a/build/voice_to_text_node/voice_to_text_node.egg-info/dependency_links.txt b/build/voice_to_text_node/voice_to_text_node.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/build/voice_to_text_node/voice_to_text_node.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/build/voice_to_text_node/voice_to_text_node.egg-info/entry_points.txt b/build/voice_to_text_node/voice_to_text_node.egg-info/entry_points.txt
new file mode 100644
index 0000000..5729fcb
--- /dev/null
+++ b/build/voice_to_text_node/voice_to_text_node.egg-info/entry_points.txt
@@ -0,0 +1,2 @@
+[console_scripts]
+voice_to_text_node = voice_to_text_node.voice_to_text_node:main
diff --git a/build/voice_to_text_node/voice_to_text_node.egg-info/requires.txt b/build/voice_to_text_node/voice_to_text_node.egg-info/requires.txt
new file mode 100644
index 0000000..49fe098
--- /dev/null
+++ b/build/voice_to_text_node/voice_to_text_node.egg-info/requires.txt
@@ -0,0 +1 @@
+setuptools
diff --git a/build/voice_to_text_node/voice_to_text_node.egg-info/top_level.txt b/build/voice_to_text_node/voice_to_text_node.egg-info/top_level.txt
new file mode 100644
index 0000000..f1e9153
--- /dev/null
+++ b/build/voice_to_text_node/voice_to_text_node.egg-info/top_level.txt
@@ -0,0 +1 @@
+voice_to_text_node
diff --git a/build/voice_to_text_node/voice_to_text_node.egg-info/zip-safe b/build/voice_to_text_node/voice_to_text_node.egg-info/zip-safe
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/build/voice_to_text_node/voice_to_text_node.egg-info/zip-safe
@@ -0,0 +1 @@
+
diff --git a/build_vtt.sh b/build_vtt.sh
new file mode 100755
index 0000000..413c680
--- /dev/null
+++ b/build_vtt.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+cd ~/ros2_ws
+source /opt/ros/kilted/setup.bash # Use system ROS setup if needed
+
+rm -rf build/voice_to_text_node install/voice_to_text_node log
+
+# Build only voice_to_text_module
+colcon build --packages-select voice_to_text_node --event-handlers console_direct+
+
+# Source overlay
+source install/setup.bash
+voice_to_text_node voice_to_text_node
\ No newline at end of file
diff --git a/install/camera_module/lib/python3.12/site-packages/camera_module/__pycache__/camera_module.cpython-312.pyc b/install/camera_module/lib/python3.12/site-packages/camera_module/__pycache__/camera_module.cpython-312.pyc
index 2d92242..cb2e521 100644
Binary files a/install/camera_module/lib/python3.12/site-packages/camera_module/__pycache__/camera_module.cpython-312.pyc and b/install/camera_module/lib/python3.12/site-packages/camera_module/__pycache__/camera_module.cpython-312.pyc differ
diff --git a/install/camera_module/lib/python3.12/site-packages/camera_module/camera_module.py b/install/camera_module/lib/python3.12/site-packages/camera_module/camera_module.py
index bb81bb6..a4a1bfa 100644
--- a/install/camera_module/lib/python3.12/site-packages/camera_module/camera_module.py
+++ b/install/camera_module/lib/python3.12/site-packages/camera_module/camera_module.py
@@ -2,22 +2,35 @@ from ament_index_python.packages import get_package_share_directory
import os
import cv2
+import numpy as np
+from math import ceil
+from itertools import product
+from rknnlite.api import RKNNLite
from sensor_msgs.msg import CompressedImage
from cv_bridge import CvBridge
-
+import time
from camera_module.threaded_node import ThreadedNode
+from sensor_msgs.msg import CompressedImage
from std_msgs.msg import String
import rclpy
+from ament_index_python.packages import get_package_share_directory
+import os
+
+package_name = 'camera_module'
+model_path = os.path.join(get_package_share_directory(package_name), 'resource', 'model', 'RetinaFace.rknn')
class CamPublisher(ThreadedNode):
def __init__(self, rknn, cap):
super().__init__('camera_module', default_rate=5.0)
- self.string_pub = self.create_publisher(String, 'camera_module/cam_topic', 10)
- self.image_pub = self.create_publisher(CompressedImage, 'camera_module/compressed', 10)
+ #self.string_pub = self.create_publisher(String, 'camera_module/cam_topic', 10)
+ #self.image_pub = self.create_publisher(CompressedImage, 'camera_module/compressed', 10)
+ self.face_detect_pub = self.create_publisher(String, 'camera_module/face_data', 10)
+ self.face_image_pub = self.create_publisher(CompressedImage, 'camera_module/face_images', 10)
+ self.face_detect_frame_pub = self.create_publisher(CompressedImage, 'camera_module/face_detect_frame', 10)
self.rknn = rknn
self.cap = cap
self.latest_frame = None
@@ -40,10 +53,10 @@ class CamPublisher(ThreadedNode):
def on_tick(self):
# Publish string message
- msg = String()
- msg.data = 'Cam from ROS 2!'
- self.string_pub.publish(msg)
- self.get_logger().info(f'Published: {msg.data}')
+ # msg = String()
+ # msg.data = 'Cam from ROS 2!'
+ # self.string_pub.publish(msg)
+ # self.get_logger().info(f'Published: {msg.data}')
# Capture and publish image
if self.cap is None:
@@ -53,8 +66,10 @@ class CamPublisher(ThreadedNode):
ret, frame = cap.read()
if not ret:
return
+ raw_frame = frame.copy()
+
img_height, img_width, _ = frame.shape
- letterbox_img, aspect_ratio, offset_x, offset_y = letterbox_resize(frame, model_size, 114)
+ letterbox_img, aspect_ratio, offset_x, offset_y = letterbox_resize(frame, self.model_size, 114)
infer_img = np.expand_dims(letterbox_img.astype(np.uint8), axis=0)
outputs = rknn.inference(inputs=[infer_img])
@@ -62,14 +77,14 @@ class CamPublisher(ThreadedNode):
return
loc, conf, landms = outputs
- boxes = box_decode(loc.squeeze(0), priors)
- boxes *= np.array([model_size[1], model_size[0], model_size[1], model_size[0]])
+ boxes = box_decode(loc.squeeze(0), self.priors)
+ boxes *= np.array([self.model_size[1], self.model_size[0], self.model_size[1], self.model_size[0]])
boxes[:, 0::2] = np.clip((boxes[:, 0::2] - offset_x) / aspect_ratio, 0, img_width)
boxes[:, 1::2] = np.clip((boxes[:, 1::2] - offset_y) / aspect_ratio, 0, img_height)
scores = conf.squeeze(0)[:, 1]
- landms = decode_landm(landms.squeeze(0), priors)
- landms *= np.tile(np.array([model_size[1], model_size[0]]), 5)
+ landms = decode_landm(landms.squeeze(0), self.priors)
+ landms *= np.tile(np.array([self.model_size[1], self.model_size[0]]), 5)
landms[:, 0::2] = np.clip((landms[:, 0::2] - offset_x) / aspect_ratio, 0, img_width)
landms[:, 1::2] = np.clip((landms[:, 1::2] - offset_y) / aspect_ratio, 0, img_height)
@@ -85,6 +100,10 @@ class CamPublisher(ThreadedNode):
face_data = []
frame_center = np.array([img_width / 2, img_height / 2])
+ face_data = []
+ valid_dets = []
+ valid_landms = []
+
for data, landmark in zip(dets, landms):
if data[4] < 0.6:
continue
@@ -100,20 +119,59 @@ class CamPublisher(ThreadedNode):
"y": float(offset[1])
}
})
+ valid_dets.append(data)
+ valid_landms.append(landmark)
+
+
+ for data, landmark in zip(valid_dets, valid_landms):
+ x1, y1, x2, y2 = map(int, data[:4])
+ conf = data[4]
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.putText(frame, f'{conf:.4f}', (x1, y1 + 12), cv2.FONT_HERSHEY_DUPLEX, 0.5, (255, 255, 255))
for j in range(5):
lx, ly = map(int, landmark[j*2:j*2+2])
cv2.circle(frame, (lx, ly), 1, (0, 255, 255), 2)
- cv2.putText(frame, f'FPS: {fps:.2f}', (10, 30),
- cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
+ # cv2.putText(frame, f'FPS: {fps:.2f}', (10, 30),
+ # cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
if len(face_data) > 0:
print(face_data)
+ self.face_detect_pub.publish(String(data=str(face_data)))
+
+ # CROP FACES AND PUBLISH STITCHED IMAGE
+ face_crops = []
+ for data in dets:
+ if data[4] < 0.6:
+ continue
+ x1, y1, x2, y2 = map(int, data[:4])
+ face_crop = raw_frame[y1:y2, x1:x2]
+ face_crops.append(face_crop)
+ target_height = 100
+ resized_faces = [
+ cv2.resize(face, (int(face.shape[1] * target_height / face.shape[0]), target_height))
+ for face in face_crops
+ ]
+ if resized_faces:
+ stitched = cv2.hconcat(resized_faces)
+ ret, stitched_buffer = cv2.imencode('.jpg', stitched)
+ if ret:
+ msg = CompressedImage()
+ msg.header.stamp = self.get_clock().now().to_msg()
+ msg.format = 'jpeg'
+ msg.data = stitched_buffer.tobytes()
+ self.face_image_pub.publish(msg)
+
+
+
ret, buffer = cv2.imencode('.jpg', frame)
if ret:
latest_frame = buffer.tobytes()
latest_faces = face_data
+ msg = CompressedImage()
+ msg.header.stamp = self.get_clock().now().to_msg()
+ msg.format = 'jpeg'
+ msg.data = buffer.tobytes()
+ self.face_detect_frame_pub.publish(msg)
def destroy_node(self):
if self.cap:
@@ -194,7 +252,7 @@ def nms(dets, thresh):
# --- RKNN Initialization ---
rknn = RKNNLite()
-rknn.load_rknn('./RetinaFace.rknn')
+rknn.load_rknn(model_path)
rknn.init_runtime()
# --- Shared State ---
diff --git a/install/voice_to_text_node/bin/voice_to_text_node b/install/voice_to_text_node/bin/voice_to_text_node
new file mode 100755
index 0000000..da1665b
--- /dev/null
+++ b/install/voice_to_text_node/bin/voice_to_text_node
@@ -0,0 +1,33 @@
+#!/usr/bin/python3
+# EASY-INSTALL-ENTRY-SCRIPT: 'voice-to-text-node==0.1.0','console_scripts','voice_to_text_node'
+import re
+import sys
+
+# for compatibility with easy_install; see #2198
+__requires__ = 'voice-to-text-node==0.1.0'
+
+try:
+ from importlib.metadata import distribution
+except ImportError:
+ try:
+ from importlib_metadata import distribution
+ except ImportError:
+ from pkg_resources import load_entry_point
+
+
+def importlib_load_entry_point(spec, group, name):
+ dist_name, _, _ = spec.partition('==')
+ matches = (
+ entry_point
+ for entry_point in distribution(dist_name).entry_points
+ if entry_point.group == group and entry_point.name == name
+ )
+ return next(matches).load()
+
+
+globals().setdefault('load_entry_point', importlib_load_entry_point)
+
+
+if __name__ == '__main__':
+ sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
+ sys.exit(load_entry_point('voice-to-text-node==0.1.0', 'console_scripts', 'voice_to_text_node')())
diff --git a/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/PKG-INFO b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/PKG-INFO
new file mode 100644
index 0000000..1f9934d
--- /dev/null
+++ b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/PKG-INFO
@@ -0,0 +1,7 @@
+Metadata-Version: 2.1
+Name: voice-to-text-node
+Version: 0.1.0
+Summary: Manages voice to text for Little Sophia
+Maintainer: jake
+Maintainer-email: jake@example.com
+License: MIT
diff --git a/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/SOURCES.txt b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/SOURCES.txt
new file mode 100644
index 0000000..e0e1bc8
--- /dev/null
+++ b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/SOURCES.txt
@@ -0,0 +1,27 @@
+package.xml
+setup.py
+../../build/voice_to_text_node/voice_to_text_node.egg-info/PKG-INFO
+../../build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt
+../../build/voice_to_text_node/voice_to_text_node.egg-info/dependency_links.txt
+../../build/voice_to_text_node/voice_to_text_node.egg-info/entry_points.txt
+../../build/voice_to_text_node/voice_to_text_node.egg-info/requires.txt
+../../build/voice_to_text_node/voice_to_text_node.egg-info/top_level.txt
+../../build/voice_to_text_node/voice_to_text_node.egg-info/zip-safe
+./voice_to_text_node/__init__.py
+./voice_to_text_node/threaded_node.py
+./voice_to_text_node/voice_to_text_node.py
+resource/voice_to_text_node
+resource/model/vosk-model-small-en-us-0.15/README
+resource/model/vosk-model-small-en-us-0.15/am/final.mdl
+resource/model/vosk-model-small-en-us-0.15/conf/mfcc.conf
+resource/model/vosk-model-small-en-us-0.15/conf/model.conf
+resource/model/vosk-model-small-en-us-0.15/graph/Gr.fst
+resource/model/vosk-model-small-en-us-0.15/graph/HCLr.fst
+resource/model/vosk-model-small-en-us-0.15/graph/disambig_tid.int
+resource/model/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int
+resource/model/vosk-model-small-en-us-0.15/ivector/final.dubm
+resource/model/vosk-model-small-en-us-0.15/ivector/final.ie
+resource/model/vosk-model-small-en-us-0.15/ivector/final.mat
+resource/model/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats
+resource/model/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf
+resource/model/vosk-model-small-en-us-0.15/ivector/splice.conf
\ No newline at end of file
diff --git a/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/dependency_links.txt b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/entry_points.txt b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/entry_points.txt
new file mode 100644
index 0000000..5729fcb
--- /dev/null
+++ b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/entry_points.txt
@@ -0,0 +1,2 @@
+[console_scripts]
+voice_to_text_node = voice_to_text_node.voice_to_text_node:main
diff --git a/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/requires.txt b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/requires.txt
new file mode 100644
index 0000000..49fe098
--- /dev/null
+++ b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/requires.txt
@@ -0,0 +1 @@
+setuptools
diff --git a/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/top_level.txt b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/top_level.txt
new file mode 100644
index 0000000..f1e9153
--- /dev/null
+++ b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/top_level.txt
@@ -0,0 +1 @@
+voice_to_text_node
diff --git a/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/zip-safe b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/zip-safe
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info/zip-safe
@@ -0,0 +1 @@
+
diff --git a/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__init__.py b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__pycache__/__init__.cpython-312.pyc b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000..111f7d5
Binary files /dev/null and b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__pycache__/__init__.cpython-312.pyc differ
diff --git a/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__pycache__/threaded_node.cpython-312.pyc b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__pycache__/threaded_node.cpython-312.pyc
new file mode 100644
index 0000000..691accf
Binary files /dev/null and b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__pycache__/threaded_node.cpython-312.pyc differ
diff --git a/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__pycache__/voice_to_text_node.cpython-312.pyc b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__pycache__/voice_to_text_node.cpython-312.pyc
new file mode 100644
index 0000000..cfea081
Binary files /dev/null and b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__pycache__/voice_to_text_node.cpython-312.pyc differ
diff --git a/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/threaded_node.py b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/threaded_node.py
new file mode 100644
index 0000000..d3abe01
--- /dev/null
+++ b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/threaded_node.py
@@ -0,0 +1,115 @@
+# threaded_node.py
+import rclpy
+from rclpy.node import Node
+from rclpy.parameter import Parameter
+from rcl_interfaces.msg import SetParametersResult, ParameterEvent
+from std_msgs.msg import Bool, Float32
+
+import time
+import threading
+import queue
+from collections import deque
+
+class ThreadedNode(Node):
+ def __init__(self, name: str, default_rate: float = 1.0):
+ super().__init__(name)
+
+ # Declare and initialize publish_rate
+ self.declare_parameter('publish_rate', default_rate)
+ self.publish_rate = self.get_parameter('publish_rate').get_parameter_value().double_value
+
+ # Heartbeat publisher
+ self.heartbeat_pub = self.create_publisher(Bool, f'{name}/heartbeat', 1)
+ self.heartbeat_timer = self.create_timer(1.0, self.send_heartbeat)
+
+ # Actual FPS publisher
+ self.fps_pub = self.create_publisher(Float32, f'{name}/fps', 1)
+ buffer_size = max(5, int(self.publish_rate * 5)) # 5 seconds worth of ticks
+ self._tick_times = deque(maxlen=buffer_size)
+
+ # Work timer
+ self.timer = self.create_timer(1.0 / self.publish_rate, self.timer_callback)
+
+ # Parameter update hooks
+ self.add_on_set_parameters_callback(self.param_callback)
+ self.create_subscription(ParameterEvent, '/parameter_events', self.parameter_event_listener, 10)
+
+ self.setup_parameters()
+ self.setup_topics()
+
+ # Worker thread setup
+ self.task_queue = queue.Queue()
+ self.worker_thread = threading.Thread(target=self.worker_loop, daemon=True)
+ self.worker_thread.start()
+
+ def setup_parameters(self):
+ pass
+
+ def setup_topics(self):
+ pass
+
+ def send_heartbeat(self):
+ self.heartbeat_pub.publish(Bool(data=True))
+
+ def timer_callback(self):
+ if self.task_queue.empty():
+ self.task_queue.put_nowait('tick')
+
+
+ def worker_loop(self):
+ while rclpy.ok():
+ try:
+ task = self.task_queue.get(timeout=1.0)
+ if task == 'tick':
+ now = time.time()
+ self._tick_times.append(now)
+
+ # Call the subclass's tick logic
+ try:
+ self.on_tick()
+ except Exception as e:
+ self.get_logger().error(f'on_tick failed: {e}')
+
+ # Compute smoothed FPS
+ if len(self._tick_times) >= 2:
+ intervals = [t2 - t1 for t1, t2 in zip(self._tick_times, list(self._tick_times)[1:])]
+ avg_interval = sum(intervals) / len(intervals)
+ smoothed_fps = 1.0 / avg_interval if avg_interval > 0 else 0.0
+ else:
+ smoothed_fps = 0.0
+
+ fps_msg = Float32()
+ fps_msg.data = smoothed_fps
+ self.fps_pub.publish(fps_msg)
+
+
+ except queue.Empty:
+ continue
+
+ def on_tick(self):
+ # Override this in your subclass
+ pass
+
+ def update_publish_rate(self, new_rate):
+ self.get_logger().info(f'Updating publish rate to {new_rate} Hz')
+ self.timer.cancel()
+ self.timer = self.create_timer(1.0 / new_rate, self.timer_callback)
+ self.publish_rate = new_rate
+ self.set_parameters([Parameter('publish_rate', Parameter.Type.DOUBLE, new_rate)])
+ buffer_size = max(5, int(self.publish_rate * 5)) # 5 seconds worth of ticks
+ self._tick_times = deque(maxlen=buffer_size)
+
+ def param_callback(self, params):
+ for param in params:
+ if param.name == 'publish_rate' and param.type_ == Parameter.Type.DOUBLE:
+ new_rate = param.value
+ if new_rate > 0.0 and abs(new_rate - self.publish_rate) > 1e-6:
+ self.update_publish_rate(new_rate)
+ return SetParametersResult(successful=True)
+
+ def parameter_event_listener(self, event: ParameterEvent):
+ for changed in event.changed_parameters:
+ if changed.name == 'publish_rate':
+ new_rate = changed.value.double_value
+ if new_rate > 0.0 and abs(new_rate - self.publish_rate) > 1e-6:
+ self.update_publish_rate(new_rate)
diff --git a/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/voice_to_text_node.py b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/voice_to_text_node.py
new file mode 100644
index 0000000..01c2aa2
--- /dev/null
+++ b/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/voice_to_text_node.py
@@ -0,0 +1,82 @@
+from ament_index_python.packages import get_package_share_directory
+import os
+
+import time
+from voice_to_text_node.threaded_node import ThreadedNode
+
+from std_msgs.msg import String
+import rclpy
+
+from ament_index_python.packages import get_package_share_directory
+import threading
+
+
+import sounddevice as sd
+import queue
+from vosk import Model, KaldiRecognizer
+
+package_name = 'voice_to_text_node'
+model_path = os.path.join(
+ get_package_share_directory('voice_to_text_node'),
+ 'resource', 'model', 'vosk-model-small-en-us-0.15'
+)
+print("MODEL PATH: " + model_path)
+latest_partial = {"partial": ""}
+latest_result = {"text": ""}
+
+
+class VoicePublisher(ThreadedNode):
+ def __init__(self):
+ super().__init__(package_name, default_rate=5.0)
+ self.string_pub = self.create_publisher(String, package_name + '/test_topic', 10)
+
+ self.latest_partial = {"partial": ""}
+ self.latest_result = {"text": ""}
+
+ self.speech_thread = threading.Thread(target=self.speech_loop, daemon=True)
+ self.speech_thread.start()
+
+ def on_tick(self):
+ msg = String()
+ msg.data = self.latest_partial.get("partial", "") or self.latest_result.get("text", "")
+ self.string_pub.publish(msg)
+ self.get_logger().info(f'Published: {msg.data}')
+
+ def speech_loop(self):
+ model = Model(model_path)
+ rec = KaldiRecognizer(model, 16000)
+ q = queue.Queue()
+
+ def callback(indata, frames, time, status):
+ if status:
+ print(status)
+ q.put(bytes(indata))
+
+ with sd.RawInputStream(samplerate=16000, blocksize=8000, dtype='int16',
+ channels=1, callback=callback):
+ while True:
+ data = q.get()
+ if rec.AcceptWaveform(data):
+ result = json.loads(rec.Result())
+ self.latest_result = result
+ print(".", result)
+ else:
+ partial = json.loads(rec.PartialResult())
+ self.latest_partial = partial
+ print("...", partial.get("partial", ""), end='\r')
+
+ def destroy_node(self):
+ super().destroy_node()
+
+
+
+
+def main():
+ rclpy.init()
+ node = VoicePublisher()
+ rclpy.spin(node)
+ node.destroy_node()
+ rclpy.shutdown()
+
+if __name__ == '__main__':
+ main()
diff --git a/install/voice_to_text_node/share/ament_index/resource_index/packages/voice_to_text_node b/install/voice_to_text_node/share/ament_index/resource_index/packages/voice_to_text_node
new file mode 100644
index 0000000..e69de29
diff --git a/install/voice_to_text_node/share/colcon-core/packages/voice_to_text_node b/install/voice_to_text_node/share/colcon-core/packages/voice_to_text_node
new file mode 100644
index 0000000..cacb31e
--- /dev/null
+++ b/install/voice_to_text_node/share/colcon-core/packages/voice_to_text_node
@@ -0,0 +1 @@
+ament_python:rclpy:std_msgs
\ No newline at end of file
diff --git a/install/voice_to_text_node/share/voice_to_text_node/hook/ament_prefix_path.dsv b/install/voice_to_text_node/share/voice_to_text_node/hook/ament_prefix_path.dsv
new file mode 100644
index 0000000..79d4c95
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/hook/ament_prefix_path.dsv
@@ -0,0 +1 @@
+prepend-non-duplicate;AMENT_PREFIX_PATH;
diff --git a/install/voice_to_text_node/share/voice_to_text_node/hook/ament_prefix_path.ps1 b/install/voice_to_text_node/share/voice_to_text_node/hook/ament_prefix_path.ps1
new file mode 100644
index 0000000..26b9997
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/hook/ament_prefix_path.ps1
@@ -0,0 +1,3 @@
+# generated from colcon_powershell/shell/template/hook_prepend_value.ps1.em
+
+colcon_prepend_unique_value AMENT_PREFIX_PATH "$env:COLCON_CURRENT_PREFIX"
diff --git a/install/voice_to_text_node/share/voice_to_text_node/hook/ament_prefix_path.sh b/install/voice_to_text_node/share/voice_to_text_node/hook/ament_prefix_path.sh
new file mode 100644
index 0000000..f3041f6
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/hook/ament_prefix_path.sh
@@ -0,0 +1,3 @@
+# generated from colcon_core/shell/template/hook_prepend_value.sh.em
+
+_colcon_prepend_unique_value AMENT_PREFIX_PATH "$COLCON_CURRENT_PREFIX"
diff --git a/install/voice_to_text_node/share/voice_to_text_node/hook/path.dsv b/install/voice_to_text_node/share/voice_to_text_node/hook/path.dsv
new file mode 100644
index 0000000..95435e0
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/hook/path.dsv
@@ -0,0 +1 @@
+prepend-non-duplicate;PATH;bin
diff --git a/install/voice_to_text_node/share/voice_to_text_node/hook/path.ps1 b/install/voice_to_text_node/share/voice_to_text_node/hook/path.ps1
new file mode 100644
index 0000000..0b980ef
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/hook/path.ps1
@@ -0,0 +1,3 @@
+# generated from colcon_powershell/shell/template/hook_prepend_value.ps1.em
+
+colcon_prepend_unique_value PATH "$env:COLCON_CURRENT_PREFIX\bin"
diff --git a/install/voice_to_text_node/share/voice_to_text_node/hook/path.sh b/install/voice_to_text_node/share/voice_to_text_node/hook/path.sh
new file mode 100644
index 0000000..295266d
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/hook/path.sh
@@ -0,0 +1,3 @@
+# generated from colcon_core/shell/template/hook_prepend_value.sh.em
+
+_colcon_prepend_unique_value PATH "$COLCON_CURRENT_PREFIX/bin"
diff --git a/install/voice_to_text_node/share/voice_to_text_node/hook/pythonpath.dsv b/install/voice_to_text_node/share/voice_to_text_node/hook/pythonpath.dsv
new file mode 100644
index 0000000..c2ddcdb
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/hook/pythonpath.dsv
@@ -0,0 +1 @@
+prepend-non-duplicate;PYTHONPATH;lib/python3.12/site-packages
diff --git a/install/voice_to_text_node/share/voice_to_text_node/hook/pythonpath.ps1 b/install/voice_to_text_node/share/voice_to_text_node/hook/pythonpath.ps1
new file mode 100644
index 0000000..bdd69af
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/hook/pythonpath.ps1
@@ -0,0 +1,3 @@
+# generated from colcon_powershell/shell/template/hook_prepend_value.ps1.em
+
+colcon_prepend_unique_value PYTHONPATH "$env:COLCON_CURRENT_PREFIX\lib/python3.12/site-packages"
diff --git a/install/voice_to_text_node/share/voice_to_text_node/hook/pythonpath.sh b/install/voice_to_text_node/share/voice_to_text_node/hook/pythonpath.sh
new file mode 100644
index 0000000..45388fe
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/hook/pythonpath.sh
@@ -0,0 +1,3 @@
+# generated from colcon_core/shell/template/hook_prepend_value.sh.em
+
+_colcon_prepend_unique_value PYTHONPATH "$COLCON_CURRENT_PREFIX/lib/python3.12/site-packages"
diff --git a/install/voice_to_text_node/share/voice_to_text_node/hook/pythonscriptspath.dsv b/install/voice_to_text_node/share/voice_to_text_node/hook/pythonscriptspath.dsv
new file mode 100644
index 0000000..95435e0
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/hook/pythonscriptspath.dsv
@@ -0,0 +1 @@
+prepend-non-duplicate;PATH;bin
diff --git a/install/voice_to_text_node/share/voice_to_text_node/hook/pythonscriptspath.ps1 b/install/voice_to_text_node/share/voice_to_text_node/hook/pythonscriptspath.ps1
new file mode 100644
index 0000000..0b980ef
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/hook/pythonscriptspath.ps1
@@ -0,0 +1,3 @@
+# generated from colcon_powershell/shell/template/hook_prepend_value.ps1.em
+
+colcon_prepend_unique_value PATH "$env:COLCON_CURRENT_PREFIX\bin"
diff --git a/install/voice_to_text_node/share/voice_to_text_node/hook/pythonscriptspath.sh b/install/voice_to_text_node/share/voice_to_text_node/hook/pythonscriptspath.sh
new file mode 100644
index 0000000..295266d
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/hook/pythonscriptspath.sh
@@ -0,0 +1,3 @@
+# generated from colcon_core/shell/template/hook_prepend_value.sh.em
+
+_colcon_prepend_unique_value PATH "$COLCON_CURRENT_PREFIX/bin"
diff --git a/install/voice_to_text_node/share/voice_to_text_node/package.bash b/install/voice_to_text_node/share/voice_to_text_node/package.bash
new file mode 100644
index 0000000..b41906d
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/package.bash
@@ -0,0 +1,31 @@
+# generated from colcon_bash/shell/template/package.bash.em
+
+# This script extends the environment for this package.
+
+# a bash script is able to determine its own path if necessary
+if [ -z "$COLCON_CURRENT_PREFIX" ]; then
+ # the prefix is two levels up from the package specific share directory
+ _colcon_package_bash_COLCON_CURRENT_PREFIX="$(builtin cd "`dirname "${BASH_SOURCE[0]}"`/../.." > /dev/null && pwd)"
+else
+ _colcon_package_bash_COLCON_CURRENT_PREFIX="$COLCON_CURRENT_PREFIX"
+fi
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+# additional arguments: arguments to the script
+_colcon_package_bash_source_script() {
+ if [ -f "$1" ]; then
+ if [ -n "$COLCON_TRACE" ]; then
+ echo "# . \"$1\""
+ fi
+ . "$@"
+ else
+ echo "not found: \"$1\"" 1>&2
+ fi
+}
+
+# source sh script of this package
+_colcon_package_bash_source_script "$_colcon_package_bash_COLCON_CURRENT_PREFIX/share/voice_to_text_node/package.sh"
+
+unset _colcon_package_bash_source_script
+unset _colcon_package_bash_COLCON_CURRENT_PREFIX
diff --git a/install/voice_to_text_node/share/voice_to_text_node/package.dsv b/install/voice_to_text_node/share/voice_to_text_node/package.dsv
new file mode 100644
index 0000000..2969423
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/package.dsv
@@ -0,0 +1,12 @@
+source;share/voice_to_text_node/hook/path.ps1
+source;share/voice_to_text_node/hook/path.dsv
+source;share/voice_to_text_node/hook/path.sh
+source;share/voice_to_text_node/hook/pythonpath.ps1
+source;share/voice_to_text_node/hook/pythonpath.dsv
+source;share/voice_to_text_node/hook/pythonpath.sh
+source;share/voice_to_text_node/hook/pythonscriptspath.ps1
+source;share/voice_to_text_node/hook/pythonscriptspath.dsv
+source;share/voice_to_text_node/hook/pythonscriptspath.sh
+source;share/voice_to_text_node/hook/ament_prefix_path.ps1
+source;share/voice_to_text_node/hook/ament_prefix_path.dsv
+source;share/voice_to_text_node/hook/ament_prefix_path.sh
diff --git a/install/voice_to_text_node/share/voice_to_text_node/package.ps1 b/install/voice_to_text_node/share/voice_to_text_node/package.ps1
new file mode 100644
index 0000000..f5434f6
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/package.ps1
@@ -0,0 +1,118 @@
+# generated from colcon_powershell/shell/template/package.ps1.em
+
+# function to append a value to a variable
+# which uses colons as separators
+# duplicates as well as leading separators are avoided
+# first argument: the name of the result variable
+# second argument: the value to be prepended
+function colcon_append_unique_value {
+ param (
+ $_listname,
+ $_value
+ )
+
+ # get values from variable
+ if (Test-Path Env:$_listname) {
+ $_values=(Get-Item env:$_listname).Value
+ } else {
+ $_values=""
+ }
+ $_duplicate=""
+ # start with no values
+ $_all_values=""
+ # iterate over existing values in the variable
+ if ($_values) {
+ $_values.Split(";") | ForEach {
+ # not an empty string
+ if ($_) {
+ # not a duplicate of _value
+ if ($_ -eq $_value) {
+ $_duplicate="1"
+ }
+ if ($_all_values) {
+ $_all_values="${_all_values};$_"
+ } else {
+ $_all_values="$_"
+ }
+ }
+ }
+ }
+ # append only non-duplicates
+ if (!$_duplicate) {
+ # avoid leading separator
+ if ($_all_values) {
+ $_all_values="${_all_values};${_value}"
+ } else {
+ $_all_values="${_value}"
+ }
+ }
+
+ # export the updated variable
+ Set-Item env:\$_listname -Value "$_all_values"
+}
+
+# function to prepend a value to a variable
+# which uses colons as separators
+# duplicates as well as trailing separators are avoided
+# first argument: the name of the result variable
+# second argument: the value to be prepended
+function colcon_prepend_unique_value {
+ param (
+ $_listname,
+ $_value
+ )
+
+ # get values from variable
+ if (Test-Path Env:$_listname) {
+ $_values=(Get-Item env:$_listname).Value
+ } else {
+ $_values=""
+ }
+ # start with the new value
+ $_all_values="$_value"
+ # iterate over existing values in the variable
+ if ($_values) {
+ $_values.Split(";") | ForEach {
+ # not an empty string
+ if ($_) {
+ # not a duplicate of _value
+ if ($_ -ne $_value) {
+ # keep non-duplicate values
+ $_all_values="${_all_values};$_"
+ }
+ }
+ }
+ }
+ # export the updated variable
+ Set-Item env:\$_listname -Value "$_all_values"
+}
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+# additional arguments: arguments to the script
+function colcon_package_source_powershell_script {
+ param (
+ $_colcon_package_source_powershell_script
+ )
+ # source script with conditional trace output
+ if (Test-Path $_colcon_package_source_powershell_script) {
+ if ($env:COLCON_TRACE) {
+ echo ". '$_colcon_package_source_powershell_script'"
+ }
+ . "$_colcon_package_source_powershell_script"
+ } else {
+ Write-Error "not found: '$_colcon_package_source_powershell_script'"
+ }
+}
+
+
+# a powershell script is able to determine its own path
+# the prefix is two levels up from the package specific share directory
+$env:COLCON_CURRENT_PREFIX=(Get-Item $PSCommandPath).Directory.Parent.Parent.FullName
+
+colcon_package_source_powershell_script "$env:COLCON_CURRENT_PREFIX\share/voice_to_text_node/hook/path.ps1"
+colcon_package_source_powershell_script "$env:COLCON_CURRENT_PREFIX\share/voice_to_text_node/hook/pythonpath.ps1"
+colcon_package_source_powershell_script "$env:COLCON_CURRENT_PREFIX\share/voice_to_text_node/hook/pythonscriptspath.ps1"
+colcon_package_source_powershell_script "$env:COLCON_CURRENT_PREFIX\share/voice_to_text_node/hook/ament_prefix_path.ps1"
+
+Remove-Item Env:\COLCON_CURRENT_PREFIX
diff --git a/install/voice_to_text_node/share/voice_to_text_node/package.sh b/install/voice_to_text_node/share/voice_to_text_node/package.sh
new file mode 100644
index 0000000..c6e5994
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/package.sh
@@ -0,0 +1,89 @@
+# generated from colcon_core/shell/template/package.sh.em
+
+# This script extends the environment for this package.
+
+# function to prepend a value to a variable
+# which uses colons as separators
+# duplicates as well as trailing separators are avoided
+# first argument: the name of the result variable
+# second argument: the value to be prepended
+_colcon_prepend_unique_value() {
+ # arguments
+ _listname="$1"
+ _value="$2"
+
+ # get values from variable
+ eval _values=\"\$$_listname\"
+ # backup the field separator
+ _colcon_prepend_unique_value_IFS=$IFS
+ IFS=":"
+ # start with the new value
+ _all_values="$_value"
+ # workaround SH_WORD_SPLIT not being set in zsh
+ if [ "$(command -v colcon_zsh_convert_to_array)" ]; then
+ colcon_zsh_convert_to_array _values
+ fi
+ # iterate over existing values in the variable
+ for _item in $_values; do
+ # ignore empty strings
+ if [ -z "$_item" ]; then
+ continue
+ fi
+ # ignore duplicates of _value
+ if [ "$_item" = "$_value" ]; then
+ continue
+ fi
+ # keep non-duplicate values
+ _all_values="$_all_values:$_item"
+ done
+ unset _item
+ # restore the field separator
+ IFS=$_colcon_prepend_unique_value_IFS
+ unset _colcon_prepend_unique_value_IFS
+ # export the updated variable
+ eval export $_listname=\"$_all_values\"
+ unset _all_values
+ unset _values
+
+ unset _value
+ unset _listname
+}
+
+# since a plain shell script can't determine its own path when being sourced
+# either use the provided COLCON_CURRENT_PREFIX
+# or fall back to the build time prefix (if it exists)
+_colcon_package_sh_COLCON_CURRENT_PREFIX="/home/jake/ros2_ws/install/voice_to_text_node"
+if [ -z "$COLCON_CURRENT_PREFIX" ]; then
+ if [ ! -d "$_colcon_package_sh_COLCON_CURRENT_PREFIX" ]; then
+ echo "The build time path \"$_colcon_package_sh_COLCON_CURRENT_PREFIX\" doesn't exist. Either source a script for a different shell or set the environment variable \"COLCON_CURRENT_PREFIX\" explicitly." 1>&2
+ unset _colcon_package_sh_COLCON_CURRENT_PREFIX
+ return 1
+ fi
+ COLCON_CURRENT_PREFIX="$_colcon_package_sh_COLCON_CURRENT_PREFIX"
+fi
+unset _colcon_package_sh_COLCON_CURRENT_PREFIX
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+# additional arguments: arguments to the script
+_colcon_package_sh_source_script() {
+ if [ -f "$1" ]; then
+ if [ -n "$COLCON_TRACE" ]; then
+ echo "# . \"$1\""
+ fi
+ . "$@"
+ else
+ echo "not found: \"$1\"" 1>&2
+ fi
+}
+
+# source sh hooks
+_colcon_package_sh_source_script "$COLCON_CURRENT_PREFIX/share/voice_to_text_node/hook/path.sh"
+_colcon_package_sh_source_script "$COLCON_CURRENT_PREFIX/share/voice_to_text_node/hook/pythonpath.sh"
+_colcon_package_sh_source_script "$COLCON_CURRENT_PREFIX/share/voice_to_text_node/hook/pythonscriptspath.sh"
+_colcon_package_sh_source_script "$COLCON_CURRENT_PREFIX/share/voice_to_text_node/hook/ament_prefix_path.sh"
+
+unset _colcon_package_sh_source_script
+unset COLCON_CURRENT_PREFIX
+
+# do not unset _colcon_prepend_unique_value since it might be used by non-primary shell hooks
diff --git a/install/voice_to_text_node/share/voice_to_text_node/package.xml b/install/voice_to_text_node/share/voice_to_text_node/package.xml
new file mode 100644
index 0000000..4e8a838
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/package.xml
@@ -0,0 +1,21 @@
+
+
+ voice_to_text_node
+ 0.1.0
+ Manages voice to text for Little Sophia
+ Jake
+ MIT
+
+ ament_python
+ ament_python
+
+ rclpy
+ std_msgs
+
+ ament_lint_auto
+ ament_lint_common
+
+
+ ament_python
+
+
diff --git a/install/voice_to_text_node/share/voice_to_text_node/package.zsh b/install/voice_to_text_node/share/voice_to_text_node/package.zsh
new file mode 100644
index 0000000..d25b60c
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/package.zsh
@@ -0,0 +1,42 @@
+# generated from colcon_zsh/shell/template/package.zsh.em
+
+# This script extends the environment for this package.
+
+# a zsh script is able to determine its own path if necessary
+if [ -z "$COLCON_CURRENT_PREFIX" ]; then
+ # the prefix is two levels up from the package specific share directory
+ _colcon_package_zsh_COLCON_CURRENT_PREFIX="$(builtin cd -q "`dirname "${(%):-%N}"`/../.." > /dev/null && pwd)"
+else
+ _colcon_package_zsh_COLCON_CURRENT_PREFIX="$COLCON_CURRENT_PREFIX"
+fi
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+# additional arguments: arguments to the script
+_colcon_package_zsh_source_script() {
+ if [ -f "$1" ]; then
+ if [ -n "$COLCON_TRACE" ]; then
+ echo "# . \"$1\""
+ fi
+ . "$@"
+ else
+ echo "not found: \"$1\"" 1>&2
+ fi
+}
+
+# function to convert array-like strings into arrays
+# to workaround SH_WORD_SPLIT not being set
+colcon_zsh_convert_to_array() {
+ local _listname=$1
+ local _dollar="$"
+ local _split="{="
+ local _to_array="(\"$_dollar$_split$_listname}\")"
+ eval $_listname=$_to_array
+}
+
+# source sh script of this package
+_colcon_package_zsh_source_script "$_colcon_package_zsh_COLCON_CURRENT_PREFIX/share/voice_to_text_node/package.sh"
+unset convert_zsh_to_array
+
+unset _colcon_package_zsh_source_script
+unset _colcon_package_zsh_COLCON_CURRENT_PREFIX
diff --git a/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/README b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/README
new file mode 100644
index 0000000..a7f7931
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/README
@@ -0,0 +1,9 @@
+US English model for mobile Vosk applications
+
+Copyright 2020 Alpha Cephei Inc
+
+Accuracy: 10.38 (tedlium test) 9.85 (librispeech test-clean)
+Speed: 0.11xRT (desktop)
+Latency: 0.15s (right context)
+
+
diff --git a/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/am/final.mdl b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/am/final.mdl
new file mode 100644
index 0000000..5596b31
Binary files /dev/null and b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/am/final.mdl differ
diff --git a/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf/mfcc.conf b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf/mfcc.conf
new file mode 100644
index 0000000..eaa40c5
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf/mfcc.conf
@@ -0,0 +1,7 @@
+--sample-frequency=16000
+--use-energy=false
+--num-mel-bins=40
+--num-ceps=40
+--low-freq=20
+--high-freq=7600
+--allow-downsample=true
diff --git a/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf/model.conf b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf/model.conf
new file mode 100644
index 0000000..9d5b0da
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf/model.conf
@@ -0,0 +1,10 @@
+--min-active=200
+--max-active=3000
+--beam=10.0
+--lattice-beam=2.0
+--acoustic-scale=1.0
+--frame-subsampling-factor=3
+--endpoint.silence-phones=1:2:3:4:5:6:7:8:9:10
+--endpoint.rule2.min-trailing-silence=0.5
+--endpoint.rule3.min-trailing-silence=0.75
+--endpoint.rule4.min-trailing-silence=1.0
diff --git a/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/Gr.fst b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/Gr.fst
new file mode 100644
index 0000000..1f292e6
Binary files /dev/null and b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/Gr.fst differ
diff --git a/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/HCLr.fst b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/HCLr.fst
new file mode 100644
index 0000000..9797b26
Binary files /dev/null and b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/HCLr.fst differ
diff --git a/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/disambig_tid.int b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/disambig_tid.int
new file mode 100644
index 0000000..762fd5f
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/disambig_tid.int
@@ -0,0 +1,17 @@
+10015
+10016
+10017
+10018
+10019
+10020
+10021
+10022
+10023
+10024
+10025
+10026
+10027
+10028
+10029
+10030
+10031
diff --git a/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int
new file mode 100644
index 0000000..df23fd7
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int
@@ -0,0 +1,166 @@
+1 nonword
+2 begin
+3 end
+4 internal
+5 singleton
+6 nonword
+7 begin
+8 end
+9 internal
+10 singleton
+11 begin
+12 end
+13 internal
+14 singleton
+15 begin
+16 end
+17 internal
+18 singleton
+19 begin
+20 end
+21 internal
+22 singleton
+23 begin
+24 end
+25 internal
+26 singleton
+27 begin
+28 end
+29 internal
+30 singleton
+31 begin
+32 end
+33 internal
+34 singleton
+35 begin
+36 end
+37 internal
+38 singleton
+39 begin
+40 end
+41 internal
+42 singleton
+43 begin
+44 end
+45 internal
+46 singleton
+47 begin
+48 end
+49 internal
+50 singleton
+51 begin
+52 end
+53 internal
+54 singleton
+55 begin
+56 end
+57 internal
+58 singleton
+59 begin
+60 end
+61 internal
+62 singleton
+63 begin
+64 end
+65 internal
+66 singleton
+67 begin
+68 end
+69 internal
+70 singleton
+71 begin
+72 end
+73 internal
+74 singleton
+75 begin
+76 end
+77 internal
+78 singleton
+79 begin
+80 end
+81 internal
+82 singleton
+83 begin
+84 end
+85 internal
+86 singleton
+87 begin
+88 end
+89 internal
+90 singleton
+91 begin
+92 end
+93 internal
+94 singleton
+95 begin
+96 end
+97 internal
+98 singleton
+99 begin
+100 end
+101 internal
+102 singleton
+103 begin
+104 end
+105 internal
+106 singleton
+107 begin
+108 end
+109 internal
+110 singleton
+111 begin
+112 end
+113 internal
+114 singleton
+115 begin
+116 end
+117 internal
+118 singleton
+119 begin
+120 end
+121 internal
+122 singleton
+123 begin
+124 end
+125 internal
+126 singleton
+127 begin
+128 end
+129 internal
+130 singleton
+131 begin
+132 end
+133 internal
+134 singleton
+135 begin
+136 end
+137 internal
+138 singleton
+139 begin
+140 end
+141 internal
+142 singleton
+143 begin
+144 end
+145 internal
+146 singleton
+147 begin
+148 end
+149 internal
+150 singleton
+151 begin
+152 end
+153 internal
+154 singleton
+155 begin
+156 end
+157 internal
+158 singleton
+159 begin
+160 end
+161 internal
+162 singleton
+163 begin
+164 end
+165 internal
+166 singleton
diff --git a/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.dubm b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.dubm
new file mode 100644
index 0000000..db789eb
Binary files /dev/null and b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.dubm differ
diff --git a/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.ie b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.ie
new file mode 100644
index 0000000..93737bf
Binary files /dev/null and b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.ie differ
diff --git a/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.mat b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.mat
new file mode 100644
index 0000000..c3ec635
Binary files /dev/null and b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.mat differ
diff --git a/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats
new file mode 100644
index 0000000..b9d92ef
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats
@@ -0,0 +1,3 @@
+ [
+ 1.682383e+11 -1.1595e+10 -1.521733e+10 4.32034e+09 -2.257938e+10 -1.969666e+10 -2.559265e+10 -1.535687e+10 -1.276854e+10 -4.494483e+09 -1.209085e+10 -5.64008e+09 -1.134847e+10 -3.419512e+09 -1.079542e+10 -4.145463e+09 -6.637486e+09 -1.11318e+09 -3.479773e+09 -1.245932e+08 -1.386961e+09 6.560655e+07 -2.436518e+08 -4.032432e+07 4.620046e+08 -7.714964e+07 9.551484e+08 -4.119761e+08 8.208582e+08 -7.117156e+08 7.457703e+08 -4.3106e+08 1.202726e+09 2.904036e+08 1.231931e+09 3.629848e+08 6.366939e+08 -4.586172e+08 -5.267629e+08 -3.507819e+08 1.679838e+09
+ 1.741141e+13 8.92488e+11 8.743834e+11 8.848896e+11 1.190313e+12 1.160279e+12 1.300066e+12 1.005678e+12 9.39335e+11 8.089614e+11 7.927041e+11 6.882427e+11 6.444235e+11 5.151451e+11 4.825723e+11 3.210106e+11 2.720254e+11 1.772539e+11 1.248102e+11 6.691599e+10 3.599804e+10 1.207574e+10 1.679301e+09 4.594778e+08 5.821614e+09 1.451758e+10 2.55803e+10 3.43277e+10 4.245286e+10 4.784859e+10 4.988591e+10 4.925451e+10 5.074584e+10 4.9557e+10 4.407876e+10 3.421443e+10 3.138606e+10 2.539716e+10 1.948134e+10 1.381167e+10 0 ]
diff --git a/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf
new file mode 100644
index 0000000..7748a4a
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf
@@ -0,0 +1 @@
+# configuration file for apply-cmvn-online, used in the script ../local/run_online_decoding.sh
diff --git a/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/splice.conf b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/splice.conf
new file mode 100644
index 0000000..960cd2e
--- /dev/null
+++ b/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/splice.conf
@@ -0,0 +1,2 @@
+--left-context=3
+--right-context=3
diff --git a/log/build_2025-11-09_19-38-47/camera_module/command.log b/log/build_2025-11-09_19-38-47/camera_module/command.log
deleted file mode 100644
index b7fd639..0000000
--- a/log/build_2025-11-09_19-38-47/camera_module/command.log
+++ /dev/null
@@ -1,2 +0,0 @@
-Invoking command in '/home/jake/ros2_ws/src/camera_module': PYTHONPATH=/home/jake/ros2_ws/build/camera_module/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base ../../build/camera_module build --build-base /home/jake/ros2_ws/build/camera_module/build install --record /home/jake/ros2_ws/build/camera_module/install.log --single-version-externally-managed install_data
-Invoked command in '/home/jake/ros2_ws/src/camera_module' returned '0': PYTHONPATH=/home/jake/ros2_ws/build/camera_module/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base ../../build/camera_module build --build-base /home/jake/ros2_ws/build/camera_module/build install --record /home/jake/ros2_ws/build/camera_module/install.log --single-version-externally-managed install_data
diff --git a/log/build_2025-11-09_19-38-47/camera_module/stdout.log b/log/build_2025-11-09_19-38-47/camera_module/stdout.log
deleted file mode 100644
index 2baba09..0000000
--- a/log/build_2025-11-09_19-38-47/camera_module/stdout.log
+++ /dev/null
@@ -1,41 +0,0 @@
-running egg_info
-creating ../../build/camera_module/camera_module.egg-info
-writing ../../build/camera_module/camera_module.egg-info/PKG-INFO
-writing dependency_links to ../../build/camera_module/camera_module.egg-info/dependency_links.txt
-writing entry points to ../../build/camera_module/camera_module.egg-info/entry_points.txt
-writing requirements to ../../build/camera_module/camera_module.egg-info/requires.txt
-writing top-level names to ../../build/camera_module/camera_module.egg-info/top_level.txt
-writing manifest file '../../build/camera_module/camera_module.egg-info/SOURCES.txt'
-reading manifest file '../../build/camera_module/camera_module.egg-info/SOURCES.txt'
-writing manifest file '../../build/camera_module/camera_module.egg-info/SOURCES.txt'
-running build
-running build_py
-creating /home/jake/ros2_ws/build/camera_module/build
-creating /home/jake/ros2_ws/build/camera_module/build/lib
-creating /home/jake/ros2_ws/build/camera_module/build/lib/camera_module
-copying ./camera_module/__init__.py -> /home/jake/ros2_ws/build/camera_module/build/lib/camera_module
-copying ./camera_module/camera_module.py -> /home/jake/ros2_ws/build/camera_module/build/lib/camera_module
-copying ./camera_module/threaded_node.py -> /home/jake/ros2_ws/build/camera_module/build/lib/camera_module
-running install
-running install_lib
-creating /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module
-copying /home/jake/ros2_ws/build/camera_module/build/lib/camera_module/__init__.py -> /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module
-copying /home/jake/ros2_ws/build/camera_module/build/lib/camera_module/camera_module.py -> /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module
-copying /home/jake/ros2_ws/build/camera_module/build/lib/camera_module/threaded_node.py -> /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module
-byte-compiling /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module/__init__.py to __init__.cpython-312.pyc
-byte-compiling /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module/camera_module.py to camera_module.cpython-312.pyc
-byte-compiling /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module/threaded_node.py to threaded_node.cpython-312.pyc
-running install_data
-copying package.xml -> /home/jake/ros2_ws/install/camera_module/share/camera_module
-creating /home/jake/ros2_ws/install/camera_module/share/camera_module/resource
-creating /home/jake/ros2_ws/install/camera_module/share/camera_module/resource/model
-copying resource/model/RetinaFace.rknn -> /home/jake/ros2_ws/install/camera_module/share/camera_module/resource/model
-creating /home/jake/ros2_ws/install/camera_module/share/ament_index
-creating /home/jake/ros2_ws/install/camera_module/share/ament_index/resource_index
-creating /home/jake/ros2_ws/install/camera_module/share/ament_index/resource_index/packages
-copying resource/camera_module -> /home/jake/ros2_ws/install/camera_module/share/ament_index/resource_index/packages
-running install_egg_info
-Copying ../../build/camera_module/camera_module.egg-info to /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module-0.1.0-py3.12.egg-info
-running install_scripts
-Installing camera_module script to /home/jake/ros2_ws/install/camera_module/bin
-writing list of installed files to '/home/jake/ros2_ws/build/camera_module/install.log'
diff --git a/log/build_2025-11-09_19-38-47/camera_module/stdout_stderr.log b/log/build_2025-11-09_19-38-47/camera_module/stdout_stderr.log
deleted file mode 100644
index 2baba09..0000000
--- a/log/build_2025-11-09_19-38-47/camera_module/stdout_stderr.log
+++ /dev/null
@@ -1,41 +0,0 @@
-running egg_info
-creating ../../build/camera_module/camera_module.egg-info
-writing ../../build/camera_module/camera_module.egg-info/PKG-INFO
-writing dependency_links to ../../build/camera_module/camera_module.egg-info/dependency_links.txt
-writing entry points to ../../build/camera_module/camera_module.egg-info/entry_points.txt
-writing requirements to ../../build/camera_module/camera_module.egg-info/requires.txt
-writing top-level names to ../../build/camera_module/camera_module.egg-info/top_level.txt
-writing manifest file '../../build/camera_module/camera_module.egg-info/SOURCES.txt'
-reading manifest file '../../build/camera_module/camera_module.egg-info/SOURCES.txt'
-writing manifest file '../../build/camera_module/camera_module.egg-info/SOURCES.txt'
-running build
-running build_py
-creating /home/jake/ros2_ws/build/camera_module/build
-creating /home/jake/ros2_ws/build/camera_module/build/lib
-creating /home/jake/ros2_ws/build/camera_module/build/lib/camera_module
-copying ./camera_module/__init__.py -> /home/jake/ros2_ws/build/camera_module/build/lib/camera_module
-copying ./camera_module/camera_module.py -> /home/jake/ros2_ws/build/camera_module/build/lib/camera_module
-copying ./camera_module/threaded_node.py -> /home/jake/ros2_ws/build/camera_module/build/lib/camera_module
-running install
-running install_lib
-creating /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module
-copying /home/jake/ros2_ws/build/camera_module/build/lib/camera_module/__init__.py -> /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module
-copying /home/jake/ros2_ws/build/camera_module/build/lib/camera_module/camera_module.py -> /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module
-copying /home/jake/ros2_ws/build/camera_module/build/lib/camera_module/threaded_node.py -> /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module
-byte-compiling /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module/__init__.py to __init__.cpython-312.pyc
-byte-compiling /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module/camera_module.py to camera_module.cpython-312.pyc
-byte-compiling /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module/threaded_node.py to threaded_node.cpython-312.pyc
-running install_data
-copying package.xml -> /home/jake/ros2_ws/install/camera_module/share/camera_module
-creating /home/jake/ros2_ws/install/camera_module/share/camera_module/resource
-creating /home/jake/ros2_ws/install/camera_module/share/camera_module/resource/model
-copying resource/model/RetinaFace.rknn -> /home/jake/ros2_ws/install/camera_module/share/camera_module/resource/model
-creating /home/jake/ros2_ws/install/camera_module/share/ament_index
-creating /home/jake/ros2_ws/install/camera_module/share/ament_index/resource_index
-creating /home/jake/ros2_ws/install/camera_module/share/ament_index/resource_index/packages
-copying resource/camera_module -> /home/jake/ros2_ws/install/camera_module/share/ament_index/resource_index/packages
-running install_egg_info
-Copying ../../build/camera_module/camera_module.egg-info to /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module-0.1.0-py3.12.egg-info
-running install_scripts
-Installing camera_module script to /home/jake/ros2_ws/install/camera_module/bin
-writing list of installed files to '/home/jake/ros2_ws/build/camera_module/install.log'
diff --git a/log/build_2025-11-09_19-38-47/camera_module/streams.log b/log/build_2025-11-09_19-38-47/camera_module/streams.log
deleted file mode 100644
index f8fa2fb..0000000
--- a/log/build_2025-11-09_19-38-47/camera_module/streams.log
+++ /dev/null
@@ -1,43 +0,0 @@
-[0.774s] Invoking command in '/home/jake/ros2_ws/src/camera_module': PYTHONPATH=/home/jake/ros2_ws/build/camera_module/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base ../../build/camera_module build --build-base /home/jake/ros2_ws/build/camera_module/build install --record /home/jake/ros2_ws/build/camera_module/install.log --single-version-externally-managed install_data
-[1.009s] running egg_info
-[1.009s] creating ../../build/camera_module/camera_module.egg-info
-[1.028s] writing ../../build/camera_module/camera_module.egg-info/PKG-INFO
-[1.029s] writing dependency_links to ../../build/camera_module/camera_module.egg-info/dependency_links.txt
-[1.029s] writing entry points to ../../build/camera_module/camera_module.egg-info/entry_points.txt
-[1.030s] writing requirements to ../../build/camera_module/camera_module.egg-info/requires.txt
-[1.030s] writing top-level names to ../../build/camera_module/camera_module.egg-info/top_level.txt
-[1.030s] writing manifest file '../../build/camera_module/camera_module.egg-info/SOURCES.txt'
-[1.066s] reading manifest file '../../build/camera_module/camera_module.egg-info/SOURCES.txt'
-[1.067s] writing manifest file '../../build/camera_module/camera_module.egg-info/SOURCES.txt'
-[1.071s] running build
-[1.071s] running build_py
-[1.071s] creating /home/jake/ros2_ws/build/camera_module/build
-[1.072s] creating /home/jake/ros2_ws/build/camera_module/build/lib
-[1.072s] creating /home/jake/ros2_ws/build/camera_module/build/lib/camera_module
-[1.073s] copying ./camera_module/__init__.py -> /home/jake/ros2_ws/build/camera_module/build/lib/camera_module
-[1.073s] copying ./camera_module/camera_module.py -> /home/jake/ros2_ws/build/camera_module/build/lib/camera_module
-[1.073s] copying ./camera_module/threaded_node.py -> /home/jake/ros2_ws/build/camera_module/build/lib/camera_module
-[1.074s] running install
-[1.079s] running install_lib
-[1.098s] creating /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module
-[1.099s] copying /home/jake/ros2_ws/build/camera_module/build/lib/camera_module/__init__.py -> /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module
-[1.099s] copying /home/jake/ros2_ws/build/camera_module/build/lib/camera_module/camera_module.py -> /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module
-[1.099s] copying /home/jake/ros2_ws/build/camera_module/build/lib/camera_module/threaded_node.py -> /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module
-[1.100s] byte-compiling /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module/__init__.py to __init__.cpython-312.pyc
-[1.100s] byte-compiling /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module/camera_module.py to camera_module.cpython-312.pyc
-[1.103s] byte-compiling /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module/threaded_node.py to threaded_node.cpython-312.pyc
-[1.104s] running install_data
-[1.105s] copying package.xml -> /home/jake/ros2_ws/install/camera_module/share/camera_module
-[1.105s] creating /home/jake/ros2_ws/install/camera_module/share/camera_module/resource
-[1.105s] creating /home/jake/ros2_ws/install/camera_module/share/camera_module/resource/model
-[1.106s] copying resource/model/RetinaFace.rknn -> /home/jake/ros2_ws/install/camera_module/share/camera_module/resource/model
-[1.107s] creating /home/jake/ros2_ws/install/camera_module/share/ament_index
-[1.108s] creating /home/jake/ros2_ws/install/camera_module/share/ament_index/resource_index
-[1.108s] creating /home/jake/ros2_ws/install/camera_module/share/ament_index/resource_index/packages
-[1.109s] copying resource/camera_module -> /home/jake/ros2_ws/install/camera_module/share/ament_index/resource_index/packages
-[1.109s] running install_egg_info
-[1.129s] Copying ../../build/camera_module/camera_module.egg-info to /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module-0.1.0-py3.12.egg-info
-[1.131s] running install_scripts
-[1.252s] Installing camera_module script to /home/jake/ros2_ws/install/camera_module/bin
-[1.253s] writing list of installed files to '/home/jake/ros2_ws/build/camera_module/install.log'
-[1.286s] Invoked command in '/home/jake/ros2_ws/src/camera_module' returned '0': PYTHONPATH=/home/jake/ros2_ws/build/camera_module/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base ../../build/camera_module build --build-base /home/jake/ros2_ws/build/camera_module/build install --record /home/jake/ros2_ws/build/camera_module/install.log --single-version-externally-managed install_data
diff --git a/log/build_2025-11-09_19-38-47/events.log b/log/build_2025-11-09_19-38-47/events.log
deleted file mode 100644
index 005cba9..0000000
--- a/log/build_2025-11-09_19-38-47/events.log
+++ /dev/null
@@ -1,66 +0,0 @@
-[0.000000] (-) TimerEvent: {}
-[0.000428] (-) JobUnselected: {'identifier': 'cam_test'}
-[0.000483] (-) JobUnselected: {'identifier': 'cv_bridge'}
-[0.000533] (-) JobUnselected: {'identifier': 'hello_pub'}
-[0.001098] (-) JobUnselected: {'identifier': 'image_geometry'}
-[0.001148] (-) JobUnselected: {'identifier': 'opencv_tests'}
-[0.001196] (-) JobUnselected: {'identifier': 'vision_opencv'}
-[0.001248] (camera_module) JobQueued: {'identifier': 'camera_module', 'dependencies': OrderedDict()}
-[0.001270] (camera_module) JobStarted: {'identifier': 'camera_module'}
-[0.099757] (-) TimerEvent: {}
-[0.200182] (-) TimerEvent: {}
-[0.300806] (-) TimerEvent: {}
-[0.401179] (-) TimerEvent: {}
-[0.501526] (-) TimerEvent: {}
-[0.601865] (-) TimerEvent: {}
-[0.702209] (-) TimerEvent: {}
-[0.773550] (camera_module) Command: {'cmd': ['/usr/bin/python3', '-W', 'ignore:setup.py install is deprecated', '-W', 'ignore:easy_install command is deprecated', 'setup.py', 'egg_info', '--egg-base', '../../build/camera_module', 'build', '--build-base', '/home/jake/ros2_ws/build/camera_module/build', 'install', '--record', '/home/jake/ros2_ws/build/camera_module/install.log', '--single-version-externally-managed', 'install_data'], 'cwd': '/home/jake/ros2_ws/src/camera_module', 'env': {'LESSOPEN': '| /usr/bin/lesspipe %s', 'USER': 'jake', 'GIT_ASKPASS': '/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/extensions/git/dist/askpass.sh', 'SHLVL': '2', 'LD_LIBRARY_PATH': '/opt/ros/kilted/opt/zenoh_cpp_vendor/lib:/opt/ros/kilted/opt/gz_math_vendor/lib:/opt/ros/kilted/opt/gz_utils_vendor/lib:/opt/ros/kilted/opt/rviz_ogre_vendor/lib:/opt/ros/kilted/lib/x86_64-linux-gnu:/opt/ros/kilted/opt/gz_cmake_vendor/lib:/opt/ros/kilted/lib', 'HOME': '/home/jake', 'CONDA_SHLVL': '0', 'OLDPWD': '/home/jake/ros2_ws', 'TERM_PROGRAM_VERSION': '1.105.1', 'VSCODE_IPC_HOOK_CLI': '/run/user/1001/vscode-ipc-07b86bca-e4f9-4c18-ba3e-d1abb3d5b6bc.sock', 'ROS_PYTHON_VERSION': '3', 'VSCODE_GIT_ASKPASS_MAIN': '/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/extensions/git/dist/askpass-main.js', 'VSCODE_GIT_ASKPASS_NODE': '/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/node', 'VSCODE_PYTHON_AUTOACTIVATE_GUARD': '1', 'DBUS_SESSION_BUS_ADDRESS': 'unix:path=/run/user/1001/bus', 'COLORTERM': 'truecolor', '_CE_M': '', 'WSL_DISTRO_NAME': 'Ubuntu-24.04', '_CONDA_ROOT': '/home/jake/miniconda3', 'WAYLAND_DISPLAY': 'wayland-0', 'ROS_DISTRO': 'kilted', 'LOGNAME': 'jake', 'NAME': 'DESKTOP-UFLG41E', 'WSL_INTEROP': '/run/WSL/440_interop', 'PULSE_SERVER': 'unix:/mnt/wslg/PulseServer', '_': '/usr/bin/colcon', 'ROS_VERSION': '2', 'TERM': 'xterm-256color', '_CE_CONDA': '', 'PATH': '/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/bin/remote-cli:/home/jake/.local/bin:/home/jake/miniconda3/condabin:/opt/ros/kilted/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Windows/System32/OpenSSH/:/mnt/c/Program Files/Docker/Docker/resources/bin:/mnt/c/Program Files/usbipd-win/:/mnt/c/Users/jake/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/jake/AppData/Local/Programs/Microsoft VS Code/bin:/snap/bin:/home/jake/.vscode-server/data/User/globalStorage/github.copilot-chat/debugCommand', 'XDG_RUNTIME_DIR': '/run/user/1001/', 'DISPLAY': '10.255.255.254:0', 'LANG': 'C.UTF-8', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.crdownload=00;90:*.dpkg-dist=00;90:*.dpkg-new=00;90:*.dpkg-old=00;90:*.dpkg-tmp=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90:*.swp=00;90:*.tmp=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:', 'VSCODE_GIT_IPC_HANDLE': '/run/user/1001/vscode-git-1d6e8e65c1.sock', 'TERM_PROGRAM': 'vscode', 'AMENT_PREFIX_PATH': '/opt/ros/kilted', 'CONDA_PYTHON_EXE': '/home/jake/miniconda3/bin/python', 'SHELL': '/bin/bash', 'LESSCLOSE': '/usr/bin/lesspipe %s %s', '_CONDA_EXE': '/home/jake/miniconda3/bin/conda', 'ROS_AUTOMATIC_DISCOVERY_RANGE': 'SUBNET', 'VSCODE_GIT_ASKPASS_EXTRA_ARGS': '', 'PWD': '/home/jake/ros2_ws/build/camera_module', 'CONDA_EXE': '/home/jake/miniconda3/bin/conda', 'XDG_DATA_DIRS': '/usr/local/share:/usr/share:/var/lib/snapd/desktop', 'PYTHONPATH': '/home/jake/ros2_ws/build/camera_module/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages:/opt/ros/kilted/lib/python3.12/site-packages', 'COLCON': '1', 'WSL2_GUI_APPS_ENABLED': '1', 'HOSTTYPE': 'x86_64', 'CMAKE_PREFIX_PATH': '/opt/ros/kilted/opt/gz_math_vendor:/opt/ros/kilted/opt/gz_utils_vendor:/opt/ros/kilted/opt/gz_cmake_vendor', 'WSLENV': 'VSCODE_WSL_EXT_LOCATION/up'}, 'shell': False}
-[0.802342] (-) TimerEvent: {}
-[0.902690] (-) TimerEvent: {}
-[1.003228] (-) TimerEvent: {}
-[1.010059] (camera_module) StdoutLine: {'line': b'running egg_info\n'}
-[1.010461] (camera_module) StdoutLine: {'line': b'creating ../../build/camera_module/camera_module.egg-info\n'}
-[1.029583] (camera_module) StdoutLine: {'line': b'writing ../../build/camera_module/camera_module.egg-info/PKG-INFO\n'}
-[1.030019] (camera_module) StdoutLine: {'line': b'writing dependency_links to ../../build/camera_module/camera_module.egg-info/dependency_links.txt\n'}
-[1.030527] (camera_module) StdoutLine: {'line': b'writing entry points to ../../build/camera_module/camera_module.egg-info/entry_points.txt\n'}
-[1.030771] (camera_module) StdoutLine: {'line': b'writing requirements to ../../build/camera_module/camera_module.egg-info/requires.txt\n'}
-[1.030887] (camera_module) StdoutLine: {'line': b'writing top-level names to ../../build/camera_module/camera_module.egg-info/top_level.txt\n'}
-[1.031003] (camera_module) StdoutLine: {'line': b"writing manifest file '../../build/camera_module/camera_module.egg-info/SOURCES.txt'\n"}
-[1.067481] (camera_module) StdoutLine: {'line': b"reading manifest file '../../build/camera_module/camera_module.egg-info/SOURCES.txt'\n"}
-[1.068167] (camera_module) StdoutLine: {'line': b"writing manifest file '../../build/camera_module/camera_module.egg-info/SOURCES.txt'\n"}
-[1.072029] (camera_module) StdoutLine: {'line': b'running build\n'}
-[1.072260] (camera_module) StdoutLine: {'line': b'running build_py\n'}
-[1.072603] (camera_module) StdoutLine: {'line': b'creating /home/jake/ros2_ws/build/camera_module/build\n'}
-[1.073042] (camera_module) StdoutLine: {'line': b'creating /home/jake/ros2_ws/build/camera_module/build/lib\n'}
-[1.073591] (camera_module) StdoutLine: {'line': b'creating /home/jake/ros2_ws/build/camera_module/build/lib/camera_module\n'}
-[1.074195] (camera_module) StdoutLine: {'line': b'copying ./camera_module/__init__.py -> /home/jake/ros2_ws/build/camera_module/build/lib/camera_module\n'}
-[1.074435] (camera_module) StdoutLine: {'line': b'copying ./camera_module/camera_module.py -> /home/jake/ros2_ws/build/camera_module/build/lib/camera_module\n'}
-[1.074726] (camera_module) StdoutLine: {'line': b'copying ./camera_module/threaded_node.py -> /home/jake/ros2_ws/build/camera_module/build/lib/camera_module\n'}
-[1.074922] (camera_module) StdoutLine: {'line': b'running install\n'}
-[1.080584] (camera_module) StdoutLine: {'line': b'running install_lib\n'}
-[1.099142] (camera_module) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module\n'}
-[1.099806] (camera_module) StdoutLine: {'line': b'copying /home/jake/ros2_ws/build/camera_module/build/lib/camera_module/__init__.py -> /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module\n'}
-[1.100057] (camera_module) StdoutLine: {'line': b'copying /home/jake/ros2_ws/build/camera_module/build/lib/camera_module/camera_module.py -> /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module\n'}
-[1.100372] (camera_module) StdoutLine: {'line': b'copying /home/jake/ros2_ws/build/camera_module/build/lib/camera_module/threaded_node.py -> /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module\n'}
-[1.100813] (camera_module) StdoutLine: {'line': b'byte-compiling /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module/__init__.py to __init__.cpython-312.pyc\n'}
-[1.101627] (camera_module) StdoutLine: {'line': b'byte-compiling /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module/camera_module.py to camera_module.cpython-312.pyc\n'}
-[1.103316] (-) TimerEvent: {}
-[1.104422] (camera_module) StdoutLine: {'line': b'byte-compiling /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module/threaded_node.py to threaded_node.cpython-312.pyc\n'}
-[1.105430] (camera_module) StdoutLine: {'line': b'running install_data\n'}
-[1.105705] (camera_module) StdoutLine: {'line': b'copying package.xml -> /home/jake/ros2_ws/install/camera_module/share/camera_module\n'}
-[1.105959] (camera_module) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/camera_module/share/camera_module/resource\n'}
-[1.106453] (camera_module) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/camera_module/share/camera_module/resource/model\n'}
-[1.107017] (camera_module) StdoutLine: {'line': b'copying resource/model/RetinaFace.rknn -> /home/jake/ros2_ws/install/camera_module/share/camera_module/resource/model\n'}
-[1.108232] (camera_module) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/camera_module/share/ament_index\n'}
-[1.108836] (camera_module) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/camera_module/share/ament_index/resource_index\n'}
-[1.109353] (camera_module) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/camera_module/share/ament_index/resource_index/packages\n'}
-[1.109918] (camera_module) StdoutLine: {'line': b'copying resource/camera_module -> /home/jake/ros2_ws/install/camera_module/share/ament_index/resource_index/packages\n'}
-[1.110052] (camera_module) StdoutLine: {'line': b'running install_egg_info\n'}
-[1.130088] (camera_module) StdoutLine: {'line': b'Copying ../../build/camera_module/camera_module.egg-info to /home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages/camera_module-0.1.0-py3.12.egg-info\n'}
-[1.131774] (camera_module) StdoutLine: {'line': b'running install_scripts\n'}
-[1.203458] (-) TimerEvent: {}
-[1.252823] (camera_module) StdoutLine: {'line': b'Installing camera_module script to /home/jake/ros2_ws/install/camera_module/bin\n'}
-[1.253791] (camera_module) StdoutLine: {'line': b"writing list of installed files to '/home/jake/ros2_ws/build/camera_module/install.log'\n"}
-[1.286184] (camera_module) CommandEnded: {'returncode': 0}
-[1.300112] (camera_module) JobEnded: {'identifier': 'camera_module', 'rc': 0}
-[1.301705] (-) EventReactorShutdown: {}
diff --git a/log/build_2025-11-09_19-38-47/logger_all.log b/log/build_2025-11-09_19-38-47/logger_all.log
deleted file mode 100644
index 1c85ff3..0000000
--- a/log/build_2025-11-09_19-38-47/logger_all.log
+++ /dev/null
@@ -1,216 +0,0 @@
-[0.119s] [34mcolcon[0m [1;30mDEBUG[0m [32mCommand line arguments: ['/usr/bin/colcon', 'build', '--packages-select', 'camera_module', '--event-handlers', 'console_direct+'][0m
-[0.119s] [34mcolcon[0m [1;30mDEBUG[0m [32mParsed command line arguments: Namespace(log_base=None, log_level=None, verb_name='build', build_base='build', install_base='install', merge_install=False, symlink_install=False, test_result_base=None, continue_on_error=False, executor='parallel', parallel_workers=24, event_handlers=['console_direct+'], ignore_user_meta=False, metas=['./colcon.meta'], base_paths=['.'], packages_ignore=None, packages_ignore_regex=None, paths=None, packages_up_to=None, packages_up_to_regex=None, packages_above=None, packages_above_and_dependencies=None, packages_above_depth=None, packages_select_by_dep=None, packages_skip_by_dep=None, packages_skip_up_to=None, packages_select_build_failed=False, packages_skip_build_finished=False, packages_select_test_failures=False, packages_skip_test_passed=False, packages_select=['camera_module'], packages_skip=None, packages_select_regex=None, packages_skip_regex=None, packages_start=None, packages_end=None, allow_overriding=[], cmake_args=None, cmake_target=None, cmake_target_skip_unavailable=False, cmake_clean_cache=False, cmake_clean_first=False, cmake_force_configure=False, ament_cmake_args=None, catkin_cmake_args=None, catkin_skip_building_tests=False, verb_parser=, verb_extension=, main=>)[0m
-[0.158s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(colcon_meta) check parameters
-[0.159s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(recursive) check parameters
-[0.159s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(ignore) check parameters
-[0.159s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(path) check parameters
-[0.159s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(colcon_meta) discover
-[0.159s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(recursive) discover
-[0.159s] [34mcolcon.colcon_core.package_discovery[0m [1;30mINFO[0m Crawling recursively for packages in '/home/jake/ros2_ws'
-[0.159s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extensions ['ignore', 'ignore_ament_install']
-[0.159s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'ignore'
-[0.159s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'ignore_ament_install'
-[0.159s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extensions ['colcon_pkg']
-[0.159s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'colcon_pkg'
-[0.159s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extensions ['colcon_meta']
-[0.159s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'colcon_meta'
-[0.159s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extensions ['ros']
-[0.159s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'ros'
-[0.181s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extensions ['cmake', 'python']
-[0.181s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'cmake'
-[0.182s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'python'
-[0.182s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extensions ['python_setup_py']
-[0.182s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'python_setup_py'
-[0.182s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(build) by extensions ['ignore', 'ignore_ament_install']
-[0.182s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(build) by extension 'ignore'
-[0.182s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(build) ignored
-[0.182s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(install) by extensions ['ignore', 'ignore_ament_install']
-[0.182s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(install) by extension 'ignore'
-[0.182s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(install) ignored
-[0.182s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(log) by extensions ['ignore', 'ignore_ament_install']
-[0.182s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(log) by extension 'ignore'
-[0.182s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(log) ignored
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extensions ['ignore', 'ignore_ament_install']
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'ignore'
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'ignore_ament_install'
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extensions ['colcon_pkg']
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'colcon_pkg'
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extensions ['colcon_meta']
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'colcon_meta'
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extensions ['ros']
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'ros'
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extensions ['cmake', 'python']
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'cmake'
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'python'
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extensions ['python_setup_py']
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'python_setup_py'
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extensions ['ignore', 'ignore_ament_install']
-[0.183s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extension 'ignore'
-[0.184s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extension 'ignore_ament_install'
-[0.184s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extensions ['colcon_pkg']
-[0.184s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extension 'colcon_pkg'
-[0.184s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extensions ['colcon_meta']
-[0.184s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extension 'colcon_meta'
-[0.184s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extensions ['ros']
-[0.184s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extension 'ros'
-[0.186s] [34mcolcon.colcon_core.package_identification[0m [1;30mDEBUG[0m [32mPackage 'src/cam_test' with type 'ros.ament_python' and name 'cam_test'[0m
-[0.186s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extensions ['ignore', 'ignore_ament_install']
-[0.186s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extension 'ignore'
-[0.186s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extension 'ignore_ament_install'
-[0.186s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extensions ['colcon_pkg']
-[0.186s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extension 'colcon_pkg'
-[0.186s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extensions ['colcon_meta']
-[0.186s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extension 'colcon_meta'
-[0.186s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extensions ['ros']
-[0.186s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extension 'ros'
-[0.187s] [34mcolcon.colcon_core.package_identification[0m [1;30mDEBUG[0m [32mPackage 'src/camera_module' with type 'ros.ament_python' and name 'camera_module'[0m
-[0.187s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extensions ['ignore', 'ignore_ament_install']
-[0.187s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extension 'ignore'
-[0.187s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extension 'ignore_ament_install'
-[0.187s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extensions ['colcon_pkg']
-[0.187s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extension 'colcon_pkg'
-[0.187s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extensions ['colcon_meta']
-[0.187s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extension 'colcon_meta'
-[0.187s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extensions ['ros']
-[0.187s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extension 'ros'
-[0.187s] [34mcolcon.colcon_core.package_identification[0m [1;30mDEBUG[0m [32mPackage 'src/hello_pub' with type 'ros.ament_python' and name 'hello_pub'[0m
-[0.187s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extensions ['ignore', 'ignore_ament_install']
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'ignore'
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'ignore_ament_install'
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extensions ['colcon_pkg']
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'colcon_pkg'
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extensions ['colcon_meta']
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'colcon_meta'
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extensions ['ros']
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'ros'
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extensions ['cmake', 'python']
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'cmake'
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'python'
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extensions ['python_setup_py']
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'python_setup_py'
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extensions ['ignore', 'ignore_ament_install']
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extension 'ignore'
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extension 'ignore_ament_install'
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extensions ['colcon_pkg']
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extension 'colcon_pkg'
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extensions ['colcon_meta']
-[0.188s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extension 'colcon_meta'
-[0.189s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extensions ['ros']
-[0.189s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extension 'ros'
-[0.189s] [34mcolcon.colcon_core.package_identification[0m [1;30mDEBUG[0m [32mPackage 'src/vision_opencv/cv_bridge' with type 'ros.ament_cmake' and name 'cv_bridge'[0m
-[0.189s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extensions ['ignore', 'ignore_ament_install']
-[0.190s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extension 'ignore'
-[0.190s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extension 'ignore_ament_install'
-[0.190s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extensions ['colcon_pkg']
-[0.190s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extension 'colcon_pkg'
-[0.190s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extensions ['colcon_meta']
-[0.190s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extension 'colcon_meta'
-[0.190s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extensions ['ros']
-[0.190s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extension 'ros'
-[0.190s] [34mcolcon.colcon_core.package_identification[0m [1;30mDEBUG[0m [32mPackage 'src/vision_opencv/image_geometry' with type 'ros.ament_cmake' and name 'image_geometry'[0m
-[0.190s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extensions ['ignore', 'ignore_ament_install']
-[0.190s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extension 'ignore'
-[0.190s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extension 'ignore_ament_install'
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extensions ['colcon_pkg']
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extension 'colcon_pkg'
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extensions ['colcon_meta']
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extension 'colcon_meta'
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extensions ['ros']
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extension 'ros'
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mDEBUG[0m [32mPackage 'src/vision_opencv/opencv_tests' with type 'ros.ament_python' and name 'opencv_tests'[0m
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extensions ['ignore', 'ignore_ament_install']
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extension 'ignore'
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extension 'ignore_ament_install'
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extensions ['colcon_pkg']
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extension 'colcon_pkg'
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extensions ['colcon_meta']
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extension 'colcon_meta'
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extensions ['ros']
-[0.191s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extension 'ros'
-[0.192s] [34mcolcon.colcon_core.package_identification[0m [1;30mDEBUG[0m [32mPackage 'src/vision_opencv/vision_opencv' with type 'ros.ament_cmake' and name 'vision_opencv'[0m
-[0.192s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(recursive) using defaults
-[0.192s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(ignore) discover
-[0.192s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(ignore) using defaults
-[0.192s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(path) discover
-[0.192s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(path) using defaults
-[0.206s] [34mcolcon.colcon_core.package_selection[0m [1;30mINFO[0m Skipping not selected package 'cam_test' in 'src/cam_test'
-[0.206s] [34mcolcon.colcon_core.package_selection[0m [1;30mINFO[0m Skipping not selected package 'cv_bridge' in 'src/vision_opencv/cv_bridge'
-[0.206s] [34mcolcon.colcon_core.package_selection[0m [1;30mINFO[0m Skipping not selected package 'hello_pub' in 'src/hello_pub'
-[0.206s] [34mcolcon.colcon_core.package_selection[0m [1;30mINFO[0m Skipping not selected package 'image_geometry' in 'src/vision_opencv/image_geometry'
-[0.206s] [34mcolcon.colcon_core.package_selection[0m [1;30mINFO[0m Skipping not selected package 'opencv_tests' in 'src/vision_opencv/opencv_tests'
-[0.206s] [34mcolcon.colcon_core.package_selection[0m [1;30mINFO[0m Skipping not selected package 'vision_opencv' in 'src/vision_opencv/vision_opencv'
-[0.206s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(prefix_path) check parameters
-[0.206s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(prefix_path) discover
-[0.209s] [34mcolcon.colcon_installed_package_information.package_discovery[0m [1;30mDEBUG[0m [32mFound 295 installed packages in /opt/ros/kilted[0m
-[0.210s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(prefix_path) using defaults
-[0.248s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'camera_module' build argument 'cmake_args' from command line to 'None'
-[0.248s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'camera_module' build argument 'cmake_target' from command line to 'None'
-[0.248s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'camera_module' build argument 'cmake_target_skip_unavailable' from command line to 'False'
-[0.248s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'camera_module' build argument 'cmake_clean_cache' from command line to 'False'
-[0.248s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'camera_module' build argument 'cmake_clean_first' from command line to 'False'
-[0.248s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'camera_module' build argument 'cmake_force_configure' from command line to 'False'
-[0.248s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'camera_module' build argument 'ament_cmake_args' from command line to 'None'
-[0.248s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'camera_module' build argument 'catkin_cmake_args' from command line to 'None'
-[0.248s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'camera_module' build argument 'catkin_skip_building_tests' from command line to 'False'
-[0.248s] [34mcolcon.colcon_core.verb[0m [1;30mDEBUG[0m [32mBuilding package 'camera_module' with the following arguments: {'ament_cmake_args': None, 'build_base': '/home/jake/ros2_ws/build/camera_module', 'catkin_cmake_args': None, 'catkin_skip_building_tests': False, 'cmake_args': None, 'cmake_clean_cache': False, 'cmake_clean_first': False, 'cmake_force_configure': False, 'cmake_target': None, 'cmake_target_skip_unavailable': False, 'install_base': '/home/jake/ros2_ws/install/camera_module', 'merge_install': False, 'path': '/home/jake/ros2_ws/src/camera_module', 'symlink_install': False, 'test_result_base': None}[0m
-[0.248s] [34mcolcon.colcon_core.executor[0m [1;30mINFO[0m Executing jobs using 'parallel' executor
-[0.250s] [34mcolcon.colcon_parallel_executor.executor.parallel[0m [1;30mDEBUG[0m [32mrun_until_complete[0m
-[0.250s] [34mcolcon.colcon_ros.task.ament_python.build[0m [1;30mINFO[0m Building ROS package in '/home/jake/ros2_ws/src/camera_module' with build type 'ament_python'
-[0.251s] [34mcolcon.colcon_core.shell[0m [1;30mLevel 1[0m create_environment_hook('camera_module', 'ament_prefix_path')
-[0.253s] [34mcolcon.colcon_core.plugin_system[0m [1;30mINFO[0m Skipping extension 'colcon_core.shell.bat': Not used on non-Windows systems
-[0.253s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/camera_module/share/camera_module/hook/ament_prefix_path.ps1'
-[0.256s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment descriptor '/home/jake/ros2_ws/install/camera_module/share/camera_module/hook/ament_prefix_path.dsv'
-[0.256s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/camera_module/share/camera_module/hook/ament_prefix_path.sh'
-[0.257s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell
-[0.257s] [34mcolcon.colcon_core.shell[0m [1;30mDEBUG[0m [32mSkip shell extension 'dsv' for command environment[0m
-[0.454s] [34mcolcon.colcon_core.task.python.build[0m [1;30mINFO[0m Building Python package in '/home/jake/ros2_ws/src/camera_module'
-[0.454s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell
-[0.454s] [34mcolcon.colcon_core.shell[0m [1;30mDEBUG[0m [32mSkip shell extension 'dsv' for command environment[0m
-[1.025s] [34mcolcon.colcon_core.event_handler.log_command[0m [1;30mDEBUG[0m [32mInvoking command in '/home/jake/ros2_ws/src/camera_module': PYTHONPATH=/home/jake/ros2_ws/build/camera_module/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base ../../build/camera_module build --build-base /home/jake/ros2_ws/build/camera_module/build install --record /home/jake/ros2_ws/build/camera_module/install.log --single-version-externally-managed install_data[0m
-[1.537s] [34mcolcon.colcon_core.event_handler.log_command[0m [1;30mDEBUG[0m [32mInvoked command in '/home/jake/ros2_ws/src/camera_module' returned '0': PYTHONPATH=/home/jake/ros2_ws/build/camera_module/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base ../../build/camera_module build --build-base /home/jake/ros2_ws/build/camera_module/build install --record /home/jake/ros2_ws/build/camera_module/install.log --single-version-externally-managed install_data[0m
-[1.539s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m checking '/home/jake/ros2_ws/install/camera_module' for CMake module files
-[1.539s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m checking '/home/jake/ros2_ws/install/camera_module' for CMake config files
-[1.540s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m checking '/home/jake/ros2_ws/install/camera_module/lib'
-[1.540s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m checking '/home/jake/ros2_ws/install/camera_module/bin'
-[1.540s] [34mcolcon.colcon_core.shell[0m [1;30mLevel 1[0m create_environment_hook('camera_module', 'path')
-[1.540s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/camera_module/share/camera_module/hook/path.ps1'
-[1.541s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment descriptor '/home/jake/ros2_ws/install/camera_module/share/camera_module/hook/path.dsv'
-[1.541s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/camera_module/share/camera_module/hook/path.sh'
-[1.541s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m checking '/home/jake/ros2_ws/install/camera_module/lib/pkgconfig/camera_module.pc'
-[1.542s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m checking '/home/jake/ros2_ws/install/camera_module/lib/python3.12/site-packages'
-[1.542s] [34mcolcon.colcon_core.shell[0m [1;30mLevel 1[0m create_environment_hook('camera_module', 'pythonpath')
-[1.542s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/camera_module/share/camera_module/hook/pythonpath.ps1'
-[1.542s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment descriptor '/home/jake/ros2_ws/install/camera_module/share/camera_module/hook/pythonpath.dsv'
-[1.543s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/camera_module/share/camera_module/hook/pythonpath.sh'
-[1.543s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m checking '/home/jake/ros2_ws/install/camera_module/bin'
-[1.544s] [34mcolcon.colcon_core.shell[0m [1;30mLevel 1[0m create_environment_hook('camera_module', 'pythonscriptspath')
-[1.544s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/camera_module/share/camera_module/hook/pythonscriptspath.ps1'
-[1.544s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment descriptor '/home/jake/ros2_ws/install/camera_module/share/camera_module/hook/pythonscriptspath.dsv'
-[1.544s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/camera_module/share/camera_module/hook/pythonscriptspath.sh'
-[1.545s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m create_environment_scripts_only(camera_module)
-[1.545s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating package script '/home/jake/ros2_ws/install/camera_module/share/camera_module/package.ps1'
-[1.546s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating package descriptor '/home/jake/ros2_ws/install/camera_module/share/camera_module/package.dsv'
-[1.546s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating package script '/home/jake/ros2_ws/install/camera_module/share/camera_module/package.sh'
-[1.547s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating package script '/home/jake/ros2_ws/install/camera_module/share/camera_module/package.bash'
-[1.547s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating package script '/home/jake/ros2_ws/install/camera_module/share/camera_module/package.zsh'
-[1.548s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m create_file_with_runtime_dependencies(/home/jake/ros2_ws/install/camera_module/share/colcon-core/packages/camera_module)
-[1.549s] [34mcolcon.colcon_parallel_executor.executor.parallel[0m [1;30mDEBUG[0m [32mclosing loop[0m
-[1.550s] [34mcolcon.colcon_parallel_executor.executor.parallel[0m [1;30mDEBUG[0m [32mloop closed[0m
-[1.551s] [34mcolcon.colcon_parallel_executor.executor.parallel[0m [1;30mDEBUG[0m [32mrun_until_complete finished with '0'[0m
-[1.551s] [34mcolcon.colcon_core.event_reactor[0m [1;30mDEBUG[0m [32mjoining thread[0m
-[1.569s] [34mcolcon.colcon_core.plugin_system[0m [1;30mINFO[0m Skipping extension 'colcon_notification.desktop_notification.notify_send': Could not find 'notify-send'
-[1.569s] [34mcolcon.colcon_core.plugin_system[0m [1;30mINFO[0m Skipping extension 'colcon_notification.desktop_notification.terminal_notifier': Not used on non-Darwin systems
-[1.570s] [34mcolcon.colcon_core.plugin_system[0m [1;30mINFO[0m Skipping extension 'colcon_notification.desktop_notification.win32': Not used on non-Windows systems
-[1.570s] [34mcolcon.colcon_notification.desktop_notification[0m [1;30mINFO[0m Sending desktop notification using 'notify2'
-[1.571s] [34mcolcon.colcon_notification.desktop_notification.notify2[0m [1;30mDEBUG[0m [32mFailed to initialize notify2: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.Notifications was not provided by any .service files[0m
-[1.571s] [34mcolcon.colcon_core.event_reactor[0m [1;30mDEBUG[0m [32mjoined thread[0m
-[1.572s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix script '/home/jake/ros2_ws/install/local_setup.ps1'
-[1.573s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix util module '/home/jake/ros2_ws/install/_local_setup_util_ps1.py'
-[1.574s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix chain script '/home/jake/ros2_ws/install/setup.ps1'
-[1.575s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix script '/home/jake/ros2_ws/install/local_setup.sh'
-[1.575s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix util module '/home/jake/ros2_ws/install/_local_setup_util_sh.py'
-[1.576s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix chain script '/home/jake/ros2_ws/install/setup.sh'
-[1.576s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix script '/home/jake/ros2_ws/install/local_setup.bash'
-[1.577s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix chain script '/home/jake/ros2_ws/install/setup.bash'
-[1.578s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix script '/home/jake/ros2_ws/install/local_setup.zsh'
-[1.578s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix chain script '/home/jake/ros2_ws/install/setup.zsh'
diff --git a/log/build_2025-11-09_22-11-31/events.log b/log/build_2025-11-09_22-11-31/events.log
new file mode 100644
index 0000000..eb40852
--- /dev/null
+++ b/log/build_2025-11-09_22-11-31/events.log
@@ -0,0 +1,91 @@
+[0.000000] (-) TimerEvent: {}
+[0.000544] (-) JobUnselected: {'identifier': 'cam_test'}
+[0.000607] (-) JobUnselected: {'identifier': 'camera_module'}
+[0.000657] (-) JobUnselected: {'identifier': 'cv_bridge'}
+[0.000705] (-) JobUnselected: {'identifier': 'hello_pub'}
+[0.000753] (-) JobUnselected: {'identifier': 'image_geometry'}
+[0.000802] (-) JobUnselected: {'identifier': 'opencv_tests'}
+[0.000849] (-) JobUnselected: {'identifier': 'vision_opencv'}
+[0.000914] (voice_to_text_node) JobQueued: {'identifier': 'voice_to_text_node', 'dependencies': OrderedDict()}
+[0.001105] (voice_to_text_node) JobStarted: {'identifier': 'voice_to_text_node'}
+[0.099760] (-) TimerEvent: {}
+[0.200115] (-) TimerEvent: {}
+[0.300472] (-) TimerEvent: {}
+[0.400817] (-) TimerEvent: {}
+[0.501205] (-) TimerEvent: {}
+[0.601568] (-) TimerEvent: {}
+[0.701895] (-) TimerEvent: {}
+[0.802233] (-) TimerEvent: {}
+[0.902608] (-) TimerEvent: {}
+[0.938221] (voice_to_text_node) Command: {'cmd': ['/usr/bin/python3', '-W', 'ignore:setup.py install is deprecated', '-W', 'ignore:easy_install command is deprecated', 'setup.py', 'egg_info', '--egg-base', '../../build/voice_to_text_node', 'build', '--build-base', '/home/jake/ros2_ws/build/voice_to_text_node/build', 'install', '--record', '/home/jake/ros2_ws/build/voice_to_text_node/install.log', '--single-version-externally-managed', 'install_data'], 'cwd': '/home/jake/ros2_ws/src/voice_to_text_node', 'env': {'LESSOPEN': '| /usr/bin/lesspipe %s', 'USER': 'jake', 'GIT_ASKPASS': '/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/extensions/git/dist/askpass.sh', 'SHLVL': '2', 'LD_LIBRARY_PATH': '/opt/ros/kilted/opt/zenoh_cpp_vendor/lib:/opt/ros/kilted/opt/gz_math_vendor/lib:/opt/ros/kilted/opt/gz_utils_vendor/lib:/opt/ros/kilted/opt/rviz_ogre_vendor/lib:/opt/ros/kilted/lib/x86_64-linux-gnu:/opt/ros/kilted/opt/gz_cmake_vendor/lib:/opt/ros/kilted/lib', 'HOME': '/home/jake', 'CONDA_SHLVL': '0', 'OLDPWD': '/home/jake/ros2_ws', 'TERM_PROGRAM_VERSION': '1.105.1', 'VSCODE_IPC_HOOK_CLI': '/run/user/1001/vscode-ipc-07b86bca-e4f9-4c18-ba3e-d1abb3d5b6bc.sock', 'ROS_PYTHON_VERSION': '3', 'VSCODE_GIT_ASKPASS_MAIN': '/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/extensions/git/dist/askpass-main.js', 'VSCODE_GIT_ASKPASS_NODE': '/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/node', 'VSCODE_PYTHON_AUTOACTIVATE_GUARD': '1', 'DBUS_SESSION_BUS_ADDRESS': 'unix:path=/run/user/1001/bus', 'COLORTERM': 'truecolor', '_CE_M': '', 'WSL_DISTRO_NAME': 'Ubuntu-24.04', '_CONDA_ROOT': '/home/jake/miniconda3', 'WAYLAND_DISPLAY': 'wayland-0', 'ROS_DISTRO': 'kilted', 'LOGNAME': 'jake', 'NAME': 'DESKTOP-UFLG41E', 'WSL_INTEROP': '/run/WSL/440_interop', 'PULSE_SERVER': 'unix:/mnt/wslg/PulseServer', '_': '/usr/bin/colcon', 'ROS_VERSION': '2', 'TERM': 'xterm-256color', '_CE_CONDA': '', 'PATH': '/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/bin/remote-cli:/home/jake/.local/bin:/home/jake/miniconda3/condabin:/opt/ros/kilted/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Windows/System32/OpenSSH/:/mnt/c/Program Files/Docker/Docker/resources/bin:/mnt/c/Program Files/usbipd-win/:/mnt/c/Users/jake/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/jake/AppData/Local/Programs/Microsoft VS Code/bin:/snap/bin:/home/jake/.vscode-server/data/User/globalStorage/github.copilot-chat/debugCommand', 'XDG_RUNTIME_DIR': '/run/user/1001/', 'DISPLAY': '10.255.255.254:0', 'LANG': 'C.UTF-8', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.crdownload=00;90:*.dpkg-dist=00;90:*.dpkg-new=00;90:*.dpkg-old=00;90:*.dpkg-tmp=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90:*.swp=00;90:*.tmp=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:', 'VSCODE_GIT_IPC_HANDLE': '/run/user/1001/vscode-git-1d6e8e65c1.sock', 'TERM_PROGRAM': 'vscode', 'AMENT_PREFIX_PATH': '/opt/ros/kilted', 'CONDA_PYTHON_EXE': '/home/jake/miniconda3/bin/python', 'SHELL': '/bin/bash', 'LESSCLOSE': '/usr/bin/lesspipe %s %s', '_CONDA_EXE': '/home/jake/miniconda3/bin/conda', 'ROS_AUTOMATIC_DISCOVERY_RANGE': 'SUBNET', 'VSCODE_GIT_ASKPASS_EXTRA_ARGS': '', 'PWD': '/home/jake/ros2_ws/build/voice_to_text_node', 'CONDA_EXE': '/home/jake/miniconda3/bin/conda', 'XDG_DATA_DIRS': '/usr/local/share:/usr/share:/var/lib/snapd/desktop', 'PYTHONPATH': '/home/jake/ros2_ws/build/voice_to_text_node/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages:/opt/ros/kilted/lib/python3.12/site-packages', 'COLCON': '1', 'WSL2_GUI_APPS_ENABLED': '1', 'HOSTTYPE': 'x86_64', 'CMAKE_PREFIX_PATH': '/opt/ros/kilted/opt/gz_math_vendor:/opt/ros/kilted/opt/gz_utils_vendor:/opt/ros/kilted/opt/gz_cmake_vendor', 'WSLENV': 'VSCODE_WSL_EXT_LOCATION/up'}, 'shell': False}
+[1.002737] (-) TimerEvent: {}
+[1.103087] (-) TimerEvent: {}
+[1.182853] (voice_to_text_node) StdoutLine: {'line': b'running egg_info\n'}
+[1.183315] (voice_to_text_node) StdoutLine: {'line': b'creating ../../build/voice_to_text_node/voice_to_text_node.egg-info\n'}
+[1.203174] (-) TimerEvent: {}
+[1.203611] (voice_to_text_node) StdoutLine: {'line': b'writing ../../build/voice_to_text_node/voice_to_text_node.egg-info/PKG-INFO\n'}
+[1.203963] (voice_to_text_node) StdoutLine: {'line': b'writing dependency_links to ../../build/voice_to_text_node/voice_to_text_node.egg-info/dependency_links.txt\n'}
+[1.204248] (voice_to_text_node) StdoutLine: {'line': b'writing entry points to ../../build/voice_to_text_node/voice_to_text_node.egg-info/entry_points.txt\n'}
+[1.204562] (voice_to_text_node) StdoutLine: {'line': b'writing requirements to ../../build/voice_to_text_node/voice_to_text_node.egg-info/requires.txt\n'}
+[1.204795] (voice_to_text_node) StdoutLine: {'line': b'writing top-level names to ../../build/voice_to_text_node/voice_to_text_node.egg-info/top_level.txt\n'}
+[1.204994] (voice_to_text_node) StdoutLine: {'line': b"writing manifest file '../../build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt'\n"}
+[1.246073] (voice_to_text_node) StdoutLine: {'line': b"reading manifest file '../../build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt'\n"}
+[1.246816] (voice_to_text_node) StdoutLine: {'line': b"writing manifest file '../../build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt'\n"}
+[1.250734] (voice_to_text_node) StdoutLine: {'line': b'running build\n'}
+[1.251119] (voice_to_text_node) StdoutLine: {'line': b'running build_py\n'}
+[1.251280] (voice_to_text_node) StdoutLine: {'line': b'creating /home/jake/ros2_ws/build/voice_to_text_node/build\n'}
+[1.251679] (voice_to_text_node) StdoutLine: {'line': b'creating /home/jake/ros2_ws/build/voice_to_text_node/build/lib\n'}
+[1.252253] (voice_to_text_node) StdoutLine: {'line': b'creating /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node\n'}
+[1.252861] (voice_to_text_node) StdoutLine: {'line': b'copying ./voice_to_text_node/__init__.py -> /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node\n'}
+[1.253430] (voice_to_text_node) StdoutLine: {'line': b'copying ./voice_to_text_node/voice_to_text_node.py -> /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node\n'}
+[1.253781] (voice_to_text_node) StdoutLine: {'line': b'copying ./voice_to_text_node/threaded_node.py -> /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node\n'}
+[1.254464] (voice_to_text_node) StdoutLine: {'line': b'running install\n'}
+[1.260541] (voice_to_text_node) StdoutLine: {'line': b'running install_lib\n'}
+[1.281764] (voice_to_text_node) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node\n'}
+[1.282489] (voice_to_text_node) StdoutLine: {'line': b'copying /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node/__init__.py -> /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node\n'}
+[1.282719] (voice_to_text_node) StdoutLine: {'line': b'copying /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node/voice_to_text_node.py -> /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node\n'}
+[1.283003] (voice_to_text_node) StdoutLine: {'line': b'copying /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node/threaded_node.py -> /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node\n'}
+[1.283364] (voice_to_text_node) StdoutLine: {'line': b'byte-compiling /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__init__.py to __init__.cpython-312.pyc\n'}
+[1.284176] (voice_to_text_node) StdoutLine: {'line': b'byte-compiling /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/voice_to_text_node.py to voice_to_text_node.cpython-312.pyc\n'}
+[1.285377] (voice_to_text_node) StdoutLine: {'line': b'byte-compiling /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/threaded_node.py to threaded_node.cpython-312.pyc\n'}
+[1.287212] (voice_to_text_node) StdoutLine: {'line': b'running install_data\n'}
+[1.287585] (voice_to_text_node) StdoutLine: {'line': b'copying package.xml -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node\n'}
+[1.287758] (voice_to_text_node) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index\n'}
+[1.289023] (voice_to_text_node) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index/resource_index\n'}
+[1.289635] (voice_to_text_node) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index/resource_index/packages\n'}
+[1.290289] (voice_to_text_node) StdoutLine: {'line': b'copying resource/voice_to_text_node -> /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index/resource_index/packages\n'}
+[1.290672] (voice_to_text_node) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource\n'}
+[1.291230] (voice_to_text_node) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model\n'}
+[1.291800] (voice_to_text_node) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15\n'}
+[1.292398] (voice_to_text_node) StdoutLine: {'line': b'copying resource/model/vosk-model-small-en-us-0.15/README -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15\n'}
+[1.293011] (voice_to_text_node) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph\n'}
+[1.293617] (voice_to_text_node) StdoutLine: {'line': b'copying resource/model/vosk-model-small-en-us-0.15/graph/HCLr.fst -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph\n'}
+[1.303308] (-) TimerEvent: {}
+[1.366093] (voice_to_text_node) StdoutLine: {'line': b'copying resource/model/vosk-model-small-en-us-0.15/graph/disambig_tid.int -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph\n'}
+[1.366626] (voice_to_text_node) StdoutLine: {'line': b'copying resource/model/vosk-model-small-en-us-0.15/graph/Gr.fst -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph\n'}
+[1.403450] (-) TimerEvent: {}
+[1.453367] (voice_to_text_node) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/phones\n'}
+[1.454108] (voice_to_text_node) StdoutLine: {'line': b'copying resource/model/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/phones\n'}
+[1.454634] (voice_to_text_node) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf\n'}
+[1.455376] (voice_to_text_node) StdoutLine: {'line': b'copying resource/model/vosk-model-small-en-us-0.15/conf/model.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf\n'}
+[1.455812] (voice_to_text_node) StdoutLine: {'line': b'copying resource/model/vosk-model-small-en-us-0.15/conf/mfcc.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf\n'}
+[1.456218] (voice_to_text_node) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/am\n'}
+[1.456850] (voice_to_text_node) StdoutLine: {'line': b'copying resource/model/vosk-model-small-en-us-0.15/am/final.mdl -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/am\n'}
+[1.503593] (-) TimerEvent: {}
+[1.512184] (voice_to_text_node) StdoutLine: {'line': b'creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector\n'}
+[1.512951] (voice_to_text_node) StdoutLine: {'line': b'copying resource/model/vosk-model-small-en-us-0.15/ivector/final.ie -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector\n'}
+[1.542959] (voice_to_text_node) StdoutLine: {'line': b'copying resource/model/vosk-model-small-en-us-0.15/ivector/final.dubm -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector\n'}
+[1.544317] (voice_to_text_node) StdoutLine: {'line': b'copying resource/model/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector\n'}
+[1.544831] (voice_to_text_node) StdoutLine: {'line': b'copying resource/model/vosk-model-small-en-us-0.15/ivector/final.mat -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector\n'}
+[1.545621] (voice_to_text_node) StdoutLine: {'line': b'copying resource/model/vosk-model-small-en-us-0.15/ivector/splice.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector\n'}
+[1.546027] (voice_to_text_node) StdoutLine: {'line': b'copying resource/model/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector\n'}
+[1.546388] (voice_to_text_node) StdoutLine: {'line': b'running install_egg_info\n'}
+[1.568135] (voice_to_text_node) StdoutLine: {'line': b'Copying ../../build/voice_to_text_node/voice_to_text_node.egg-info to /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info\n'}
+[1.570037] (voice_to_text_node) StdoutLine: {'line': b'running install_scripts\n'}
+[1.603733] (-) TimerEvent: {}
+[1.704116] (-) TimerEvent: {}
+[1.704634] (voice_to_text_node) StdoutLine: {'line': b'Installing voice_to_text_node script to /home/jake/ros2_ws/install/voice_to_text_node/bin\n'}
+[1.705630] (voice_to_text_node) StdoutLine: {'line': b"writing list of installed files to '/home/jake/ros2_ws/build/voice_to_text_node/install.log'\n"}
+[1.736936] (voice_to_text_node) CommandEnded: {'returncode': 0}
+[1.754653] (voice_to_text_node) JobEnded: {'identifier': 'voice_to_text_node', 'rc': 0}
+[1.756243] (-) EventReactorShutdown: {}
diff --git a/log/build_2025-11-09_22-11-31/logger_all.log b/log/build_2025-11-09_22-11-31/logger_all.log
new file mode 100644
index 0000000..f879c78
--- /dev/null
+++ b/log/build_2025-11-09_22-11-31/logger_all.log
@@ -0,0 +1,227 @@
+[0.194s] [34mcolcon[0m [1;30mDEBUG[0m [32mCommand line arguments: ['/usr/bin/colcon', 'build', '--packages-select', 'voice_to_text_node', '--event-handlers', 'console_direct+'][0m
+[0.194s] [34mcolcon[0m [1;30mDEBUG[0m [32mParsed command line arguments: Namespace(log_base=None, log_level=None, verb_name='build', build_base='build', install_base='install', merge_install=False, symlink_install=False, test_result_base=None, continue_on_error=False, executor='parallel', parallel_workers=24, event_handlers=['console_direct+'], ignore_user_meta=False, metas=['./colcon.meta'], base_paths=['.'], packages_ignore=None, packages_ignore_regex=None, paths=None, packages_up_to=None, packages_up_to_regex=None, packages_above=None, packages_above_and_dependencies=None, packages_above_depth=None, packages_select_by_dep=None, packages_skip_by_dep=None, packages_skip_up_to=None, packages_select_build_failed=False, packages_skip_build_finished=False, packages_select_test_failures=False, packages_skip_test_passed=False, packages_select=['voice_to_text_node'], packages_skip=None, packages_select_regex=None, packages_skip_regex=None, packages_start=None, packages_end=None, allow_overriding=[], cmake_args=None, cmake_target=None, cmake_target_skip_unavailable=False, cmake_clean_cache=False, cmake_clean_first=False, cmake_force_configure=False, ament_cmake_args=None, catkin_cmake_args=None, catkin_skip_building_tests=False, verb_parser=, verb_extension=, main=>)[0m
+[0.254s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(colcon_meta) check parameters
+[0.254s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(recursive) check parameters
+[0.254s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(ignore) check parameters
+[0.254s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(path) check parameters
+[0.254s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(colcon_meta) discover
+[0.254s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(recursive) discover
+[0.254s] [34mcolcon.colcon_core.package_discovery[0m [1;30mINFO[0m Crawling recursively for packages in '/home/jake/ros2_ws'
+[0.254s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extensions ['ignore', 'ignore_ament_install']
+[0.254s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'ignore'
+[0.254s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'ignore_ament_install'
+[0.254s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extensions ['colcon_pkg']
+[0.255s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'colcon_pkg'
+[0.255s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extensions ['colcon_meta']
+[0.255s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'colcon_meta'
+[0.255s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extensions ['ros']
+[0.255s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'ros'
+[0.281s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extensions ['cmake', 'python']
+[0.281s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'cmake'
+[0.281s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'python'
+[0.281s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extensions ['python_setup_py']
+[0.281s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(.) by extension 'python_setup_py'
+[0.281s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(build) by extensions ['ignore', 'ignore_ament_install']
+[0.281s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(build) by extension 'ignore'
+[0.281s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(build) ignored
+[0.281s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(install) by extensions ['ignore', 'ignore_ament_install']
+[0.281s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(install) by extension 'ignore'
+[0.281s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(install) ignored
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(log) by extensions ['ignore', 'ignore_ament_install']
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(log) by extension 'ignore'
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(log) ignored
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extensions ['ignore', 'ignore_ament_install']
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'ignore'
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'ignore_ament_install'
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extensions ['colcon_pkg']
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'colcon_pkg'
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extensions ['colcon_meta']
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'colcon_meta'
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extensions ['ros']
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'ros'
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extensions ['cmake', 'python']
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'cmake'
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'python'
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extensions ['python_setup_py']
+[0.282s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src) by extension 'python_setup_py'
+[0.283s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extensions ['ignore', 'ignore_ament_install']
+[0.283s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extension 'ignore'
+[0.283s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extension 'ignore_ament_install'
+[0.283s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extensions ['colcon_pkg']
+[0.283s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extension 'colcon_pkg'
+[0.283s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extensions ['colcon_meta']
+[0.283s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extension 'colcon_meta'
+[0.283s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extensions ['ros']
+[0.283s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/cam_test) by extension 'ros'
+[0.286s] [34mcolcon.colcon_core.package_identification[0m [1;30mDEBUG[0m [32mPackage 'src/cam_test' with type 'ros.ament_python' and name 'cam_test'[0m
+[0.287s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extensions ['ignore', 'ignore_ament_install']
+[0.287s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extension 'ignore'
+[0.287s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extension 'ignore_ament_install'
+[0.287s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extensions ['colcon_pkg']
+[0.287s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extension 'colcon_pkg'
+[0.287s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extensions ['colcon_meta']
+[0.287s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extension 'colcon_meta'
+[0.287s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extensions ['ros']
+[0.287s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/camera_module) by extension 'ros'
+[0.288s] [34mcolcon.colcon_core.package_identification[0m [1;30mDEBUG[0m [32mPackage 'src/camera_module' with type 'ros.ament_python' and name 'camera_module'[0m
+[0.288s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extensions ['ignore', 'ignore_ament_install']
+[0.288s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extension 'ignore'
+[0.288s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extension 'ignore_ament_install'
+[0.288s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extensions ['colcon_pkg']
+[0.288s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extension 'colcon_pkg'
+[0.288s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extensions ['colcon_meta']
+[0.288s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extension 'colcon_meta'
+[0.288s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extensions ['ros']
+[0.288s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/hello_pub) by extension 'ros'
+[0.289s] [34mcolcon.colcon_core.package_identification[0m [1;30mDEBUG[0m [32mPackage 'src/hello_pub' with type 'ros.ament_python' and name 'hello_pub'[0m
+[0.289s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extensions ['ignore', 'ignore_ament_install']
+[0.290s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'ignore'
+[0.290s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'ignore_ament_install'
+[0.290s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extensions ['colcon_pkg']
+[0.290s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'colcon_pkg'
+[0.290s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extensions ['colcon_meta']
+[0.290s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'colcon_meta'
+[0.290s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extensions ['ros']
+[0.290s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'ros'
+[0.290s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extensions ['cmake', 'python']
+[0.290s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'cmake'
+[0.290s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'python'
+[0.290s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extensions ['python_setup_py']
+[0.290s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv) by extension 'python_setup_py'
+[0.290s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extensions ['ignore', 'ignore_ament_install']
+[0.291s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extension 'ignore'
+[0.291s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extension 'ignore_ament_install'
+[0.291s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extensions ['colcon_pkg']
+[0.291s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extension 'colcon_pkg'
+[0.291s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extensions ['colcon_meta']
+[0.291s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extension 'colcon_meta'
+[0.291s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extensions ['ros']
+[0.291s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/cv_bridge) by extension 'ros'
+[0.292s] [34mcolcon.colcon_core.package_identification[0m [1;30mDEBUG[0m [32mPackage 'src/vision_opencv/cv_bridge' with type 'ros.ament_cmake' and name 'cv_bridge'[0m
+[0.292s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extensions ['ignore', 'ignore_ament_install']
+[0.292s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extension 'ignore'
+[0.292s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extension 'ignore_ament_install'
+[0.292s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extensions ['colcon_pkg']
+[0.293s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extension 'colcon_pkg'
+[0.293s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extensions ['colcon_meta']
+[0.293s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extension 'colcon_meta'
+[0.293s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extensions ['ros']
+[0.293s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/image_geometry) by extension 'ros'
+[0.293s] [34mcolcon.colcon_core.package_identification[0m [1;30mDEBUG[0m [32mPackage 'src/vision_opencv/image_geometry' with type 'ros.ament_cmake' and name 'image_geometry'[0m
+[0.294s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extensions ['ignore', 'ignore_ament_install']
+[0.294s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extension 'ignore'
+[0.294s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extension 'ignore_ament_install'
+[0.294s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extensions ['colcon_pkg']
+[0.294s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extension 'colcon_pkg'
+[0.294s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extensions ['colcon_meta']
+[0.294s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extension 'colcon_meta'
+[0.294s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extensions ['ros']
+[0.294s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/opencv_tests) by extension 'ros'
+[0.295s] [34mcolcon.colcon_core.package_identification[0m [1;30mDEBUG[0m [32mPackage 'src/vision_opencv/opencv_tests' with type 'ros.ament_python' and name 'opencv_tests'[0m
+[0.295s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extensions ['ignore', 'ignore_ament_install']
+[0.295s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extension 'ignore'
+[0.295s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extension 'ignore_ament_install'
+[0.295s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extensions ['colcon_pkg']
+[0.295s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extension 'colcon_pkg'
+[0.296s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extensions ['colcon_meta']
+[0.296s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extension 'colcon_meta'
+[0.296s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extensions ['ros']
+[0.296s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/vision_opencv/vision_opencv) by extension 'ros'
+[0.296s] [34mcolcon.colcon_core.package_identification[0m [1;30mDEBUG[0m [32mPackage 'src/vision_opencv/vision_opencv' with type 'ros.ament_cmake' and name 'vision_opencv'[0m
+[0.296s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/voice_to_text_node) by extensions ['ignore', 'ignore_ament_install']
+[0.296s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/voice_to_text_node) by extension 'ignore'
+[0.297s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/voice_to_text_node) by extension 'ignore_ament_install'
+[0.297s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/voice_to_text_node) by extensions ['colcon_pkg']
+[0.297s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/voice_to_text_node) by extension 'colcon_pkg'
+[0.297s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/voice_to_text_node) by extensions ['colcon_meta']
+[0.297s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/voice_to_text_node) by extension 'colcon_meta'
+[0.297s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/voice_to_text_node) by extensions ['ros']
+[0.297s] [34mcolcon.colcon_core.package_identification[0m [1;30mLevel 1[0m _identify(src/voice_to_text_node) by extension 'ros'
+[0.297s] [34mcolcon.colcon_core.package_identification[0m [1;30mDEBUG[0m [32mPackage 'src/voice_to_text_node' with type 'ros.ament_python' and name 'voice_to_text_node'[0m
+[0.297s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(recursive) using defaults
+[0.297s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(ignore) discover
+[0.298s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(ignore) using defaults
+[0.298s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(path) discover
+[0.298s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(path) using defaults
+[0.314s] [34mcolcon.colcon_core.package_selection[0m [1;30mINFO[0m Skipping not selected package 'cam_test' in 'src/cam_test'
+[0.314s] [34mcolcon.colcon_core.package_selection[0m [1;30mINFO[0m Skipping not selected package 'camera_module' in 'src/camera_module'
+[0.315s] [34mcolcon.colcon_core.package_selection[0m [1;30mINFO[0m Skipping not selected package 'cv_bridge' in 'src/vision_opencv/cv_bridge'
+[0.315s] [34mcolcon.colcon_core.package_selection[0m [1;30mINFO[0m Skipping not selected package 'hello_pub' in 'src/hello_pub'
+[0.315s] [34mcolcon.colcon_core.package_selection[0m [1;30mINFO[0m Skipping not selected package 'image_geometry' in 'src/vision_opencv/image_geometry'
+[0.315s] [34mcolcon.colcon_core.package_selection[0m [1;30mINFO[0m Skipping not selected package 'opencv_tests' in 'src/vision_opencv/opencv_tests'
+[0.315s] [34mcolcon.colcon_core.package_selection[0m [1;30mINFO[0m Skipping not selected package 'vision_opencv' in 'src/vision_opencv/vision_opencv'
+[0.315s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(prefix_path) check parameters
+[0.315s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(prefix_path) discover
+[0.320s] [34mcolcon.colcon_installed_package_information.package_discovery[0m [1;30mDEBUG[0m [32mFound 295 installed packages in /opt/ros/kilted[0m
+[0.321s] [34mcolcon.colcon_core.package_discovery[0m [1;30mLevel 1[0m discover_packages(prefix_path) using defaults
+[0.359s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'voice_to_text_node' build argument 'cmake_args' from command line to 'None'
+[0.359s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'voice_to_text_node' build argument 'cmake_target' from command line to 'None'
+[0.359s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'voice_to_text_node' build argument 'cmake_target_skip_unavailable' from command line to 'False'
+[0.359s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'voice_to_text_node' build argument 'cmake_clean_cache' from command line to 'False'
+[0.359s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'voice_to_text_node' build argument 'cmake_clean_first' from command line to 'False'
+[0.359s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'voice_to_text_node' build argument 'cmake_force_configure' from command line to 'False'
+[0.359s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'voice_to_text_node' build argument 'ament_cmake_args' from command line to 'None'
+[0.360s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'voice_to_text_node' build argument 'catkin_cmake_args' from command line to 'None'
+[0.360s] [34mcolcon.colcon_core.verb[0m [1;30mLevel 5[0m set package 'voice_to_text_node' build argument 'catkin_skip_building_tests' from command line to 'False'
+[0.360s] [34mcolcon.colcon_core.verb[0m [1;30mDEBUG[0m [32mBuilding package 'voice_to_text_node' with the following arguments: {'ament_cmake_args': None, 'build_base': '/home/jake/ros2_ws/build/voice_to_text_node', 'catkin_cmake_args': None, 'catkin_skip_building_tests': False, 'cmake_args': None, 'cmake_clean_cache': False, 'cmake_clean_first': False, 'cmake_force_configure': False, 'cmake_target': None, 'cmake_target_skip_unavailable': False, 'install_base': '/home/jake/ros2_ws/install/voice_to_text_node', 'merge_install': False, 'path': '/home/jake/ros2_ws/src/voice_to_text_node', 'symlink_install': False, 'test_result_base': None}[0m
+[0.360s] [34mcolcon.colcon_core.executor[0m [1;30mINFO[0m Executing jobs using 'parallel' executor
+[0.361s] [34mcolcon.colcon_parallel_executor.executor.parallel[0m [1;30mDEBUG[0m [32mrun_until_complete[0m
+[0.361s] [34mcolcon.colcon_ros.task.ament_python.build[0m [1;30mINFO[0m Building ROS package in '/home/jake/ros2_ws/src/voice_to_text_node' with build type 'ament_python'
+[0.362s] [34mcolcon.colcon_core.shell[0m [1;30mLevel 1[0m create_environment_hook('voice_to_text_node', 'ament_prefix_path')
+[0.367s] [34mcolcon.colcon_core.plugin_system[0m [1;30mINFO[0m Skipping extension 'colcon_core.shell.bat': Not used on non-Windows systems
+[0.367s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/hook/ament_prefix_path.ps1'
+[0.370s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment descriptor '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/hook/ament_prefix_path.dsv'
+[0.371s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/hook/ament_prefix_path.sh'
+[0.372s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell
+[0.372s] [34mcolcon.colcon_core.shell[0m [1;30mDEBUG[0m [32mSkip shell extension 'dsv' for command environment[0m
+[0.588s] [34mcolcon.colcon_core.task.python.build[0m [1;30mINFO[0m Building Python package in '/home/jake/ros2_ws/src/voice_to_text_node'
+[0.588s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell
+[0.588s] [34mcolcon.colcon_core.shell[0m [1;30mDEBUG[0m [32mSkip shell extension 'dsv' for command environment[0m
+[1.301s] [34mcolcon.colcon_core.event_handler.log_command[0m [1;30mDEBUG[0m [32mInvoking command in '/home/jake/ros2_ws/src/voice_to_text_node': PYTHONPATH=/home/jake/ros2_ws/build/voice_to_text_node/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base ../../build/voice_to_text_node build --build-base /home/jake/ros2_ws/build/voice_to_text_node/build install --record /home/jake/ros2_ws/build/voice_to_text_node/install.log --single-version-externally-managed install_data[0m
+[2.098s] [34mcolcon.colcon_core.event_handler.log_command[0m [1;30mDEBUG[0m [32mInvoked command in '/home/jake/ros2_ws/src/voice_to_text_node' returned '0': PYTHONPATH=/home/jake/ros2_ws/build/voice_to_text_node/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base ../../build/voice_to_text_node build --build-base /home/jake/ros2_ws/build/voice_to_text_node/build install --record /home/jake/ros2_ws/build/voice_to_text_node/install.log --single-version-externally-managed install_data[0m
+[2.104s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m checking '/home/jake/ros2_ws/install/voice_to_text_node' for CMake module files
+[2.104s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m checking '/home/jake/ros2_ws/install/voice_to_text_node' for CMake config files
+[2.105s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m checking '/home/jake/ros2_ws/install/voice_to_text_node/lib'
+[2.105s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m checking '/home/jake/ros2_ws/install/voice_to_text_node/bin'
+[2.105s] [34mcolcon.colcon_core.shell[0m [1;30mLevel 1[0m create_environment_hook('voice_to_text_node', 'path')
+[2.106s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/hook/path.ps1'
+[2.106s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment descriptor '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/hook/path.dsv'
+[2.106s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/hook/path.sh'
+[2.107s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m checking '/home/jake/ros2_ws/install/voice_to_text_node/lib/pkgconfig/voice_to_text_node.pc'
+[2.107s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m checking '/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages'
+[2.107s] [34mcolcon.colcon_core.shell[0m [1;30mLevel 1[0m create_environment_hook('voice_to_text_node', 'pythonpath')
+[2.107s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/hook/pythonpath.ps1'
+[2.107s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment descriptor '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/hook/pythonpath.dsv'
+[2.108s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/hook/pythonpath.sh'
+[2.108s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m checking '/home/jake/ros2_ws/install/voice_to_text_node/bin'
+[2.108s] [34mcolcon.colcon_core.shell[0m [1;30mLevel 1[0m create_environment_hook('voice_to_text_node', 'pythonscriptspath')
+[2.108s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/hook/pythonscriptspath.ps1'
+[2.109s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment descriptor '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/hook/pythonscriptspath.dsv'
+[2.109s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating environment hook '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/hook/pythonscriptspath.sh'
+[2.109s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m create_environment_scripts_only(voice_to_text_node)
+[2.110s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating package script '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/package.ps1'
+[2.111s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating package descriptor '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/package.dsv'
+[2.111s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating package script '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/package.sh'
+[2.112s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating package script '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/package.bash'
+[2.113s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating package script '/home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/package.zsh'
+[2.114s] [34mcolcon.colcon_core.environment[0m [1;30mLevel 1[0m create_file_with_runtime_dependencies(/home/jake/ros2_ws/install/voice_to_text_node/share/colcon-core/packages/voice_to_text_node)
+[2.116s] [34mcolcon.colcon_parallel_executor.executor.parallel[0m [1;30mDEBUG[0m [32mclosing loop[0m
+[2.116s] [34mcolcon.colcon_parallel_executor.executor.parallel[0m [1;30mDEBUG[0m [32mloop closed[0m
+[2.116s] [34mcolcon.colcon_parallel_executor.executor.parallel[0m [1;30mDEBUG[0m [32mrun_until_complete finished with '0'[0m
+[2.117s] [34mcolcon.colcon_core.event_reactor[0m [1;30mDEBUG[0m [32mjoining thread[0m
+[2.140s] [34mcolcon.colcon_core.plugin_system[0m [1;30mINFO[0m Skipping extension 'colcon_notification.desktop_notification.notify_send': Could not find 'notify-send'
+[2.141s] [34mcolcon.colcon_core.plugin_system[0m [1;30mINFO[0m Skipping extension 'colcon_notification.desktop_notification.terminal_notifier': Not used on non-Darwin systems
+[2.141s] [34mcolcon.colcon_core.plugin_system[0m [1;30mINFO[0m Skipping extension 'colcon_notification.desktop_notification.win32': Not used on non-Windows systems
+[2.141s] [34mcolcon.colcon_notification.desktop_notification[0m [1;30mINFO[0m Sending desktop notification using 'notify2'
+[2.143s] [34mcolcon.colcon_notification.desktop_notification.notify2[0m [1;30mDEBUG[0m [32mFailed to initialize notify2: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.Notifications was not provided by any .service files[0m
+[2.143s] [34mcolcon.colcon_core.event_reactor[0m [1;30mDEBUG[0m [32mjoined thread[0m
+[2.143s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix script '/home/jake/ros2_ws/install/local_setup.ps1'
+[2.145s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix util module '/home/jake/ros2_ws/install/_local_setup_util_ps1.py'
+[2.146s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix chain script '/home/jake/ros2_ws/install/setup.ps1'
+[2.148s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix script '/home/jake/ros2_ws/install/local_setup.sh'
+[2.148s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix util module '/home/jake/ros2_ws/install/_local_setup_util_sh.py'
+[2.149s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix chain script '/home/jake/ros2_ws/install/setup.sh'
+[2.150s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix script '/home/jake/ros2_ws/install/local_setup.bash'
+[2.151s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix chain script '/home/jake/ros2_ws/install/setup.bash'
+[2.152s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix script '/home/jake/ros2_ws/install/local_setup.zsh'
+[2.153s] [34mcolcon.colcon_core.shell[0m [1;30mINFO[0m Creating prefix chain script '/home/jake/ros2_ws/install/setup.zsh'
diff --git a/log/build_2025-11-09_22-11-31/voice_to_text_node/command.log b/log/build_2025-11-09_22-11-31/voice_to_text_node/command.log
new file mode 100644
index 0000000..9daef41
--- /dev/null
+++ b/log/build_2025-11-09_22-11-31/voice_to_text_node/command.log
@@ -0,0 +1,2 @@
+Invoking command in '/home/jake/ros2_ws/src/voice_to_text_node': PYTHONPATH=/home/jake/ros2_ws/build/voice_to_text_node/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base ../../build/voice_to_text_node build --build-base /home/jake/ros2_ws/build/voice_to_text_node/build install --record /home/jake/ros2_ws/build/voice_to_text_node/install.log --single-version-externally-managed install_data
+Invoked command in '/home/jake/ros2_ws/src/voice_to_text_node' returned '0': PYTHONPATH=/home/jake/ros2_ws/build/voice_to_text_node/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base ../../build/voice_to_text_node build --build-base /home/jake/ros2_ws/build/voice_to_text_node/build install --record /home/jake/ros2_ws/build/voice_to_text_node/install.log --single-version-externally-managed install_data
diff --git a/log/build_2025-11-09_22-11-31/voice_to_text_node/stderr.log b/log/build_2025-11-09_22-11-31/voice_to_text_node/stderr.log
new file mode 100644
index 0000000..e69de29
diff --git a/log/build_2025-11-09_22-11-31/voice_to_text_node/stdout.log b/log/build_2025-11-09_22-11-31/voice_to_text_node/stdout.log
new file mode 100644
index 0000000..38dcf0f
--- /dev/null
+++ b/log/build_2025-11-09_22-11-31/voice_to_text_node/stdout.log
@@ -0,0 +1,60 @@
+running egg_info
+creating ../../build/voice_to_text_node/voice_to_text_node.egg-info
+writing ../../build/voice_to_text_node/voice_to_text_node.egg-info/PKG-INFO
+writing dependency_links to ../../build/voice_to_text_node/voice_to_text_node.egg-info/dependency_links.txt
+writing entry points to ../../build/voice_to_text_node/voice_to_text_node.egg-info/entry_points.txt
+writing requirements to ../../build/voice_to_text_node/voice_to_text_node.egg-info/requires.txt
+writing top-level names to ../../build/voice_to_text_node/voice_to_text_node.egg-info/top_level.txt
+writing manifest file '../../build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt'
+reading manifest file '../../build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt'
+writing manifest file '../../build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt'
+running build
+running build_py
+creating /home/jake/ros2_ws/build/voice_to_text_node/build
+creating /home/jake/ros2_ws/build/voice_to_text_node/build/lib
+creating /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node
+copying ./voice_to_text_node/__init__.py -> /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node
+copying ./voice_to_text_node/voice_to_text_node.py -> /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node
+copying ./voice_to_text_node/threaded_node.py -> /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node
+running install
+running install_lib
+creating /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node
+copying /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node/__init__.py -> /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node
+copying /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node/voice_to_text_node.py -> /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node
+copying /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node/threaded_node.py -> /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node
+byte-compiling /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__init__.py to __init__.cpython-312.pyc
+byte-compiling /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/voice_to_text_node.py to voice_to_text_node.cpython-312.pyc
+byte-compiling /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/threaded_node.py to threaded_node.cpython-312.pyc
+running install_data
+copying package.xml -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index/resource_index
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index/resource_index/packages
+copying resource/voice_to_text_node -> /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index/resource_index/packages
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15
+copying resource/model/vosk-model-small-en-us-0.15/README -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph
+copying resource/model/vosk-model-small-en-us-0.15/graph/HCLr.fst -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph
+copying resource/model/vosk-model-small-en-us-0.15/graph/disambig_tid.int -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph
+copying resource/model/vosk-model-small-en-us-0.15/graph/Gr.fst -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/phones
+copying resource/model/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/phones
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf
+copying resource/model/vosk-model-small-en-us-0.15/conf/model.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf
+copying resource/model/vosk-model-small-en-us-0.15/conf/mfcc.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/am
+copying resource/model/vosk-model-small-en-us-0.15/am/final.mdl -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/am
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+copying resource/model/vosk-model-small-en-us-0.15/ivector/final.ie -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+copying resource/model/vosk-model-small-en-us-0.15/ivector/final.dubm -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+copying resource/model/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+copying resource/model/vosk-model-small-en-us-0.15/ivector/final.mat -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+copying resource/model/vosk-model-small-en-us-0.15/ivector/splice.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+copying resource/model/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+running install_egg_info
+Copying ../../build/voice_to_text_node/voice_to_text_node.egg-info to /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info
+running install_scripts
+Installing voice_to_text_node script to /home/jake/ros2_ws/install/voice_to_text_node/bin
+writing list of installed files to '/home/jake/ros2_ws/build/voice_to_text_node/install.log'
diff --git a/log/build_2025-11-09_22-11-31/voice_to_text_node/stdout_stderr.log b/log/build_2025-11-09_22-11-31/voice_to_text_node/stdout_stderr.log
new file mode 100644
index 0000000..38dcf0f
--- /dev/null
+++ b/log/build_2025-11-09_22-11-31/voice_to_text_node/stdout_stderr.log
@@ -0,0 +1,60 @@
+running egg_info
+creating ../../build/voice_to_text_node/voice_to_text_node.egg-info
+writing ../../build/voice_to_text_node/voice_to_text_node.egg-info/PKG-INFO
+writing dependency_links to ../../build/voice_to_text_node/voice_to_text_node.egg-info/dependency_links.txt
+writing entry points to ../../build/voice_to_text_node/voice_to_text_node.egg-info/entry_points.txt
+writing requirements to ../../build/voice_to_text_node/voice_to_text_node.egg-info/requires.txt
+writing top-level names to ../../build/voice_to_text_node/voice_to_text_node.egg-info/top_level.txt
+writing manifest file '../../build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt'
+reading manifest file '../../build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt'
+writing manifest file '../../build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt'
+running build
+running build_py
+creating /home/jake/ros2_ws/build/voice_to_text_node/build
+creating /home/jake/ros2_ws/build/voice_to_text_node/build/lib
+creating /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node
+copying ./voice_to_text_node/__init__.py -> /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node
+copying ./voice_to_text_node/voice_to_text_node.py -> /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node
+copying ./voice_to_text_node/threaded_node.py -> /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node
+running install
+running install_lib
+creating /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node
+copying /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node/__init__.py -> /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node
+copying /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node/voice_to_text_node.py -> /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node
+copying /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node/threaded_node.py -> /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node
+byte-compiling /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__init__.py to __init__.cpython-312.pyc
+byte-compiling /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/voice_to_text_node.py to voice_to_text_node.cpython-312.pyc
+byte-compiling /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/threaded_node.py to threaded_node.cpython-312.pyc
+running install_data
+copying package.xml -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index/resource_index
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index/resource_index/packages
+copying resource/voice_to_text_node -> /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index/resource_index/packages
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15
+copying resource/model/vosk-model-small-en-us-0.15/README -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph
+copying resource/model/vosk-model-small-en-us-0.15/graph/HCLr.fst -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph
+copying resource/model/vosk-model-small-en-us-0.15/graph/disambig_tid.int -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph
+copying resource/model/vosk-model-small-en-us-0.15/graph/Gr.fst -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/phones
+copying resource/model/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/phones
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf
+copying resource/model/vosk-model-small-en-us-0.15/conf/model.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf
+copying resource/model/vosk-model-small-en-us-0.15/conf/mfcc.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/am
+copying resource/model/vosk-model-small-en-us-0.15/am/final.mdl -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/am
+creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+copying resource/model/vosk-model-small-en-us-0.15/ivector/final.ie -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+copying resource/model/vosk-model-small-en-us-0.15/ivector/final.dubm -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+copying resource/model/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+copying resource/model/vosk-model-small-en-us-0.15/ivector/final.mat -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+copying resource/model/vosk-model-small-en-us-0.15/ivector/splice.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+copying resource/model/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+running install_egg_info
+Copying ../../build/voice_to_text_node/voice_to_text_node.egg-info to /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info
+running install_scripts
+Installing voice_to_text_node script to /home/jake/ros2_ws/install/voice_to_text_node/bin
+writing list of installed files to '/home/jake/ros2_ws/build/voice_to_text_node/install.log'
diff --git a/log/build_2025-11-09_22-11-31/voice_to_text_node/streams.log b/log/build_2025-11-09_22-11-31/voice_to_text_node/streams.log
new file mode 100644
index 0000000..ad38e1a
--- /dev/null
+++ b/log/build_2025-11-09_22-11-31/voice_to_text_node/streams.log
@@ -0,0 +1,62 @@
+[0.940s] Invoking command in '/home/jake/ros2_ws/src/voice_to_text_node': PYTHONPATH=/home/jake/ros2_ws/build/voice_to_text_node/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base ../../build/voice_to_text_node build --build-base /home/jake/ros2_ws/build/voice_to_text_node/build install --record /home/jake/ros2_ws/build/voice_to_text_node/install.log --single-version-externally-managed install_data
+[1.182s] running egg_info
+[1.182s] creating ../../build/voice_to_text_node/voice_to_text_node.egg-info
+[1.203s] writing ../../build/voice_to_text_node/voice_to_text_node.egg-info/PKG-INFO
+[1.203s] writing dependency_links to ../../build/voice_to_text_node/voice_to_text_node.egg-info/dependency_links.txt
+[1.203s] writing entry points to ../../build/voice_to_text_node/voice_to_text_node.egg-info/entry_points.txt
+[1.204s] writing requirements to ../../build/voice_to_text_node/voice_to_text_node.egg-info/requires.txt
+[1.204s] writing top-level names to ../../build/voice_to_text_node/voice_to_text_node.egg-info/top_level.txt
+[1.204s] writing manifest file '../../build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt'
+[1.245s] reading manifest file '../../build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt'
+[1.246s] writing manifest file '../../build/voice_to_text_node/voice_to_text_node.egg-info/SOURCES.txt'
+[1.250s] running build
+[1.250s] running build_py
+[1.250s] creating /home/jake/ros2_ws/build/voice_to_text_node/build
+[1.251s] creating /home/jake/ros2_ws/build/voice_to_text_node/build/lib
+[1.251s] creating /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node
+[1.252s] copying ./voice_to_text_node/__init__.py -> /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node
+[1.252s] copying ./voice_to_text_node/voice_to_text_node.py -> /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node
+[1.253s] copying ./voice_to_text_node/threaded_node.py -> /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node
+[1.253s] running install
+[1.260s] running install_lib
+[1.281s] creating /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node
+[1.281s] copying /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node/__init__.py -> /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node
+[1.282s] copying /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node/voice_to_text_node.py -> /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node
+[1.282s] copying /home/jake/ros2_ws/build/voice_to_text_node/build/lib/voice_to_text_node/threaded_node.py -> /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node
+[1.282s] byte-compiling /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/__init__.py to __init__.cpython-312.pyc
+[1.283s] byte-compiling /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/voice_to_text_node.py to voice_to_text_node.cpython-312.pyc
+[1.284s] byte-compiling /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node/threaded_node.py to threaded_node.cpython-312.pyc
+[1.286s] running install_data
+[1.287s] copying package.xml -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node
+[1.287s] creating /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index
+[1.288s] creating /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index/resource_index
+[1.289s] creating /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index/resource_index/packages
+[1.289s] copying resource/voice_to_text_node -> /home/jake/ros2_ws/install/voice_to_text_node/share/ament_index/resource_index/packages
+[1.290s] creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource
+[1.290s] creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model
+[1.291s] creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15
+[1.291s] copying resource/model/vosk-model-small-en-us-0.15/README -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15
+[1.292s] creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph
+[1.293s] copying resource/model/vosk-model-small-en-us-0.15/graph/HCLr.fst -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph
+[1.365s] copying resource/model/vosk-model-small-en-us-0.15/graph/disambig_tid.int -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph
+[1.366s] copying resource/model/vosk-model-small-en-us-0.15/graph/Gr.fst -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph
+[1.452s] creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/phones
+[1.453s] copying resource/model/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/phones
+[1.454s] creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf
+[1.454s] copying resource/model/vosk-model-small-en-us-0.15/conf/model.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf
+[1.455s] copying resource/model/vosk-model-small-en-us-0.15/conf/mfcc.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf
+[1.455s] creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/am
+[1.456s] copying resource/model/vosk-model-small-en-us-0.15/am/final.mdl -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/am
+[1.511s] creating /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+[1.512s] copying resource/model/vosk-model-small-en-us-0.15/ivector/final.ie -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+[1.542s] copying resource/model/vosk-model-small-en-us-0.15/ivector/final.dubm -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+[1.543s] copying resource/model/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+[1.544s] copying resource/model/vosk-model-small-en-us-0.15/ivector/final.mat -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+[1.545s] copying resource/model/vosk-model-small-en-us-0.15/ivector/splice.conf -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+[1.545s] copying resource/model/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats -> /home/jake/ros2_ws/install/voice_to_text_node/share/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector
+[1.545s] running install_egg_info
+[1.567s] Copying ../../build/voice_to_text_node/voice_to_text_node.egg-info to /home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages/voice_to_text_node-0.1.0-py3.12.egg-info
+[1.569s] running install_scripts
+[1.704s] Installing voice_to_text_node script to /home/jake/ros2_ws/install/voice_to_text_node/bin
+[1.705s] writing list of installed files to '/home/jake/ros2_ws/build/voice_to_text_node/install.log'
+[1.736s] Invoked command in '/home/jake/ros2_ws/src/voice_to_text_node' returned '0': PYTHONPATH=/home/jake/ros2_ws/build/voice_to_text_node/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/install/voice_to_text_node/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base ../../build/voice_to_text_node build --build-base /home/jake/ros2_ws/build/voice_to_text_node/build install --record /home/jake/ros2_ws/build/voice_to_text_node/install.log --single-version-externally-managed install_data
diff --git a/log/latest_build b/log/latest_build
index 060f86d..4dd77e3 120000
--- a/log/latest_build
+++ b/log/latest_build
@@ -1 +1 @@
-build_2025-11-09_19-38-47
\ No newline at end of file
+build_2025-11-09_22-11-31
\ No newline at end of file
diff --git a/src/voice_to_text_node/build/.built_by b/src/voice_to_text_node/build/.built_by
new file mode 100644
index 0000000..06e74ac
--- /dev/null
+++ b/src/voice_to_text_node/build/.built_by
@@ -0,0 +1 @@
+colcon
diff --git a/src/voice_to_text_node/build/COLCON_IGNORE b/src/voice_to_text_node/build/COLCON_IGNORE
new file mode 100644
index 0000000..e69de29
diff --git a/src/voice_to_text_node/build/cam_test/build/lib/cam_test/__init__.py b/src/voice_to_text_node/build/cam_test/build/lib/cam_test/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/voice_to_text_node/build/cam_test/build/lib/cam_test/cam_test.py b/src/voice_to_text_node/build/cam_test/build/lib/cam_test/cam_test.py
new file mode 100644
index 0000000..46691fe
--- /dev/null
+++ b/src/voice_to_text_node/build/cam_test/build/lib/cam_test/cam_test.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python3
+import rclpy
+from rclpy.node import Node
+from std_msgs.msg import String
+
+class CamPublisher(Node):
+ def __init__(self):
+ super().__init__('cam_publisher')
+ self.publisher_ = self.create_publisher(String, 'cam_topic', 10)
+ self.timer = self.create_timer(1.0, self.publish_message)
+
+ def publish_message(self):
+ msg = String()
+ msg.data = 'Cam from ROS 2!'
+ self.publisher_.publish(msg)
+ self.get_logger().info(f'Published: {msg.data}')
+
+def main():
+ rclpy.init()
+ node = CamPublisher()
+ rclpy.spin(node)
+ node.destroy_node()
+ rclpy.shutdown()
+
+if __name__ == '__main__':
+ main()
diff --git a/src/voice_to_text_node/build/cam_test/cam_test.egg-info/PKG-INFO b/src/voice_to_text_node/build/cam_test/cam_test.egg-info/PKG-INFO
new file mode 100644
index 0000000..44fe8d9
--- /dev/null
+++ b/src/voice_to_text_node/build/cam_test/cam_test.egg-info/PKG-INFO
@@ -0,0 +1,7 @@
+Metadata-Version: 2.1
+Name: cam-test
+Version: 0.1.0
+Summary: Minimal Cam Test publisher
+Maintainer: jake
+Maintainer-email: jake@example.com
+License: MIT
diff --git a/src/voice_to_text_node/build/cam_test/cam_test.egg-info/SOURCES.txt b/src/voice_to_text_node/build/cam_test/cam_test.egg-info/SOURCES.txt
new file mode 100644
index 0000000..3377802
--- /dev/null
+++ b/src/voice_to_text_node/build/cam_test/cam_test.egg-info/SOURCES.txt
@@ -0,0 +1,12 @@
+package.xml
+setup.py
+build/cam_test/cam_test.egg-info/PKG-INFO
+build/cam_test/cam_test.egg-info/SOURCES.txt
+build/cam_test/cam_test.egg-info/dependency_links.txt
+build/cam_test/cam_test.egg-info/entry_points.txt
+build/cam_test/cam_test.egg-info/requires.txt
+build/cam_test/cam_test.egg-info/top_level.txt
+build/cam_test/cam_test.egg-info/zip-safe
+cam_test/__init__.py
+cam_test/cam_test.py
+resource/cam_test
\ No newline at end of file
diff --git a/src/voice_to_text_node/build/cam_test/cam_test.egg-info/dependency_links.txt b/src/voice_to_text_node/build/cam_test/cam_test.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/voice_to_text_node/build/cam_test/cam_test.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/src/voice_to_text_node/build/cam_test/cam_test.egg-info/entry_points.txt b/src/voice_to_text_node/build/cam_test/cam_test.egg-info/entry_points.txt
new file mode 100644
index 0000000..de71f3f
--- /dev/null
+++ b/src/voice_to_text_node/build/cam_test/cam_test.egg-info/entry_points.txt
@@ -0,0 +1,2 @@
+[console_scripts]
+cam_test = cam_test.cam_test:main
diff --git a/src/voice_to_text_node/build/cam_test/cam_test.egg-info/requires.txt b/src/voice_to_text_node/build/cam_test/cam_test.egg-info/requires.txt
new file mode 100644
index 0000000..49fe098
--- /dev/null
+++ b/src/voice_to_text_node/build/cam_test/cam_test.egg-info/requires.txt
@@ -0,0 +1 @@
+setuptools
diff --git a/src/voice_to_text_node/build/cam_test/cam_test.egg-info/top_level.txt b/src/voice_to_text_node/build/cam_test/cam_test.egg-info/top_level.txt
new file mode 100644
index 0000000..36a80fa
--- /dev/null
+++ b/src/voice_to_text_node/build/cam_test/cam_test.egg-info/top_level.txt
@@ -0,0 +1 @@
+cam_test
diff --git a/src/voice_to_text_node/build/cam_test/cam_test.egg-info/zip-safe b/src/voice_to_text_node/build/cam_test/cam_test.egg-info/zip-safe
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/voice_to_text_node/build/cam_test/cam_test.egg-info/zip-safe
@@ -0,0 +1 @@
+
diff --git a/src/voice_to_text_node/build/cam_test/colcon_build.rc b/src/voice_to_text_node/build/cam_test/colcon_build.rc
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/src/voice_to_text_node/build/cam_test/colcon_build.rc
@@ -0,0 +1 @@
+0
diff --git a/src/voice_to_text_node/build/cam_test/colcon_command_prefix_setup_py.sh b/src/voice_to_text_node/build/cam_test/colcon_command_prefix_setup_py.sh
new file mode 100644
index 0000000..f9867d5
--- /dev/null
+++ b/src/voice_to_text_node/build/cam_test/colcon_command_prefix_setup_py.sh
@@ -0,0 +1 @@
+# generated from colcon_core/shell/template/command_prefix.sh.em
diff --git a/src/voice_to_text_node/build/cam_test/colcon_command_prefix_setup_py.sh.env b/src/voice_to_text_node/build/cam_test/colcon_command_prefix_setup_py.sh.env
new file mode 100644
index 0000000..89b93e7
--- /dev/null
+++ b/src/voice_to_text_node/build/cam_test/colcon_command_prefix_setup_py.sh.env
@@ -0,0 +1,46 @@
+AMENT_PREFIX_PATH=/home/jake/ros2_ws/install/hello_pub:/opt/ros/kilted
+CMAKE_PREFIX_PATH=/opt/ros/kilted/opt/gz_math_vendor:/opt/ros/kilted/opt/gz_utils_vendor:/opt/ros/kilted/opt/gz_cmake_vendor
+COLCON=1
+COLCON_PREFIX_PATH=/home/jake/ros2_ws/install
+COLORTERM=truecolor
+DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus
+DISPLAY=10.255.255.254:0
+GIT_ASKPASS=/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/extensions/git/dist/askpass.sh
+HOME=/home/jake
+HOSTTYPE=x86_64
+LANG=C.UTF-8
+LD_LIBRARY_PATH=/opt/ros/kilted/opt/zenoh_cpp_vendor/lib:/opt/ros/kilted/opt/gz_math_vendor/lib:/opt/ros/kilted/opt/gz_utils_vendor/lib:/opt/ros/kilted/opt/rviz_ogre_vendor/lib:/opt/ros/kilted/lib/x86_64-linux-gnu:/opt/ros/kilted/opt/gz_cmake_vendor/lib:/opt/ros/kilted/lib
+LESSCLOSE=/usr/bin/lesspipe %s %s
+LESSOPEN=| /usr/bin/lesspipe %s
+LOGNAME=jake
+LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.crdownload=00;90:*.dpkg-dist=00;90:*.dpkg-new=00;90:*.dpkg-old=00;90:*.dpkg-tmp=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90:*.swp=00;90:*.tmp=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:
+NAME=DESKTOP-UFLG41E
+OLDPWD=/home/jake/ros2_ws/src
+PATH=/home/jake/ros2_ws/install/hello_pub/bin:/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/bin/remote-cli:/opt/ros/kilted/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Windows/System32/OpenSSH/:/mnt/c/Program Files/Docker/Docker/resources/bin:/mnt/c/Users/jake/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/jake/AppData/Local/Programs/Microsoft VS Code/bin:/snap/bin:/home/jake/.vscode-server/data/User/globalStorage/github.copilot-chat/debugCommand
+PULSE_SERVER=unix:/mnt/wslg/PulseServer
+PWD=/home/jake/ros2_ws/src/cam_test/build/cam_test
+PYTHONPATH=/home/jake/ros2_ws/install/hello_pub/lib/python3.12/site-packages:/opt/ros/kilted/lib/python3.12/site-packages
+ROS_AUTOMATIC_DISCOVERY_RANGE=SUBNET
+ROS_DISTRO=kilted
+ROS_PYTHON_VERSION=3
+ROS_VERSION=2
+SHELL=/bin/bash
+SHLVL=1
+TERM=xterm-256color
+TERM_PROGRAM=vscode
+TERM_PROGRAM_VERSION=1.105.1
+USER=jake
+VSCODE_GIT_ASKPASS_EXTRA_ARGS=
+VSCODE_GIT_ASKPASS_MAIN=/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/extensions/git/dist/askpass-main.js
+VSCODE_GIT_ASKPASS_NODE=/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/node
+VSCODE_GIT_IPC_HANDLE=/run/user/1001/vscode-git-1d6e8e65c1.sock
+VSCODE_IPC_HOOK_CLI=/run/user/1001/vscode-ipc-bc7e8c25-b626-4f8f-989e-c38b7c8e334a.sock
+VSCODE_PYTHON_AUTOACTIVATE_GUARD=1
+WAYLAND_DISPLAY=wayland-0
+WSL2_GUI_APPS_ENABLED=1
+WSLENV=VSCODE_WSL_EXT_LOCATION/up
+WSL_DISTRO_NAME=Ubuntu-24.04
+WSL_INTEROP=/run/WSL/468_interop
+XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
+XDG_RUNTIME_DIR=/run/user/1001/
+_=/usr/bin/colcon
diff --git a/src/voice_to_text_node/build/cam_test/install.log b/src/voice_to_text_node/build/cam_test/install.log
new file mode 100644
index 0000000..9ee098c
--- /dev/null
+++ b/src/voice_to_text_node/build/cam_test/install.log
@@ -0,0 +1,14 @@
+/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test/cam_test.py
+/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test/__init__.py
+/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test/__pycache__/cam_test.cpython-312.pyc
+/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test/__pycache__/__init__.cpython-312.pyc
+/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/package.xml
+/home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index/resource_index/packages/cam_test
+/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/entry_points.txt
+/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/SOURCES.txt
+/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/zip-safe
+/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/top_level.txt
+/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/dependency_links.txt
+/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/requires.txt
+/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/PKG-INFO
+/home/jake/ros2_ws/src/cam_test/install/cam_test/bin/cam_test
diff --git a/src/voice_to_text_node/build/cam_test/prefix_override/__pycache__/sitecustomize.cpython-312.pyc b/src/voice_to_text_node/build/cam_test/prefix_override/__pycache__/sitecustomize.cpython-312.pyc
new file mode 100644
index 0000000..f4d8f5c
Binary files /dev/null and b/src/voice_to_text_node/build/cam_test/prefix_override/__pycache__/sitecustomize.cpython-312.pyc differ
diff --git a/src/voice_to_text_node/build/cam_test/prefix_override/sitecustomize.py b/src/voice_to_text_node/build/cam_test/prefix_override/sitecustomize.py
new file mode 100644
index 0000000..0c35ec5
--- /dev/null
+++ b/src/voice_to_text_node/build/cam_test/prefix_override/sitecustomize.py
@@ -0,0 +1,4 @@
+import sys
+if sys.prefix == '/usr':
+ sys.real_prefix = sys.prefix
+ sys.prefix = sys.exec_prefix = '/home/jake/ros2_ws/src/cam_test/install/cam_test'
diff --git a/src/voice_to_text_node/install/.colcon_install_layout b/src/voice_to_text_node/install/.colcon_install_layout
new file mode 100644
index 0000000..3aad533
--- /dev/null
+++ b/src/voice_to_text_node/install/.colcon_install_layout
@@ -0,0 +1 @@
+isolated
diff --git a/src/voice_to_text_node/install/COLCON_IGNORE b/src/voice_to_text_node/install/COLCON_IGNORE
new file mode 100644
index 0000000..e69de29
diff --git a/src/voice_to_text_node/install/_local_setup_util_ps1.py b/src/voice_to_text_node/install/_local_setup_util_ps1.py
new file mode 100644
index 0000000..3c6d9e8
--- /dev/null
+++ b/src/voice_to_text_node/install/_local_setup_util_ps1.py
@@ -0,0 +1,407 @@
+# Copyright 2016-2019 Dirk Thomas
+# Licensed under the Apache License, Version 2.0
+
+import argparse
+from collections import OrderedDict
+import os
+from pathlib import Path
+import sys
+
+
+FORMAT_STR_COMMENT_LINE = '# {comment}'
+FORMAT_STR_SET_ENV_VAR = 'Set-Item -Path "Env:{name}" -Value "{value}"'
+FORMAT_STR_USE_ENV_VAR = '$env:{name}'
+FORMAT_STR_INVOKE_SCRIPT = '_colcon_prefix_powershell_source_script "{script_path}"' # noqa: E501
+FORMAT_STR_REMOVE_LEADING_SEPARATOR = '' # noqa: E501
+FORMAT_STR_REMOVE_TRAILING_SEPARATOR = '' # noqa: E501
+
+DSV_TYPE_APPEND_NON_DUPLICATE = 'append-non-duplicate'
+DSV_TYPE_PREPEND_NON_DUPLICATE = 'prepend-non-duplicate'
+DSV_TYPE_PREPEND_NON_DUPLICATE_IF_EXISTS = 'prepend-non-duplicate-if-exists'
+DSV_TYPE_SET = 'set'
+DSV_TYPE_SET_IF_UNSET = 'set-if-unset'
+DSV_TYPE_SOURCE = 'source'
+
+
+def main(argv=sys.argv[1:]): # noqa: D103
+ parser = argparse.ArgumentParser(
+ description='Output shell commands for the packages in topological '
+ 'order')
+ parser.add_argument(
+ 'primary_extension',
+ help='The file extension of the primary shell')
+ parser.add_argument(
+ 'additional_extension', nargs='?',
+ help='The additional file extension to be considered')
+ parser.add_argument(
+ '--merged-install', action='store_true',
+ help='All install prefixes are merged into a single location')
+ args = parser.parse_args(argv)
+
+ packages = get_packages(Path(__file__).parent, args.merged_install)
+
+ ordered_packages = order_packages(packages)
+ for pkg_name in ordered_packages:
+ if _include_comments():
+ print(
+ FORMAT_STR_COMMENT_LINE.format_map(
+ {'comment': 'Package: ' + pkg_name}))
+ prefix = os.path.abspath(os.path.dirname(__file__))
+ if not args.merged_install:
+ prefix = os.path.join(prefix, pkg_name)
+ for line in get_commands(
+ pkg_name, prefix, args.primary_extension,
+ args.additional_extension
+ ):
+ print(line)
+
+ for line in _remove_ending_separators():
+ print(line)
+
+
+def get_packages(prefix_path, merged_install):
+ """
+ Find packages based on colcon-specific files created during installation.
+
+ :param Path prefix_path: The install prefix path of all packages
+ :param bool merged_install: The flag if the packages are all installed
+ directly in the prefix or if each package is installed in a subdirectory
+ named after the package
+ :returns: A mapping from the package name to the set of runtime
+ dependencies
+ :rtype: dict
+ """
+ packages = {}
+ # since importing colcon_core isn't feasible here the following constant
+ # must match colcon_core.location.get_relative_package_index_path()
+ subdirectory = 'share/colcon-core/packages'
+ if merged_install:
+ # return if workspace is empty
+ if not (prefix_path / subdirectory).is_dir():
+ return packages
+ # find all files in the subdirectory
+ for p in (prefix_path / subdirectory).iterdir():
+ if not p.is_file():
+ continue
+ if p.name.startswith('.'):
+ continue
+ add_package_runtime_dependencies(p, packages)
+ else:
+ # for each subdirectory look for the package specific file
+ for p in prefix_path.iterdir():
+ if not p.is_dir():
+ continue
+ if p.name.startswith('.'):
+ continue
+ p = p / subdirectory / p.name
+ if p.is_file():
+ add_package_runtime_dependencies(p, packages)
+
+ # remove unknown dependencies
+ pkg_names = set(packages.keys())
+ for k in packages.keys():
+ packages[k] = {d for d in packages[k] if d in pkg_names}
+
+ return packages
+
+
+def add_package_runtime_dependencies(path, packages):
+ """
+ Check the path and if it exists extract the packages runtime dependencies.
+
+ :param Path path: The resource file containing the runtime dependencies
+ :param dict packages: A mapping from package names to the sets of runtime
+ dependencies to add to
+ """
+ content = path.read_text()
+ dependencies = set(content.split(os.pathsep) if content else [])
+ packages[path.name] = dependencies
+
+
+def order_packages(packages):
+ """
+ Order packages topologically.
+
+ :param dict packages: A mapping from package name to the set of runtime
+ dependencies
+ :returns: The package names
+ :rtype: list
+ """
+ # select packages with no dependencies in alphabetical order
+ to_be_ordered = list(packages.keys())
+ ordered = []
+ while to_be_ordered:
+ pkg_names_without_deps = [
+ name for name in to_be_ordered if not packages[name]]
+ if not pkg_names_without_deps:
+ reduce_cycle_set(packages)
+ raise RuntimeError(
+ 'Circular dependency between: ' + ', '.join(sorted(packages)))
+ pkg_names_without_deps.sort()
+ pkg_name = pkg_names_without_deps[0]
+ to_be_ordered.remove(pkg_name)
+ ordered.append(pkg_name)
+ # remove item from dependency lists
+ for k in list(packages.keys()):
+ if pkg_name in packages[k]:
+ packages[k].remove(pkg_name)
+ return ordered
+
+
+def reduce_cycle_set(packages):
+ """
+ Reduce the set of packages to the ones part of the circular dependency.
+
+ :param dict packages: A mapping from package name to the set of runtime
+ dependencies which is modified in place
+ """
+ last_depended = None
+ while len(packages) > 0:
+ # get all remaining dependencies
+ depended = set()
+ for pkg_name, dependencies in packages.items():
+ depended = depended.union(dependencies)
+ # remove all packages which are not dependent on
+ for name in list(packages.keys()):
+ if name not in depended:
+ del packages[name]
+ if last_depended:
+ # if remaining packages haven't changed return them
+ if last_depended == depended:
+ return packages.keys()
+ # otherwise reduce again
+ last_depended = depended
+
+
+def _include_comments():
+ # skipping comment lines when COLCON_TRACE is not set speeds up the
+ # processing especially on Windows
+ return bool(os.environ.get('COLCON_TRACE'))
+
+
+def get_commands(pkg_name, prefix, primary_extension, additional_extension):
+ commands = []
+ package_dsv_path = os.path.join(prefix, 'share', pkg_name, 'package.dsv')
+ if os.path.exists(package_dsv_path):
+ commands += process_dsv_file(
+ package_dsv_path, prefix, primary_extension, additional_extension)
+ return commands
+
+
+def process_dsv_file(
+ dsv_path, prefix, primary_extension=None, additional_extension=None
+):
+ commands = []
+ if _include_comments():
+ commands.append(FORMAT_STR_COMMENT_LINE.format_map({'comment': dsv_path}))
+ with open(dsv_path, 'r') as h:
+ content = h.read()
+ lines = content.splitlines()
+
+ basenames = OrderedDict()
+ for i, line in enumerate(lines):
+ # skip over empty or whitespace-only lines
+ if not line.strip():
+ continue
+ # skip over comments
+ if line.startswith('#'):
+ continue
+ try:
+ type_, remainder = line.split(';', 1)
+ except ValueError:
+ raise RuntimeError(
+ "Line %d in '%s' doesn't contain a semicolon separating the "
+ 'type from the arguments' % (i + 1, dsv_path))
+ if type_ != DSV_TYPE_SOURCE:
+ # handle non-source lines
+ try:
+ commands += handle_dsv_types_except_source(
+ type_, remainder, prefix)
+ except RuntimeError as e:
+ raise RuntimeError(
+ "Line %d in '%s' %s" % (i + 1, dsv_path, e)) from e
+ else:
+ # group remaining source lines by basename
+ path_without_ext, ext = os.path.splitext(remainder)
+ if path_without_ext not in basenames:
+ basenames[path_without_ext] = set()
+ assert ext.startswith('.')
+ ext = ext[1:]
+ if ext in (primary_extension, additional_extension):
+ basenames[path_without_ext].add(ext)
+
+ # add the dsv extension to each basename if the file exists
+ for basename, extensions in basenames.items():
+ if not os.path.isabs(basename):
+ basename = os.path.join(prefix, basename)
+ if os.path.exists(basename + '.dsv'):
+ extensions.add('dsv')
+
+ for basename, extensions in basenames.items():
+ if not os.path.isabs(basename):
+ basename = os.path.join(prefix, basename)
+ if 'dsv' in extensions:
+ # process dsv files recursively
+ commands += process_dsv_file(
+ basename + '.dsv', prefix, primary_extension=primary_extension,
+ additional_extension=additional_extension)
+ elif primary_extension in extensions and len(extensions) == 1:
+ # source primary-only files
+ commands += [
+ FORMAT_STR_INVOKE_SCRIPT.format_map({
+ 'prefix': prefix,
+ 'script_path': basename + '.' + primary_extension})]
+ elif additional_extension in extensions:
+ # source non-primary files
+ commands += [
+ FORMAT_STR_INVOKE_SCRIPT.format_map({
+ 'prefix': prefix,
+ 'script_path': basename + '.' + additional_extension})]
+
+ return commands
+
+
+def handle_dsv_types_except_source(type_, remainder, prefix):
+ commands = []
+ if type_ in (DSV_TYPE_SET, DSV_TYPE_SET_IF_UNSET):
+ try:
+ env_name, value = remainder.split(';', 1)
+ except ValueError:
+ raise RuntimeError(
+ "doesn't contain a semicolon separating the environment name "
+ 'from the value')
+ try_prefixed_value = os.path.join(prefix, value) if value else prefix
+ if os.path.exists(try_prefixed_value):
+ value = try_prefixed_value
+ if type_ == DSV_TYPE_SET:
+ commands += _set(env_name, value)
+ elif type_ == DSV_TYPE_SET_IF_UNSET:
+ commands += _set_if_unset(env_name, value)
+ else:
+ assert False
+ elif type_ in (
+ DSV_TYPE_APPEND_NON_DUPLICATE,
+ DSV_TYPE_PREPEND_NON_DUPLICATE,
+ DSV_TYPE_PREPEND_NON_DUPLICATE_IF_EXISTS
+ ):
+ try:
+ env_name_and_values = remainder.split(';')
+ except ValueError:
+ raise RuntimeError(
+ "doesn't contain a semicolon separating the environment name "
+ 'from the values')
+ env_name = env_name_and_values[0]
+ values = env_name_and_values[1:]
+ for value in values:
+ if not value:
+ value = prefix
+ elif not os.path.isabs(value):
+ value = os.path.join(prefix, value)
+ if (
+ type_ == DSV_TYPE_PREPEND_NON_DUPLICATE_IF_EXISTS and
+ not os.path.exists(value)
+ ):
+ comment = f'skip extending {env_name} with not existing ' \
+ f'path: {value}'
+ if _include_comments():
+ commands.append(
+ FORMAT_STR_COMMENT_LINE.format_map({'comment': comment}))
+ elif type_ == DSV_TYPE_APPEND_NON_DUPLICATE:
+ commands += _append_unique_value(env_name, value)
+ else:
+ commands += _prepend_unique_value(env_name, value)
+ else:
+ raise RuntimeError(
+ 'contains an unknown environment hook type: ' + type_)
+ return commands
+
+
+env_state = {}
+
+
+def _append_unique_value(name, value):
+ global env_state
+ if name not in env_state:
+ if os.environ.get(name):
+ env_state[name] = set(os.environ[name].split(os.pathsep))
+ else:
+ env_state[name] = set()
+ # append even if the variable has not been set yet, in case a shell script sets the
+ # same variable without the knowledge of this Python script.
+ # later _remove_ending_separators() will cleanup any unintentional leading separator
+ extend = FORMAT_STR_USE_ENV_VAR.format_map({'name': name}) + os.pathsep
+ line = FORMAT_STR_SET_ENV_VAR.format_map(
+ {'name': name, 'value': extend + value})
+ if value not in env_state[name]:
+ env_state[name].add(value)
+ else:
+ if not _include_comments():
+ return []
+ line = FORMAT_STR_COMMENT_LINE.format_map({'comment': line})
+ return [line]
+
+
+def _prepend_unique_value(name, value):
+ global env_state
+ if name not in env_state:
+ if os.environ.get(name):
+ env_state[name] = set(os.environ[name].split(os.pathsep))
+ else:
+ env_state[name] = set()
+ # prepend even if the variable has not been set yet, in case a shell script sets the
+ # same variable without the knowledge of this Python script.
+ # later _remove_ending_separators() will cleanup any unintentional trailing separator
+ extend = os.pathsep + FORMAT_STR_USE_ENV_VAR.format_map({'name': name})
+ line = FORMAT_STR_SET_ENV_VAR.format_map(
+ {'name': name, 'value': value + extend})
+ if value not in env_state[name]:
+ env_state[name].add(value)
+ else:
+ if not _include_comments():
+ return []
+ line = FORMAT_STR_COMMENT_LINE.format_map({'comment': line})
+ return [line]
+
+
+# generate commands for removing prepended underscores
+def _remove_ending_separators():
+ # do nothing if the shell extension does not implement the logic
+ if FORMAT_STR_REMOVE_TRAILING_SEPARATOR is None:
+ return []
+
+ global env_state
+ commands = []
+ for name in env_state:
+ # skip variables that already had values before this script started prepending
+ if name in os.environ:
+ continue
+ commands += [
+ FORMAT_STR_REMOVE_LEADING_SEPARATOR.format_map({'name': name}),
+ FORMAT_STR_REMOVE_TRAILING_SEPARATOR.format_map({'name': name})]
+ return commands
+
+
+def _set(name, value):
+ global env_state
+ env_state[name] = value
+ line = FORMAT_STR_SET_ENV_VAR.format_map(
+ {'name': name, 'value': value})
+ return [line]
+
+
+def _set_if_unset(name, value):
+ global env_state
+ line = FORMAT_STR_SET_ENV_VAR.format_map(
+ {'name': name, 'value': value})
+ if env_state.get(name, os.environ.get(name)):
+ line = FORMAT_STR_COMMENT_LINE.format_map({'comment': line})
+ return [line]
+
+
+if __name__ == '__main__': # pragma: no cover
+ try:
+ rc = main()
+ except RuntimeError as e:
+ print(str(e), file=sys.stderr)
+ rc = 1
+ sys.exit(rc)
diff --git a/src/voice_to_text_node/install/_local_setup_util_sh.py b/src/voice_to_text_node/install/_local_setup_util_sh.py
new file mode 100644
index 0000000..f67eaa9
--- /dev/null
+++ b/src/voice_to_text_node/install/_local_setup_util_sh.py
@@ -0,0 +1,407 @@
+# Copyright 2016-2019 Dirk Thomas
+# Licensed under the Apache License, Version 2.0
+
+import argparse
+from collections import OrderedDict
+import os
+from pathlib import Path
+import sys
+
+
+FORMAT_STR_COMMENT_LINE = '# {comment}'
+FORMAT_STR_SET_ENV_VAR = 'export {name}="{value}"'
+FORMAT_STR_USE_ENV_VAR = '${name}'
+FORMAT_STR_INVOKE_SCRIPT = 'COLCON_CURRENT_PREFIX="{prefix}" _colcon_prefix_sh_source_script "{script_path}"' # noqa: E501
+FORMAT_STR_REMOVE_LEADING_SEPARATOR = 'if [ "$(echo -n ${name} | head -c 1)" = ":" ]; then export {name}=${{{name}#?}} ; fi' # noqa: E501
+FORMAT_STR_REMOVE_TRAILING_SEPARATOR = 'if [ "$(echo -n ${name} | tail -c 1)" = ":" ]; then export {name}=${{{name}%?}} ; fi' # noqa: E501
+
+DSV_TYPE_APPEND_NON_DUPLICATE = 'append-non-duplicate'
+DSV_TYPE_PREPEND_NON_DUPLICATE = 'prepend-non-duplicate'
+DSV_TYPE_PREPEND_NON_DUPLICATE_IF_EXISTS = 'prepend-non-duplicate-if-exists'
+DSV_TYPE_SET = 'set'
+DSV_TYPE_SET_IF_UNSET = 'set-if-unset'
+DSV_TYPE_SOURCE = 'source'
+
+
+def main(argv=sys.argv[1:]): # noqa: D103
+ parser = argparse.ArgumentParser(
+ description='Output shell commands for the packages in topological '
+ 'order')
+ parser.add_argument(
+ 'primary_extension',
+ help='The file extension of the primary shell')
+ parser.add_argument(
+ 'additional_extension', nargs='?',
+ help='The additional file extension to be considered')
+ parser.add_argument(
+ '--merged-install', action='store_true',
+ help='All install prefixes are merged into a single location')
+ args = parser.parse_args(argv)
+
+ packages = get_packages(Path(__file__).parent, args.merged_install)
+
+ ordered_packages = order_packages(packages)
+ for pkg_name in ordered_packages:
+ if _include_comments():
+ print(
+ FORMAT_STR_COMMENT_LINE.format_map(
+ {'comment': 'Package: ' + pkg_name}))
+ prefix = os.path.abspath(os.path.dirname(__file__))
+ if not args.merged_install:
+ prefix = os.path.join(prefix, pkg_name)
+ for line in get_commands(
+ pkg_name, prefix, args.primary_extension,
+ args.additional_extension
+ ):
+ print(line)
+
+ for line in _remove_ending_separators():
+ print(line)
+
+
+def get_packages(prefix_path, merged_install):
+ """
+ Find packages based on colcon-specific files created during installation.
+
+ :param Path prefix_path: The install prefix path of all packages
+ :param bool merged_install: The flag if the packages are all installed
+ directly in the prefix or if each package is installed in a subdirectory
+ named after the package
+ :returns: A mapping from the package name to the set of runtime
+ dependencies
+ :rtype: dict
+ """
+ packages = {}
+ # since importing colcon_core isn't feasible here the following constant
+ # must match colcon_core.location.get_relative_package_index_path()
+ subdirectory = 'share/colcon-core/packages'
+ if merged_install:
+ # return if workspace is empty
+ if not (prefix_path / subdirectory).is_dir():
+ return packages
+ # find all files in the subdirectory
+ for p in (prefix_path / subdirectory).iterdir():
+ if not p.is_file():
+ continue
+ if p.name.startswith('.'):
+ continue
+ add_package_runtime_dependencies(p, packages)
+ else:
+ # for each subdirectory look for the package specific file
+ for p in prefix_path.iterdir():
+ if not p.is_dir():
+ continue
+ if p.name.startswith('.'):
+ continue
+ p = p / subdirectory / p.name
+ if p.is_file():
+ add_package_runtime_dependencies(p, packages)
+
+ # remove unknown dependencies
+ pkg_names = set(packages.keys())
+ for k in packages.keys():
+ packages[k] = {d for d in packages[k] if d in pkg_names}
+
+ return packages
+
+
+def add_package_runtime_dependencies(path, packages):
+ """
+ Check the path and if it exists extract the packages runtime dependencies.
+
+ :param Path path: The resource file containing the runtime dependencies
+ :param dict packages: A mapping from package names to the sets of runtime
+ dependencies to add to
+ """
+ content = path.read_text()
+ dependencies = set(content.split(os.pathsep) if content else [])
+ packages[path.name] = dependencies
+
+
+def order_packages(packages):
+ """
+ Order packages topologically.
+
+ :param dict packages: A mapping from package name to the set of runtime
+ dependencies
+ :returns: The package names
+ :rtype: list
+ """
+ # select packages with no dependencies in alphabetical order
+ to_be_ordered = list(packages.keys())
+ ordered = []
+ while to_be_ordered:
+ pkg_names_without_deps = [
+ name for name in to_be_ordered if not packages[name]]
+ if not pkg_names_without_deps:
+ reduce_cycle_set(packages)
+ raise RuntimeError(
+ 'Circular dependency between: ' + ', '.join(sorted(packages)))
+ pkg_names_without_deps.sort()
+ pkg_name = pkg_names_without_deps[0]
+ to_be_ordered.remove(pkg_name)
+ ordered.append(pkg_name)
+ # remove item from dependency lists
+ for k in list(packages.keys()):
+ if pkg_name in packages[k]:
+ packages[k].remove(pkg_name)
+ return ordered
+
+
+def reduce_cycle_set(packages):
+ """
+ Reduce the set of packages to the ones part of the circular dependency.
+
+ :param dict packages: A mapping from package name to the set of runtime
+ dependencies which is modified in place
+ """
+ last_depended = None
+ while len(packages) > 0:
+ # get all remaining dependencies
+ depended = set()
+ for pkg_name, dependencies in packages.items():
+ depended = depended.union(dependencies)
+ # remove all packages which are not dependent on
+ for name in list(packages.keys()):
+ if name not in depended:
+ del packages[name]
+ if last_depended:
+ # if remaining packages haven't changed return them
+ if last_depended == depended:
+ return packages.keys()
+ # otherwise reduce again
+ last_depended = depended
+
+
+def _include_comments():
+ # skipping comment lines when COLCON_TRACE is not set speeds up the
+ # processing especially on Windows
+ return bool(os.environ.get('COLCON_TRACE'))
+
+
+def get_commands(pkg_name, prefix, primary_extension, additional_extension):
+ commands = []
+ package_dsv_path = os.path.join(prefix, 'share', pkg_name, 'package.dsv')
+ if os.path.exists(package_dsv_path):
+ commands += process_dsv_file(
+ package_dsv_path, prefix, primary_extension, additional_extension)
+ return commands
+
+
+def process_dsv_file(
+ dsv_path, prefix, primary_extension=None, additional_extension=None
+):
+ commands = []
+ if _include_comments():
+ commands.append(FORMAT_STR_COMMENT_LINE.format_map({'comment': dsv_path}))
+ with open(dsv_path, 'r') as h:
+ content = h.read()
+ lines = content.splitlines()
+
+ basenames = OrderedDict()
+ for i, line in enumerate(lines):
+ # skip over empty or whitespace-only lines
+ if not line.strip():
+ continue
+ # skip over comments
+ if line.startswith('#'):
+ continue
+ try:
+ type_, remainder = line.split(';', 1)
+ except ValueError:
+ raise RuntimeError(
+ "Line %d in '%s' doesn't contain a semicolon separating the "
+ 'type from the arguments' % (i + 1, dsv_path))
+ if type_ != DSV_TYPE_SOURCE:
+ # handle non-source lines
+ try:
+ commands += handle_dsv_types_except_source(
+ type_, remainder, prefix)
+ except RuntimeError as e:
+ raise RuntimeError(
+ "Line %d in '%s' %s" % (i + 1, dsv_path, e)) from e
+ else:
+ # group remaining source lines by basename
+ path_without_ext, ext = os.path.splitext(remainder)
+ if path_without_ext not in basenames:
+ basenames[path_without_ext] = set()
+ assert ext.startswith('.')
+ ext = ext[1:]
+ if ext in (primary_extension, additional_extension):
+ basenames[path_without_ext].add(ext)
+
+ # add the dsv extension to each basename if the file exists
+ for basename, extensions in basenames.items():
+ if not os.path.isabs(basename):
+ basename = os.path.join(prefix, basename)
+ if os.path.exists(basename + '.dsv'):
+ extensions.add('dsv')
+
+ for basename, extensions in basenames.items():
+ if not os.path.isabs(basename):
+ basename = os.path.join(prefix, basename)
+ if 'dsv' in extensions:
+ # process dsv files recursively
+ commands += process_dsv_file(
+ basename + '.dsv', prefix, primary_extension=primary_extension,
+ additional_extension=additional_extension)
+ elif primary_extension in extensions and len(extensions) == 1:
+ # source primary-only files
+ commands += [
+ FORMAT_STR_INVOKE_SCRIPT.format_map({
+ 'prefix': prefix,
+ 'script_path': basename + '.' + primary_extension})]
+ elif additional_extension in extensions:
+ # source non-primary files
+ commands += [
+ FORMAT_STR_INVOKE_SCRIPT.format_map({
+ 'prefix': prefix,
+ 'script_path': basename + '.' + additional_extension})]
+
+ return commands
+
+
+def handle_dsv_types_except_source(type_, remainder, prefix):
+ commands = []
+ if type_ in (DSV_TYPE_SET, DSV_TYPE_SET_IF_UNSET):
+ try:
+ env_name, value = remainder.split(';', 1)
+ except ValueError:
+ raise RuntimeError(
+ "doesn't contain a semicolon separating the environment name "
+ 'from the value')
+ try_prefixed_value = os.path.join(prefix, value) if value else prefix
+ if os.path.exists(try_prefixed_value):
+ value = try_prefixed_value
+ if type_ == DSV_TYPE_SET:
+ commands += _set(env_name, value)
+ elif type_ == DSV_TYPE_SET_IF_UNSET:
+ commands += _set_if_unset(env_name, value)
+ else:
+ assert False
+ elif type_ in (
+ DSV_TYPE_APPEND_NON_DUPLICATE,
+ DSV_TYPE_PREPEND_NON_DUPLICATE,
+ DSV_TYPE_PREPEND_NON_DUPLICATE_IF_EXISTS
+ ):
+ try:
+ env_name_and_values = remainder.split(';')
+ except ValueError:
+ raise RuntimeError(
+ "doesn't contain a semicolon separating the environment name "
+ 'from the values')
+ env_name = env_name_and_values[0]
+ values = env_name_and_values[1:]
+ for value in values:
+ if not value:
+ value = prefix
+ elif not os.path.isabs(value):
+ value = os.path.join(prefix, value)
+ if (
+ type_ == DSV_TYPE_PREPEND_NON_DUPLICATE_IF_EXISTS and
+ not os.path.exists(value)
+ ):
+ comment = f'skip extending {env_name} with not existing ' \
+ f'path: {value}'
+ if _include_comments():
+ commands.append(
+ FORMAT_STR_COMMENT_LINE.format_map({'comment': comment}))
+ elif type_ == DSV_TYPE_APPEND_NON_DUPLICATE:
+ commands += _append_unique_value(env_name, value)
+ else:
+ commands += _prepend_unique_value(env_name, value)
+ else:
+ raise RuntimeError(
+ 'contains an unknown environment hook type: ' + type_)
+ return commands
+
+
+env_state = {}
+
+
+def _append_unique_value(name, value):
+ global env_state
+ if name not in env_state:
+ if os.environ.get(name):
+ env_state[name] = set(os.environ[name].split(os.pathsep))
+ else:
+ env_state[name] = set()
+ # append even if the variable has not been set yet, in case a shell script sets the
+ # same variable without the knowledge of this Python script.
+ # later _remove_ending_separators() will cleanup any unintentional leading separator
+ extend = FORMAT_STR_USE_ENV_VAR.format_map({'name': name}) + os.pathsep
+ line = FORMAT_STR_SET_ENV_VAR.format_map(
+ {'name': name, 'value': extend + value})
+ if value not in env_state[name]:
+ env_state[name].add(value)
+ else:
+ if not _include_comments():
+ return []
+ line = FORMAT_STR_COMMENT_LINE.format_map({'comment': line})
+ return [line]
+
+
+def _prepend_unique_value(name, value):
+ global env_state
+ if name not in env_state:
+ if os.environ.get(name):
+ env_state[name] = set(os.environ[name].split(os.pathsep))
+ else:
+ env_state[name] = set()
+ # prepend even if the variable has not been set yet, in case a shell script sets the
+ # same variable without the knowledge of this Python script.
+ # later _remove_ending_separators() will cleanup any unintentional trailing separator
+ extend = os.pathsep + FORMAT_STR_USE_ENV_VAR.format_map({'name': name})
+ line = FORMAT_STR_SET_ENV_VAR.format_map(
+ {'name': name, 'value': value + extend})
+ if value not in env_state[name]:
+ env_state[name].add(value)
+ else:
+ if not _include_comments():
+ return []
+ line = FORMAT_STR_COMMENT_LINE.format_map({'comment': line})
+ return [line]
+
+
+# generate commands for removing prepended underscores
+def _remove_ending_separators():
+ # do nothing if the shell extension does not implement the logic
+ if FORMAT_STR_REMOVE_TRAILING_SEPARATOR is None:
+ return []
+
+ global env_state
+ commands = []
+ for name in env_state:
+ # skip variables that already had values before this script started prepending
+ if name in os.environ:
+ continue
+ commands += [
+ FORMAT_STR_REMOVE_LEADING_SEPARATOR.format_map({'name': name}),
+ FORMAT_STR_REMOVE_TRAILING_SEPARATOR.format_map({'name': name})]
+ return commands
+
+
+def _set(name, value):
+ global env_state
+ env_state[name] = value
+ line = FORMAT_STR_SET_ENV_VAR.format_map(
+ {'name': name, 'value': value})
+ return [line]
+
+
+def _set_if_unset(name, value):
+ global env_state
+ line = FORMAT_STR_SET_ENV_VAR.format_map(
+ {'name': name, 'value': value})
+ if env_state.get(name, os.environ.get(name)):
+ line = FORMAT_STR_COMMENT_LINE.format_map({'comment': line})
+ return [line]
+
+
+if __name__ == '__main__': # pragma: no cover
+ try:
+ rc = main()
+ except RuntimeError as e:
+ print(str(e), file=sys.stderr)
+ rc = 1
+ sys.exit(rc)
diff --git a/src/voice_to_text_node/install/cam_test/bin/cam_test b/src/voice_to_text_node/install/cam_test/bin/cam_test
new file mode 100755
index 0000000..212a832
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/bin/cam_test
@@ -0,0 +1,33 @@
+#!/home/jake/miniconda3/envs/rknn/bin/python
+# EASY-INSTALL-ENTRY-SCRIPT: 'cam-test==0.1.0','console_scripts','cam_test'
+import re
+import sys
+
+# for compatibility with easy_install; see #2198
+__requires__ = 'cam-test==0.1.0'
+
+try:
+ from importlib.metadata import distribution
+except ImportError:
+ try:
+ from importlib_metadata import distribution
+ except ImportError:
+ from pkg_resources import load_entry_point
+
+
+def importlib_load_entry_point(spec, group, name):
+ dist_name, _, _ = spec.partition('==')
+ matches = (
+ entry_point
+ for entry_point in distribution(dist_name).entry_points
+ if entry_point.group == group and entry_point.name == name
+ )
+ return next(matches).load()
+
+
+globals().setdefault('load_entry_point', importlib_load_entry_point)
+
+
+if __name__ == '__main__':
+ sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
+ sys.exit(load_entry_point('cam-test==0.1.0', 'console_scripts', 'cam_test')())
diff --git a/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/PKG-INFO b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/PKG-INFO
new file mode 100644
index 0000000..44fe8d9
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/PKG-INFO
@@ -0,0 +1,7 @@
+Metadata-Version: 2.1
+Name: cam-test
+Version: 0.1.0
+Summary: Minimal Cam Test publisher
+Maintainer: jake
+Maintainer-email: jake@example.com
+License: MIT
diff --git a/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/SOURCES.txt b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/SOURCES.txt
new file mode 100644
index 0000000..3377802
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/SOURCES.txt
@@ -0,0 +1,12 @@
+package.xml
+setup.py
+build/cam_test/cam_test.egg-info/PKG-INFO
+build/cam_test/cam_test.egg-info/SOURCES.txt
+build/cam_test/cam_test.egg-info/dependency_links.txt
+build/cam_test/cam_test.egg-info/entry_points.txt
+build/cam_test/cam_test.egg-info/requires.txt
+build/cam_test/cam_test.egg-info/top_level.txt
+build/cam_test/cam_test.egg-info/zip-safe
+cam_test/__init__.py
+cam_test/cam_test.py
+resource/cam_test
\ No newline at end of file
diff --git a/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/dependency_links.txt b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/entry_points.txt b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/entry_points.txt
new file mode 100644
index 0000000..de71f3f
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/entry_points.txt
@@ -0,0 +1,2 @@
+[console_scripts]
+cam_test = cam_test.cam_test:main
diff --git a/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/requires.txt b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/requires.txt
new file mode 100644
index 0000000..49fe098
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/requires.txt
@@ -0,0 +1 @@
+setuptools
diff --git a/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/top_level.txt b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/top_level.txt
new file mode 100644
index 0000000..36a80fa
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/top_level.txt
@@ -0,0 +1 @@
+cam_test
diff --git a/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/zip-safe b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/zip-safe
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info/zip-safe
@@ -0,0 +1 @@
+
diff --git a/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test/__init__.py b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test/__pycache__/__init__.cpython-312.pyc b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000..fa9f13f
Binary files /dev/null and b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test/__pycache__/__init__.cpython-312.pyc differ
diff --git a/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test/__pycache__/cam_test.cpython-312.pyc b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test/__pycache__/cam_test.cpython-312.pyc
new file mode 100644
index 0000000..946ed0c
Binary files /dev/null and b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test/__pycache__/cam_test.cpython-312.pyc differ
diff --git a/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test/cam_test.py b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test/cam_test.py
new file mode 100644
index 0000000..46691fe
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/lib/python3.12/site-packages/cam_test/cam_test.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python3
+import rclpy
+from rclpy.node import Node
+from std_msgs.msg import String
+
+class CamPublisher(Node):
+ def __init__(self):
+ super().__init__('cam_publisher')
+ self.publisher_ = self.create_publisher(String, 'cam_topic', 10)
+ self.timer = self.create_timer(1.0, self.publish_message)
+
+ def publish_message(self):
+ msg = String()
+ msg.data = 'Cam from ROS 2!'
+ self.publisher_.publish(msg)
+ self.get_logger().info(f'Published: {msg.data}')
+
+def main():
+ rclpy.init()
+ node = CamPublisher()
+ rclpy.spin(node)
+ node.destroy_node()
+ rclpy.shutdown()
+
+if __name__ == '__main__':
+ main()
diff --git a/src/voice_to_text_node/install/cam_test/share/ament_index/resource_index/packages/cam_test b/src/voice_to_text_node/install/cam_test/share/ament_index/resource_index/packages/cam_test
new file mode 100644
index 0000000..e69de29
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/hook/ament_prefix_path.dsv b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/ament_prefix_path.dsv
new file mode 100644
index 0000000..79d4c95
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/ament_prefix_path.dsv
@@ -0,0 +1 @@
+prepend-non-duplicate;AMENT_PREFIX_PATH;
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/hook/ament_prefix_path.ps1 b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/ament_prefix_path.ps1
new file mode 100644
index 0000000..26b9997
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/ament_prefix_path.ps1
@@ -0,0 +1,3 @@
+# generated from colcon_powershell/shell/template/hook_prepend_value.ps1.em
+
+colcon_prepend_unique_value AMENT_PREFIX_PATH "$env:COLCON_CURRENT_PREFIX"
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/hook/ament_prefix_path.sh b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/ament_prefix_path.sh
new file mode 100644
index 0000000..f3041f6
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/ament_prefix_path.sh
@@ -0,0 +1,3 @@
+# generated from colcon_core/shell/template/hook_prepend_value.sh.em
+
+_colcon_prepend_unique_value AMENT_PREFIX_PATH "$COLCON_CURRENT_PREFIX"
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/hook/path.dsv b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/path.dsv
new file mode 100644
index 0000000..95435e0
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/path.dsv
@@ -0,0 +1 @@
+prepend-non-duplicate;PATH;bin
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/hook/path.ps1 b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/path.ps1
new file mode 100644
index 0000000..0b980ef
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/path.ps1
@@ -0,0 +1,3 @@
+# generated from colcon_powershell/shell/template/hook_prepend_value.ps1.em
+
+colcon_prepend_unique_value PATH "$env:COLCON_CURRENT_PREFIX\bin"
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/hook/path.sh b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/path.sh
new file mode 100644
index 0000000..295266d
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/path.sh
@@ -0,0 +1,3 @@
+# generated from colcon_core/shell/template/hook_prepend_value.sh.em
+
+_colcon_prepend_unique_value PATH "$COLCON_CURRENT_PREFIX/bin"
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonpath.dsv b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonpath.dsv
new file mode 100644
index 0000000..c2ddcdb
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonpath.dsv
@@ -0,0 +1 @@
+prepend-non-duplicate;PYTHONPATH;lib/python3.12/site-packages
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonpath.ps1 b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonpath.ps1
new file mode 100644
index 0000000..bdd69af
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonpath.ps1
@@ -0,0 +1,3 @@
+# generated from colcon_powershell/shell/template/hook_prepend_value.ps1.em
+
+colcon_prepend_unique_value PYTHONPATH "$env:COLCON_CURRENT_PREFIX\lib/python3.12/site-packages"
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonpath.sh b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonpath.sh
new file mode 100644
index 0000000..45388fe
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonpath.sh
@@ -0,0 +1,3 @@
+# generated from colcon_core/shell/template/hook_prepend_value.sh.em
+
+_colcon_prepend_unique_value PYTHONPATH "$COLCON_CURRENT_PREFIX/lib/python3.12/site-packages"
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonscriptspath.dsv b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonscriptspath.dsv
new file mode 100644
index 0000000..95435e0
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonscriptspath.dsv
@@ -0,0 +1 @@
+prepend-non-duplicate;PATH;bin
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonscriptspath.ps1 b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonscriptspath.ps1
new file mode 100644
index 0000000..0b980ef
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonscriptspath.ps1
@@ -0,0 +1,3 @@
+# generated from colcon_powershell/shell/template/hook_prepend_value.ps1.em
+
+colcon_prepend_unique_value PATH "$env:COLCON_CURRENT_PREFIX\bin"
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonscriptspath.sh b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonscriptspath.sh
new file mode 100644
index 0000000..295266d
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/hook/pythonscriptspath.sh
@@ -0,0 +1,3 @@
+# generated from colcon_core/shell/template/hook_prepend_value.sh.em
+
+_colcon_prepend_unique_value PATH "$COLCON_CURRENT_PREFIX/bin"
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/package.bash b/src/voice_to_text_node/install/cam_test/share/cam_test/package.bash
new file mode 100644
index 0000000..ea4b77b
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/package.bash
@@ -0,0 +1,31 @@
+# generated from colcon_bash/shell/template/package.bash.em
+
+# This script extends the environment for this package.
+
+# a bash script is able to determine its own path if necessary
+if [ -z "$COLCON_CURRENT_PREFIX" ]; then
+ # the prefix is two levels up from the package specific share directory
+ _colcon_package_bash_COLCON_CURRENT_PREFIX="$(builtin cd "`dirname "${BASH_SOURCE[0]}"`/../.." > /dev/null && pwd)"
+else
+ _colcon_package_bash_COLCON_CURRENT_PREFIX="$COLCON_CURRENT_PREFIX"
+fi
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+# additional arguments: arguments to the script
+_colcon_package_bash_source_script() {
+ if [ -f "$1" ]; then
+ if [ -n "$COLCON_TRACE" ]; then
+ echo "# . \"$1\""
+ fi
+ . "$@"
+ else
+ echo "not found: \"$1\"" 1>&2
+ fi
+}
+
+# source sh script of this package
+_colcon_package_bash_source_script "$_colcon_package_bash_COLCON_CURRENT_PREFIX/share/cam_test/package.sh"
+
+unset _colcon_package_bash_source_script
+unset _colcon_package_bash_COLCON_CURRENT_PREFIX
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/package.dsv b/src/voice_to_text_node/install/cam_test/share/cam_test/package.dsv
new file mode 100644
index 0000000..8beb19c
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/package.dsv
@@ -0,0 +1,12 @@
+source;share/cam_test/hook/path.ps1
+source;share/cam_test/hook/path.dsv
+source;share/cam_test/hook/path.sh
+source;share/cam_test/hook/pythonpath.ps1
+source;share/cam_test/hook/pythonpath.dsv
+source;share/cam_test/hook/pythonpath.sh
+source;share/cam_test/hook/pythonscriptspath.ps1
+source;share/cam_test/hook/pythonscriptspath.dsv
+source;share/cam_test/hook/pythonscriptspath.sh
+source;share/cam_test/hook/ament_prefix_path.ps1
+source;share/cam_test/hook/ament_prefix_path.dsv
+source;share/cam_test/hook/ament_prefix_path.sh
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/package.ps1 b/src/voice_to_text_node/install/cam_test/share/cam_test/package.ps1
new file mode 100644
index 0000000..dce86f9
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/package.ps1
@@ -0,0 +1,118 @@
+# generated from colcon_powershell/shell/template/package.ps1.em
+
+# function to append a value to a variable
+# which uses colons as separators
+# duplicates as well as leading separators are avoided
+# first argument: the name of the result variable
+# second argument: the value to be prepended
+function colcon_append_unique_value {
+ param (
+ $_listname,
+ $_value
+ )
+
+ # get values from variable
+ if (Test-Path Env:$_listname) {
+ $_values=(Get-Item env:$_listname).Value
+ } else {
+ $_values=""
+ }
+ $_duplicate=""
+ # start with no values
+ $_all_values=""
+ # iterate over existing values in the variable
+ if ($_values) {
+ $_values.Split(";") | ForEach {
+ # not an empty string
+ if ($_) {
+ # not a duplicate of _value
+ if ($_ -eq $_value) {
+ $_duplicate="1"
+ }
+ if ($_all_values) {
+ $_all_values="${_all_values};$_"
+ } else {
+ $_all_values="$_"
+ }
+ }
+ }
+ }
+ # append only non-duplicates
+ if (!$_duplicate) {
+ # avoid leading separator
+ if ($_all_values) {
+ $_all_values="${_all_values};${_value}"
+ } else {
+ $_all_values="${_value}"
+ }
+ }
+
+ # export the updated variable
+ Set-Item env:\$_listname -Value "$_all_values"
+}
+
+# function to prepend a value to a variable
+# which uses colons as separators
+# duplicates as well as trailing separators are avoided
+# first argument: the name of the result variable
+# second argument: the value to be prepended
+function colcon_prepend_unique_value {
+ param (
+ $_listname,
+ $_value
+ )
+
+ # get values from variable
+ if (Test-Path Env:$_listname) {
+ $_values=(Get-Item env:$_listname).Value
+ } else {
+ $_values=""
+ }
+ # start with the new value
+ $_all_values="$_value"
+ # iterate over existing values in the variable
+ if ($_values) {
+ $_values.Split(";") | ForEach {
+ # not an empty string
+ if ($_) {
+ # not a duplicate of _value
+ if ($_ -ne $_value) {
+ # keep non-duplicate values
+ $_all_values="${_all_values};$_"
+ }
+ }
+ }
+ }
+ # export the updated variable
+ Set-Item env:\$_listname -Value "$_all_values"
+}
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+# additional arguments: arguments to the script
+function colcon_package_source_powershell_script {
+ param (
+ $_colcon_package_source_powershell_script
+ )
+ # source script with conditional trace output
+ if (Test-Path $_colcon_package_source_powershell_script) {
+ if ($env:COLCON_TRACE) {
+ echo ". '$_colcon_package_source_powershell_script'"
+ }
+ . "$_colcon_package_source_powershell_script"
+ } else {
+ Write-Error "not found: '$_colcon_package_source_powershell_script'"
+ }
+}
+
+
+# a powershell script is able to determine its own path
+# the prefix is two levels up from the package specific share directory
+$env:COLCON_CURRENT_PREFIX=(Get-Item $PSCommandPath).Directory.Parent.Parent.FullName
+
+colcon_package_source_powershell_script "$env:COLCON_CURRENT_PREFIX\share/cam_test/hook/path.ps1"
+colcon_package_source_powershell_script "$env:COLCON_CURRENT_PREFIX\share/cam_test/hook/pythonpath.ps1"
+colcon_package_source_powershell_script "$env:COLCON_CURRENT_PREFIX\share/cam_test/hook/pythonscriptspath.ps1"
+colcon_package_source_powershell_script "$env:COLCON_CURRENT_PREFIX\share/cam_test/hook/ament_prefix_path.ps1"
+
+Remove-Item Env:\COLCON_CURRENT_PREFIX
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/package.sh b/src/voice_to_text_node/install/cam_test/share/cam_test/package.sh
new file mode 100644
index 0000000..b46ac91
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/package.sh
@@ -0,0 +1,89 @@
+# generated from colcon_core/shell/template/package.sh.em
+
+# This script extends the environment for this package.
+
+# function to prepend a value to a variable
+# which uses colons as separators
+# duplicates as well as trailing separators are avoided
+# first argument: the name of the result variable
+# second argument: the value to be prepended
+_colcon_prepend_unique_value() {
+ # arguments
+ _listname="$1"
+ _value="$2"
+
+ # get values from variable
+ eval _values=\"\$$_listname\"
+ # backup the field separator
+ _colcon_prepend_unique_value_IFS=$IFS
+ IFS=":"
+ # start with the new value
+ _all_values="$_value"
+ # workaround SH_WORD_SPLIT not being set in zsh
+ if [ "$(command -v colcon_zsh_convert_to_array)" ]; then
+ colcon_zsh_convert_to_array _values
+ fi
+ # iterate over existing values in the variable
+ for _item in $_values; do
+ # ignore empty strings
+ if [ -z "$_item" ]; then
+ continue
+ fi
+ # ignore duplicates of _value
+ if [ "$_item" = "$_value" ]; then
+ continue
+ fi
+ # keep non-duplicate values
+ _all_values="$_all_values:$_item"
+ done
+ unset _item
+ # restore the field separator
+ IFS=$_colcon_prepend_unique_value_IFS
+ unset _colcon_prepend_unique_value_IFS
+ # export the updated variable
+ eval export $_listname=\"$_all_values\"
+ unset _all_values
+ unset _values
+
+ unset _value
+ unset _listname
+}
+
+# since a plain shell script can't determine its own path when being sourced
+# either use the provided COLCON_CURRENT_PREFIX
+# or fall back to the build time prefix (if it exists)
+_colcon_package_sh_COLCON_CURRENT_PREFIX="/home/jake/ros2_ws/src/cam_test/install/cam_test"
+if [ -z "$COLCON_CURRENT_PREFIX" ]; then
+ if [ ! -d "$_colcon_package_sh_COLCON_CURRENT_PREFIX" ]; then
+ echo "The build time path \"$_colcon_package_sh_COLCON_CURRENT_PREFIX\" doesn't exist. Either source a script for a different shell or set the environment variable \"COLCON_CURRENT_PREFIX\" explicitly." 1>&2
+ unset _colcon_package_sh_COLCON_CURRENT_PREFIX
+ return 1
+ fi
+ COLCON_CURRENT_PREFIX="$_colcon_package_sh_COLCON_CURRENT_PREFIX"
+fi
+unset _colcon_package_sh_COLCON_CURRENT_PREFIX
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+# additional arguments: arguments to the script
+_colcon_package_sh_source_script() {
+ if [ -f "$1" ]; then
+ if [ -n "$COLCON_TRACE" ]; then
+ echo "# . \"$1\""
+ fi
+ . "$@"
+ else
+ echo "not found: \"$1\"" 1>&2
+ fi
+}
+
+# source sh hooks
+_colcon_package_sh_source_script "$COLCON_CURRENT_PREFIX/share/cam_test/hook/path.sh"
+_colcon_package_sh_source_script "$COLCON_CURRENT_PREFIX/share/cam_test/hook/pythonpath.sh"
+_colcon_package_sh_source_script "$COLCON_CURRENT_PREFIX/share/cam_test/hook/pythonscriptspath.sh"
+_colcon_package_sh_source_script "$COLCON_CURRENT_PREFIX/share/cam_test/hook/ament_prefix_path.sh"
+
+unset _colcon_package_sh_source_script
+unset COLCON_CURRENT_PREFIX
+
+# do not unset _colcon_prepend_unique_value since it might be used by non-primary shell hooks
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/package.xml b/src/voice_to_text_node/install/cam_test/share/cam_test/package.xml
new file mode 100644
index 0000000..a7001df
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/package.xml
@@ -0,0 +1,19 @@
+
+
+ cam_test
+ 0.1.0
+ Minimal Cam Test publisher
+ Jake
+ MIT
+
+ ament_python
+ rclpy
+ std_msgs
+
+ ament_lint_auto
+ ament_lint_common
+
+
+ ament_python
+
+
diff --git a/src/voice_to_text_node/install/cam_test/share/cam_test/package.zsh b/src/voice_to_text_node/install/cam_test/share/cam_test/package.zsh
new file mode 100644
index 0000000..0a1257b
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/cam_test/package.zsh
@@ -0,0 +1,42 @@
+# generated from colcon_zsh/shell/template/package.zsh.em
+
+# This script extends the environment for this package.
+
+# a zsh script is able to determine its own path if necessary
+if [ -z "$COLCON_CURRENT_PREFIX" ]; then
+ # the prefix is two levels up from the package specific share directory
+ _colcon_package_zsh_COLCON_CURRENT_PREFIX="$(builtin cd -q "`dirname "${(%):-%N}"`/../.." > /dev/null && pwd)"
+else
+ _colcon_package_zsh_COLCON_CURRENT_PREFIX="$COLCON_CURRENT_PREFIX"
+fi
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+# additional arguments: arguments to the script
+_colcon_package_zsh_source_script() {
+ if [ -f "$1" ]; then
+ if [ -n "$COLCON_TRACE" ]; then
+ echo "# . \"$1\""
+ fi
+ . "$@"
+ else
+ echo "not found: \"$1\"" 1>&2
+ fi
+}
+
+# function to convert array-like strings into arrays
+# to workaround SH_WORD_SPLIT not being set
+colcon_zsh_convert_to_array() {
+ local _listname=$1
+ local _dollar="$"
+ local _split="{="
+ local _to_array="(\"$_dollar$_split$_listname}\")"
+ eval $_listname=$_to_array
+}
+
+# source sh script of this package
+_colcon_package_zsh_source_script "$_colcon_package_zsh_COLCON_CURRENT_PREFIX/share/cam_test/package.sh"
+unset convert_zsh_to_array
+
+unset _colcon_package_zsh_source_script
+unset _colcon_package_zsh_COLCON_CURRENT_PREFIX
diff --git a/src/voice_to_text_node/install/cam_test/share/colcon-core/packages/cam_test b/src/voice_to_text_node/install/cam_test/share/colcon-core/packages/cam_test
new file mode 100644
index 0000000..de58d89
--- /dev/null
+++ b/src/voice_to_text_node/install/cam_test/share/colcon-core/packages/cam_test
@@ -0,0 +1 @@
+rclpy:std_msgs
\ No newline at end of file
diff --git a/src/voice_to_text_node/install/local_setup.bash b/src/voice_to_text_node/install/local_setup.bash
new file mode 100644
index 0000000..03f0025
--- /dev/null
+++ b/src/voice_to_text_node/install/local_setup.bash
@@ -0,0 +1,121 @@
+# generated from colcon_bash/shell/template/prefix.bash.em
+
+# This script extends the environment with all packages contained in this
+# prefix path.
+
+# a bash script is able to determine its own path if necessary
+if [ -z "$COLCON_CURRENT_PREFIX" ]; then
+ _colcon_prefix_bash_COLCON_CURRENT_PREFIX="$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)"
+else
+ _colcon_prefix_bash_COLCON_CURRENT_PREFIX="$COLCON_CURRENT_PREFIX"
+fi
+
+# function to prepend a value to a variable
+# which uses colons as separators
+# duplicates as well as trailing separators are avoided
+# first argument: the name of the result variable
+# second argument: the value to be prepended
+_colcon_prefix_bash_prepend_unique_value() {
+ # arguments
+ _listname="$1"
+ _value="$2"
+
+ # get values from variable
+ eval _values=\"\$$_listname\"
+ # backup the field separator
+ _colcon_prefix_bash_prepend_unique_value_IFS="$IFS"
+ IFS=":"
+ # start with the new value
+ _all_values="$_value"
+ _contained_value=""
+ # iterate over existing values in the variable
+ for _item in $_values; do
+ # ignore empty strings
+ if [ -z "$_item" ]; then
+ continue
+ fi
+ # ignore duplicates of _value
+ if [ "$_item" = "$_value" ]; then
+ _contained_value=1
+ continue
+ fi
+ # keep non-duplicate values
+ _all_values="$_all_values:$_item"
+ done
+ unset _item
+ if [ -z "$_contained_value" ]; then
+ if [ -n "$COLCON_TRACE" ]; then
+ if [ "$_all_values" = "$_value" ]; then
+ echo "export $_listname=$_value"
+ else
+ echo "export $_listname=$_value:\$$_listname"
+ fi
+ fi
+ fi
+ unset _contained_value
+ # restore the field separator
+ IFS="$_colcon_prefix_bash_prepend_unique_value_IFS"
+ unset _colcon_prefix_bash_prepend_unique_value_IFS
+ # export the updated variable
+ eval export $_listname=\"$_all_values\"
+ unset _all_values
+ unset _values
+
+ unset _value
+ unset _listname
+}
+
+# add this prefix to the COLCON_PREFIX_PATH
+_colcon_prefix_bash_prepend_unique_value COLCON_PREFIX_PATH "$_colcon_prefix_bash_COLCON_CURRENT_PREFIX"
+unset _colcon_prefix_bash_prepend_unique_value
+
+# check environment variable for custom Python executable
+if [ -n "$COLCON_PYTHON_EXECUTABLE" ]; then
+ if [ ! -f "$COLCON_PYTHON_EXECUTABLE" ]; then
+ echo "error: COLCON_PYTHON_EXECUTABLE '$COLCON_PYTHON_EXECUTABLE' doesn't exist"
+ return 1
+ fi
+ _colcon_python_executable="$COLCON_PYTHON_EXECUTABLE"
+else
+ # try the Python executable known at configure time
+ _colcon_python_executable="/usr/bin/python3"
+ # if it doesn't exist try a fall back
+ if [ ! -f "$_colcon_python_executable" ]; then
+ if ! /usr/bin/env python3 --version > /dev/null 2> /dev/null; then
+ echo "error: unable to find python3 executable"
+ return 1
+ fi
+ _colcon_python_executable=`/usr/bin/env python3 -c "import sys; print(sys.executable)"`
+ fi
+fi
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+_colcon_prefix_sh_source_script() {
+ if [ -f "$1" ]; then
+ if [ -n "$COLCON_TRACE" ]; then
+ echo "# . \"$1\""
+ fi
+ . "$1"
+ else
+ echo "not found: \"$1\"" 1>&2
+ fi
+}
+
+# get all commands in topological order
+_colcon_ordered_commands="$($_colcon_python_executable "$_colcon_prefix_bash_COLCON_CURRENT_PREFIX/_local_setup_util_sh.py" sh bash)"
+unset _colcon_python_executable
+if [ -n "$COLCON_TRACE" ]; then
+ echo "$(declare -f _colcon_prefix_sh_source_script)"
+ echo "# Execute generated script:"
+ echo "# <<<"
+ echo "${_colcon_ordered_commands}"
+ echo "# >>>"
+ echo "unset _colcon_prefix_sh_source_script"
+fi
+eval "${_colcon_ordered_commands}"
+unset _colcon_ordered_commands
+
+unset _colcon_prefix_sh_source_script
+
+unset _colcon_prefix_bash_COLCON_CURRENT_PREFIX
diff --git a/src/voice_to_text_node/install/local_setup.ps1 b/src/voice_to_text_node/install/local_setup.ps1
new file mode 100644
index 0000000..6f68c8d
--- /dev/null
+++ b/src/voice_to_text_node/install/local_setup.ps1
@@ -0,0 +1,55 @@
+# generated from colcon_powershell/shell/template/prefix.ps1.em
+
+# This script extends the environment with all packages contained in this
+# prefix path.
+
+# check environment variable for custom Python executable
+if ($env:COLCON_PYTHON_EXECUTABLE) {
+ if (!(Test-Path "$env:COLCON_PYTHON_EXECUTABLE" -PathType Leaf)) {
+ echo "error: COLCON_PYTHON_EXECUTABLE '$env:COLCON_PYTHON_EXECUTABLE' doesn't exist"
+ exit 1
+ }
+ $_colcon_python_executable="$env:COLCON_PYTHON_EXECUTABLE"
+} else {
+ # use the Python executable known at configure time
+ $_colcon_python_executable="/usr/bin/python3"
+ # if it doesn't exist try a fall back
+ if (!(Test-Path "$_colcon_python_executable" -PathType Leaf)) {
+ if (!(Get-Command "python3" -ErrorAction SilentlyContinue)) {
+ echo "error: unable to find python3 executable"
+ exit 1
+ }
+ $_colcon_python_executable="python3"
+ }
+}
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+function _colcon_prefix_powershell_source_script {
+ param (
+ $_colcon_prefix_powershell_source_script_param
+ )
+ # source script with conditional trace output
+ if (Test-Path $_colcon_prefix_powershell_source_script_param) {
+ if ($env:COLCON_TRACE) {
+ echo ". '$_colcon_prefix_powershell_source_script_param'"
+ }
+ . "$_colcon_prefix_powershell_source_script_param"
+ } else {
+ Write-Error "not found: '$_colcon_prefix_powershell_source_script_param'"
+ }
+}
+
+# get all commands in topological order
+$_colcon_ordered_commands = & "$_colcon_python_executable" "$(Split-Path $PSCommandPath -Parent)/_local_setup_util_ps1.py" ps1
+
+# execute all commands in topological order
+if ($env:COLCON_TRACE) {
+ echo "Execute generated script:"
+ echo "<<<"
+ $_colcon_ordered_commands.Split([Environment]::NewLine, [StringSplitOptions]::RemoveEmptyEntries) | Write-Output
+ echo ">>>"
+}
+if ($_colcon_ordered_commands) {
+ $_colcon_ordered_commands.Split([Environment]::NewLine, [StringSplitOptions]::RemoveEmptyEntries) | Invoke-Expression
+}
diff --git a/src/voice_to_text_node/install/local_setup.sh b/src/voice_to_text_node/install/local_setup.sh
new file mode 100644
index 0000000..0097ccc
--- /dev/null
+++ b/src/voice_to_text_node/install/local_setup.sh
@@ -0,0 +1,137 @@
+# generated from colcon_core/shell/template/prefix.sh.em
+
+# This script extends the environment with all packages contained in this
+# prefix path.
+
+# since a plain shell script can't determine its own path when being sourced
+# either use the provided COLCON_CURRENT_PREFIX
+# or fall back to the build time prefix (if it exists)
+_colcon_prefix_sh_COLCON_CURRENT_PREFIX="/home/jake/ros2_ws/src/cam_test/install"
+if [ -z "$COLCON_CURRENT_PREFIX" ]; then
+ if [ ! -d "$_colcon_prefix_sh_COLCON_CURRENT_PREFIX" ]; then
+ echo "The build time path \"$_colcon_prefix_sh_COLCON_CURRENT_PREFIX\" doesn't exist. Either source a script for a different shell or set the environment variable \"COLCON_CURRENT_PREFIX\" explicitly." 1>&2
+ unset _colcon_prefix_sh_COLCON_CURRENT_PREFIX
+ return 1
+ fi
+else
+ _colcon_prefix_sh_COLCON_CURRENT_PREFIX="$COLCON_CURRENT_PREFIX"
+fi
+
+# function to prepend a value to a variable
+# which uses colons as separators
+# duplicates as well as trailing separators are avoided
+# first argument: the name of the result variable
+# second argument: the value to be prepended
+_colcon_prefix_sh_prepend_unique_value() {
+ # arguments
+ _listname="$1"
+ _value="$2"
+
+ # get values from variable
+ eval _values=\"\$$_listname\"
+ # backup the field separator
+ _colcon_prefix_sh_prepend_unique_value_IFS="$IFS"
+ IFS=":"
+ # start with the new value
+ _all_values="$_value"
+ _contained_value=""
+ # iterate over existing values in the variable
+ for _item in $_values; do
+ # ignore empty strings
+ if [ -z "$_item" ]; then
+ continue
+ fi
+ # ignore duplicates of _value
+ if [ "$_item" = "$_value" ]; then
+ _contained_value=1
+ continue
+ fi
+ # keep non-duplicate values
+ _all_values="$_all_values:$_item"
+ done
+ unset _item
+ if [ -z "$_contained_value" ]; then
+ if [ -n "$COLCON_TRACE" ]; then
+ if [ "$_all_values" = "$_value" ]; then
+ echo "export $_listname=$_value"
+ else
+ echo "export $_listname=$_value:\$$_listname"
+ fi
+ fi
+ fi
+ unset _contained_value
+ # restore the field separator
+ IFS="$_colcon_prefix_sh_prepend_unique_value_IFS"
+ unset _colcon_prefix_sh_prepend_unique_value_IFS
+ # export the updated variable
+ eval export $_listname=\"$_all_values\"
+ unset _all_values
+ unset _values
+
+ unset _value
+ unset _listname
+}
+
+# add this prefix to the COLCON_PREFIX_PATH
+_colcon_prefix_sh_prepend_unique_value COLCON_PREFIX_PATH "$_colcon_prefix_sh_COLCON_CURRENT_PREFIX"
+unset _colcon_prefix_sh_prepend_unique_value
+
+# check environment variable for custom Python executable
+if [ -n "$COLCON_PYTHON_EXECUTABLE" ]; then
+ if [ ! -f "$COLCON_PYTHON_EXECUTABLE" ]; then
+ echo "error: COLCON_PYTHON_EXECUTABLE '$COLCON_PYTHON_EXECUTABLE' doesn't exist"
+ return 1
+ fi
+ _colcon_python_executable="$COLCON_PYTHON_EXECUTABLE"
+else
+ # try the Python executable known at configure time
+ _colcon_python_executable="/usr/bin/python3"
+ # if it doesn't exist try a fall back
+ if [ ! -f "$_colcon_python_executable" ]; then
+ if ! /usr/bin/env python3 --version > /dev/null 2> /dev/null; then
+ echo "error: unable to find python3 executable"
+ return 1
+ fi
+ _colcon_python_executable=`/usr/bin/env python3 -c "import sys; print(sys.executable)"`
+ fi
+fi
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+_colcon_prefix_sh_source_script() {
+ if [ -f "$1" ]; then
+ if [ -n "$COLCON_TRACE" ]; then
+ echo "# . \"$1\""
+ fi
+ . "$1"
+ else
+ echo "not found: \"$1\"" 1>&2
+ fi
+}
+
+# get all commands in topological order
+_colcon_ordered_commands="$($_colcon_python_executable "$_colcon_prefix_sh_COLCON_CURRENT_PREFIX/_local_setup_util_sh.py" sh)"
+unset _colcon_python_executable
+if [ -n "$COLCON_TRACE" ]; then
+ echo "_colcon_prefix_sh_source_script() {
+ if [ -f \"\$1\" ]; then
+ if [ -n \"\$COLCON_TRACE\" ]; then
+ echo \"# . \\\"\$1\\\"\"
+ fi
+ . \"\$1\"
+ else
+ echo \"not found: \\\"\$1\\\"\" 1>&2
+ fi
+ }"
+ echo "# Execute generated script:"
+ echo "# <<<"
+ echo "${_colcon_ordered_commands}"
+ echo "# >>>"
+ echo "unset _colcon_prefix_sh_source_script"
+fi
+eval "${_colcon_ordered_commands}"
+unset _colcon_ordered_commands
+
+unset _colcon_prefix_sh_source_script
+
+unset _colcon_prefix_sh_COLCON_CURRENT_PREFIX
diff --git a/src/voice_to_text_node/install/local_setup.zsh b/src/voice_to_text_node/install/local_setup.zsh
new file mode 100644
index 0000000..b648710
--- /dev/null
+++ b/src/voice_to_text_node/install/local_setup.zsh
@@ -0,0 +1,134 @@
+# generated from colcon_zsh/shell/template/prefix.zsh.em
+
+# This script extends the environment with all packages contained in this
+# prefix path.
+
+# a zsh script is able to determine its own path if necessary
+if [ -z "$COLCON_CURRENT_PREFIX" ]; then
+ _colcon_prefix_zsh_COLCON_CURRENT_PREFIX="$(builtin cd -q "`dirname "${(%):-%N}"`" > /dev/null && pwd)"
+else
+ _colcon_prefix_zsh_COLCON_CURRENT_PREFIX="$COLCON_CURRENT_PREFIX"
+fi
+
+# function to convert array-like strings into arrays
+# to workaround SH_WORD_SPLIT not being set
+_colcon_prefix_zsh_convert_to_array() {
+ local _listname=$1
+ local _dollar="$"
+ local _split="{="
+ local _to_array="(\"$_dollar$_split$_listname}\")"
+ eval $_listname=$_to_array
+}
+
+# function to prepend a value to a variable
+# which uses colons as separators
+# duplicates as well as trailing separators are avoided
+# first argument: the name of the result variable
+# second argument: the value to be prepended
+_colcon_prefix_zsh_prepend_unique_value() {
+ # arguments
+ _listname="$1"
+ _value="$2"
+
+ # get values from variable
+ eval _values=\"\$$_listname\"
+ # backup the field separator
+ _colcon_prefix_zsh_prepend_unique_value_IFS="$IFS"
+ IFS=":"
+ # start with the new value
+ _all_values="$_value"
+ _contained_value=""
+ # workaround SH_WORD_SPLIT not being set
+ _colcon_prefix_zsh_convert_to_array _values
+ # iterate over existing values in the variable
+ for _item in $_values; do
+ # ignore empty strings
+ if [ -z "$_item" ]; then
+ continue
+ fi
+ # ignore duplicates of _value
+ if [ "$_item" = "$_value" ]; then
+ _contained_value=1
+ continue
+ fi
+ # keep non-duplicate values
+ _all_values="$_all_values:$_item"
+ done
+ unset _item
+ if [ -z "$_contained_value" ]; then
+ if [ -n "$COLCON_TRACE" ]; then
+ if [ "$_all_values" = "$_value" ]; then
+ echo "export $_listname=$_value"
+ else
+ echo "export $_listname=$_value:\$$_listname"
+ fi
+ fi
+ fi
+ unset _contained_value
+ # restore the field separator
+ IFS="$_colcon_prefix_zsh_prepend_unique_value_IFS"
+ unset _colcon_prefix_zsh_prepend_unique_value_IFS
+ # export the updated variable
+ eval export $_listname=\"$_all_values\"
+ unset _all_values
+ unset _values
+
+ unset _value
+ unset _listname
+}
+
+# add this prefix to the COLCON_PREFIX_PATH
+_colcon_prefix_zsh_prepend_unique_value COLCON_PREFIX_PATH "$_colcon_prefix_zsh_COLCON_CURRENT_PREFIX"
+unset _colcon_prefix_zsh_prepend_unique_value
+unset _colcon_prefix_zsh_convert_to_array
+
+# check environment variable for custom Python executable
+if [ -n "$COLCON_PYTHON_EXECUTABLE" ]; then
+ if [ ! -f "$COLCON_PYTHON_EXECUTABLE" ]; then
+ echo "error: COLCON_PYTHON_EXECUTABLE '$COLCON_PYTHON_EXECUTABLE' doesn't exist"
+ return 1
+ fi
+ _colcon_python_executable="$COLCON_PYTHON_EXECUTABLE"
+else
+ # try the Python executable known at configure time
+ _colcon_python_executable="/usr/bin/python3"
+ # if it doesn't exist try a fall back
+ if [ ! -f "$_colcon_python_executable" ]; then
+ if ! /usr/bin/env python3 --version > /dev/null 2> /dev/null; then
+ echo "error: unable to find python3 executable"
+ return 1
+ fi
+ _colcon_python_executable=`/usr/bin/env python3 -c "import sys; print(sys.executable)"`
+ fi
+fi
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+_colcon_prefix_sh_source_script() {
+ if [ -f "$1" ]; then
+ if [ -n "$COLCON_TRACE" ]; then
+ echo "# . \"$1\""
+ fi
+ . "$1"
+ else
+ echo "not found: \"$1\"" 1>&2
+ fi
+}
+
+# get all commands in topological order
+_colcon_ordered_commands="$($_colcon_python_executable "$_colcon_prefix_zsh_COLCON_CURRENT_PREFIX/_local_setup_util_sh.py" sh zsh)"
+unset _colcon_python_executable
+if [ -n "$COLCON_TRACE" ]; then
+ echo "$(declare -f _colcon_prefix_sh_source_script)"
+ echo "# Execute generated script:"
+ echo "# <<<"
+ echo "${_colcon_ordered_commands}"
+ echo "# >>>"
+ echo "unset _colcon_prefix_sh_source_script"
+fi
+eval "${_colcon_ordered_commands}"
+unset _colcon_ordered_commands
+
+unset _colcon_prefix_sh_source_script
+
+unset _colcon_prefix_zsh_COLCON_CURRENT_PREFIX
diff --git a/src/voice_to_text_node/install/setup.bash b/src/voice_to_text_node/install/setup.bash
new file mode 100644
index 0000000..c1ab21b
--- /dev/null
+++ b/src/voice_to_text_node/install/setup.bash
@@ -0,0 +1,34 @@
+# generated from colcon_bash/shell/template/prefix_chain.bash.em
+
+# This script extends the environment with the environment of other prefix
+# paths which were sourced when this file was generated as well as all packages
+# contained in this prefix path.
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+_colcon_prefix_chain_bash_source_script() {
+ if [ -f "$1" ]; then
+ if [ -n "$COLCON_TRACE" ]; then
+ echo "# . \"$1\""
+ fi
+ . "$1"
+ else
+ echo "not found: \"$1\"" 1>&2
+ fi
+}
+
+# source chained prefixes
+# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
+COLCON_CURRENT_PREFIX="/opt/ros/kilted"
+_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash"
+# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
+COLCON_CURRENT_PREFIX="/home/jake/ros2_ws/install"
+_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash"
+
+# source this prefix
+# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
+COLCON_CURRENT_PREFIX="$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)"
+_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash"
+
+unset COLCON_CURRENT_PREFIX
+unset _colcon_prefix_chain_bash_source_script
diff --git a/src/voice_to_text_node/install/setup.ps1 b/src/voice_to_text_node/install/setup.ps1
new file mode 100644
index 0000000..06e97ae
--- /dev/null
+++ b/src/voice_to_text_node/install/setup.ps1
@@ -0,0 +1,30 @@
+# generated from colcon_powershell/shell/template/prefix_chain.ps1.em
+
+# This script extends the environment with the environment of other prefix
+# paths which were sourced when this file was generated as well as all packages
+# contained in this prefix path.
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+function _colcon_prefix_chain_powershell_source_script {
+ param (
+ $_colcon_prefix_chain_powershell_source_script_param
+ )
+ # source script with conditional trace output
+ if (Test-Path $_colcon_prefix_chain_powershell_source_script_param) {
+ if ($env:COLCON_TRACE) {
+ echo ". '$_colcon_prefix_chain_powershell_source_script_param'"
+ }
+ . "$_colcon_prefix_chain_powershell_source_script_param"
+ } else {
+ Write-Error "not found: '$_colcon_prefix_chain_powershell_source_script_param'"
+ }
+}
+
+# source chained prefixes
+_colcon_prefix_chain_powershell_source_script "/opt/ros/kilted\local_setup.ps1"
+_colcon_prefix_chain_powershell_source_script "/home/jake/ros2_ws/install\local_setup.ps1"
+
+# source this prefix
+$env:COLCON_CURRENT_PREFIX=(Split-Path $PSCommandPath -Parent)
+_colcon_prefix_chain_powershell_source_script "$env:COLCON_CURRENT_PREFIX\local_setup.ps1"
diff --git a/src/voice_to_text_node/install/setup.sh b/src/voice_to_text_node/install/setup.sh
new file mode 100644
index 0000000..7fa22f4
--- /dev/null
+++ b/src/voice_to_text_node/install/setup.sh
@@ -0,0 +1,49 @@
+# generated from colcon_core/shell/template/prefix_chain.sh.em
+
+# This script extends the environment with the environment of other prefix
+# paths which were sourced when this file was generated as well as all packages
+# contained in this prefix path.
+
+# since a plain shell script can't determine its own path when being sourced
+# either use the provided COLCON_CURRENT_PREFIX
+# or fall back to the build time prefix (if it exists)
+_colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX=/home/jake/ros2_ws/src/cam_test/install
+if [ ! -z "$COLCON_CURRENT_PREFIX" ]; then
+ _colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX="$COLCON_CURRENT_PREFIX"
+elif [ ! -d "$_colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX" ]; then
+ echo "The build time path \"$_colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX\" doesn't exist. Either source a script for a different shell or set the environment variable \"COLCON_CURRENT_PREFIX\" explicitly." 1>&2
+ unset _colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX
+ return 1
+fi
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+_colcon_prefix_chain_sh_source_script() {
+ if [ -f "$1" ]; then
+ if [ -n "$COLCON_TRACE" ]; then
+ echo "# . \"$1\""
+ fi
+ . "$1"
+ else
+ echo "not found: \"$1\"" 1>&2
+ fi
+}
+
+# source chained prefixes
+# setting COLCON_CURRENT_PREFIX avoids relying on the build time prefix of the sourced script
+COLCON_CURRENT_PREFIX="/opt/ros/kilted"
+_colcon_prefix_chain_sh_source_script "$COLCON_CURRENT_PREFIX/local_setup.sh"
+
+# setting COLCON_CURRENT_PREFIX avoids relying on the build time prefix of the sourced script
+COLCON_CURRENT_PREFIX="/home/jake/ros2_ws/install"
+_colcon_prefix_chain_sh_source_script "$COLCON_CURRENT_PREFIX/local_setup.sh"
+
+
+# source this prefix
+# setting COLCON_CURRENT_PREFIX avoids relying on the build time prefix of the sourced script
+COLCON_CURRENT_PREFIX="$_colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX"
+_colcon_prefix_chain_sh_source_script "$COLCON_CURRENT_PREFIX/local_setup.sh"
+
+unset _colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX
+unset _colcon_prefix_chain_sh_source_script
+unset COLCON_CURRENT_PREFIX
diff --git a/src/voice_to_text_node/install/setup.zsh b/src/voice_to_text_node/install/setup.zsh
new file mode 100644
index 0000000..416cfe8
--- /dev/null
+++ b/src/voice_to_text_node/install/setup.zsh
@@ -0,0 +1,34 @@
+# generated from colcon_zsh/shell/template/prefix_chain.zsh.em
+
+# This script extends the environment with the environment of other prefix
+# paths which were sourced when this file was generated as well as all packages
+# contained in this prefix path.
+
+# function to source another script with conditional trace output
+# first argument: the path of the script
+_colcon_prefix_chain_zsh_source_script() {
+ if [ -f "$1" ]; then
+ if [ -n "$COLCON_TRACE" ]; then
+ echo "# . \"$1\""
+ fi
+ . "$1"
+ else
+ echo "not found: \"$1\"" 1>&2
+ fi
+}
+
+# source chained prefixes
+# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
+COLCON_CURRENT_PREFIX="/opt/ros/kilted"
+_colcon_prefix_chain_zsh_source_script "$COLCON_CURRENT_PREFIX/local_setup.zsh"
+# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
+COLCON_CURRENT_PREFIX="/home/jake/ros2_ws/install"
+_colcon_prefix_chain_zsh_source_script "$COLCON_CURRENT_PREFIX/local_setup.zsh"
+
+# source this prefix
+# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
+COLCON_CURRENT_PREFIX="$(builtin cd -q "`dirname "${(%):-%N}"`" > /dev/null && pwd)"
+_colcon_prefix_chain_zsh_source_script "$COLCON_CURRENT_PREFIX/local_setup.zsh"
+
+unset COLCON_CURRENT_PREFIX
+unset _colcon_prefix_chain_zsh_source_script
diff --git a/src/voice_to_text_node/log/COLCON_IGNORE b/src/voice_to_text_node/log/COLCON_IGNORE
new file mode 100644
index 0000000..e69de29
diff --git a/src/voice_to_text_node/log/build_2025-11-08_16-59-45/cam_test/command.log b/src/voice_to_text_node/log/build_2025-11-08_16-59-45/cam_test/command.log
new file mode 100644
index 0000000..52a9e43
--- /dev/null
+++ b/src/voice_to_text_node/log/build_2025-11-08_16-59-45/cam_test/command.log
@@ -0,0 +1,2 @@
+Invoking command in '/home/jake/ros2_ws/src/cam_test': PYTHONPATH=/home/jake/ros2_ws/src/cam_test/build/cam_test/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base build/cam_test build --build-base /home/jake/ros2_ws/src/cam_test/build/cam_test/build install --record /home/jake/ros2_ws/src/cam_test/build/cam_test/install.log --single-version-externally-managed install_data
+Invoked command in '/home/jake/ros2_ws/src/cam_test' returned '0': PYTHONPATH=/home/jake/ros2_ws/src/cam_test/build/cam_test/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base build/cam_test build --build-base /home/jake/ros2_ws/src/cam_test/build/cam_test/build install --record /home/jake/ros2_ws/src/cam_test/build/cam_test/install.log --single-version-externally-managed install_data
diff --git a/src/voice_to_text_node/log/build_2025-11-08_16-59-45/cam_test/stderr.log b/src/voice_to_text_node/log/build_2025-11-08_16-59-45/cam_test/stderr.log
new file mode 100644
index 0000000..e69de29
diff --git a/src/voice_to_text_node/log/build_2025-11-08_16-59-45/cam_test/stdout.log b/src/voice_to_text_node/log/build_2025-11-08_16-59-45/cam_test/stdout.log
new file mode 100644
index 0000000..795fc7e
--- /dev/null
+++ b/src/voice_to_text_node/log/build_2025-11-08_16-59-45/cam_test/stdout.log
@@ -0,0 +1,35 @@
+running egg_info
+creating build/cam_test/cam_test.egg-info
+writing build/cam_test/cam_test.egg-info/PKG-INFO
+writing dependency_links to build/cam_test/cam_test.egg-info/dependency_links.txt
+writing entry points to build/cam_test/cam_test.egg-info/entry_points.txt
+writing requirements to build/cam_test/cam_test.egg-info/requires.txt
+writing top-level names to build/cam_test/cam_test.egg-info/top_level.txt
+writing manifest file 'build/cam_test/cam_test.egg-info/SOURCES.txt'
+reading manifest file 'build/cam_test/cam_test.egg-info/SOURCES.txt'
+writing manifest file 'build/cam_test/cam_test.egg-info/SOURCES.txt'
+running build
+running build_py
+creating /home/jake/ros2_ws/src/cam_test/build/cam_test/build
+creating /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib
+creating /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test
+copying cam_test/cam_test.py -> /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test
+copying cam_test/__init__.py -> /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test
+running install
+running install_lib
+creating /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test
+copying /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test/cam_test.py -> /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test
+copying /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test/__init__.py -> /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test
+byte-compiling /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test/cam_test.py to cam_test.cpython-312.pyc
+byte-compiling /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test/__init__.py to __init__.cpython-312.pyc
+running install_data
+copying package.xml -> /home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test
+creating /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index
+creating /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index/resource_index
+creating /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index/resource_index/packages
+copying resource/cam_test -> /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index/resource_index/packages
+running install_egg_info
+Copying build/cam_test/cam_test.egg-info to /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info
+running install_scripts
+Installing cam_test script to /home/jake/ros2_ws/src/cam_test/install/cam_test/bin
+writing list of installed files to '/home/jake/ros2_ws/src/cam_test/build/cam_test/install.log'
diff --git a/src/voice_to_text_node/log/build_2025-11-08_16-59-45/cam_test/stdout_stderr.log b/src/voice_to_text_node/log/build_2025-11-08_16-59-45/cam_test/stdout_stderr.log
new file mode 100644
index 0000000..795fc7e
--- /dev/null
+++ b/src/voice_to_text_node/log/build_2025-11-08_16-59-45/cam_test/stdout_stderr.log
@@ -0,0 +1,35 @@
+running egg_info
+creating build/cam_test/cam_test.egg-info
+writing build/cam_test/cam_test.egg-info/PKG-INFO
+writing dependency_links to build/cam_test/cam_test.egg-info/dependency_links.txt
+writing entry points to build/cam_test/cam_test.egg-info/entry_points.txt
+writing requirements to build/cam_test/cam_test.egg-info/requires.txt
+writing top-level names to build/cam_test/cam_test.egg-info/top_level.txt
+writing manifest file 'build/cam_test/cam_test.egg-info/SOURCES.txt'
+reading manifest file 'build/cam_test/cam_test.egg-info/SOURCES.txt'
+writing manifest file 'build/cam_test/cam_test.egg-info/SOURCES.txt'
+running build
+running build_py
+creating /home/jake/ros2_ws/src/cam_test/build/cam_test/build
+creating /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib
+creating /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test
+copying cam_test/cam_test.py -> /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test
+copying cam_test/__init__.py -> /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test
+running install
+running install_lib
+creating /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test
+copying /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test/cam_test.py -> /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test
+copying /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test/__init__.py -> /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test
+byte-compiling /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test/cam_test.py to cam_test.cpython-312.pyc
+byte-compiling /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test/__init__.py to __init__.cpython-312.pyc
+running install_data
+copying package.xml -> /home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test
+creating /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index
+creating /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index/resource_index
+creating /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index/resource_index/packages
+copying resource/cam_test -> /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index/resource_index/packages
+running install_egg_info
+Copying build/cam_test/cam_test.egg-info to /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info
+running install_scripts
+Installing cam_test script to /home/jake/ros2_ws/src/cam_test/install/cam_test/bin
+writing list of installed files to '/home/jake/ros2_ws/src/cam_test/build/cam_test/install.log'
diff --git a/src/voice_to_text_node/log/build_2025-11-08_16-59-45/cam_test/streams.log b/src/voice_to_text_node/log/build_2025-11-08_16-59-45/cam_test/streams.log
new file mode 100644
index 0000000..4a0bab3
--- /dev/null
+++ b/src/voice_to_text_node/log/build_2025-11-08_16-59-45/cam_test/streams.log
@@ -0,0 +1,37 @@
+[1.018s] Invoking command in '/home/jake/ros2_ws/src/cam_test': PYTHONPATH=/home/jake/ros2_ws/src/cam_test/build/cam_test/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base build/cam_test build --build-base /home/jake/ros2_ws/src/cam_test/build/cam_test/build install --record /home/jake/ros2_ws/src/cam_test/build/cam_test/install.log --single-version-externally-managed install_data
+[1.258s] running egg_info
+[1.258s] creating build/cam_test/cam_test.egg-info
+[1.276s] writing build/cam_test/cam_test.egg-info/PKG-INFO
+[1.276s] writing dependency_links to build/cam_test/cam_test.egg-info/dependency_links.txt
+[1.276s] writing entry points to build/cam_test/cam_test.egg-info/entry_points.txt
+[1.276s] writing requirements to build/cam_test/cam_test.egg-info/requires.txt
+[1.277s] writing top-level names to build/cam_test/cam_test.egg-info/top_level.txt
+[1.277s] writing manifest file 'build/cam_test/cam_test.egg-info/SOURCES.txt'
+[1.311s] reading manifest file 'build/cam_test/cam_test.egg-info/SOURCES.txt'
+[1.311s] writing manifest file 'build/cam_test/cam_test.egg-info/SOURCES.txt'
+[1.312s] running build
+[1.312s] running build_py
+[1.312s] creating /home/jake/ros2_ws/src/cam_test/build/cam_test/build
+[1.313s] creating /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib
+[1.314s] creating /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test
+[1.314s] copying cam_test/cam_test.py -> /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test
+[1.315s] copying cam_test/__init__.py -> /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test
+[1.315s] running install
+[1.320s] running install_lib
+[1.338s] creating /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test
+[1.338s] copying /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test/cam_test.py -> /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test
+[1.339s] copying /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test/__init__.py -> /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test
+[1.339s] byte-compiling /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test/cam_test.py to cam_test.cpython-312.pyc
+[1.340s] byte-compiling /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test/__init__.py to __init__.cpython-312.pyc
+[1.340s] running install_data
+[1.340s] copying package.xml -> /home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test
+[1.341s] creating /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index
+[1.341s] creating /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index/resource_index
+[1.342s] creating /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index/resource_index/packages
+[1.342s] copying resource/cam_test -> /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index/resource_index/packages
+[1.342s] running install_egg_info
+[1.361s] Copying build/cam_test/cam_test.egg-info to /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info
+[1.362s] running install_scripts
+[1.474s] Installing cam_test script to /home/jake/ros2_ws/src/cam_test/install/cam_test/bin
+[1.475s] writing list of installed files to '/home/jake/ros2_ws/src/cam_test/build/cam_test/install.log'
+[1.505s] Invoked command in '/home/jake/ros2_ws/src/cam_test' returned '0': PYTHONPATH=/home/jake/ros2_ws/src/cam_test/build/cam_test/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base build/cam_test build --build-base /home/jake/ros2_ws/src/cam_test/build/cam_test/build install --record /home/jake/ros2_ws/src/cam_test/build/cam_test/install.log --single-version-externally-managed install_data
diff --git a/src/voice_to_text_node/log/build_2025-11-08_16-59-45/events.log b/src/voice_to_text_node/log/build_2025-11-08_16-59-45/events.log
new file mode 100644
index 0000000..2f0fd68
--- /dev/null
+++ b/src/voice_to_text_node/log/build_2025-11-08_16-59-45/events.log
@@ -0,0 +1,57 @@
+[0.000000] (-) TimerEvent: {}
+[0.000458] (cam_test) JobQueued: {'identifier': 'cam_test', 'dependencies': OrderedDict()}
+[0.000535] (cam_test) JobStarted: {'identifier': 'cam_test'}
+[0.099608] (-) TimerEvent: {}
+[0.199943] (-) TimerEvent: {}
+[0.300816] (-) TimerEvent: {}
+[0.401119] (-) TimerEvent: {}
+[0.501609] (-) TimerEvent: {}
+[0.602173] (-) TimerEvent: {}
+[0.702517] (-) TimerEvent: {}
+[0.802871] (-) TimerEvent: {}
+[0.903228] (-) TimerEvent: {}
+[1.003629] (-) TimerEvent: {}
+[1.014900] (cam_test) Command: {'cmd': ['/usr/bin/python3', '-W', 'ignore:setup.py install is deprecated', '-W', 'ignore:easy_install command is deprecated', 'setup.py', 'egg_info', '--egg-base', 'build/cam_test', 'build', '--build-base', '/home/jake/ros2_ws/src/cam_test/build/cam_test/build', 'install', '--record', '/home/jake/ros2_ws/src/cam_test/build/cam_test/install.log', '--single-version-externally-managed', 'install_data'], 'cwd': '/home/jake/ros2_ws/src/cam_test', 'env': {'LESSOPEN': '| /usr/bin/lesspipe %s', 'USER': 'jake', 'GIT_ASKPASS': '/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/extensions/git/dist/askpass.sh', 'SHLVL': '1', 'LD_LIBRARY_PATH': '/opt/ros/kilted/opt/zenoh_cpp_vendor/lib:/opt/ros/kilted/opt/gz_math_vendor/lib:/opt/ros/kilted/opt/gz_utils_vendor/lib:/opt/ros/kilted/opt/rviz_ogre_vendor/lib:/opt/ros/kilted/lib/x86_64-linux-gnu:/opt/ros/kilted/opt/gz_cmake_vendor/lib:/opt/ros/kilted/lib', 'HOME': '/home/jake', 'OLDPWD': '/home/jake/ros2_ws/src', 'TERM_PROGRAM_VERSION': '1.105.1', 'VSCODE_IPC_HOOK_CLI': '/run/user/1001/vscode-ipc-bc7e8c25-b626-4f8f-989e-c38b7c8e334a.sock', 'ROS_PYTHON_VERSION': '3', 'VSCODE_GIT_ASKPASS_MAIN': '/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/extensions/git/dist/askpass-main.js', 'VSCODE_GIT_ASKPASS_NODE': '/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/node', 'VSCODE_PYTHON_AUTOACTIVATE_GUARD': '1', 'DBUS_SESSION_BUS_ADDRESS': 'unix:path=/run/user/1001/bus', 'COLORTERM': 'truecolor', 'WSL_DISTRO_NAME': 'Ubuntu-24.04', 'WAYLAND_DISPLAY': 'wayland-0', 'COLCON_PREFIX_PATH': '/home/jake/ros2_ws/install', 'ROS_DISTRO': 'kilted', 'LOGNAME': 'jake', 'NAME': 'DESKTOP-UFLG41E', 'WSL_INTEROP': '/run/WSL/468_interop', 'PULSE_SERVER': 'unix:/mnt/wslg/PulseServer', '_': '/usr/bin/colcon', 'ROS_VERSION': '2', 'TERM': 'xterm-256color', 'PATH': '/home/jake/ros2_ws/install/hello_pub/bin:/home/jake/.vscode-server/bin/7d842fb85a0275a4a8e4d7e040d2625abbf7f084/bin/remote-cli:/opt/ros/kilted/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Windows/System32/OpenSSH/:/mnt/c/Program Files/Docker/Docker/resources/bin:/mnt/c/Users/jake/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/jake/AppData/Local/Programs/Microsoft VS Code/bin:/snap/bin:/home/jake/.vscode-server/data/User/globalStorage/github.copilot-chat/debugCommand', 'XDG_RUNTIME_DIR': '/run/user/1001/', 'DISPLAY': '10.255.255.254:0', 'LANG': 'C.UTF-8', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.crdownload=00;90:*.dpkg-dist=00;90:*.dpkg-new=00;90:*.dpkg-old=00;90:*.dpkg-tmp=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90:*.swp=00;90:*.tmp=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:', 'VSCODE_GIT_IPC_HANDLE': '/run/user/1001/vscode-git-1d6e8e65c1.sock', 'TERM_PROGRAM': 'vscode', 'AMENT_PREFIX_PATH': '/home/jake/ros2_ws/install/hello_pub:/opt/ros/kilted', 'SHELL': '/bin/bash', 'LESSCLOSE': '/usr/bin/lesspipe %s %s', 'ROS_AUTOMATIC_DISCOVERY_RANGE': 'SUBNET', 'VSCODE_GIT_ASKPASS_EXTRA_ARGS': '', 'PWD': '/home/jake/ros2_ws/src/cam_test/build/cam_test', 'XDG_DATA_DIRS': '/usr/local/share:/usr/share:/var/lib/snapd/desktop', 'PYTHONPATH': '/home/jake/ros2_ws/src/cam_test/build/cam_test/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages:/home/jake/ros2_ws/install/hello_pub/lib/python3.12/site-packages:/opt/ros/kilted/lib/python3.12/site-packages', 'COLCON': '1', 'WSL2_GUI_APPS_ENABLED': '1', 'HOSTTYPE': 'x86_64', 'CMAKE_PREFIX_PATH': '/opt/ros/kilted/opt/gz_math_vendor:/opt/ros/kilted/opt/gz_utils_vendor:/opt/ros/kilted/opt/gz_cmake_vendor', 'WSLENV': 'VSCODE_WSL_EXT_LOCATION/up'}, 'shell': False}
+[1.103746] (-) TimerEvent: {}
+[1.204106] (-) TimerEvent: {}
+[1.257910] (cam_test) StdoutLine: {'line': b'running egg_info\n'}
+[1.258411] (cam_test) StdoutLine: {'line': b'creating build/cam_test/cam_test.egg-info\n'}
+[1.275991] (cam_test) StdoutLine: {'line': b'writing build/cam_test/cam_test.egg-info/PKG-INFO\n'}
+[1.276361] (cam_test) StdoutLine: {'line': b'writing dependency_links to build/cam_test/cam_test.egg-info/dependency_links.txt\n'}
+[1.276592] (cam_test) StdoutLine: {'line': b'writing entry points to build/cam_test/cam_test.egg-info/entry_points.txt\n'}
+[1.276876] (cam_test) StdoutLine: {'line': b'writing requirements to build/cam_test/cam_test.egg-info/requires.txt\n'}
+[1.277131] (cam_test) StdoutLine: {'line': b'writing top-level names to build/cam_test/cam_test.egg-info/top_level.txt\n'}
+[1.277320] (cam_test) StdoutLine: {'line': b"writing manifest file 'build/cam_test/cam_test.egg-info/SOURCES.txt'\n"}
+[1.304271] (-) TimerEvent: {}
+[1.311171] (cam_test) StdoutLine: {'line': b"reading manifest file 'build/cam_test/cam_test.egg-info/SOURCES.txt'\n"}
+[1.311787] (cam_test) StdoutLine: {'line': b"writing manifest file 'build/cam_test/cam_test.egg-info/SOURCES.txt'\n"}
+[1.312126] (cam_test) StdoutLine: {'line': b'running build\n'}
+[1.312401] (cam_test) StdoutLine: {'line': b'running build_py\n'}
+[1.312619] (cam_test) StdoutLine: {'line': b'creating /home/jake/ros2_ws/src/cam_test/build/cam_test/build\n'}
+[1.313423] (cam_test) StdoutLine: {'line': b'creating /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib\n'}
+[1.313998] (cam_test) StdoutLine: {'line': b'creating /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test\n'}
+[1.314607] (cam_test) StdoutLine: {'line': b'copying cam_test/cam_test.py -> /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test\n'}
+[1.314866] (cam_test) StdoutLine: {'line': b'copying cam_test/__init__.py -> /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test\n'}
+[1.315130] (cam_test) StdoutLine: {'line': b'running install\n'}
+[1.320665] (cam_test) StdoutLine: {'line': b'running install_lib\n'}
+[1.337980] (cam_test) StdoutLine: {'line': b'creating /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test\n'}
+[1.338797] (cam_test) StdoutLine: {'line': b'copying /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test/cam_test.py -> /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test\n'}
+[1.339120] (cam_test) StdoutLine: {'line': b'copying /home/jake/ros2_ws/src/cam_test/build/cam_test/build/lib/cam_test/__init__.py -> /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test\n'}
+[1.339485] (cam_test) StdoutLine: {'line': b'byte-compiling /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test/cam_test.py to cam_test.cpython-312.pyc\n'}
+[1.340486] (cam_test) StdoutLine: {'line': b'byte-compiling /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test/__init__.py to __init__.cpython-312.pyc\n'}
+[1.340803] (cam_test) StdoutLine: {'line': b'running install_data\n'}
+[1.340914] (cam_test) StdoutLine: {'line': b'copying package.xml -> /home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test\n'}
+[1.341048] (cam_test) StdoutLine: {'line': b'creating /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index\n'}
+[1.341702] (cam_test) StdoutLine: {'line': b'creating /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index/resource_index\n'}
+[1.342304] (cam_test) StdoutLine: {'line': b'creating /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index/resource_index/packages\n'}
+[1.342842] (cam_test) StdoutLine: {'line': b'copying resource/cam_test -> /home/jake/ros2_ws/src/cam_test/install/cam_test/share/ament_index/resource_index/packages\n'}
+[1.342989] (cam_test) StdoutLine: {'line': b'running install_egg_info\n'}
+[1.361084] (cam_test) StdoutLine: {'line': b'Copying build/cam_test/cam_test.egg-info to /home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages/cam_test-0.1.0-py3.12.egg-info\n'}
+[1.362826] (cam_test) StdoutLine: {'line': b'running install_scripts\n'}
+[1.404401] (-) TimerEvent: {}
+[1.474703] (cam_test) StdoutLine: {'line': b'Installing cam_test script to /home/jake/ros2_ws/src/cam_test/install/cam_test/bin\n'}
+[1.475684] (cam_test) StdoutLine: {'line': b"writing list of installed files to '/home/jake/ros2_ws/src/cam_test/build/cam_test/install.log'\n"}
+[1.504463] (-) TimerEvent: {}
+[1.505490] (cam_test) CommandEnded: {'returncode': 0}
+[1.524915] (cam_test) JobEnded: {'identifier': 'cam_test', 'rc': 0}
+[1.526224] (-) EventReactorShutdown: {}
diff --git a/src/voice_to_text_node/log/build_2025-11-08_16-59-45/logger_all.log b/src/voice_to_text_node/log/build_2025-11-08_16-59-45/logger_all.log
new file mode 100644
index 0000000..387eabc
--- /dev/null
+++ b/src/voice_to_text_node/log/build_2025-11-08_16-59-45/logger_all.log
@@ -0,0 +1,100 @@
+[0.111s] DEBUG:colcon:Command line arguments: ['/usr/bin/colcon', 'build', '--packages-select', 'cam_test', '--event-handlers', 'console_direct+']
+[0.111s] DEBUG:colcon:Parsed command line arguments: Namespace(log_base=None, log_level=None, verb_name='build', build_base='build', install_base='install', merge_install=False, symlink_install=False, test_result_base=None, continue_on_error=False, executor='parallel', parallel_workers=24, event_handlers=['console_direct+'], ignore_user_meta=False, metas=['./colcon.meta'], base_paths=['.'], packages_ignore=None, packages_ignore_regex=None, paths=None, packages_up_to=None, packages_up_to_regex=None, packages_above=None, packages_above_and_dependencies=None, packages_above_depth=None, packages_select_by_dep=None, packages_skip_by_dep=None, packages_skip_up_to=None, packages_select_build_failed=False, packages_skip_build_finished=False, packages_select_test_failures=False, packages_skip_test_passed=False, packages_select=['cam_test'], packages_skip=None, packages_select_regex=None, packages_skip_regex=None, packages_start=None, packages_end=None, allow_overriding=[], cmake_args=None, cmake_target=None, cmake_target_skip_unavailable=False, cmake_clean_cache=False, cmake_clean_first=False, cmake_force_configure=False, ament_cmake_args=None, catkin_cmake_args=None, catkin_skip_building_tests=False, verb_parser=, verb_extension=, main=>)
+[0.151s] Level 1:colcon.colcon_core.package_discovery:discover_packages(colcon_meta) check parameters
+[0.151s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) check parameters
+[0.151s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) check parameters
+[0.151s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) check parameters
+[0.151s] Level 1:colcon.colcon_core.package_discovery:discover_packages(colcon_meta) discover
+[0.151s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) discover
+[0.151s] INFO:colcon.colcon_core.package_discovery:Crawling recursively for packages in '/home/jake/ros2_ws/src/cam_test'
+[0.151s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['ignore', 'ignore_ament_install']
+[0.151s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ignore'
+[0.151s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ignore_ament_install'
+[0.151s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['colcon_pkg']
+[0.151s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'colcon_pkg'
+[0.151s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['colcon_meta']
+[0.152s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'colcon_meta'
+[0.152s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['ros']
+[0.152s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ros'
+[0.177s] DEBUG:colcon.colcon_core.package_identification:Package '.' with type 'ros.ament_python' and name 'cam_test'
+[0.177s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) using defaults
+[0.177s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) discover
+[0.177s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) using defaults
+[0.177s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) discover
+[0.177s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) using defaults
+[0.192s] Level 1:colcon.colcon_core.package_discovery:discover_packages(prefix_path) check parameters
+[0.193s] Level 1:colcon.colcon_core.package_discovery:discover_packages(prefix_path) discover
+[0.194s] DEBUG:colcon.colcon_installed_package_information.package_discovery:Found 1 installed packages in /home/jake/ros2_ws/install
+[0.195s] DEBUG:colcon.colcon_installed_package_information.package_discovery:Found 294 installed packages in /opt/ros/kilted
+[0.196s] Level 1:colcon.colcon_core.package_discovery:discover_packages(prefix_path) using defaults
+[0.234s] Level 5:colcon.colcon_core.verb:set package 'cam_test' build argument 'cmake_args' from command line to 'None'
+[0.234s] Level 5:colcon.colcon_core.verb:set package 'cam_test' build argument 'cmake_target' from command line to 'None'
+[0.234s] Level 5:colcon.colcon_core.verb:set package 'cam_test' build argument 'cmake_target_skip_unavailable' from command line to 'False'
+[0.234s] Level 5:colcon.colcon_core.verb:set package 'cam_test' build argument 'cmake_clean_cache' from command line to 'False'
+[0.234s] Level 5:colcon.colcon_core.verb:set package 'cam_test' build argument 'cmake_clean_first' from command line to 'False'
+[0.234s] Level 5:colcon.colcon_core.verb:set package 'cam_test' build argument 'cmake_force_configure' from command line to 'False'
+[0.234s] Level 5:colcon.colcon_core.verb:set package 'cam_test' build argument 'ament_cmake_args' from command line to 'None'
+[0.234s] Level 5:colcon.colcon_core.verb:set package 'cam_test' build argument 'catkin_cmake_args' from command line to 'None'
+[0.234s] Level 5:colcon.colcon_core.verb:set package 'cam_test' build argument 'catkin_skip_building_tests' from command line to 'False'
+[0.234s] DEBUG:colcon.colcon_core.verb:Building package 'cam_test' with the following arguments: {'ament_cmake_args': None, 'build_base': '/home/jake/ros2_ws/src/cam_test/build/cam_test', 'catkin_cmake_args': None, 'catkin_skip_building_tests': False, 'cmake_args': None, 'cmake_clean_cache': False, 'cmake_clean_first': False, 'cmake_force_configure': False, 'cmake_target': None, 'cmake_target_skip_unavailable': False, 'install_base': '/home/jake/ros2_ws/src/cam_test/install/cam_test', 'merge_install': False, 'path': '/home/jake/ros2_ws/src/cam_test', 'symlink_install': False, 'test_result_base': None}
+[0.234s] INFO:colcon.colcon_core.executor:Executing jobs using 'parallel' executor
+[0.235s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:run_until_complete
+[0.235s] INFO:colcon.colcon_ros.task.ament_python.build:Building ROS package in '/home/jake/ros2_ws/src/cam_test' with build type 'ament_python'
+[0.236s] Level 1:colcon.colcon_core.shell:create_environment_hook('cam_test', 'ament_prefix_path')
+[0.238s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_core.shell.bat': Not used on non-Windows systems
+[0.238s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/hook/ament_prefix_path.ps1'
+[0.241s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/hook/ament_prefix_path.dsv'
+[0.242s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/hook/ament_prefix_path.sh'
+[0.243s] INFO:colcon.colcon_core.shell:Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell
+[0.243s] DEBUG:colcon.colcon_core.shell:Skip shell extension 'dsv' for command environment
+[0.434s] INFO:colcon.colcon_core.task.python.build:Building Python package in '/home/jake/ros2_ws/src/cam_test'
+[0.434s] INFO:colcon.colcon_core.shell:Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell
+[0.434s] DEBUG:colcon.colcon_core.shell:Skip shell extension 'dsv' for command environment
+[1.254s] DEBUG:colcon.colcon_core.event_handler.log_command:Invoking command in '/home/jake/ros2_ws/src/cam_test': PYTHONPATH=/home/jake/ros2_ws/src/cam_test/build/cam_test/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base build/cam_test build --build-base /home/jake/ros2_ws/src/cam_test/build/cam_test/build install --record /home/jake/ros2_ws/src/cam_test/build/cam_test/install.log --single-version-externally-managed install_data
+[1.741s] DEBUG:colcon.colcon_core.event_handler.log_command:Invoked command in '/home/jake/ros2_ws/src/cam_test' returned '0': PYTHONPATH=/home/jake/ros2_ws/src/cam_test/build/cam_test/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py egg_info --egg-base build/cam_test build --build-base /home/jake/ros2_ws/src/cam_test/build/cam_test/build install --record /home/jake/ros2_ws/src/cam_test/build/cam_test/install.log --single-version-externally-managed install_data
+[1.747s] Level 1:colcon.colcon_core.environment:checking '/home/jake/ros2_ws/src/cam_test/install/cam_test' for CMake module files
+[1.748s] Level 1:colcon.colcon_core.environment:checking '/home/jake/ros2_ws/src/cam_test/install/cam_test' for CMake config files
+[1.748s] Level 1:colcon.colcon_core.environment:checking '/home/jake/ros2_ws/src/cam_test/install/cam_test/lib'
+[1.748s] Level 1:colcon.colcon_core.environment:checking '/home/jake/ros2_ws/src/cam_test/install/cam_test/bin'
+[1.749s] Level 1:colcon.colcon_core.shell:create_environment_hook('cam_test', 'path')
+[1.749s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/hook/path.ps1'
+[1.749s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/hook/path.dsv'
+[1.750s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/hook/path.sh'
+[1.750s] Level 1:colcon.colcon_core.environment:checking '/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/pkgconfig/cam_test.pc'
+[1.750s] Level 1:colcon.colcon_core.environment:checking '/home/jake/ros2_ws/src/cam_test/install/cam_test/lib/python3.12/site-packages'
+[1.750s] Level 1:colcon.colcon_core.shell:create_environment_hook('cam_test', 'pythonpath')
+[1.750s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/hook/pythonpath.ps1'
+[1.751s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/hook/pythonpath.dsv'
+[1.751s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/hook/pythonpath.sh'
+[1.752s] Level 1:colcon.colcon_core.environment:checking '/home/jake/ros2_ws/src/cam_test/install/cam_test/bin'
+[1.752s] Level 1:colcon.colcon_core.shell:create_environment_hook('cam_test', 'pythonscriptspath')
+[1.752s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/hook/pythonscriptspath.ps1'
+[1.752s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/hook/pythonscriptspath.dsv'
+[1.753s] INFO:colcon.colcon_core.shell:Creating environment hook '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/hook/pythonscriptspath.sh'
+[1.753s] Level 1:colcon.colcon_core.environment:create_environment_scripts_only(cam_test)
+[1.754s] INFO:colcon.colcon_core.shell:Creating package script '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/package.ps1'
+[1.755s] INFO:colcon.colcon_core.shell:Creating package descriptor '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/package.dsv'
+[1.755s] INFO:colcon.colcon_core.shell:Creating package script '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/package.sh'
+[1.756s] INFO:colcon.colcon_core.shell:Creating package script '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/package.bash'
+[1.757s] INFO:colcon.colcon_core.shell:Creating package script '/home/jake/ros2_ws/src/cam_test/install/cam_test/share/cam_test/package.zsh'
+[1.758s] Level 1:colcon.colcon_core.environment:create_file_with_runtime_dependencies(/home/jake/ros2_ws/src/cam_test/install/cam_test/share/colcon-core/packages/cam_test)
+[1.760s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:closing loop
+[1.761s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:loop closed
+[1.761s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:run_until_complete finished with '0'
+[1.761s] DEBUG:colcon.colcon_core.event_reactor:joining thread
+[1.779s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.notify_send': Could not find 'notify-send'
+[1.779s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.terminal_notifier': Not used on non-Darwin systems
+[1.779s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.win32': Not used on non-Windows systems
+[1.779s] INFO:colcon.colcon_notification.desktop_notification:Sending desktop notification using 'notify2'
+[1.781s] DEBUG:colcon.colcon_notification.desktop_notification.notify2:Failed to initialize notify2: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.Notifications was not provided by any .service files
+[1.781s] DEBUG:colcon.colcon_core.event_reactor:joined thread
+[1.781s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/jake/ros2_ws/src/cam_test/install/local_setup.ps1'
+[1.782s] INFO:colcon.colcon_core.shell:Creating prefix util module '/home/jake/ros2_ws/src/cam_test/install/_local_setup_util_ps1.py'
+[1.783s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/jake/ros2_ws/src/cam_test/install/setup.ps1'
+[1.784s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/jake/ros2_ws/src/cam_test/install/local_setup.sh'
+[1.784s] INFO:colcon.colcon_core.shell:Creating prefix util module '/home/jake/ros2_ws/src/cam_test/install/_local_setup_util_sh.py'
+[1.785s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/jake/ros2_ws/src/cam_test/install/setup.sh'
+[1.786s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/jake/ros2_ws/src/cam_test/install/local_setup.bash'
+[1.786s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/jake/ros2_ws/src/cam_test/install/setup.bash'
+[1.787s] INFO:colcon.colcon_core.shell:Creating prefix script '/home/jake/ros2_ws/src/cam_test/install/local_setup.zsh'
+[1.788s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/home/jake/ros2_ws/src/cam_test/install/setup.zsh'
diff --git a/src/voice_to_text_node/log/latest b/src/voice_to_text_node/log/latest
new file mode 120000
index 0000000..b57d247
--- /dev/null
+++ b/src/voice_to_text_node/log/latest
@@ -0,0 +1 @@
+latest_build
\ No newline at end of file
diff --git a/src/voice_to_text_node/log/latest_build b/src/voice_to_text_node/log/latest_build
new file mode 120000
index 0000000..83f3deb
--- /dev/null
+++ b/src/voice_to_text_node/log/latest_build
@@ -0,0 +1 @@
+build_2025-11-08_16-59-45
\ No newline at end of file
diff --git a/src/voice_to_text_node/package.xml b/src/voice_to_text_node/package.xml
new file mode 100644
index 0000000..4e8a838
--- /dev/null
+++ b/src/voice_to_text_node/package.xml
@@ -0,0 +1,21 @@
+
+
+ voice_to_text_node
+ 0.1.0
+ Manages voice to text for Little Sophia
+ Jake
+ MIT
+
+ ament_python
+ ament_python
+
+ rclpy
+ std_msgs
+
+ ament_lint_auto
+ ament_lint_common
+
+
+ ament_python
+
+
diff --git a/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/README b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/README
new file mode 100644
index 0000000..a7f7931
--- /dev/null
+++ b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/README
@@ -0,0 +1,9 @@
+US English model for mobile Vosk applications
+
+Copyright 2020 Alpha Cephei Inc
+
+Accuracy: 10.38 (tedlium test) 9.85 (librispeech test-clean)
+Speed: 0.11xRT (desktop)
+Latency: 0.15s (right context)
+
+
diff --git a/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/am/final.mdl b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/am/final.mdl
new file mode 100644
index 0000000..5596b31
Binary files /dev/null and b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/am/final.mdl differ
diff --git a/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf/mfcc.conf b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf/mfcc.conf
new file mode 100644
index 0000000..eaa40c5
--- /dev/null
+++ b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf/mfcc.conf
@@ -0,0 +1,7 @@
+--sample-frequency=16000
+--use-energy=false
+--num-mel-bins=40
+--num-ceps=40
+--low-freq=20
+--high-freq=7600
+--allow-downsample=true
diff --git a/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf/model.conf b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf/model.conf
new file mode 100644
index 0000000..9d5b0da
--- /dev/null
+++ b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/conf/model.conf
@@ -0,0 +1,10 @@
+--min-active=200
+--max-active=3000
+--beam=10.0
+--lattice-beam=2.0
+--acoustic-scale=1.0
+--frame-subsampling-factor=3
+--endpoint.silence-phones=1:2:3:4:5:6:7:8:9:10
+--endpoint.rule2.min-trailing-silence=0.5
+--endpoint.rule3.min-trailing-silence=0.75
+--endpoint.rule4.min-trailing-silence=1.0
diff --git a/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/Gr.fst b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/Gr.fst
new file mode 100644
index 0000000..1f292e6
Binary files /dev/null and b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/Gr.fst differ
diff --git a/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/HCLr.fst b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/HCLr.fst
new file mode 100644
index 0000000..9797b26
Binary files /dev/null and b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/HCLr.fst differ
diff --git a/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/disambig_tid.int b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/disambig_tid.int
new file mode 100644
index 0000000..762fd5f
--- /dev/null
+++ b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/disambig_tid.int
@@ -0,0 +1,17 @@
+10015
+10016
+10017
+10018
+10019
+10020
+10021
+10022
+10023
+10024
+10025
+10026
+10027
+10028
+10029
+10030
+10031
diff --git a/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int
new file mode 100644
index 0000000..df23fd7
--- /dev/null
+++ b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int
@@ -0,0 +1,166 @@
+1 nonword
+2 begin
+3 end
+4 internal
+5 singleton
+6 nonword
+7 begin
+8 end
+9 internal
+10 singleton
+11 begin
+12 end
+13 internal
+14 singleton
+15 begin
+16 end
+17 internal
+18 singleton
+19 begin
+20 end
+21 internal
+22 singleton
+23 begin
+24 end
+25 internal
+26 singleton
+27 begin
+28 end
+29 internal
+30 singleton
+31 begin
+32 end
+33 internal
+34 singleton
+35 begin
+36 end
+37 internal
+38 singleton
+39 begin
+40 end
+41 internal
+42 singleton
+43 begin
+44 end
+45 internal
+46 singleton
+47 begin
+48 end
+49 internal
+50 singleton
+51 begin
+52 end
+53 internal
+54 singleton
+55 begin
+56 end
+57 internal
+58 singleton
+59 begin
+60 end
+61 internal
+62 singleton
+63 begin
+64 end
+65 internal
+66 singleton
+67 begin
+68 end
+69 internal
+70 singleton
+71 begin
+72 end
+73 internal
+74 singleton
+75 begin
+76 end
+77 internal
+78 singleton
+79 begin
+80 end
+81 internal
+82 singleton
+83 begin
+84 end
+85 internal
+86 singleton
+87 begin
+88 end
+89 internal
+90 singleton
+91 begin
+92 end
+93 internal
+94 singleton
+95 begin
+96 end
+97 internal
+98 singleton
+99 begin
+100 end
+101 internal
+102 singleton
+103 begin
+104 end
+105 internal
+106 singleton
+107 begin
+108 end
+109 internal
+110 singleton
+111 begin
+112 end
+113 internal
+114 singleton
+115 begin
+116 end
+117 internal
+118 singleton
+119 begin
+120 end
+121 internal
+122 singleton
+123 begin
+124 end
+125 internal
+126 singleton
+127 begin
+128 end
+129 internal
+130 singleton
+131 begin
+132 end
+133 internal
+134 singleton
+135 begin
+136 end
+137 internal
+138 singleton
+139 begin
+140 end
+141 internal
+142 singleton
+143 begin
+144 end
+145 internal
+146 singleton
+147 begin
+148 end
+149 internal
+150 singleton
+151 begin
+152 end
+153 internal
+154 singleton
+155 begin
+156 end
+157 internal
+158 singleton
+159 begin
+160 end
+161 internal
+162 singleton
+163 begin
+164 end
+165 internal
+166 singleton
diff --git a/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.dubm b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.dubm
new file mode 100644
index 0000000..db789eb
Binary files /dev/null and b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.dubm differ
diff --git a/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.ie b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.ie
new file mode 100644
index 0000000..93737bf
Binary files /dev/null and b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.ie differ
diff --git a/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.mat b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.mat
new file mode 100644
index 0000000..c3ec635
Binary files /dev/null and b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/final.mat differ
diff --git a/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats
new file mode 100644
index 0000000..b9d92ef
--- /dev/null
+++ b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats
@@ -0,0 +1,3 @@
+ [
+ 1.682383e+11 -1.1595e+10 -1.521733e+10 4.32034e+09 -2.257938e+10 -1.969666e+10 -2.559265e+10 -1.535687e+10 -1.276854e+10 -4.494483e+09 -1.209085e+10 -5.64008e+09 -1.134847e+10 -3.419512e+09 -1.079542e+10 -4.145463e+09 -6.637486e+09 -1.11318e+09 -3.479773e+09 -1.245932e+08 -1.386961e+09 6.560655e+07 -2.436518e+08 -4.032432e+07 4.620046e+08 -7.714964e+07 9.551484e+08 -4.119761e+08 8.208582e+08 -7.117156e+08 7.457703e+08 -4.3106e+08 1.202726e+09 2.904036e+08 1.231931e+09 3.629848e+08 6.366939e+08 -4.586172e+08 -5.267629e+08 -3.507819e+08 1.679838e+09
+ 1.741141e+13 8.92488e+11 8.743834e+11 8.848896e+11 1.190313e+12 1.160279e+12 1.300066e+12 1.005678e+12 9.39335e+11 8.089614e+11 7.927041e+11 6.882427e+11 6.444235e+11 5.151451e+11 4.825723e+11 3.210106e+11 2.720254e+11 1.772539e+11 1.248102e+11 6.691599e+10 3.599804e+10 1.207574e+10 1.679301e+09 4.594778e+08 5.821614e+09 1.451758e+10 2.55803e+10 3.43277e+10 4.245286e+10 4.784859e+10 4.988591e+10 4.925451e+10 5.074584e+10 4.9557e+10 4.407876e+10 3.421443e+10 3.138606e+10 2.539716e+10 1.948134e+10 1.381167e+10 0 ]
diff --git a/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf
new file mode 100644
index 0000000..7748a4a
--- /dev/null
+++ b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf
@@ -0,0 +1 @@
+# configuration file for apply-cmvn-online, used in the script ../local/run_online_decoding.sh
diff --git a/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/splice.conf b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/splice.conf
new file mode 100644
index 0000000..960cd2e
--- /dev/null
+++ b/src/voice_to_text_node/resource/model/vosk-model-small-en-us-0.15/ivector/splice.conf
@@ -0,0 +1,2 @@
+--left-context=3
+--right-context=3
diff --git a/src/voice_to_text_node/resource/voice_to_text_node b/src/voice_to_text_node/resource/voice_to_text_node
new file mode 100644
index 0000000..e69de29
diff --git a/src/voice_to_text_node/setup.py b/src/voice_to_text_node/setup.py
new file mode 100644
index 0000000..4e8e406
--- /dev/null
+++ b/src/voice_to_text_node/setup.py
@@ -0,0 +1,37 @@
+from setuptools import setup
+import os
+
+package_name = 'voice_to_text_node'
+
+def collect_model_files():
+ base_dir = 'resource/model/vosk-model-small-en-us-0.15'
+ data_files = []
+ for dirpath, _, filenames in os.walk(base_dir):
+ for f in filenames:
+ src_path = os.path.join(dirpath, f)
+ install_dir = os.path.join('share', package_name, dirpath)
+ data_files.append((install_dir, [src_path]))
+ return data_files
+
+setup(
+ name=package_name,
+ version='0.1.0',
+ packages=[package_name],
+ package_dir={'': '.'},
+ data_files=[
+ ('share/' + package_name, ['package.xml']),
+ ('share/ament_index/resource_index/packages', ['resource/' + package_name]),
+ ] + collect_model_files(),
+ install_requires=['setuptools'],
+ zip_safe=True,
+ maintainer='jake',
+ maintainer_email='jake@example.com',
+ description='Manages voice to text for Little Sophia',
+ license='MIT',
+ tests_require=['pytest'],
+ entry_points={
+ 'console_scripts': [
+ 'voice_to_text_node = voice_to_text_node.voice_to_text_node:main',
+ ],
+ },
+)
diff --git a/src/voice_to_text_node/voice_to_text_node/__init__.py b/src/voice_to_text_node/voice_to_text_node/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/voice_to_text_node/voice_to_text_node/__pycache__/cam_test.cpython-38.pyc b/src/voice_to_text_node/voice_to_text_node/__pycache__/cam_test.cpython-38.pyc
new file mode 100644
index 0000000..3537ba6
Binary files /dev/null and b/src/voice_to_text_node/voice_to_text_node/__pycache__/cam_test.cpython-38.pyc differ
diff --git a/src/voice_to_text_node/voice_to_text_node/threaded_node.py b/src/voice_to_text_node/voice_to_text_node/threaded_node.py
new file mode 100644
index 0000000..d3abe01
--- /dev/null
+++ b/src/voice_to_text_node/voice_to_text_node/threaded_node.py
@@ -0,0 +1,115 @@
+# threaded_node.py
+import rclpy
+from rclpy.node import Node
+from rclpy.parameter import Parameter
+from rcl_interfaces.msg import SetParametersResult, ParameterEvent
+from std_msgs.msg import Bool, Float32
+
+import time
+import threading
+import queue
+from collections import deque
+
+class ThreadedNode(Node):
+ def __init__(self, name: str, default_rate: float = 1.0):
+ super().__init__(name)
+
+ # Declare and initialize publish_rate
+ self.declare_parameter('publish_rate', default_rate)
+ self.publish_rate = self.get_parameter('publish_rate').get_parameter_value().double_value
+
+ # Heartbeat publisher
+ self.heartbeat_pub = self.create_publisher(Bool, f'{name}/heartbeat', 1)
+ self.heartbeat_timer = self.create_timer(1.0, self.send_heartbeat)
+
+ # Actual FPS publisher
+ self.fps_pub = self.create_publisher(Float32, f'{name}/fps', 1)
+ buffer_size = max(5, int(self.publish_rate * 5)) # 5 seconds worth of ticks
+ self._tick_times = deque(maxlen=buffer_size)
+
+ # Work timer
+ self.timer = self.create_timer(1.0 / self.publish_rate, self.timer_callback)
+
+ # Parameter update hooks
+ self.add_on_set_parameters_callback(self.param_callback)
+ self.create_subscription(ParameterEvent, '/parameter_events', self.parameter_event_listener, 10)
+
+ self.setup_parameters()
+ self.setup_topics()
+
+ # Worker thread setup
+ self.task_queue = queue.Queue()
+ self.worker_thread = threading.Thread(target=self.worker_loop, daemon=True)
+ self.worker_thread.start()
+
+ def setup_parameters(self):
+ pass
+
+ def setup_topics(self):
+ pass
+
+ def send_heartbeat(self):
+ self.heartbeat_pub.publish(Bool(data=True))
+
+ def timer_callback(self):
+ if self.task_queue.empty():
+ self.task_queue.put_nowait('tick')
+
+
+ def worker_loop(self):
+ while rclpy.ok():
+ try:
+ task = self.task_queue.get(timeout=1.0)
+ if task == 'tick':
+ now = time.time()
+ self._tick_times.append(now)
+
+ # Call the subclass's tick logic
+ try:
+ self.on_tick()
+ except Exception as e:
+ self.get_logger().error(f'on_tick failed: {e}')
+
+ # Compute smoothed FPS
+ if len(self._tick_times) >= 2:
+ intervals = [t2 - t1 for t1, t2 in zip(self._tick_times, list(self._tick_times)[1:])]
+ avg_interval = sum(intervals) / len(intervals)
+ smoothed_fps = 1.0 / avg_interval if avg_interval > 0 else 0.0
+ else:
+ smoothed_fps = 0.0
+
+ fps_msg = Float32()
+ fps_msg.data = smoothed_fps
+ self.fps_pub.publish(fps_msg)
+
+
+ except queue.Empty:
+ continue
+
+ def on_tick(self):
+ # Override this in your subclass
+ pass
+
+ def update_publish_rate(self, new_rate):
+ self.get_logger().info(f'Updating publish rate to {new_rate} Hz')
+ self.timer.cancel()
+ self.timer = self.create_timer(1.0 / new_rate, self.timer_callback)
+ self.publish_rate = new_rate
+ self.set_parameters([Parameter('publish_rate', Parameter.Type.DOUBLE, new_rate)])
+ buffer_size = max(5, int(self.publish_rate * 5)) # 5 seconds worth of ticks
+ self._tick_times = deque(maxlen=buffer_size)
+
+ def param_callback(self, params):
+ for param in params:
+ if param.name == 'publish_rate' and param.type_ == Parameter.Type.DOUBLE:
+ new_rate = param.value
+ if new_rate > 0.0 and abs(new_rate - self.publish_rate) > 1e-6:
+ self.update_publish_rate(new_rate)
+ return SetParametersResult(successful=True)
+
+ def parameter_event_listener(self, event: ParameterEvent):
+ for changed in event.changed_parameters:
+ if changed.name == 'publish_rate':
+ new_rate = changed.value.double_value
+ if new_rate > 0.0 and abs(new_rate - self.publish_rate) > 1e-6:
+ self.update_publish_rate(new_rate)
diff --git a/src/voice_to_text_node/voice_to_text_node/voice_to_text_node.py b/src/voice_to_text_node/voice_to_text_node/voice_to_text_node.py
new file mode 100755
index 0000000..01c2aa2
--- /dev/null
+++ b/src/voice_to_text_node/voice_to_text_node/voice_to_text_node.py
@@ -0,0 +1,82 @@
+from ament_index_python.packages import get_package_share_directory
+import os
+
+import time
+from voice_to_text_node.threaded_node import ThreadedNode
+
+from std_msgs.msg import String
+import rclpy
+
+from ament_index_python.packages import get_package_share_directory
+import threading
+
+
+import sounddevice as sd
+import queue
+from vosk import Model, KaldiRecognizer
+
+package_name = 'voice_to_text_node'
+model_path = os.path.join(
+ get_package_share_directory('voice_to_text_node'),
+ 'resource', 'model', 'vosk-model-small-en-us-0.15'
+)
+print("MODEL PATH: " + model_path)
+latest_partial = {"partial": ""}
+latest_result = {"text": ""}
+
+
+class VoicePublisher(ThreadedNode):
+ def __init__(self):
+ super().__init__(package_name, default_rate=5.0)
+ self.string_pub = self.create_publisher(String, package_name + '/test_topic', 10)
+
+ self.latest_partial = {"partial": ""}
+ self.latest_result = {"text": ""}
+
+ self.speech_thread = threading.Thread(target=self.speech_loop, daemon=True)
+ self.speech_thread.start()
+
+ def on_tick(self):
+ msg = String()
+ msg.data = self.latest_partial.get("partial", "") or self.latest_result.get("text", "")
+ self.string_pub.publish(msg)
+ self.get_logger().info(f'Published: {msg.data}')
+
+ def speech_loop(self):
+ model = Model(model_path)
+ rec = KaldiRecognizer(model, 16000)
+ q = queue.Queue()
+
+ def callback(indata, frames, time, status):
+ if status:
+ print(status)
+ q.put(bytes(indata))
+
+ with sd.RawInputStream(samplerate=16000, blocksize=8000, dtype='int16',
+ channels=1, callback=callback):
+ while True:
+ data = q.get()
+ if rec.AcceptWaveform(data):
+ result = json.loads(rec.Result())
+ self.latest_result = result
+ print(".", result)
+ else:
+ partial = json.loads(rec.PartialResult())
+ self.latest_partial = partial
+ print("...", partial.get("partial", ""), end='\r')
+
+ def destroy_node(self):
+ super().destroy_node()
+
+
+
+
+def main():
+ rclpy.init()
+ node = VoicePublisher()
+ rclpy.spin(node)
+ node.destroy_node()
+ rclpy.shutdown()
+
+if __name__ == '__main__':
+ main()