【从0制作自己的ros导航小车:上位机篇】04、使用gmapping建图

从0制作自己的ros导航小车

    • 前言
    • 一、激光雷达数据发布
    • 二、激光雷达数据、小车模型、里程计数据同时显示
    • 三、键盘控制小车运动
    • 四、使用gmapping建图
    • 五、地图保存

系列文章
①【从0制作自己的ros导航小车:介绍及准备】
②【从0制作自己的ros导航小车:下位机篇】01、工程准备_标准库移植freertos
③【从0制作自己的ros导航小车:下位机篇】02、电机驱动、转速读取、PID控制
④【从0制作自己的ros导航小车:下位机篇】03、mpu6050偏航角获取
⑤【从0制作自己的ros导航小车:上、下位机通信篇】上、下位机串口DMA通信
⑥【从0制作自己的ros导航小车:上位机篇】01、里程计与坐标变换发布
⑦【从0制作自己的ros导航小车:上位机篇】02、ros1多机通讯与坐标变换可视化
⑧【从0制作自己的ros导航小车:上位机篇】03、添加urdf模型(发布各传感器与小车基坐标系之间的静态坐标变换)
⑨【从0制作自己的ros导航小车:上位机篇】04、使用gmapping建图
⑩【从0制作自己的ros导航小车:上位机篇】05、导航!


前言

前面的文章已经能够实现在odom坐标系下显示小车模型和里程计数据了,本文加上激光slam必不可少的传感器雷达,先进行测试,然后直接开始建图!


一、激光雷达数据发布

每个厂家的激光雷达驱动各不相同,在买来之后商家都会给出使用示例的,大家按照自己的激光雷达使用说明来测试,只需要实现/scan话题发布即可,如果官方的launch文件中有发布laser到base_footprint的坐标变换,切记注释这行代码,否则会和我们之前的urdf发布的坐标变换冲突,导致异常。
我使用的激光雷达是亚博x3单线激光雷达,按照官方的使用方法进行设置,将雷达功能包放到自己的工作空间中,然后板端运行:

roslaunch ydlidar_ros_driver X3.launch

此时在rviz中若是能看到雷达数据,那就说明没问题了
在这里插入图片描述


二、激光雷达数据、小车模型、里程计数据同时显示

为了下一步更方便的进行gmapping建图,现在先将这些预备工作测试完。在上一节的start_car.launch中继续添加代码,将雷达数据发布集成进去(静态坐标变换在urdf中以及集成,确保雷达坐标系是laser即可)。

<launch><!-- 将 urdf 文件内容设置进参数服务器 --><param name="robot_description" textfile="$(find my_description)/urdf/car.urdf" /><!-- 启动里程计与坐标变换发布节点 --><node pkg="uart_tf" type="uartandtf" name="uart_and_tf" output="screen"/><!-- 启动雷达数据发布节点 --><include file="$(find ydlidar_ros_driver)/launch/X3.launch" /><!-- 启动机器人状态和关节状态发布节点 --><node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" /><node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" /></launch>

运行之后,只要在rviz中,odom坐标系下,前面所有的东西都能正常显示,那就没问题:
在这里插入图片描述


三、键盘控制小车运动

注意:stm32端的代码只需要在定时器中处理串口接收到的数据,设置电机转向和pwm即可。
运行建图时需要控制小车运动,可以使用ros中的一个键盘控制功能包:teleop_twist_keyboard。没有的话需要安装:

sudo apt-get install ros-noetic-teleop-twist-keyboard

这个节点输出的控制话题是/cmd_vel。所以我们需要在串口的cpp文件中添加一些代码以控制小车运动:

