Calling set_velocities(ids, velocities) raises a ValueError when ids is a scalar or a 0-dimensional NDArray, which might be used for single-robot control.
Reproduction (Single robot moving in a circle):
import numpy as np
from rps.robotarium import Robotarium
robotarium = Robotarium(number_of_robots=1, show_figure=True)
for _ in range(100):
poses = robotarium.get_poses()
command = np.array([[0.2], [1]])
robotarium.set_velocities(0, command) # crashes
# robotarium.set_velocities(np.array(0), command) # crashes
# robotarium.set_velocities([0], command) # no crash
# robotarium.set_velocities(np.atleast_1d(0), command) # no crash
# robotarium.set_velocities(np.arange(1), command) # no crash
robotarium.step()
Error:
ValueError: could not broadcast input array from shape (2,1) into shape (2,)
Cause:
In set_velocities, if ids is a scalar or 0d array, self._velocities[:,ids] has shape (2,). Because velocities is (2,1), numpy fails to broadcast.
Suggested fix:
Hopefully I will follow this with a pull request. My suggested fix would be to make ids be at least 1d, allowing self._velocities[:,ids] to maintain a shape of (2,1). This would have no effect if ids is already 1d or 2d.
Calling
set_velocities(ids, velocities)raises aValueErrorwhenidsis a scalar or a 0-dimensional NDArray, which might be used for single-robot control.Reproduction (Single robot moving in a circle):
Error:
Cause:
In
set_velocities, ifidsis a scalar or 0d array,self._velocities[:,ids]has shape(2,). Becausevelocitiesis(2,1), numpy fails to broadcast.Suggested fix:
Hopefully I will follow this with a pull request. My suggested fix would be to make
idsbe at least 1d, allowingself._velocities[:,ids]to maintain a shape of(2,1). This would have no effect ifidsis already 1d or 2d.