marker_test.cpp
Go to the documentation of this file.
00001 #include "ros/ros.h"
00002 
00003 #include "visualization_msgs/Marker.h"
00004 #include "visualization_msgs/MarkerArray.h"
00005 
00006 #include <tf/transform_broadcaster.h>
00007 #include <tf/tf.h>
00008 
00009 ros::Publisher g_marker_pub;
00010 
00011 void emitRow(const std::string type_name, uint32_t type, int32_t x_pos, float r, float g, float b,
00012     ros::Duration lifetime, ros::Publisher& pub, bool frame_locked = true, std::string frame_id = std::string("/base_link"),
00013     float sx = 1.0, float sy = 1.0, float sz = 1.0)
00014 {
00015   static uint32_t count = 0;
00016   for (int i = -5; i < 5; ++i)
00017   {
00018     visualization_msgs::Marker marker;
00019     marker.header.frame_id = frame_id;
00020     ros::Time ros_time = ros::Time::now();
00021 //    ros_time.sec -=1;
00022     marker.header.stamp = ros_time;
00023     marker.ns = "marker_test_" + type_name;
00024     marker.id = i;
00025     marker.type = type;
00026     marker.action = visualization_msgs::Marker::ADD;
00027     marker.pose.position.x = x_pos;
00028     marker.pose.position.y = (i * 2);
00029     marker.pose.position.z = 0;
00030     marker.pose.orientation.x = 0.0;
00031     marker.pose.orientation.y = 0.0;
00032     marker.pose.orientation.z = 0.0;
00033     marker.pose.orientation.w = 1.0;
00034     marker.scale.x = sx;
00035     marker.scale.y = sy;
00036     marker.scale.z = sz;
00037     marker.color.r = r;
00038     marker.color.g = g;
00039     marker.color.b = b;
00040     marker.color.a = 1.0;
00041 
00042     marker.lifetime = lifetime;
00043     marker.frame_locked = frame_locked;
00044     marker.text = "This is some text\nthis is a new line\nthis is another line\nand another     adfoije    owijeoiwej\na really really really really really really really really really really long one";
00045     marker.mesh_resource = "package://pr2_description/meshes/base_v0/base.dae";
00046     marker.mesh_use_embedded_materials = count % 2 == 0;
00047     pub.publish(marker);
00048   }
00049 
00050   ++count;
00051 }
00052 
00053 void publishCallback(const ros::TimerEvent&)
00054 {
00055   static uint32_t counter = 0;
00056 
00057   ROS_INFO("Publishing");
00058   int32_t x_pos = -15;
00059   emitRow("arrows", visualization_msgs::Marker::ARROW, x_pos, 1.0, 0.0, 0.0, ros::Duration(), g_marker_pub);
00060   x_pos += 3;
00061   emitRow("cubes", visualization_msgs::Marker::CUBE, x_pos, 0.0, 1.0, 0.0, ros::Duration(), g_marker_pub);
00062   x_pos += 3;
00063   emitRow("cubes_frame_locked", visualization_msgs::Marker::CUBE, x_pos, 1.0, 1.0, 0.0, ros::Duration(), g_marker_pub, true, "/my_link");
00064   x_pos += 3;
00065   emitRow("spheres", visualization_msgs::Marker::SPHERE, x_pos, 0.0, 0.0, 1.0, ros::Duration(), g_marker_pub);
00066   x_pos += 3;
00067   emitRow("cylinder", visualization_msgs::Marker::CYLINDER, x_pos, 1.0, 0.0, 0.0, ros::Duration(), g_marker_pub);
00068   x_pos += 3;
00069   emitRow("arrows_with_lifetime", visualization_msgs::Marker::ARROW, x_pos, 0.0, 1.0, 0.0, ros::Duration(0.6),
00070       g_marker_pub);
00071   x_pos += 3;
00072   emitRow("cubes_with_lifetime", visualization_msgs::Marker::CUBE, x_pos, 0.0, 0.0, 1.0, ros::Duration(0.7),
00073       g_marker_pub);
00074   x_pos += 3;
00075   emitRow("spheres_with_lifetime", visualization_msgs::Marker::SPHERE, x_pos, 1.0, 0.0, 0.0, ros::Duration(0.8),
00076       g_marker_pub);
00077   x_pos += 3;
00078   emitRow("cylinder_with_lifetime", visualization_msgs::Marker::CYLINDER, x_pos, 0.0, 1.0, 0.0, ros::Duration(0.9),
00079       g_marker_pub);
00080   x_pos += 3;
00081   emitRow("text_view_facing", visualization_msgs::Marker::TEXT_VIEW_FACING, x_pos, 1.0, 1.0, 1.0, ros::Duration(),
00082       g_marker_pub, false, "/base_link", 1.0, 1.0, 0.2);
00083   x_pos += 3;
00084   emitRow("mesh_resource", visualization_msgs::Marker::MESH_RESOURCE, x_pos, 0.0, 1.0, 1.0, ros::Duration(),
00085       g_marker_pub);
00086   x_pos += 3;
00087 
00088   emitRow("invalid_scales", visualization_msgs::Marker::CUBE, x_pos, 0.0, 1.0, 1.0, ros::Duration(), g_marker_pub, false, "/base_link", 0.0, 1.0, 1.0);
00089   x_pos += 3;
00090 
00091   {
00092     for (int i = -5; i < 5; ++i)
00093     {
00094       visualization_msgs::Marker marker;
00095       marker.header.frame_id = "/base_link";
00096       marker.header.stamp = ros::Time::now();
00097       marker.ns = "marker_test_arrow_by_points";
00098       marker.id = i;
00099       marker.type = visualization_msgs::Marker::ARROW;
00100       marker.action = visualization_msgs::Marker::ADD;
00101       marker.pose.orientation.x = 0.0;
00102       marker.pose.orientation.y = 0.0;
00103       marker.pose.orientation.z = 0.0;
00104       marker.pose.orientation.w = 1.0;
00105       marker.pose.position.x = x_pos;
00106       marker.pose.position.y = i * 2;
00107       marker.scale.x = 0.25;
00108       marker.scale.y = 0.5;
00109       marker.color.r = 0.0;
00110       marker.color.g = 1.0;
00111       marker.color.b = 1.0;
00112       marker.color.a = 1.0;
00113       marker.frame_locked = true;
00114 
00115       if (counter % 2 == 0)
00116       {
00117         marker.points.resize(1);
00118         marker.points[0].x = 0.0f;
00119         marker.points[0].y = 0.0f;
00120         marker.points[0].z = 0.0f;
00121       }
00122       else
00123       {
00124         marker.points.resize(2);
00125         marker.points[0].x = 0.0f;
00126         marker.points[0].y = 0.0f;
00127         marker.points[0].z = 0.0f;
00128         marker.points[1].x = 1.0f;
00129         marker.points[1].y = 0.0f;
00130         marker.points[1].z = 0.0f;
00131       }
00132       g_marker_pub.publish(marker);
00133     }
00134   }
00135 
00136   x_pos += 3;
00137 
00138   {
00139     visualization_msgs::Marker marker;
00140     marker.header.frame_id = "/base_link";
00141     marker.header.stamp = ros::Time::now();
00142     marker.ns = "marker_test_cube_list";
00143     marker.id = 0;
00144     marker.type = visualization_msgs::Marker::CUBE_LIST;
00145     marker.action = visualization_msgs::Marker::ADD;
00146     marker.pose.orientation.x = 0.0;
00147     marker.pose.orientation.y = 0.0;
00148     marker.pose.orientation.z = 0.0;
00149     marker.pose.orientation.w = 1.0;
00150     marker.pose.position.x = x_pos;
00151     marker.scale.x = 0.05;
00152     marker.scale.y = 0.05;
00153     marker.scale.z = 0.05;
00154     marker.color.r = 1.0;
00155     marker.color.g = 1.0;
00156     marker.color.b = 0.0;
00157     marker.color.a = 1.0;
00158     marker.frame_locked = true;
00159 
00160     for (int x = 0; x < 10; ++x)
00161     {
00162       for (int y = 0; y < 10; ++y)
00163       {
00164         for (int z = 0; z < 10; ++z)
00165         {
00166           geometry_msgs::Point p;
00167           p.x = x * 0.1f;
00168           p.y = y * 0.1f;
00169           p.z = z * 0.1f;
00170 
00171           marker.points.push_back(p);
00172         }
00173       }
00174     }
00175     g_marker_pub.publish(marker);
00176   }
00177 
00178   x_pos += 3;
00179 
00180   {
00181     visualization_msgs::Marker marker;
00182     marker.header.frame_id = "/base_link";
00183     marker.header.stamp = ros::Time::now();
00184     marker.ns = "marker_test_cube_list_color_per";
00185     marker.id = 0;
00186     marker.type = visualization_msgs::Marker::CUBE_LIST;
00187     marker.action = visualization_msgs::Marker::ADD;
00188     marker.pose.orientation.x = 0.0;
00189     marker.pose.orientation.y = 0.0;
00190     marker.pose.orientation.z = 0.0;
00191     marker.pose.orientation.w = 1.0;
00192     marker.pose.position.x = x_pos;
00193     marker.scale.x = 0.05;
00194     marker.scale.y = 0.05;
00195     marker.scale.z = 0.05;
00196     marker.color.r = 1.0;
00197     marker.color.g = 1.0;
00198     marker.color.b = 0.0;
00199     marker.color.a = 1.0;
00200     marker.frame_locked = true;
00201 
00202     for (int x = 0; x < 10; ++x)
00203     {
00204       for (int y = 0; y < 10; ++y)
00205       {
00206         for (int z = 0; z < 10; ++z)
00207         {
00208           geometry_msgs::Point p;
00209           p.x = x * 0.1f;
00210           p.y = y * 0.1f;
00211           p.z = z * 0.1f;
00212 
00213           marker.points.push_back(p);
00214 
00215           std_msgs::ColorRGBA c;
00216           c.r = x * 0.1;
00217           c.g = y * 0.1;
00218           c.b = z * 0.1;
00219           marker.colors.push_back(c);
00220         }
00221       }
00222     }
00223     g_marker_pub.publish(marker);
00224   }
00225 
00226   x_pos += 3;
00227 
00228   {
00229     visualization_msgs::Marker marker;
00230     marker.header.frame_id = "/base_link";
00231     marker.header.stamp = ros::Time::now();
00232     marker.ns = "marker_test_sphere_list";
00233     marker.id = 0;
00234     marker.type = visualization_msgs::Marker::SPHERE_LIST;
00235     marker.action = visualization_msgs::Marker::ADD;
00236     marker.pose.orientation.x = 0.0;
00237     marker.pose.orientation.y = 0.0;
00238     marker.pose.orientation.z = 0.0;
00239     marker.pose.orientation.w = 1.0;
00240     marker.pose.position.x = x_pos;
00241     marker.scale.x = 0.05;
00242     marker.scale.y = 0.05;
00243     marker.scale.z = 0.05;
00244     marker.color.r = 1.0;
00245     marker.color.g = 1.0;
00246     marker.color.b = 1.0;
00247     marker.color.a = 1.0;
00248     marker.frame_locked = true;
00249 
00250     for (int x = 0; x < 10; ++x)
00251     {
00252       for (int y = 0; y < 10; ++y)
00253       {
00254         for (int z = 0; z < 1; ++z)
00255         {
00256           geometry_msgs::Point p;
00257           p.x = x * 0.1f;
00258           p.y = y * 0.1f;
00259           p.z = z * 0.1f;
00260 
00261           marker.points.push_back(p);
00262 
00263           std_msgs::ColorRGBA c;
00264           c.r = x * 0.1;
00265           c.g = y * 0.1;
00266           c.b = 0.5;
00267           marker.colors.push_back(c);
00268         }
00269       }
00270     }
00271     g_marker_pub.publish(marker);
00272   }
00273 
00274   x_pos += 3;
00275 
00276   {
00277     visualization_msgs::Marker marker;
00278     marker.header.frame_id = "/base_link";
00279     marker.header.stamp = ros::Time::now();
00280     marker.ns = "marker_test_points";
00281     marker.id = 0;
00282     marker.type = visualization_msgs::Marker::POINTS;
00283     marker.action = visualization_msgs::Marker::ADD;
00284     marker.pose.orientation.x = 0.0;
00285     marker.pose.orientation.y = 0.0;
00286     marker.pose.orientation.z = 0.0;
00287     marker.pose.orientation.w = 1.0;
00288     marker.pose.position.x = x_pos;
00289     marker.scale.x = 0.02;
00290     marker.scale.y = 0.02;
00291     marker.scale.z = 0.02;
00292     marker.color.r = 1.0;
00293     marker.color.g = 0.0;
00294     marker.color.b = 1.0;
00295     marker.color.a = 1.0;
00296     marker.frame_locked = true;
00297 
00298     for (int x = 0; x < 10; ++x)
00299     {
00300       for (int y = 0; y < 10; ++y)
00301       {
00302         for (int z = 0; z < 10; ++z)
00303         {
00304           geometry_msgs::Point p;
00305           p.x = x * 0.1f;
00306           p.y = y * 0.1f;
00307           p.z = z * 0.1f;
00308 
00309           marker.points.push_back(p);
00310         }
00311       }
00312     }
00313     g_marker_pub.publish(marker);
00314   }
00315 
00316   x_pos += 3;
00317 
00318   {
00319     visualization_msgs::Marker marker;
00320     marker.header.frame_id = "/base_link";
00321     marker.header.stamp = ros::Time::now();
00322     marker.ns = "marker_test_points_color_per";
00323     marker.id = 0;
00324     marker.type = visualization_msgs::Marker::POINTS;
00325     marker.action = visualization_msgs::Marker::ADD;
00326     marker.pose.orientation.x = 0.0;
00327     marker.pose.orientation.y = 0.0;
00328     marker.pose.orientation.z = 0.0;
00329     marker.pose.orientation.w = 1.0;
00330     marker.pose.position.x = x_pos;
00331     marker.scale.x = 0.02;
00332     marker.scale.y = 0.02;
00333     marker.scale.z = 0.02;
00334     marker.color.r = 1.0;
00335     marker.color.g = 0.0;
00336     marker.color.b = 1.0;
00337     marker.color.a = 1.0;
00338     marker.frame_locked = true;
00339 
00340     for (int x = 0; x < 10; ++x)
00341     {
00342       for (int y = 0; y < 10; ++y)
00343       {
00344         for (int z = 0; z < 10; ++z)
00345         {
00346           geometry_msgs::Point p;
00347           p.x = x * 0.1f;
00348           p.y = y * 0.1f;
00349           p.z = z * 0.1f;
00350 
00351           marker.points.push_back(p);
00352 
00353           std_msgs::ColorRGBA c;
00354           c.r = x * 0.1;
00355           c.g = y * 0.1;
00356           c.b = z * 0.1;
00357           marker.colors.push_back(c);
00358         }
00359       }
00360     }
00361     g_marker_pub.publish(marker);
00362   }
00363 
00364   x_pos += 3;
00365 
00366   {
00367     int count = 10;
00368     visualization_msgs::Marker marker;
00369     marker.header.frame_id = "/base_link";
00370     marker.header.stamp = ros::Time::now();
00371     marker.ns = "marker_test_line_list";
00372     marker.id = 0;
00373     marker.type = visualization_msgs::Marker::LINE_LIST;
00374     marker.action = visualization_msgs::Marker::ADD;
00375     marker.pose.position.x = 0.0;
00376     marker.pose.position.y = 0.0;
00377     marker.pose.position.z = 0.0;
00378     marker.pose.orientation.x = 0.0;
00379     marker.pose.orientation.y = 0.0;
00380     marker.pose.orientation.z = 0.0;
00381     marker.pose.orientation.w = 1.0;
00382     marker.pose.position.x = x_pos;
00383     marker.scale.x = 0.1;
00384     marker.color.r = 1.0;
00385     marker.color.a = 1.0;
00386     marker.frame_locked = true;
00387 
00388     for (int i = 0; i < count; ++i)
00389     {
00390       geometry_msgs::Point p1, p2;
00391       p1.x = 0;
00392       p1.y = (i - count / 2) * 2;
00393       p1.z = 0;
00394       p2.x = 0;
00395       p2.y = (i - count / 2) * 2;
00396       p2.z = 1;
00397       marker.points.push_back(p1);
00398       marker.points.push_back(p2);
00399     }
00400     g_marker_pub.publish(marker);
00401   }
00402 
00403   x_pos += 3;
00404 
00405   {
00406     int count = 10;
00407     visualization_msgs::Marker marker;
00408     marker.header.frame_id = "/base_link";
00409     marker.header.stamp = ros::Time::now();
00410     marker.ns = "marker_test_line_list_color_per";
00411     marker.id = 0;
00412     marker.type = visualization_msgs::Marker::LINE_LIST;
00413     marker.action = visualization_msgs::Marker::ADD;
00414     marker.pose.position.x = 0.0;
00415     marker.pose.position.y = 0.0;
00416     marker.pose.position.z = 0.0;
00417     marker.pose.orientation.x = 0.0;
00418     marker.pose.orientation.y = 0.0;
00419     marker.pose.orientation.z = 0.0;
00420     marker.pose.orientation.w = 1.0;
00421     marker.pose.position.x = x_pos;
00422     marker.scale.x = 0.1;
00423     marker.color.r = 1.0;
00424     marker.color.a = 1.0;
00425     marker.frame_locked = true;
00426 
00427     for (int i = 0; i < count; ++i)
00428     {
00429       geometry_msgs::Point p1, p2;
00430       p1.x = 0;
00431       p1.y = (i - count / 2) * 2;
00432       p1.z = 0;
00433       p2.x = 0;
00434       p2.y = (i - count / 2) * 2;
00435       p2.z = 1;
00436       marker.points.push_back(p1);
00437       marker.points.push_back(p2);
00438 
00439       std_msgs::ColorRGBA c;
00440       float pct = (float)i / (float)count;
00441       c.r = pct * 1.0 + (1 - pct) * 0.0;
00442       c.g = pct * 0.0 + (1 - pct) * 0.0;
00443       c.b = pct * 0.0 + (1 - pct) * 1.0;
00444 
00445       marker.colors.push_back(c);
00446       marker.colors.push_back(c);
00447     }
00448     g_marker_pub.publish(marker);
00449   }
00450 
00451   x_pos += 3;
00452 
00453   {
00454     visualization_msgs::Marker marker;
00455     marker.header.frame_id = "/base_link";
00456     marker.header.stamp = ros::Time::now();
00457     marker.ns = "marker_test_line_strip";
00458     marker.id = 0;
00459     marker.type = visualization_msgs::Marker::LINE_STRIP;
00460     marker.action = visualization_msgs::Marker::ADD;
00461     marker.pose.position.x = 0.0;
00462     marker.pose.position.y = 0.0;
00463     marker.pose.position.z = 0.0;
00464     marker.pose.orientation.x = 0.0;
00465     marker.pose.orientation.y = 0.0;
00466     marker.pose.orientation.z = 0.0;
00467     marker.pose.orientation.w = 1.0;
00468     marker.pose.position.x = x_pos;
00469     marker.scale.x = 0.1;
00470     marker.color.g = 1.0;
00471     marker.color.a = 1.0;
00472     marker.frame_locked = true;
00473 
00474     for (int i = -5; i < 5; ++i)
00475     {
00476       geometry_msgs::Point p;
00477       p.x = 1 + (i % 2);
00478       p.y = (i * 2);
00479       p.z = 0;
00480       marker.points.push_back(p);
00481     }
00482 
00483     g_marker_pub.publish(marker);
00484   }
00485 
00486   x_pos += 3;
00487 
00488   {
00489     visualization_msgs::Marker marker;
00490     marker.header.frame_id = "/base_link";
00491     marker.header.stamp = ros::Time::now();
00492     marker.ns = "marker_test_line_strip_color_per";
00493     marker.id = 0;
00494     marker.type = visualization_msgs::Marker::LINE_STRIP;
00495     marker.action = visualization_msgs::Marker::ADD;
00496     marker.pose.position.x = 0.0;
00497     marker.pose.position.y = 0.0;
00498     marker.pose.position.z = 0.0;
00499     marker.pose.orientation.x = 0.0;
00500     marker.pose.orientation.y = 0.0;
00501     marker.pose.orientation.z = 0.0;
00502     marker.pose.orientation.w = 1.0;
00503     marker.pose.position.x = x_pos;
00504     marker.scale.x = 0.1;
00505     marker.color.g = 1.0;
00506     marker.color.a = 1.0;
00507     marker.frame_locked = true;
00508 
00509     for (int i = -5; i < 5; ++i)
00510     {
00511       geometry_msgs::Point p;
00512       p.x = 1 + (i % 2);
00513       p.y = (i * 2);
00514       p.z = 0;
00515       marker.points.push_back(p);
00516 
00517       std_msgs::ColorRGBA c;
00518       float pct = (i + 5) / 10.0;
00519       c.r = pct * 0.0 + (1 - pct) * 0.0;
00520       c.g = pct * 1.0 + (1 - pct) * 0.0;
00521       c.b = pct * 0.0 + (1 - pct) * 1.0;
00522 
00523       marker.colors.push_back(c);
00524     }
00525 
00526     g_marker_pub.publish(marker);
00527   }
00528 
00529   x_pos += 3;
00530 
00531   {
00532     visualization_msgs::Marker marker;
00533     marker.header.frame_id = "/base_link";
00534     marker.header.stamp = ros::Time::now();
00535     marker.ns = "marker_test_triangle_list";
00536     marker.id = 0;
00537     marker.type = visualization_msgs::Marker::TRIANGLE_LIST;
00538     marker.action = visualization_msgs::Marker::ADD;
00539     marker.pose.position.x = 0.0;
00540     marker.pose.position.y = 0.0;
00541     marker.pose.position.z = 0.0;
00542     marker.pose.orientation.x = 0.0;
00543     marker.pose.orientation.y = 0.0;
00544     marker.pose.orientation.z = 0.0;
00545     marker.pose.orientation.w = 1.0;
00546     marker.pose.position.x = x_pos;
00547     marker.scale.x = 1.0;
00548     marker.scale.y = 1.0;
00549     marker.scale.z = 1.0;
00550     marker.color.g = 1.0;
00551     marker.color.a = 1.0;
00552     marker.frame_locked = true;
00553 
00554     for (int x = 0; x < 10; ++x)
00555     {
00556       for (int y = 0; y < 10; ++y)
00557       {
00558         for (int z = 0; z < 10; ++z)
00559         {
00560           geometry_msgs::Point p;
00561           p.x = x * 0.1f;
00562           p.y = y * 0.1f;
00563           p.z = z * 0.1f;
00564 
00565           geometry_msgs::Point p2 = p;
00566           p2.x = p.x + 0.05;
00567 
00568           geometry_msgs::Point p3 = p;
00569           p3.x = p2.x;
00570           p3.z = p.z + 0.05;
00571 
00572           marker.points.push_back(p);
00573           marker.points.push_back(p2);
00574           marker.points.push_back(p3);
00575 
00576           std_msgs::ColorRGBA c;
00577           c.r = x * 0.1;
00578           c.g = y * 0.1;
00579           c.b = z * 0.1;
00580           marker.colors.push_back(c);
00581           marker.colors.push_back(c);
00582           marker.colors.push_back(c);
00583         }
00584       }
00585     }
00586 
00587     g_marker_pub.publish(marker);
00588   }
00589 
00590   ++counter;
00591 }
00592 
00593 void frameCallback(const ros::TimerEvent&)
00594 {
00595   static uint32_t counter = 0;
00596 
00597   static tf::TransformBroadcaster br;
00598   tf::Transform t;
00599 
00600   t.setOrigin(tf::Vector3(0.0, 0.0, (counter % 1000) * 0.01));
00601   t.setRotation(tf::Quaternion(0.0, 0.0, 0.0, 1.0));
00602   br.sendTransform(tf::StampedTransform(t, ros::Time::now(), "base_link", "my_link"));
00603 
00604   t.setOrigin(tf::Vector3(0.0, 0.0, 0.0));
00605   t.setRotation(tf::createQuaternionFromRPY(M_PI*0.25, M_PI*0.25, 0.0));
00606   br.sendTransform(tf::StampedTransform(t, ros::Time::now(), "rotate_base_link", "base_link"));
00607 
00608   ++counter;
00609 }
00610 
00611 int main(int argc, char** argv)
00612 {
00613   ros::init(argc, argv, "marker_test");
00614   ros::NodeHandle n;
00615 
00616   g_marker_pub = n.advertise<visualization_msgs::Marker> ("visualization_marker", 0);
00617   ros::Timer publish_timer = n.createTimer(ros::Duration(1), publishCallback);
00618   ros::Timer frame_timer = n.createTimer(ros::Duration(0.01), frameCallback);
00619 
00620   tf::TransformBroadcaster tf_broadcaster;
00621 
00622   ros::Duration(0.1).sleep();
00623 
00624   ros::spin();
00625 }


rviz_qt
Author(s): Dave Hershberger
autogenerated on Fri Dec 6 2013 20:56:52