Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
27b17af
wallfollower
ifenetangerine Feb 25, 2026
0633ab1
wall_follower from lab2
ifenetangerine Feb 27, 2026
3088341
safety_controller stuff
ifenetangerine Feb 28, 2026
21f9026
Setup Structure For Safety Controller
DwnNyxDev Feb 28, 2026
c11b29e
logger node type shi
ifenetangerine Feb 28, 2026
194497c
setup for logger node typshit
ifenetangerine Feb 28, 2026
cf39e06
Added Helper Functions for Converting Between Polar and Cartesian and…
DwnNyxDev Feb 28, 2026
ec45e9e
Improving Lidar Subset Calculator
DwnNyxDev Mar 2, 2026
5b27f90
todo error messages in logger node
ifenetangerine Mar 2, 2026
a12f6f7
Added Distance Filtering
DwnNyxDev Mar 2, 2026
e48e918
Merge branch 'master' of github.com:rss2026-2/wall_follower
DwnNyxDev Mar 2, 2026
a63a783
Fixed Safety Controller Distance Mask
DwnNyxDev Mar 2, 2026
ae985ab
drive callback thing
ifenetangerine Mar 2, 2026
a10047f
Rewrote docstrings by template
DwnNyxDev Mar 2, 2026
b11f841
drive callback fr
ifenetangerine Mar 2, 2026
4551e31
merging shit
ifenetangerine Mar 2, 2026
54d55c6
line projection function
citlalmina17 Mar 2, 2026
bc81886
Modularized Safety Controller Drive Command
DwnNyxDev Mar 2, 2026
8314d98
Merge branch 'master' of github.com:rss2026-2/wall_follower
DwnNyxDev Mar 2, 2026
883937a
fixing a minor issue
ifenetangerine Mar 2, 2026
2201762
Merge branch 'master' of github.com:rss2026-2/wall_follower
DwnNyxDev Mar 2, 2026
8f193e3
Merge branch 'master' of github.com:rss2026-2/wall_follower
citlalmina17 Mar 2, 2026
0e69c61
added parameters for line projection
citlalmina17 Mar 2, 2026
32cbf3c
fixed axis
citlalmina17 Mar 2, 2026
5b074bf
Changed Lidar Subset Calculator to Return Cartesian Points
DwnNyxDev Mar 2, 2026
abce4e9
bredons function
ifenetangerine Mar 2, 2026
361b88a
Removed publisher from lidar callback
DwnNyxDev Mar 2, 2026
8cfed49
Merge branch 'master' of github.com:rss2026-2/wall_follower
DwnNyxDev Mar 2, 2026
1c1bd61
driver callback
ifenetangerine Mar 2, 2026
4f96b90
mergin somethign erge branch 'master' of https://github.com/rss2026-2…
ifenetangerine Mar 2, 2026
edb3331
changed the functions a bit
ifenetangerine Mar 2, 2026
ff53979
nothing changed
citlalmina17 Mar 2, 2026
25bbb9c
comments, minor fixes, safety controller tester updates
citlalmina17 Mar 2, 2026
8d23138
updated drive topics for muxes
citlalmina17 Mar 2, 2026
e988c9e
added a comma
citlalmina17 Mar 2, 2026
2772b1c
fix parameters .value
citlalmina17 Mar 2, 2026
b4f900f
fix parameters and drive publish topic
citlalmina17 Mar 2, 2026
67f35be
deltas logic fixes, masks for distances, topic names
citlalmina17 Mar 2, 2026
6cdee48
type fix
citlalmina17 Mar 2, 2026
2864cfd
added logging messages
citlalmina17 Mar 2, 2026
e22969f
updated drive listen topic
citlalmina17 Mar 2, 2026
75ae34e
updated logging
citlalmina17 Mar 2, 2026
1ae7e1e
none check
citlalmina17 Mar 2, 2026
801c92e
fixed topics
citlalmina17 Mar 3, 2026
ac362a0
fixed distance filter
citlalmina17 Mar 3, 2026
6bf8097
fix
citlalmina17 Mar 3, 2026
642ec59
renamed wall_follower to prevent naming conflicts in local docker + a…
ifenetangerine Mar 3, 2026
2179177
tmux file to open four windows at once
ifenetangerine Mar 3, 2026
9c0650a
added tmux file
ifenetangerine Mar 3, 2026
7a4114e
changed function order
bmurph04 Mar 4, 2026
f4fe9f1
simplified deltas calculation
bmurph04 Mar 4, 2026
626c9e5
simplified subset calculations
bmurph04 Mar 4, 2026
be7d173
removed coordinate conversion and line dist functions
bmurph04 Mar 4, 2026
8ace641
standardized docstrings
bmurph04 Mar 4, 2026
39f8349
Merge pull request #1 from rss2026-2/code-cleanup
bmurph04 Mar 4, 2026
bd634fe
added visualization line
bmurph04 Mar 4, 2026
9fac324
Fixed Line Project Visualization Bug
bmurph04 Mar 4, 2026
0738de9
Added docstring to visualize line
bmurph04 Mar 4, 2026
236f5fd
fixed type
bmurph04 Mar 4, 2026
b183f7b
Merge branch 'master' into launch-files
ifenetangerine Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
Binary file added safety_controller/.DS_Store
Binary file not shown.
4 changes: 4 additions & 0 deletions safety_controller/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Safety_controller subscribes to ouster_points and imu_packets.
First, projects car's position in the next 1 second.
Second, takes the linear regression between curr position and future position.
Third, calculates distance from lidar points to line. If within crash delta (.2 m), then publishes STOP command.
39 changes: 39 additions & 0 deletions safety_controller/launch/testing.launch.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from launch import LaunchDescription
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory
import os

