Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sanitize input for initial_conditions #23

Open
PhilipLoewen opened this issue Oct 2, 2024 · 0 comments
Open

Sanitize input for initial_conditions #23

PhilipLoewen opened this issue Oct 2, 2024 · 0 comments

Comments

@PhilipLoewen
Copy link

I think this is serious, but it needs independent corroboration.

If the user carelessly provides integer values for the initial_conditions when creating a RobotariumABC object, deep magic in Numpy can make the dynamics break. To save careless users (like my past self) from this, I suggest changing the definition of the variable self.initial_conditions in the __init__ method of this class. Right now this is line 33 in the file named robotarium_abc.py, and it makes a literal copy of the user input. I think that line should be replaced with this:
self.initial_conditions = initial_conditions.astype(float)

Here is a test case to copy-paste into the Python simulator and demonstrate the issue. Toggle the line after N=1. Then make the change suggested above and retest. Finally, check that the suggested change doesn't break something else.

import rps.robotarium as robotarium
from rps.utilities.transformations import *
from rps.utilities.barrier_certificates import *
from rps.utilities.misc import *
from rps.utilities.controllers import *
import numpy as np
import time

N = 1 # Number of Robots

# Activate one of the following two lines and observe the different outcomes
#init_pos = np.array([-1.3,0,0]).reshape(3,1) # Initial Positions - works!
init_pos = np.array([-1,0,0]).reshape(3,1) # Initial Positions are all integers - breaks!


iterations = 60        # Run the simulation/experiment for 60 steps

r = robotarium.Robotarium(number_of_robots=N, show_figure=True, initial_conditions=init_pos, sim_in_real_time=True) 

line_width = 5 # Big lines
position_history = np.empty((2,0)) # History to show what the robot does
r.axes.plot([-1.6,1.6],[0,0],linewidth=line_width,color='k',zorder=-1) # Plot reference line

for t in range(iterations):

    x = r.get_poses() # Get the poses of robots

    dxu = np.array([0.15,0]).reshape(2,1) # Define the Speed of the robot

    r.set_velocities(np.arange(N), dxu) # Set the velocities using unicycle commands

    print(f"Index t={t:3d}: pose {x[0,0]:4.2f} {x[1,0]:4.2f} {x[2,0]:4.2f}; inputs {dxu[0,0]:4.2f}, {dxu[1,0]:4.2f}.")

    # Plotting the robot's true trajectory.
    position_history=np.append(position_history, x[:2],axis=1)
    if(t == iterations-1):
        r.axes.scatter(position_history[0,:],position_history[1,:], s=1, linewidth=line_width, color='r', linestyle='dashed')

    r.step() # Iterate the simulation
    secretx = r.poses
    print(f"    Updated pose: {secretx[0,0]:4.2f} {secretx[1,0]:4.2f} {secretx[2,0]:4.2f}.")

time.sleep(5)

r.call_at_scripts_end() # Call at end of script to print debug information

Thanks for considering this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant