Program Listing for File moveit_visual_tools.h

Return to documentation for file (/tmp/ws/src/moveit_visual_tools/include/moveit_visual_tools/moveit_visual_tools.h)

// Copyright 2015 University of Colorado, Boulder
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
//    * Redistributions of source code must retain the above copyright
//      notice, this list of conditions and the following disclaimer.
//
//    * Redistributions in binary form must reproduce the above copyright
//      notice, this list of conditions and the following disclaimer in the
//      documentation and/or other materials provided with the distribution.
//
//    * Neither the name of the copyright holder nor the names of its
//      contributors may be used to endorse or promote products derived from
//      this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.

/* \author  Dave Coleman
 * \desc    Helper functions for displaying and debugging MoveIt data in Rviz via published markers
 *          and MoveIt collision objects. Very useful for debugging complex software
 */

#ifndef MOVEIT_VISUAL_TOOLS_MOVEIT_VISUAL_TOOLS_H
#define MOVEIT_VISUAL_TOOLS_MOVEIT_VISUAL_TOOLS_H

// Rviz Visualization Tool
#include <rviz_visual_tools/rviz_visual_tools.hpp>

// MoveIt
#include <moveit/planning_scene_monitor/planning_scene_monitor.h>

// MoveIt Messages
#include <moveit_msgs/msg/grasp.hpp>
#include <moveit_msgs/msg/display_robot_state.hpp>
#include <moveit_msgs/msg/workspace_parameters.hpp>
#include <moveit_msgs/msg/display_robot_state.hpp>
#include <moveit_msgs/msg/display_trajectory.hpp>

// ROS Messages
#include <trajectory_msgs/msg/joint_trajectory.hpp>
#include <graph_msgs/msg/geometry_graph.hpp>

// C++
#include <map>
#include <string>
#include <utility>
#include <vector>

namespace moveit_visual_tools
{
// Default constants
static const std::string ROBOT_DESCRIPTION = "robot_description";  // this is the default used in ROS
static const std::string DISPLAY_PLANNED_PATH_TOPIC =
    "/move_group/display_planned_path";  // this is the default when adding the Rviz plugin
static const std::string DISPLAY_ROBOT_STATE_TOPIC =
    "display_robot_state";                                         // this is the default when adding the Rviz plugin
static const std::string PLANNING_SCENE_TOPIC = "planning_scene";  // this is the default when adding the Rviz plugin

class MoveItVisualTools : public rviz_visual_tools::RvizVisualTools
{
public:
  MoveItVisualTools(const rclcpp::Node::SharedPtr& node);

  MoveItVisualTools(const rclcpp::Node::SharedPtr& node, const std::string& base_frame, const std::string& marker_topic,
                    planning_scene_monitor::PlanningSceneMonitorPtr psm);

  MoveItVisualTools(const rclcpp::Node::SharedPtr& node, const std::string& base_frame,
                    const std::string& marker_topic = rviz_visual_tools::RVIZ_MARKER_TOPIC,
                    moveit::core::RobotModelConstPtr robot_model = moveit::core::RobotModelConstPtr());

  void setRobotStateTopic(const std::string& robot_state_topic)
  {
    robot_state_topic_ = robot_state_topic;
  }

  void setPlanningSceneTopic(const std::string& planning_scene_topic)
  {
    planning_scene_topic_ = planning_scene_topic;
  }

  bool loadPlanningSceneMonitor();

  bool processCollisionObjectMsg(const moveit_msgs::msg::CollisionObject& msg,
                                 const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);

  bool processAttachedCollisionObjectMsg(const moveit_msgs::msg::AttachedCollisionObject& msg);

  bool moveCollisionObject(const Eigen::Isometry3d& pose, const std::string& name,
                           const rviz_visual_tools::Colors& color);
  bool moveCollisionObject(const geometry_msgs::msg::Pose& pose, const std::string& name,
                           const rviz_visual_tools::Colors& color);

  bool triggerPlanningSceneUpdate();