def generate_launch_description():
safety_params = os.path.join(
get_package_share_directory('safety_controller'),
'params.yaml'
)
return LaunchDescription([
Node(
package='safety_controller',
executable='tester',
name='safety_tester',
parameters=[
{'drive_topic': '/vesc/high_level/input/nav_1'},
]
),
Node(
package='safety_controller',
executable='controller',
name='safety_controller',
parameters=[
safety_params,
{'scan_topic': '/scan'},
{'drive_topic_listen': '/vesc/low_level/ackermann_cmd'},
{'drive_topic_publish':'/vesc/low_level/input/safety'},
]
),
Node(
package='safety_controller',
executable='logger',
name='error_logger',
parameters=[

]
)
])
33 changes: 33 additions & 0 deletions safety_controller/package.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>safety_controller</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="racecar@todo.todo">racecar</maintainer>
<license>TODO: License declaration</license>

<depend>ackermann_msgs</depend>
<depend>geometry_msgs</depend>
<depend>rclpy</depend>
<depend>sensor_msgs</depend>
<depend>std_msgs</depend>
<depend>visualization_msgs</depend>
<depend>tf2_ros</depend>

<test_depend>ament_copyright</test_depend>
<test_depend>ament_flake8</test_depend>
<test_depend>ament_pep257</test_depend>
<test_depend>python3-pytest</test_depend>

<export>
<build_type>ament_python</build_type>
<depend>ackermann_msgs</depend>
<depend>geometry_msgs</depend>
<depend>rclpy</depend>
<depend>sensor_msgs</depend>
<depend>std_msgs</depend>
<depend>visualization_msgs</depend>
<depend>tf2_ros</depend>
</export>
</package>
Empty file.
Empty file.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
89 changes: 89 additions & 0 deletions safety_controller/safety_controller/logger_node.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import rclpy
import random
from rclpy.node import Node

from std_msgs.msg import Float32
from sensor_msgs.msg import LaserScan
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os

class WallFollowerLogger(Node):
# TODO: error metric: where we want it to stop - where it actually stopped
# TODO: publish error metric WRT to different velocities

def __init__(self):
super().__init__('')
self.declare_parameters(namespace = '', parameters = [
('subscriber_topic', 'crash_points'),
])

self.subscription = self.create_subscription(
LaserScan,
self.get_parameter('subscriber_topic').value,
self.listener_callback,
10)

rclpy.get_shutdown_context().on_shutdown(self.on_shutdown_callback)

self.obstacle_sizes = []
self.avg_distances = []

def on_shutdown_callback(self):
self.get_logger().info("--- Node is shutting down. Saving a log of the run. ---")
obstacle_time_axis = [0 + i for i in range(len(self.obstacle_sizes))]
distance_time_axis = [0 + i for i in range(len(self.avg_distances))]

fig1 = plt.figure()
plt.plot(obstacle_time_axis,self.obstacle_sizes)
plt.figure('Obstacle Sizes Over Time During the Run')
plt.ylabel('Count of lidar points cluster')
plt.xlable('Timestep')

fig2 = plt.figure()
plt.plot(distance_time_axis,self.avg_distances)
plt.figure('Average Distance To Obstacles During the Run')
plt.ylabel('Distance (m)')
plt.xlable('Timestep')

fig1.savefig('obstacle_count')
fig2.savefig('avg_dist')
fig1.close()
fig2.close()

obstacles_df = pd.DataFrame(self.obstacle_sizes)
distances_df = pd.DataFrame(self.avg_distances)
obstacles_df.to_csv('obstacle_count',index=False)
distances_df.to_csv('avg_dist',index=False)
self.get_logger().info(f'Saved csv files and plots to {os.getcwd()}/')

def listener_callback(self, msg):
points = msg.ranges

n = len(points)
if n > 0:
self.get_logger().info(f'Currently detecting a crash of size: {n}')

avg_distance = np.mean(np.array(n))

self.obstacle_sizes.append(n)
self.avg_distances.append(avg_distance)


def main(args=None):
rclpy.init(args=args)

minimal_publisher = WallFollowerLogger()

rclpy.spin(minimal_publisher)

# Destroy the node explicitly
# (optional - otherwise it will be done automatically
# when the garbage collector destroys the node object)
minimal_publisher.destroy_node()
rclpy.shutdown()


if __name__ == '__main__':
main()
4 changes: 4 additions & 0 deletions safety_controller/safety_controller/params.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
safety_controller:
ros__parameters:
safety_radius: 0.5
safety_controller_const: 0.1
Loading