1 #include <ed_gui_server_msgs/EntityInfos.h>
2 #include <ed_gui_server_msgs/QueryMeshes.h>
5 #include <ros/node_handle.h>
6 #include <ros/subscriber.h>
7 #include <ros/publisher.h>
11 #include <visualization_msgs/MarkerArray.h>
34 float COLORS[27][3] = { { 0.6, 0.6, 0.6},
68 for(
unsigned int i = 0; i < str.
size(); ++i)
82 m.lifetime = ros::Duration(1.0 /
RATE * 4);
83 m.action = visualization_msgs::Marker::ADD;
84 m.header.frame_id =
"map";
86 int i_color =
djb2(
id) % 27;
87 m.color.r =
COLORS[i_color][0];
88 m.color.g =
COLORS[i_color][1];
89 m.color.b =
COLORS[i_color][2];
94 void meshToMarker(
const ed_gui_server_msgs::Mesh& mesh, visualization_msgs::Marker& m)
96 m.type = visualization_msgs::Marker::TRIANGLE_LIST;
97 m.scale.x = m.scale.y = m.scale.z = 1.0;
99 m.points.resize(mesh.vertices.size() / 3);
100 for(
unsigned int i = 0; i < m.points.size(); ++i )
102 unsigned int i3 = 3 * i;
103 m.points[i].x = mesh.vertices[i3];
104 m.points[i].y = mesh.vertices[i3 + 1];
105 m.points[i].z = mesh.vertices[i3 + 2];
111 void polygonToMarker(
const ed_gui_server_msgs::EntityInfo& e, visualization_msgs::Marker& m)
113 m.type = visualization_msgs::Marker::LINE_LIST;
116 for(
unsigned int i = 0; i < e.polygon.xs.size(); ++i)
118 int j = (i + 1) % e.polygon.xs.size();
120 float x1 = e.polygon.xs[i];
121 float x2 = e.polygon.xs[j];
123 float y1 = e.polygon.ys[i];
124 float y2 = e.polygon.ys[j];
127 geometry_msgs::Point p;
130 p.x = x1; p.y = y1; p.z = e.polygon.z_min;
131 m.points.push_back(p);
133 p.x = x2; p.y = y2; p.z = e.polygon.z_min;
134 m.points.push_back(p);
137 p.x = x1; p.y = y1; p.z = e.polygon.z_max;
138 m.points.push_back(p);
140 p.x = x2; p.y = y2; p.z = e.polygon.z_max;
141 m.points.push_back(p);
144 p.x = x1; p.y = y1; p.z = e.polygon.z_min;
145 m.points.push_back(p);
147 p.x = x1; p.y = y1; p.z = e.polygon.z_max;
148 m.points.push_back(p);
156 for(
unsigned int i = 0; i < msg->entities.size(); ++i)
158 const ed_gui_server_msgs::EntityInfo&
info = msg->entities[i];
160 if (
info.id.size() >= 5 &&
info.id.substr(
info.id.size() - 5) ==
"floor")
182 entity_viz = &it->second;
185 if (
info.color.a == 1 &&
info.color.r == 2 &&
info.color.g == 3 && (
info.color.b == 4 ||
info.color.b == 5))
188 marker_msg.markers.push_back(visualization_msgs::Marker());
189 visualization_msgs::Marker& m =
marker_msg.markers.back();
192 m.id = entity_viz->
num_id;
194 m.header.stamp = ros::Time::now();
195 m.type = visualization_msgs::Marker::CYLINDER;
199 if (
info.color.b == 4)
201 m.color.r = 0.2; m.color.g = 0.7; m.color.b = 1.0;
205 m.color.r = 1.0; m.color.g = 0.7; m.color.b = 0.2;
209 m.pose.position.z = .5;
211 m.scale.x = 0.3; m.scale.y = 0.3; m.scale.z = 1.0;
224 visualization_msgs::Marker& m =
marker_msg.markers.back();
228 m.header.stamp = ros::Time::now();
232 if (
info.color.a != 0)
234 m.color.r = (float)
info.color.r / 255;
235 m.color.g = (
float)
info.color.g / 255;
236 m.color.b = (float)
info.color.b / 255;
239 m.color.a =
info.existence_probability;
241 if (
info.visual_revision == 0)
249 visualization_msgs::Marker& m_text =
marker_msg.markers.back();
251 m_text.type = visualization_msgs::Marker::TEXT_VIEW_FACING;
253 m_text.scale.x = m_text.scale.y = m_text.scale.z = 0.1;
255 m_text.color.r = 0.9;
256 m_text.color.g = 0.9;
257 m_text.color.b = 0.9;
259 m_text.pose = m.pose;
260 m_text.pose.position.z += 0.1;
261 m_text.header = m.header;
262 m_text.ns =
"labels";
264 m_text.text =
info.id.substr(0,4);
266 if (!
info.type.empty())
267 m_text.text +=
" (" +
info.type +
")";
294 int main(
int argc,
char **argv)
296 ros::init(argc, argv,
"ed_rviz_publisher");
303 RATE = atof(argv[2]);
306 ros::Subscriber sub = nh.subscribe(
"ed/gui/entities", 1,
entityCallback);
308 ros::ServiceClient
client = nh.serviceClient<ed_gui_server_msgs::QueryMeshes>(
"ed/gui/query_meshes");
310 ros::Publisher pub = nh.advertise<visualization_msgs::MarkerArray>(pub_topic, 1);
329 for (
const ed_gui_server_msgs::EntityMeshAndVolumes& entity_geomertry :
query_meshes_srv.response.entity_geometries)
332 const ed_gui_server_msgs::Mesh& mesh = entity_geomertry.mesh;
340 it->second.visual_revision = entity_geomertry.visual_revision;
345 ROS_ERROR(
"[ED RVIZ PUBLISHER] Could not query for meshes.");