ROS——rplidar A1在rviz中实时显示分析
2017-11-09 10:20
633 查看
1. 简介
RPLIDAR A1的运行教程在这里不做重点讲解,官方教程已经介绍的很详细,在这里跟大家解释下例程中是怎么在RVIZ中事实显示图像的。运行下面这句话时,可以看到rviz自动打开,并且在图像中显示出了激光雷达扫描到的数据信息,那么激光雷达的数据是如何传递到rviz中的那?
roslaunch rplidar_ros view_rplidar.launch
2. view_rplidar.launch分析
打开view_rplidar.launch
<launch> <include file="$(find rplidar_ros)/launch/rplidar.launch" /> <node name="rviz" pkg="rviz" type="rviz" args="-d $(find rplidar_ros)/rviz/rplidar.rviz" /> </launch>
我们发现在其中调用了
rplidar.launch,使用
include命令是为了减少冗余代码的数量,简化代码。
rplidar.launch如下
<launch> <node name="rplidarNode" pkg="rplidar_ros" type="rplidarNode" output="screen"> <param name="serial_port" type="string" value="/dev/ttyUSB0"/> <param name="serial_baudrate" type="int" value="115200"/> <param name="frame_id" type="string" value="laser"/> <param name="inverted" type="bool" value="false"/> <param name="angle_compensate" type="bool" value="true"/> </node> </launch>
在这个launch文件中可以清楚的看到,在其中定义了串口的名字
"/dev/ttyUSB0",波特率
"115200"等等一系列的串口配置信息,正是由于这些配置信息,才可以在
rplidarNode节点中获取激光雷达发送过来的数据信息。
3.分析如何发送数据到rviz
看到这里可能很多朋友会比较疑惑是如何发送数据到rviz平台的,在此我们打开rplidar_ros/src/node.cpp文件,在193行左右可以发现这个消息发布者的节点名字和类型,类型和我们以往使用的不太一样。
ros::Publisher scan_pub = nh.advertise<sensor_msgs::LaserScan>("scan", 1000);
没错,这个
<sensor_msgs::LaserScan>类型就是rviz中
LaserScan功能模块定义的标准信息格式
我们可以在命令行中输入下列命令来查看LaserScan的数据格式
rosmsg show sensor_msgs/LaserScan
运行结果如图所示:
这个时候我们再来对比
rplidar_ros/src/node.cpp文件中的
void publish_scan()函数
void publish_scan(ros::Publisher *pub, rplidar_response_measurement_node_t *nodes, size_t node_count, ros::Time start, double scan_time, bool inverted, float angle_min, float angle_max, std::string frame_id) { static int scan_count = 0; sensor_msgs::LaserScan scan_msg; scan_msg.header.stamp = start; scan_msg.header.frame_id = frame_id; scan_count++; bool reversed = (angle_max > angle_min); if ( reversed ) { scan_msg.angle_min = M_PI - angle_max; scan_msg.angle_max = M_PI - angle_min; } else { scan_msg.angle_min = M_PI - angle_min; scan_msg.angle_max = M_PI - angle_max; } scan_msg.angle_increment = (scan_msg.angle_max - scan_msg.angle_min) / (double)(node_count-1); scan_msg.scan_time = scan_time; scan_msg.time_increment = scan_time / (double)(node_count-1); scan_msg.range_min = 0.15; scan_msg.range_max = 8.0; scan_msg.intensities.resize(node_count); scan_msg.ranges.resize(node_count); bool reverse_data = (!inverted && reversed) || (inverted && !reversed); if (!reverse_data) { for (size_t i = 0; i < node_count; i++) { float read_value = (float) nodes[i].distance_q2/4.0f/1000; if (read_value == 0.0) scan_msg.ranges[i] = std::numeric_limits<float>::infinity(); else scan_msg.ranges[i] = read_value; scan_msg.intensities[i] = (float) (nodes[i].sync_quality >> 2); } } else { for (size_t i = 0; i < node_count; i++) { float read_value = (float)nodes[i].distance_q2/4.0f/1000; if (read_value == 0.0) scan_msg.ranges[node_count-1-i] = std::numeric_limits<float>::infinity(); else scan_msg.ranges[node_count-1-i] = read_value; scan_msg.intensities[node_count-1-i] = (float) (nodes[i].sync_quality >> 2); } } pub->publish(scan_msg); }
在函数中可以清楚的看到有对下列变量进行赋值操作
std_msgs/Header header uint32 seq time stamp string frame_id float32 angle_min float32 angle_max float32 angle_increment float32 time_increment float32 scan_time float32 range_min float32 range_max float32[] ranges float32[] intensities
因此可以断定正是通过对这些数据赋值,然后再讲消息发布出去,rviz中的LaserScan便会自动订阅这些消息,从而将激光雷达中的数据显示出来,如果还是有疑问的话大家可以在运行
roslaunch rplidar_ros view_rplidar.launch的同时,在行的命令行中输入下列命令查看ROS话题发发布订阅情况:
rosrun rqt_graph rqt_graph
在这个图中可以清楚的看到程序只发布了一个topic——”/scan”,同时在我们的rviz中我们也可以看到在”topic”选项后面对应的是”/scan”,即我们的分析完全正确。
相关文章推荐
- (九)ROS在rviz中实时显示轨迹(nav_msgs/Path消息的使用)
- ROS——rplidar在rviz中三维显示
- (一)ROS中新建机器人模型(urdf格式)并用rviz显示
- 查看linux服务器配置和TOP命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况。
- ROS学习之tf在rviz中的显示
- ROS 学习系列 -- RViz 实时观测机器人建立导航2D封闭空间地图过程 (SLAM)
- ROS中新建机器人模型(.xacro)并用rviz显示
- ROS 学习系列 -- RViz 实时观测机器人建立导航2D封闭空间地图过程 (SLAM)
- ROS中rviz添加urdf文件显示机器人模型
- (七)ROS使用OpenCV读取图像并发布图像消息在rviz中显示
- ROS下如何调用USB摄像头在rviz显示(核心:权限问题)?
- ROS中新建多轴机器人模型(urdf)并用rviz显示
- Octomap 在ROS环境下实时显示
- ROS 连接SICK LMS100激光,并用RVIZ显示(网线端口)
- ROS 学习系列 -- RViz 实时观测机器人建立导航2D封闭空间地图过程 (SLAM)
- ROS--urdf在rviz之中的显示(补充)
- ROS 学习系列 -- RViz 实时观测机器人建立导航2D封闭空间地图过程 (SLAM)
- ROS下利用 moveit 控制gazebo模型并在rviz中显示的探索总结
- 视觉里程计学习(一) ROS实时读取并显示摄像头图像
- Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam