21 #include <sys/socket.h> 22 #include <arpa/inet.h> 29 #include <tf/transform_listener.h> 57 if(add_multicast) ROS_INFO_STREAM(
"Opening UDP socket: group_address " <<
group_ip_string);
58 ROS_INFO_STREAM(
"Opening UDP socket: port " << UDP_PORT_NUMBER);
70 const double diag_freq = 16*20000.0 / (12*32);
73 ROS_INFO(
"expected frequency: %.3f (Hz)", diag_freq);
83 "lslidar_packet", 100);
88 socket_id = socket(PF_INET, SOCK_DGRAM, 0);
95 memset(&my_addr, 0,
sizeof(my_addr));
96 my_addr.sin_family = AF_INET;
99 my_addr.sin_addr.s_addr = INADDR_ANY;
101 if (bind(
socket_id, (sockaddr *)&my_addr,
sizeof(sockaddr)) == -1) {
108 groupcast.imr_interface.s_addr=INADDR_ANY;
111 if(setsockopt(
socket_id,IPPROTO_IP,IP_ADD_MEMBERSHIP,(
char*)&groupcast,
sizeof(groupcast))<0) {
112 perror(
"set multicast error");
117 if (fcntl(
socket_id, F_SETFL, O_NONBLOCK|FASYNC) < 0) {
130 ROS_ERROR(
"Cannot load all required ROS parameters...");
135 ROS_ERROR(
"Cannot create all ROS IO...");
143 ROS_INFO(
"Initialised lslidar c16 without error");
148 lslidar_c16_msgs::LslidarC16PacketPtr& packet) {
152 struct pollfd fds[1];
154 fds[0].events = POLLIN;
155 static const int POLL_TIMEOUT = 2000;
157 sockaddr_in sender_address;
158 socklen_t sender_address_len =
sizeof(sender_address);
181 int retval = poll(fds, 1, POLL_TIMEOUT);
185 ROS_ERROR(
"poll() error: %s", strerror(errno));
193 if ((fds[0].revents & POLLERR)
194 || (fds[0].revents & POLLHUP)
195 || (fds[0].revents & POLLNVAL))
197 ROS_ERROR(
"poll() reports lslidar error");
200 }
while ((fds[0].revents & POLLIN) == 0);
205 (sockaddr*) &sender_address, &sender_address_len);
212 if (errno != EWOULDBLOCK)
246 lslidar_c16_msgs::LslidarC16PacketPtr packet(
247 new lslidar_c16_msgs::LslidarC16Packet());
266 if (rc < 0)
return false;
270 ROS_DEBUG(
"Publishing a full lslidar scan.");
285 for(i = 0;i < 10;i ++)
296 unsigned char head2[] = {packet->data[0],packet->data[1],packet->data[2],packet->data[3]};
298 if(head2[0] == 0xA5 && head2[1] == 0xFF)
300 if(head2[2] == 0x00 && head2[3] == 0x5A)
334 else if(head2[0] == 0xFF && head2[1] == 0xEE)
336 uint64_t packet_timestamp;
337 packet_timestamp = (packet->data[1200] +
338 packet->data[1201] * pow(2, 8) +
339 packet->data[1202] * pow(2, 16) +
340 packet->data[1203] * pow(2, 24)) * 1e3;
void publish(const boost::shared_ptr< M > &message) const
uint64_t pointcloudTimeStamp
void setHardwareID(const std::string &hwid)
std::string lidar_ip_string
int getPacket(lslidar_c16_msgs::LslidarC16PacketPtr &msg)
static uint16_t PACKET_SIZE
unsigned char packetTimeStamp[10]
bool param(const std::string ¶m_name, T ¶m_val, const T &default_val) const
diagnostic_updater::Updater diagnostics
boost::shared_ptr< diagnostic_updater::TopicDiagnostic > diag_topic
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
std::string group_ip_string
#define ROS_INFO_STREAM(args)
void getFPGA_GPSTimeStamp(lslidar_c16_msgs::LslidarC16PacketPtr &packet)
LslidarC16Driver(ros::NodeHandle &n, ros::NodeHandle &pn)
ros::Publisher packet_pub