/*----------------------------------------------------------------------------*/ /* Copyright (c) 2020 FIRST. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ /*----------------------------------------------------------------------------*/ #pragma once #include #include #include #include #include #include #include #include "frc/geometry/Pose2d.h" #include "frc/geometry/Rotation2d.h" #include "frc/smartdashboard/FieldObject2d.h" #include "frc/smartdashboard/Sendable.h" namespace frc { /** * 2D representation of game field for dashboards. * * An object's pose is the location shown on the dashboard view. Note that * for the robot, this may or may not match the internal odometry. For example, * if the robot is shown at a particular starting location, the pose in this * class would represent the actual location on the field, but the robot's * internal state might have a 0,0,0 pose (unless it's initialized to * something different). * * As the user is able to edit the pose, code performing updates should get * the robot pose, transform it as appropriate (e.g. based on wheel odometry), * and set the new pose. * * This class provides methods to set the robot pose, but other objects can * also be shown by using the GetObject() function. Other objects can * also have multiple poses (which will show the object at multiple locations). */ class Field2d : public Sendable { public: using Entry = size_t; Field2d(); /** * Set the robot pose from a Pose object. * * @param pose 2D pose */ void SetRobotPose(const Pose2d& pose); /** * Set the robot pose from x, y, and rotation. * * @param x X location * @param y Y location * @param rotation rotation */ void SetRobotPose(units::meter_t x, units::meter_t y, Rotation2d rotation); /** * Get the robot pose. * * @return 2D pose */ Pose2d GetRobotPose() const; /** * Get or create a field object. * * @return Field object */ FieldObject2d* GetObject(const wpi::Twine& name); /** * Get the robot object. * * @return Field object for robot */ FieldObject2d* GetRobotObject(); void InitSendable(SendableBuilder& builder) override; private: std::shared_ptr m_table; mutable wpi::mutex m_mutex; std::vector> m_objects; }; } // namespace frc