ROS仿真环境搭建

机器人系统仿真:是通过计算机对实体机器人系统进行模拟的技术,在 ROS 中,仿真实现涉及的内容主要有三:对 机器人建模(URDF)创建仿真环境(Gazebo)以及感知环境(Rviz)等系统性实现。

________ 

搭建环境介绍:

1.URDF是 Unified Robot Description Format 的首字母缩写,直译为统一(标准化)机器人描述格式,可以以一种 XML 的方式描述机器人的部分结构,比如底盘、摄像头、激光雷达、机械臂以及不同关节的自由度.....,该文件可以被 C++ 内置的解释器转换成可视化的机器人模型,是 ROS 中实现机器人仿真的重要组件

2.RViz 是 ROS Visualization Tool 的首字母缩写,直译为ROS的三维可视化工具。它的主要目的是以三维方式显示ROS消息,可以将 数据进行可视化表达。例如:可以显示机器人模型,可以无需编程就能表达激光测距仪(LRF)传感器中的传感 器到障碍物的距离

下载RViz :

sudo apt install ros-noetic-rviz

3.Gazebo 是一款3D动态模拟器,用于显示机器人模型并创建仿真环境,能够在复杂的室内和室外环境中准确有效地模拟机器人。与游戏引擎提供高保真度的视觉模拟类似,Gazebo提供高保真度的物理模拟,其提供一整套传感器模型,以及对用户和程序非常友好的交互方式。

下载 Gazebo:

sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" 
>
 /etc/apt/sources.list.d/gazebo-stable.list'
sudo apt install gazebo11 
sudo apt install libgazebo11-dev

——————

使用 xacro 优化 urdf 驱动轮实现,需要使用变量封装底盘的半径、高度,使用数学公式动态计算底盘的关节点坐标

使用 Xacro 宏封装轮子重复的代码并调用宏创建两个轮子

——————

1. 建立URDF文件(Xacro)

 

2.launch文件 

建立文件之后,得有和他对应的launch节点

 

那么其对应的launch文件就要找到这些文件

<launch>
    <param name="robot_description" command="$(find xacro)/xacro $(find urdf01_rviz)/urdf/xacro/car.urdf.xacro" />

    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz" />
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen" />
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen" />
    <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" output="screen" />

</launch>

而car.xacro又包括需要的所以xacro文件,这样就变成了一个嵌套

启动时,我们只需要把这个launch文件启动就好 ,以上面为例

初始化:source ./devel/setup.bash

roslaunch urdf01_rviz demo03....

_________________________

2. URDF集成Gazebo

我们想把之前的 urdf 形成的小车模型在gazebo里面实现,我们就需要加入 改进后的xacro文件

开启 launch文件节点,启动gazebo

 创建仿真环境:

 与之前相比,差别就在多了个world文件来构建环境,当然也可以自己在里面构建,然后保存,当然那样有大可能是会卡住的

拓展:

 雷达信息仿真以及显示

1 新建 Xacro 文件,配置雷达传感器信息

2 xacro 文件集成

3 启动仿真环境

4 Rviz 显示雷达数据

 具体如下:

1. 在新的 gazebo环境下 建立新的xacro:

 注: demo05/6/7是环境中雷达 底盘 相机的形状,而新建的gazebo文件里面添加的是需要使用的内容,有了这些配置,功能才能被使用

然后把这些使用的  xacro文件 集合到 car.xacro中

 机器人运动控制以及里程计信息显示

1 为 joint 添加传动装置以及控制器(move)

2 xacro文件集成(car.xacro)

3 启动 gazebo并控制机器人运动(启动 car.xacro)

启动 launch 文件,使用 topic list 查看话题列表,会发现多了 /cmd_vel 然后发布 vmd_vel 消息控制即可

使用命令控制(或者可以编写单独的节点控制)(telekey 键盘控制节点)

————————————————————————————————————

导航 

 导航实现01_SLAM建图

gmapping 是ROS开源社区中较为常用且比较成熟的SLAM算法之一,gmapping可以根据移动机器人里程计数据和激光雷达数据来绘制二维的栅格地图

下载:

sudo apt install ros-noetic-gmapping

gmapping 功能包中的核心节点是:slam_gmapping。为了方便调用,需要先了解该节点订阅的话题、发布的话题、服务以及相关参数。

————————

2.1订阅的Topic

tf (tf/tfMessage)

  • 用于雷达、底盘与里程计之间的坐标变换消息。

scan(sensor_msgs/LaserScan)

  • SLAM所需的雷达信息。

————————————————

2.2发布的Topic

map_metadata(nav_msgs/MapMetaData)

  • 地图元数据,包括地图的宽度、高度、分辨率等,该消息会固定更新。

map(nav_msgs/OccupancyGrid)

  • 地图栅格数据,一般会在rviz中以图形化的方式显示。