  bool loadSharedRobotState();

  moveit::core::RobotStatePtr& getSharedRobotState();

  moveit::core::RobotStatePtr& getRootRobotState()
  {
    return root_robot_state_;
  }

  moveit::core::RobotModelConstPtr getRobotModel();

  bool loadEEMarker(const moveit::core::JointModelGroup* ee_jmg, const std::vector<double>& ee_joint_pos = {});

  void loadTrajectoryPub(const std::string& display_planned_path_topic = DISPLAY_PLANNED_PATH_TOPIC,
                         bool blocking = true);
  void loadRobotStatePub(const std::string& robot_state_topic = "", bool blocking = true);

  void setPlanningSceneMonitor(planning_scene_monitor::PlanningSceneMonitorPtr psm)
  {
    psm_ = std::move(psm);
  }

  void setManualSceneUpdating(bool enable_manual = true)
  {
    manual_trigger_update_ = enable_manual;
  }

  bool publishEEMarkers(const Eigen::Isometry3d& pose, const moveit::core::JointModelGroup* ee_jmg,
                        const std::vector<double>& ee_joint_pos,
                        const rviz_visual_tools::Colors& color = rviz_visual_tools::DEFAULT,
                        const std::string& ns = "end_effector")
  {
    return publishEEMarkers(convertPose(pose), ee_jmg, ee_joint_pos, color, ns);
  }
  bool publishEEMarkers(const Eigen::Isometry3d& pose, const moveit::core::JointModelGroup* ee_jmg,
                        const rviz_visual_tools::Colors& color = rviz_visual_tools::DEFAULT,
                        const std::string& ns = "end_effector")
  {
    return publishEEMarkers(convertPose(pose), ee_jmg, {}, color, ns);
  }
  bool publishEEMarkers(const geometry_msgs::msg::Pose& pose, const moveit::core::JointModelGroup* ee_jmg,
                        const rviz_visual_tools::Colors& color = rviz_visual_tools::DEFAULT,
                        const std::string& ns = "end_effector")
  {
    return publishEEMarkers(pose, ee_jmg, {}, color, ns);
  }
  bool publishEEMarkers(const geometry_msgs::msg::Pose& pose, const moveit::core::JointModelGroup* ee_jmg,
                        const std::vector<double>& ee_joint_pos,
                        const rviz_visual_tools::Colors& color = rviz_visual_tools::DEFAULT,
                        const std::string& ns = "end_effector");

  bool publishGrasps(const std::vector<moveit_msgs::msg::Grasp>& possible_grasps,
                     const moveit::core::JointModelGroup* ee_jmg, double animate_speed = 0.1 /* seconds */);

  bool publishAnimatedGrasps(const std::vector<moveit_msgs::msg::Grasp>& possible_grasps,
                             const moveit::core::JointModelGroup* ee_jmg, double animate_speed = 0.01 /* seconds */);

  bool publishAnimatedGrasp(const moveit_msgs::msg::Grasp& grasp, const moveit::core::JointModelGroup* ee_jmg,
                            double animate_speed /* seconds */);

  bool publishIKSolutions(const std::vector<trajectory_msgs::msg::JointTrajectoryPoint>& ik_solutions,
                          const moveit::core::JointModelGroup* arm_jmg, double display_time = 0.4);

  bool removeAllCollisionObjects();

  bool cleanupCO(const std::string& name);

  bool cleanupACO(const std::string& name);

  bool attachCO(const std::string& name, const std::string& ee_parent_link);

  bool publishCollisionFloor(double z = 0.0, const std::string& plane_name = "Floor",
                             const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);

  bool publishCollisionBlock(const geometry_msgs::msg::Pose& block_pose, const std::string& block_name = "block",
                             double block_size = 0.1,
                             const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);

  bool publishCollisionCuboid(const Eigen::Vector3d& point1, const Eigen::Vector3d& point2, const std::string& name,
                              const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);
  bool publishCollisionCuboid(const geometry_msgs::msg::Point& point1, const geometry_msgs::msg::Point& point2,
                              const std::string& name,
                              const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);