在原先代码的基础上加上下面这些,代码的位置,一看就知道加在哪里:
subscription2_ = nh_.subscribe("/cmd_vel", 20, &MyNode::cmdVelCallback, this);    ros::Subscriber subscription2_;void cmdVelCallback_daohang(const geometry_msgs::Twist::ConstPtr& msg) {double linear_vel_x = (msg->linear.x) *100;double angular_vel_th = (msg->angular.z) *100;double right_speed = 0.0;double left_speed = 0.0;right_speed = (linear_vel_x + angular_vel_th*9.5);left_speed = (linear_vel_x - angular_vel_th*9.5);writeSpeed(left_speed,right_speed,0x01);ROS_INFO("daohang:right_speed=%.2f,left_speed=%.2ff",right_speed, left_speed);
}

有了上面这个代码,就可以通过键盘控制小车运动了,记得要确保stm32端写了根据上位机下发数据进行运动的代码。上面对键盘控制节点发布的线速度和角速度进行了解算,解算过程可以参考此视频。

键盘控制节点运行:rosrun teleop_twist_keyboard teleop_twist_keyboard.py

如果此时启动键盘控制,会发现小车运动很快,并且转弯也不太行,这是因为此键盘控制节点默认的线速度是0.5,角速度是1.0,这样算出来之后可以发现数值很大,比如走直线就是50cm/s,这对于建图而言有点大了,所以在不想改代码的情况下,直接修改teleop_twist_keyboard节点的线速度角速度即可:
在这里插入图片描述
按键盘的x和c分别减小线速度与角速度,到我这样差不多就合适了。


四、使用gmapping建图

①首先安装需要的功能包(注意将ros的版本换成自己的):

安装 gmapping 包(用于构建地图):sudo apt install ros-noetic-gmapping
安装地图服务包(用于保存与读取地图):sudo apt install ros-noetic-map-server
安装 navigation 包(用于定位以及路径规划):sudo apt install ros-noetic-navigation

②在工作空间中新建一个导航相关功能包,在功能包中新建launch文件夹,并新建launch文件

catkin_create_pkg nav gmapping map_server amcl move_base
<launch><node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen"><remap from="scan" to="scan"/><param name="base_frame" value="base_footprint"/><!--底盘坐标系--><param name="odom_frame" value="odom"/> <!--里程计坐标系--><param name="map_update_interval" value="5.0"/><param name="maxUrange" value="16.0"/><param name="sigma" value="0.05"/><param name="kernelSize" value="1"/><param name="lstep" value="0.05"/><param name="astep" value="0.05"/><param name="iterations" value="5"/><param name="lsigma" value="0.075"/><param name="ogain" value="3.0"/><param name="lskip" value="0"/><param name="srr" value="0.1"/><param name="srt" value="0.2"/><param name="str" value="0.1"/><param name="stt" value="0.2"/><param name="linearUpdate" value="1.0"/><param name="angularUpdate" value="0.5"/><param name="temporalUpdate" value="3.0"/><param name="resampleThreshold" value="0.5"/><param name="particles" value="30"/><param name="xmin" value="-50.0"/><param name="ymin" value="-50.0"/><param name="xmax" value="50.0"/><param name="ymax" value="50.0"/><param name="delta" value="0.05"/><param name="llsamplerange" value="0.01"/><param name="llsamplestep" value="0.01"/><param name="lasamplerange" value="0.005"/><param name="lasamplestep" value="0.005"/></node>
</launch>

③运行建图

1、启动前面集成好的:roslaunch uart_tf start_car.launch
2、启动gmapping:roslaunch nav gmapping.launch
3、上位机打开rviz,此时基坐标系就是map,因为运行gmapping之后,这个功能包会自动发布odom到map的坐标变换。
4、启动键盘控制节点:rosrun teleop_twist_keyboard teleop_twist_keyboard.py

在rviz中添加map、机器人模型、tf变换等参数,此时如下图所示:
在这里插入图片描述


五、地图保存

通过键盘控制小车运动,等待地图建的差不多之后调用map_server进行地图的保存,这一步是在nav功能包的launch目录下新建map_server.launch:

<launch><arg name="filename" value="$(find nav)/map/nav" /><node name="map_save" pkg="map_server" type="map_saver" args="-f $(arg filename)" />
</launch>