~entropy(std_msgs/Float64)

  • 机器人姿态分布熵估计(值越大,不确定性越大)。

————————————

2.3服务

dynamic_map(nav_msgs/GetMap)

  • 用于获取地图数据。

————————————

2.4参数

~base_frame(string, default:"base_link")

  • 机器人基坐标系。

~map_frame(string, default:"map")

  • 地图坐标系。

~odom_frame(string, default:"odom")

  • 里程计坐标系。

~map_update_interval(float, default: 5.0)

  • 地图更新频率,根据指定的值设计更新间隔。

~maxUrange(float, default: 80.0)

  • 激光探测的最大可用范围(超出此阈值,被截断)。

~maxRange(float)

  • 激光探测的最大范围。

.... 参数较多,上述是几个较为常用的参数,其他参数介绍可参考官网。

————————————

2.5所需的坐标变换

雷达坐标系→基坐标系

  • 一般由 robot_state_publisher 或 static_transform_publisher 发布。

基坐标系→里程计坐标系

  • 一般由里程计节点发布。

————————————

2.6发布的坐标变换

地图坐标系→里程计坐标系

  • 地图到里程计坐标系之间的变换

1 编写gmapping节点相关launch文件

2 执行

1.先启动 Gazebo 仿真环境(此过程略)

2.然后再启动地图绘制的 launch 文件:

roslaunch 包名(nav_...) launch文件名(nav01_...)

3.启动键盘键盘控制节点,用于控制机器人运动建图

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

4.在 rviz 中添加组件,显示栅格地图

导航实现02_地图服务

1.map_server简介

map_server功能包中提供了两个节点: map_saver 和 map_server,前者用于将栅格地图保存到磁盘,后者读取磁盘的栅格地图并以服务的方式提供出去

sudo apt install ros-noetic-map-server

2.1map_saver节点说明

2.2地图保存launch文件

首先,参考上一节,依次启动仿真环境,键盘控制节点与SLAM节点;

然后,通过键盘控制机器人运动并绘图;

最后,通过上述地图保存方式保存地图。

结果:在指定路径下会生成两个文件,xxx.pgm 与 xxx.yaml

其中 mymap 是指地图的保存路径以及保存的文件名称。

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

xxx.pgm 本质是一张图片,直接使用图片查看程序即可打开。

xxx.yaml 保存的是地图的元数据信息,用于描述图片

3.2地图读取

通过 map_server 的 map_server 节点可以读取栅格地图数据,编写 launch 文件如下:

<launch>
    <!-- 设置地图的配置文件 -->
    <arg name="map" default="nav.yaml" />
    <!-- 运行地图服务器,并且加载设置的地图-->
    <node name="map_server" pkg="map_server" type="map_server" args="$(find mycar_nav)/map/$(arg map)"/>
</launch>

3.3地图显示

具体如下:

source  roslaunch 运行没有报错就算成功

接着在我们map文件里面就会多两个文件,这就是保存成功了

而地图服务,想要显示,就要打开一个rviz

source roslaunch 打开nav03

然后在终端打开一个rviz ,add添加地图(map),选取话题即可

——————————————————————————

AMCL(adaptive Monte Carlo Localization) 是用于2D移动机器人的概率定位系统,它实现了自适应(或KLD采样)蒙特卡洛定位方法,可以根据已有地图使用粒子滤波器推算机器人位置。

sudo apt install ros-noetic-navigation

3.1编写amcl节点相关的launch文件

3.2编写测试launch文件

test.launch

3.3执行

1.先启动 Gazebo 仿真环境(此过程略);

2.启动键盘控制节点:

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

3.启动上一步中集成地图服务、amcl 与 rviz 的 launch 文件;

4.在启动的 rviz 中,添加RobotModel、Map组件,分别显示机器人模型与地图,添加 posearray 插件,设置topic为particlecloud来显示 amcl 预估的当前机器人的位姿,箭头越是密集,说明当前机器人处于此位置的概率越高;

5.通过键盘控制机器人运动,会发现 posearray 也随之而改变。

 ——————————————

4.1launch文件

关于move_base节点的调用,模板如下:

4.3launch文件集成

如果要实现导航,需要集成地图服务、amcl 、move_base 与 Rviz 等,集成示例如下:

4.4测试

1.先启动 Gazebo 仿真环境(此过程略);

2.启动导航相关的 launch 文件;

3.添加Rviz组件(参考演示结果),可以将配置数据保存,后期直接调用;

 4.通过Rviz工具栏的 2D Nav Goal设置目的地实现导航

即 右上角粉红色箭头

——————————

导航与SLAM建图

1.首先运行gazebo仿真环境;

2.然后执行launch文件;

3.在rviz中通过2D Nav Goal设置目标点,机器人开始自主移动并建图了;

4.最后可以使用 map_server 保存地图。

猜你喜欢

转载自blog.csdn.net/ArtoriaLili/article/details/126021447