  bool publishCollisionCuboid(const Eigen::Isometry3d& pose, double width, double depth, double height,
                              const std::string& name, const rviz_visual_tools::Colors& color);

  bool publishCollisionCuboid(const geometry_msgs::msg::Pose& pose, double width, double depth, double height,
                              const std::string& name, const rviz_visual_tools::Colors& color);

  bool publishCollisionCuboid(const Eigen::Isometry3d& pose, const Eigen::Vector3d& size, const std::string& name,
                              const rviz_visual_tools::Colors& color)
  {
    return publishCollisionCuboid(pose, size.x(), size.y(), size.z(), name, color);
  }
  bool publishCollisionCuboid(const geometry_msgs::msg::Pose& pose, const geometry_msgs::msg::Vector3& size,
                              const std::string& name, const rviz_visual_tools::Colors& color)
  {
    return publishCollisionCuboid(pose, size.x, size.y, size.z, name, color);
  }

  bool publishCollisionCylinder(const geometry_msgs::msg::Point& a, const geometry_msgs::msg::Point& b,
                                const std::string& object_name, double radius,
                                const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);
  bool publishCollisionCylinder(const Eigen::Vector3d& a, const Eigen::Vector3d& b, const std::string& object_name,
                                double radius, const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);

  bool publishCollisionCylinder(const Eigen::Isometry3d& object_pose, const std::string& object_name, double radius,
                                double height, const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);
  bool publishCollisionCylinder(const geometry_msgs::msg::Pose& object_pose, const std::string& object_name,
                                double radius, double height,
                                const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);

  bool publishCollisionMesh(const geometry_msgs::msg::Pose& object_pose, const std::string& object_name,
                            const std::string& mesh_path,
                            const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);
  bool publishCollisionMesh(const Eigen::Isometry3d& object_pose, const std::string& object_name,
                            const std::string& mesh_path,
                            const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);
  bool publishCollisionMesh(const Eigen::Isometry3d& object_pose, const std::string& object_name,
                            const shape_msgs::msg::Mesh& mesh_msg,
                            const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);
  bool publishCollisionMesh(const geometry_msgs::msg::Pose& object_pose, const std::string& object_name,
                            const shape_msgs::msg::Mesh& mesh_msg,
                            const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);

  bool publishCollisionGraph(const graph_msgs::msg::GeometryGraph& graph, const std::string& object_name, double radius,
                             const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);

  void getCollisionWallMsg(double x, double y, double z, double angle, double width, double height,
                           const std::string& name, moveit_msgs::msg::CollisionObject& collision_obj);

  bool publishCollisionWall(double x, double y, double angle = 0.0, double width = 2.0, double height = 1.5,
                            const std::string& name = "wall",
                            const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);
  bool publishCollisionWall(double x, double y, double z, double angle = 0.0, double width = 2.0, double height = 1.5,
                            const std::string& name = "wall",
                            const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);

  bool publishCollisionTable(double x, double y, double z, double angle, double width, double height, double depth,
                             const std::string& name,
                             const rviz_visual_tools::Colors& color = rviz_visual_tools::GREEN);

  bool loadCollisionSceneFromFile(const std::string& path);
  bool loadCollisionSceneFromFile(const std::string& path, const Eigen::Isometry3d& offset);

  bool publishWorkspaceParameters(const moveit_msgs::msg::WorkspaceParameters& params);

  bool checkAndPublishCollision(const moveit::core::RobotState& robot_state,
                                const planning_scene::PlanningScene* planning_scene,
                                const rviz_visual_tools::Colors& highlight_link_color = rviz_visual_tools::RED,
                                const rviz_visual_tools::Colors& contact_point_color = rviz_visual_tools::PURPLE);

  bool publishContactPoints(const moveit::core::RobotState& robot_state,
                            const planning_scene::PlanningScene* planning_scene,
                            const rviz_visual_tools::Colors& color = rviz_visual_tools::RED);