等建图完毕之后,新开终端运行此launch文件,即可将地图保存到map文件夹中:
在这里插入图片描述
建完的地图如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3280207.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot实战权威指南 JavaEE开发的颠覆者(电子版教程)

前言 虽然 Spring Boot 给我们带来了类似于脚本语言开发的效率&#xff0c;但 Spring Boot 里没有使用任何让你意外的技术&#xff0c;完全是一个单纯的基于Spring的应用。如 Spring.Boot 的自动配置是通过Spring 4.x 的Conditional 注解来实现的&#xff0c;所以在学习 Sprin…

(40)温度传感器

文章目录 前言 1 设置 2 记录 3 参数说明 前言 ArduPilot 已经有许多可能的温度报告来源&#xff1a;电调&#xff0c;智能电池&#xff0c;电机 EFI&#xff0c;这些独立的传感器可以用来取代 ArduPilot 中已经存在的那些设备温度报告。它们也可以只是被记录下来。 ArduP…

Eclipse 主网向开发者开放

摘要&#xff1a;Eclipse 基金会宣布&#xff0c;Eclipse 主网已经向开发者开放。在接下来几周的时间里&#xff0c;Eclipse 将邀请开发者在主网上部署项目&#xff0c;并参加黑客马拉松活动——“Total Eclipse Challenge”。 Eclipse 是首个基于以太坊的 SVM Layer2 方案&am…

