Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <ros/ros.h>
00022 #include <geometry_msgs/Twist.h>
00023 #include <visualization_msgs/Marker.h>
00024 #include <visualization_msgs/MarkerArray.h>
00025
00026 #include <string>
00027
00028 class TwistMarker
00029 {
00030 public:
00031
00032 TwistMarker(double scale = 1.0, double z = 0.0, const std::string& frame_id = "base_footprint")
00033 : frame_id_(frame_id)
00034 , scale_(scale)
00035 , z_(z)
00036 {
00037
00038 marker_.id = 0;
00039 marker_.type = visualization_msgs::Marker::ARROW;
00040
00041
00042 marker_.header.frame_id = frame_id_;
00043
00044
00045 marker_.points.resize(2);
00046
00047
00048 marker_.pose.position.z = z_;
00049
00050
00051 marker_.scale.x = 0.05 * scale_;
00052 marker_.scale.y = 2 * marker_.scale.x;
00053
00054
00055 marker_.color.a = 1.0;
00056 marker_.color.r = 0.0;
00057 marker_.color.g = 1.0;
00058 marker_.color.b = 0.0;
00059 }
00060
00061 void update(const geometry_msgs::Twist& twist)
00062 {
00063 marker_.points[1].x = twist.linear.x;
00064
00065 if (fabs(twist.linear.y) > fabs(twist.angular.z))
00066 {
00067 marker_.points[1].y = twist.linear.y;
00068 }
00069 else
00070 {
00071 marker_.points[1].y = twist.angular.z;
00072 }
00073 }
00074
00075 const visualization_msgs::Marker& getMarker()
00076 {
00077 return marker_;
00078 }
00079
00080 private:
00081 visualization_msgs::Marker marker_;
00082
00083 std::string frame_id_;
00084 double scale_;
00085 double z_;
00086 };
00087
00088 class TwistMarkerPublisher
00089 {
00090 public:
00091
00092 TwistMarkerPublisher(double scale = 1.0, double z = 0.0)
00093 : marker_(scale, z)
00094 {
00095 ros::NodeHandle nh;
00096
00097 pub_ = nh.advertise<visualization_msgs::Marker>("marker", 1, true);
00098 sub_ = nh.subscribe("twist", 1, &TwistMarkerPublisher::callback, this);
00099 }
00100
00101 void callback(const geometry_msgs::TwistConstPtr& twist)
00102 {
00103 marker_.update(*twist);
00104
00105 pub_.publish(marker_.getMarker());
00106 }
00107
00108 private:
00109 ros::Subscriber sub_;
00110 ros::Publisher pub_;
00111
00112 TwistMarker marker_;
00113 };
00114
00115 int
00116 main(int argc, char *argv[])
00117 {
00118 ros::init(argc, argv, "twist_marker");
00119
00120 TwistMarkerPublisher t(1.0, 2.0);
00121
00122 while (ros::ok())
00123 {
00124 ros::spin();
00125 }
00126
00127 return EXIT_SUCCESS;
00128 }
00129