  bool publishContactPoints(const collision_detection::CollisionResult::ContactMap& contacts,
                            const planning_scene::PlanningScene* planning_scene,
                            const rviz_visual_tools::Colors& color = rviz_visual_tools::RED);

  bool publishTrajectoryPoint(const trajectory_msgs::msg::JointTrajectoryPoint& trajectory_pt,
                              const std::string& planning_group, double display_time = 0.1);

  bool publishTrajectoryPath(const std::vector<moveit::core::RobotStatePtr>& trajectory,
                             const moveit::core::JointModelGroup* jmg, double speed = 0.01, bool blocking = false);
  bool publishTrajectoryPath(const robot_trajectory::RobotTrajectoryPtr& trajectory, bool blocking = false);
  bool publishTrajectoryPath(const robot_trajectory::RobotTrajectory& trajectory, bool blocking = false);
  bool publishTrajectoryPath(const moveit_msgs::msg::RobotTrajectory& trajectory_msg,
                             const moveit::core::RobotStateConstPtr& robot_state, bool blocking = false);
  bool publishTrajectoryPath(const moveit_msgs::msg::RobotTrajectory& trajectory_msg,
                             const moveit::core::RobotState& robot_state, bool blocking = false);
  bool publishTrajectoryPath(const moveit_msgs::msg::RobotTrajectory& trajectory_msg,
                             const moveit_msgs::msg::RobotState& robot_state, bool blocking = false);
  void publishTrajectoryPath(const moveit_msgs::msg::DisplayTrajectory& display_trajectory_msg);

  bool publishTrajectoryLine(const moveit_msgs::msg::RobotTrajectory& trajectory_msg,
                             const moveit::core::LinkModel* ee_parent_link,
                             const moveit::core::JointModelGroup* arm_jmg,
                             const rviz_visual_tools::Colors& color = rviz_visual_tools::LIME_GREEN);
  bool publishTrajectoryLine(const robot_trajectory::RobotTrajectoryPtr& robot_trajectory,
                             const moveit::core::LinkModel* ee_parent_link,
                             const rviz_visual_tools::Colors& color = rviz_visual_tools::LIME_GREEN);
  bool publishTrajectoryLine(const robot_trajectory::RobotTrajectory& robot_trajectory,
                             const moveit::core::LinkModel* ee_parent_link,
                             const rviz_visual_tools::Colors& color = rviz_visual_tools::LIME_GREEN);

  bool publishTrajectoryLine(const moveit_msgs::msg::RobotTrajectory& trajectory_msg,
                             const moveit::core::JointModelGroup* arm_jmg,
                             const rviz_visual_tools::Colors& color = rviz_visual_tools::LIME_GREEN);
  bool publishTrajectoryLine(const robot_trajectory::RobotTrajectoryPtr& robot_trajectory,
                             const moveit::core::JointModelGroup* arm_jmg,
                             const rviz_visual_tools::Colors& color = rviz_visual_tools::LIME_GREEN);
  bool publishTrajectoryLine(const robot_trajectory::RobotTrajectory& robot_trajectory,
                             const moveit::core::JointModelGroup* arm_jmg,
                             const rviz_visual_tools::Colors& color = rviz_visual_tools::LIME_GREEN);

  bool publishTrajectoryPoints(const std::vector<moveit::core::RobotStatePtr>& robot_state_trajectory,
                               const moveit::core::LinkModel* ee_parent_link,
                               const rviz_visual_tools::Colors& color = rviz_visual_tools::YELLOW);

  void enableRobotStateRootOffet(const Eigen::Isometry3d& offset);

  void disableRobotStateRootOffet();

  bool publishRobotState(const trajectory_msgs::msg::JointTrajectoryPoint& trajectory_pt,
                         const moveit::core::JointModelGroup* jmg,
                         const rviz_visual_tools::Colors& color = rviz_visual_tools::DEFAULT);