Java7.0标准之重要特性及用法实例(十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

关于cacti监控-如何理解cacti统计图表的数据-cacti流量图怎么看及linux下svn常用管理命令及svn忽略文件目录-设置vimdiff来比较差异

一、关于cacti监控-如何理解cacti统计图表的数据-cacti流量图怎么看 Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具&#xff0c;是用php语言实现的一个软件&#xff0c;它的主要功能是用snmp服务获取数据&#xff0c;然后用rrdtool储存和更新数据&…

React 学习——useEffect 清除副作用

清除副作用的函数 最常见的执行时机是在组件卸载时自动执行 import { useEffect, useState } from "react"function Son(){useEffect(()>{const timer setInterval(()>{console.log(定时器);},1000); // 清除副作用return () > {clearInterval(timer)} …

计算机网络—电路、分组、报文交换—图文详解

计算机网络—电路、分组、报文交换 计算机网络中的数据传输方式可以根据数据的处理方式和网络资源的使用方式分为电路交换、分组交换和报文交换三种类型。 这些方式在网络设计和数据传输过程中起到了不同的作用和效果。 1. 电路交换&#xff08;Circuit Switching&#xff0…

公布一批脸书爬虫(facebook)IP地址,真实采集数据

一、数据来源&#xff1a; 1、这批脸书爬虫&#xff08;facebook&#xff09;IP来源于尚贤达猎头公司网站采集数据&#xff1b; ​ 2、数据采集时间段&#xff1a;2023年10月-2024年7月&#xff1b; 3、判断标准&#xff1a;主要根据用户代理是否包含“facebook”和IP核实。…

CTF学习笔记汇总(非常详细)零基础入门到精通,收藏这一篇就够了

CTF学习笔记汇总 Part.01 Web 01 SSRF 主要攻击方式如下&#xff1a; 01 对外网、服务器所在内网、本地进行端口扫描&#xff0c;获取一些服务的banner信息。 02 攻击运行在内网或本地的应用程序。 03 对内网Web应用进行指纹识别&#xff0c;识别企业内部的资产信息。 …

React案例知识点解读 【ES6】新特性用法

前面有写过一篇React的实战小案例 React项目 实战案例 实用推荐收藏-CSDN博客&#xff0c;有同学对里面的部分知识点有疑问&#xff0c;在这里专门出一片实战部分知识点解读&#xff0c;以方便更好的理解。 欢迎参考以及交流&#xff0c;谢谢。 目录 1.const 关键字 2.箭头…

实战内测-某内测项目站点FUZZ到Sql注入

0x1 前言 下面给师傅们分享的案例呢是前段时间实战的一个站点&#xff0c;也是我朋友前段时间让我测的一个站点。整体的测试流程也还算ok&#xff0c;然后里面有些细节要是对师傅们有帮助可以收藏下&#xff0c;后面主要是利用FUZZ打了一个sql注入漏洞上去。 0x2 fuzz和sql结…

嵌入式学习Day17---Linux软件变编程

目录 ​编辑 一、Linux 系统 1.1.Linux服务器 1.2.Linux嵌入式 1.3.Linux系统上的软件开发 1.操作系统 2.Linux内核 3.man手册 1.4.shell命令 1.基本命令 2.文件查看命令 3.文件查找命令 4.压缩解压文件 5.其他命令 6.通配符 7.管道 8.重定向 1.5.虚拟机上网 1.NAT模式 …

【中项】系统集成项目管理工程师-第9章 项目管理概论-9.1PMBOK的发展与9.2项目基本要素

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

旷野之间30 - 创业者如何更好的获取VC

让我们来谈谈初创公司创始人如何获得资金——以及他们为什么没有获得资金。 很多初次创业的企业家都向我咨询如何帮助他们的公司获得资金。现在&#xff0c;我不再做这些了&#xff0c;但我确实认识很多风险投资 (VC) 和天使投资者&#xff0c;所以我问了他们中的很多人&#…

JavaWeb开发——Eclipse安装配置教程

一、安装 1.Eclipse官方下载网站&#xff1a;https://www.eclipse.org/downloads/packages/ 2.点击Eclipse IDE for Enterprise Java and Web Developers进行安装 3.按需求选择操作系统的版本 4.点击DownLoad 5.打开文件并解压 6.打开文件 7.打开程序 8.配置安装 出现以…

基于站点的中国6小时PM2.5数据集(1960-2020)

基于站点的中国6小时PM2.5数据集&#xff08;1960-2020&#xff09; 数据介绍 几十年来&#xff0c;PM2.5改变了地球上的辐射平衡&#xff0c;增加了环境和健康风险&#xff0c;但直到2013年才在中国得到广泛监测。历史长期 PM2.5具有高时间分辨率的记录是必不可少的&#xff0…

《代码大全》读书笔记-第5章 软件构建的设计

有人会说&#xff0c;设计不是真正的构建活动。但在小项目中&#xff0c;包括设计在内的许多活动都被认为是构建。有些设计更关注系统级问题&#xff0c;许多设计工作留给构建。有些大型项目设计非常详细&#xff0c;导致编码成为一项机械性劳动。小型项目的设计更多的是程序员…

【Kafka】对 kafka 消费程序客户端进行监控采集

前言 对于 Kafka 组件而言&#xff0c;我们通常会对 kafka 服务端添加一些监控&#xff0c;来确保服务的稳定性&#xff0c;虽然有 kafka-exporter 来对消费者进行监控&#xff0c;但是指标很少&#xff0c;对于生产者和消费者更细粒度的监控就无法做到了。只能将监控部署在客…

Java | Leetcode Java题解之第307题区域和检索-数组可修改

题目&#xff1a; 题解&#xff1a; class NumArray {private int[] tree;private int[] nums;public NumArray(int[] nums) {this.tree new int[nums.length 1];this.nums nums;for (int i 0; i < nums.length; i) {add(i 1, nums[i]);}}public void update(int inde…

C++(week15): C++提高:(三)计算机网络

文章目录 一、计算机网络基础1.协议概念2.分层模型3.协议格式(1)以太网帧格式(2)IP段格式(3)TCP/UDP数据报格式4.TCP协议(1)TCP协议的特点(2)三次握手(3)四次挥手(4)SYN攻击5.状态迁移图的解析:11种状态6.TCP通信状态与程序结合分析二、网络编程(Socket编程)1.网络编程基础2.字…