使用RViz观测传感器数据
一.介绍
Rviz是ROS中一款三维可视化平台,一方面能够实现对外部信息的图形化显示,另外还可以通过rviz给对象发布控制信息,从而实现对机器人的监测与控制:
外部信息图形化,显示车道线,车辆轨迹等
发布控制信息,自动驾驶中下发控车命令
二.RViz 加载模型初体验
1.输入代码roslaunch wpr_simulation wpb_simple.launch,打开gazebo仿真环境
输入代码rviz,打开RViz软件
4.进行相关修改,把Fixed Frame配置成base_footprint
5.添加机器人模型,点击左下角Add按钮,选择RobotModle,导入机器人模型;同时添加激光雷达,点击左下角Add按钮,选择LaserScan,并把话题名称(Topic)配置成/scan,可以看到小车前方出现红点即为激光雷达扫描到的点
6.近一步在gazebo里添加物块,也可以在RViz里实时显示出扫描状态
7.保存模型,点击RViz左上角File,Save Config As,输入保存文件名,即可保存
也可以在终端输入
roslaunch wpr_simulation wpb_rviz.launch
三.激光雷达
1.雷达消息包数据格式
在终端输入代码
rostopic echo /scan --noarr
终端显示输出如下
header:
seq: 10469
stamp:
secs: 1603
nsecs: 975000000
frame_id: "laser"
angle_min: -3.141590118408203 //激光雷达扫描的起始角度,为-180度
angle_max: 3.141590118408203 //激光雷达扫描的终止角度,为180度
angle_increment: 0.017501894384622574 //一次测距行为(发出光线到接受光线为一次测距行为)的角度间隔
time_increment: 0.0 //一次测距行为的时间间隔
scan_time: 0.0
range_min: 0.23999999463558197
range_max: 10.0
ranges: "<array type: float32, length: 360>" //本次扫描的所有测距值(从-180度到180度,共360个点对应测距值)
intensities: "<array type: float32, length: 360>" //所有测距的返回信号强度
2.获取激光雷达数据
(1).思路整理:
(i).构建一个新的软件包,包名为lidar_pkg
(ii).在软件包中新建一个节点,节点名叫做lidar_node
(iii).在节点中,向ROS大管家NodeHandle申请订阅话题/scan,并设置回调函数LidarCallback()
(iiii).构建回调函数LidarCallback(),用来接受和处理雷达数据
(iiiii).调用ROS_INFO()显示雷达检测到的前方障碍物距离
(2).代码实现
在catkin_wsxia的src文件夹下新建软件包,执行代码
catkin_create_pkg lidar_pkg roscpp rospy sensor_msgs
打开vscode,在lidar_pkg/src文件夹下新建源码文件lidar_node.cpp,输入代码
// #include <ros/ros.h>
// #include <sensor_msgs/LaserScan.h>
// void LidarCallback(const sensor_msgs::LaserScan msg)
// {
// float fMidDist = msg.ranges[180];
// ROS_INFO("前方测距 range[180] = %f 米", fMidDist);
// }
// int main(int argc, char** argv)
// {
// setlocale(LC_ALL,""); //设置中文编码
// ros::init(argc, argv, "lidar_node");
// ros::NodeHandle n; //节点管理
// ros::Subscriber lidar_sub = n.subscribe("/scan", 10, &LidarCallback);
// ros::spin(); //让节点保持运行不退出
// return 0;
// }
同时需要修改CMakelists文件如下
catkin_make编译之后,终端执行代码
roslaunch wpr_simulation wpb_simple.launch
打开gazebo仿真环境
再在终端输入代码,即可显示激光雷达反馈数据
rosrun lidar_pkg lidar_node
3.利用激光雷达反馈数据实现小车避障
(1).思路整理
(i).让大管家NodeHandle发布速度控制话题/cmd_vel
(ii).构建速度控制消息包vel_pkg
(iii).根据激光雷达测距值,实时调整机器人运动速度,避开障碍物
(2).代码实现
#include <ros/ros.h>
#include <sensor_msgs/LaserScan.h> //激光雷达数据头文件
#include <geometry_msgs/Twist.h> //速度控制头文件
ros::Publisher vel_pub; //定义发布对象
int nCount = 0;
void LidarCallback(const sensor_msgs::LaserScan msg)
{
float fMidDist = msg.ranges[180];
ROS_INFO("前方测距 range[180] = %f 米", fMidDist);
geometry_msgs::Twist vel_cmd; //构建速度控制消息包
if(nCount > 0)
{
nCount--;
return;
}
if(fMidDist < 1.5)
{
vel_cmd.angular.z = 0.3;
nCount = 50;
}
else
{
vel_cmd.linear.x = 0.1;
}
vel_pub.publish(vel_cmd);//将消息包发布到速度控制话题里
}
int main(int argc, char** argv)
{
setlocale(LC_ALL,""); //设置中文编码
ros::init(argc, argv, "lidar_node");
ros::NodeHandle n; //节点管理
ros::Subscriber lidar_sub = n.subscribe("/scan", 10, &LidarCallback); //订阅雷达数据话题/scan
vel_pub = n.advertise<geometry_msgs::Twist>("/cmd_vel", 10); //发布速度控制话题/cmd_vel
ros::spin(); //让节点保持运行不退出
return 0;
}
catkin_make编译完成后,终端执行代码
roslaunch wpr_simulation wpb_simple.launch
打开gazebo仿真环境
再在终端输入代码
rosrun lidar_pkg lidar_node
同时在gazebo也可以观测到机器人实现了避障操作