  bool publishRobotState(const std::vector<double>& joint_positions, const moveit::core::JointModelGroup* jmg,
                         const rviz_visual_tools::Colors& color = rviz_visual_tools::DEFAULT);

  bool publishRobotState(const moveit::core::RobotState& robot_state,
                         const rviz_visual_tools::Colors& color = rviz_visual_tools::DEFAULT,
                         const std::vector<std::string>& highlight_links = {});
  bool publishRobotState(const moveit::core::RobotStatePtr& robot_state,
                         const rviz_visual_tools::Colors& color = rviz_visual_tools::DEFAULT,
                         const std::vector<std::string>& highlight_links = {});
  void publishRobotState(const moveit_msgs::msg::DisplayRobotState& display_robot_state_msg);

  bool hideRobot();

  static bool applyVirtualJointTransform(moveit::core::RobotState& robot_state, const Eigen::Isometry3d& offset);

  void showJointLimits(const moveit::core::RobotStatePtr& robot_state);

  planning_scene_monitor::PlanningSceneMonitorPtr getPlanningSceneMonitor();

private:
  static bool checkForVirtualJoint(const moveit::core::RobotState& robot_state);

protected:
  // Pointer to a Planning Scene Monitor
  planning_scene_monitor::PlanningSceneMonitorPtr psm_;

  // Prevent the planning scene from always auto-pushing, but rather do it manually
  bool manual_trigger_update_ = false;

  // Pointer to the robot model
  moveit::core::RobotModelConstPtr robot_model_;

  // ROS topic names to use when starting publishers
  std::string robot_state_topic_;
  std::string planning_scene_topic_;

  // ROS publishers
  rclcpp::Publisher<moveit_msgs::msg::DisplayTrajectory>::SharedPtr pub_display_path_;  // for MoveIt trajectories
  rclcpp::Publisher<moveit_msgs::msg::DisplayRobotState>::SharedPtr pub_robot_state_;   // publish a RobotState message

  // ROS Node
  rclcpp::Node::SharedPtr node_;

  robot_model_loader::RobotModelLoaderPtr rm_loader_;  // so that we can specify our own options

  // End Effector Markers
  std::map<const moveit::core::JointModelGroup*, visualization_msgs::msg::MarkerArray> ee_markers_map_;
  std::map<const moveit::core::JointModelGroup*, EigenSTL::vector_Isometry3d> ee_poses_map_;
  std::map<const moveit::core::JointModelGroup*, std::vector<double> > ee_joint_pos_map_;

  // Cached robot state marker - cache the colored links.
  // Note: Only allows colors provided in rviz_visual_tools to prevent too many robot state messages from being loaded
  // and ensuring efficiency
  std::map<rviz_visual_tools::Colors, moveit_msgs::msg::DisplayRobotState> display_robot_msgs_;

  // Note: call loadSharedRobotState() before using this
  moveit::core::RobotStatePtr shared_robot_state_;

  // Note: call loadSharedRobotState() before using this. Use only for hiding the robot
  moveit::core::RobotStatePtr hidden_robot_state_;

  // A robot state whose virtual_joint remains at identity so that getGlobalLinkTransform() isn't tainted
  // Note: call loadSharedRobotState() before using this
  moveit::core::RobotStatePtr root_robot_state_;

  // Optional offset that can be applied to all outgoing/published robot states
  bool robot_state_root_offset_enabled_ = false;
  Eigen::Isometry3d robot_state_root_offset_;

public:
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW  // http://eigen.tuxfamily.org/dox/group__TopicStructHavingEigenMembers.html
};                                 // class

typedef std::shared_ptr<MoveItVisualTools> MoveItVisualToolsPtr;
typedef std::shared_ptr<const MoveItVisualTools> MoveItVisualToolsConstPtr;

}  // namespace moveit_visual_tools

#endif  // MOVEIT_VISUAL_TOOLS_MOVEIT_VISUAL_TOOLS_H