ROS学习记录(四)

使用RViz观测传感器数据

一.介绍

Rviz是ROS中一款三维可视化平台,一方面能够实现对外部信息的图形化显示,另外还可以通过rviz给对象发布控制信息,从而实现对机器人的监测与控制:

  1. 外部信息图形化,显示车道线,车辆轨迹等

  1. 发布控制信息,自动驾驶中下发控车命令

二.RViz 加载模型初体验

1.输入代码roslaunch wpr_simulation wpb_simple.launch,打开gazebo仿真环境

  1. 输入代码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也可以观测到机器人实现了避障操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值