ros_tutorials
ros_tutorials copied to clipboard
[ros2 turtlesim] turtle.cpp needs to validate float32/float64 input variables
There are many places in the code that assume control inputs (i.e., x
, y
, and theta
) are valid floating point numbers. As a result, when one of nan
, -nan
, inf
or -inf
is given, the turtle's position becomes infeasible (e.g., x
being nan
), sometimes even become rendering it uncontrollable.
- Case 1:
teleport_absolute
service- In
Turtle::update()
, the requestedx
is directly used to set position (pos_.setX(req.pos.x());
). - When
nan
or-nan
is provided, turtle'sx
position becomesnan
. - Requests with
theta
set tonan
orinf
makex
,y
, andtheta
of the turtle's posenan
, removing the turtle from the frame.
- In
- Case 2:
teleport_relative
service- Similarly, if
linear
and/orangular
ofteleport_relative
request is set tonan
orinf
, turtle's position becomes infeasible.
- Similarly, if
- Case 3:
rotate_absolute
action- Sending goal with
theta
set tonan
orinf
can have the turtle rotate indefinitely, asremaining
becomes eithernan
or-nan
. - This forces
ang_vel_
to become 1.0 after executing the following statement:ang_vel_ = remaining < 0.0 ? -1.0 : 1.0;
, asnan < 0.0
always evaluates toFalse
.
- Sending goal with
- Case 4:
cmd_vel
topic-
linear.x
,linear.y
, andangular.z
are not sanitized before being used. Similar to the previous cases,x
,y
and/ortheta
of turtle's pose are easily set tonan
.
-
I suggest adding checks before using these variables, e.g., std::isnan
and std::isinf
, to prevent unexpected input values from polluting the turtle's state.
Hi @squizz617, thanks for making this issue. Feel free to make a PR with some or all of these fixes. If you do, you can @ me for a review.