是通过计算机对实体机器人系统进行模拟的技术,在 ROS 模拟实现涉及的内容主要有三个:对 机器人建模(URDF)、创造模拟环境(Gazebo)以及感知环境(Rviz)等系统实现。
________
搭建环境介绍:
是 Unified Robot Description Format 首字母缩写直译为,可以以一种 XML 描述机器人的部分结构,如底盘、摄像头、激光雷达、机械臂和不同关节的自由度...,本文件可被接受 C 内置解释器转换为可视化机器人模型 ROS 机器人仿真的重要组件
是 ROS Visualization Tool 首字母缩写直译为。其主要目的是三维显示ROS新闻,可以 可视化表达数据。例如,激光测距仪可以在不编程的情况下显示机器人模型和表达(LRF)传感器中的传感 从障碍物到障碍物的距离
下载RViz :
sudo apt install ros-noetic-rviz
是一款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
——————
使用 优化 urdf 实现驱动轮,需要使用变量包装底盘的半径和高度,并使用数学公式动态计算底盘的关节点坐标
使用 宏封装轮重复代码,并调用宏创建两个轮子
——————
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, deault:"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.先启动 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 保存的是地图的元数据信息,用于描述图片
通过 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>
具体如下:
source roslaunch 运行没有报错就算成功
接着在我们map文件里面就会多两个文件,这就是保存成功了
而地图服务,想要显示,就要打开一个rviz
source roslaunch 打开nav03
然后在终端打开一个rviz ,add添加地图(map),选取话题即可
——————————————————————————
AMCL(adaptive Monte Carlo Localization) 是用于2D移动机器人的概率定位系统,它实现了自适应(或KLD采样)蒙特卡洛定位方法,可以根据已有地图使用粒子滤波器推算机器人位置。
sudo apt install ros-noetic-navigation
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 保存地图。