提问 发文

ROS仿真环境搭建

微微菌

| 2024-04-01 17:20 37 0 0

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

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

搭建环境介绍:
1.URDF 是 Unified Robot Description Format 的首字母缩写,直译为统一(标准化)机器人描述格式,可以以一种 XML 的方式描述机器人的部分结构

比如底盘、摄像头、激光雷达、机械臂以及不同关节的自由度.....,该文件可以被 C++ 内置的解释器转换成可视化的机器人模型,是 ROS 中实现机器人仿真的重要组件

(在程序中,我们使用 xacro 优化 urdf 驱动轮实现)

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

2.RViz 是 ROS Visualization Tool 的首字母缩写,直译为ROS的三维可视化工具。

它的主要目的是以三维方式显示ROS消息,可以将 数据进行可视化表达。例如:可以显示机器人模型,可以无需编程就能表达激光测距仪(LRF)传感器中的传感 器到障碍物的距离

下载RViz :(ros-(ros的版本)-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


素材下载链接

https://github.com/zx595306686/sim_demo.git


——————

使用 xacro 优化 urdf 驱动轮实现

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

二、建立URDF文件(Xacro)- RVIZ
前置: 优化RVIZ启动

重复启动launch文件时,Rviz 之前的组件配置信息不会自动保存,需要重复执行步骤4的操作,为了方便使用,可以使用如下方式优化:




(如下:文件命名为 urdf01_rviz  功能包包含 urdf xacro)



----------------------------

Xacro-语法解析

我们先来看看一个例子 - 建造小车底盘


  1. <!-- 根标签,必须声明 xmlns:xacro -->
    <robot name="my_base" xmlns:xacro="http://www.ros.org/wiki/xacro">
    <!-- 封装变量、常量 -->
    <xacro:property name="PI" value="3.141"/>
    <!-- 宏:黑色设置 -->
    <material name="black">
    <color rgba="0.0 0.0 0.0 1.0" />
    </material>
    <!-- 底盘属性 -->
    <xacro:property name="base_footprint_radius" value="0.001" /> <!-- base_footprint 半径 -->
    <xacro:property name="base_link_radius" value="0.1" /> <!-- base_link 半径 -->
    <xacro:property name="base_link_length" value="0.08" /> <!-- base_link 长 -->
    <xacro:property name="earth_space" value="0.015" /> <!-- 离地间距 -->

    <!-- 底盘 -->
    <link name="base_footprint">
    <visual>
    <geometry>
    <sphere radius="${base_footprint_radius}" />
    </geometry>
    </visual>
    </link>

    <link name="base_link">
    <visual>
    <geometry>
    <cylinder radius="${base_link_radius}" length="${base_link_length}" />
    </geometry>
    <origin xyz="0 0 0" rpy="0 0 0" />
    <material name="yellow">
    <color rgba="0.5 0.3 0.0 0.5" />
    </material>
    </visual>
    </link>

    <joint name="base_link2base_footprint" type="fixed">
    <parent link="base_footprint" />
    <child link="base_link" />
    <origin xyz="0 0 ${earth_space + base_link_length / 2 }" />
    </joint>

    <!-- 驱动轮 -->
    <!-- 驱动轮属性 -->
    <xacro:property name="wheel_radius" value="0.0325" /><!-- 半径 -->
    <xacro:property name="wheel_length" value="0.015" /><!-- 宽度 -->
    <!-- 驱动轮宏实现 -->
    <xacro:macro name="add_wheels" params="name flag">
    <link name="${name}_wheel">
    <visual>
    <geometry>
    <cylinder radius="${wheel_radius}" length="${wheel_length}" />
    </geometry>
    <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
    <material name="black" />
    </visual>
    </link>

    <joint name="${name}_wheel2base_link" type="continuous">
    <parent link="base_link" />
    <child link="${name}_wheel" />
    <origin xyz="0 ${flag * base_link_radius} ${-(earth_space + base_link_length / 2 - wheel_radius) }" />
    <axis xyz="0 1 0" />
    </joint>
    </xacro:macro>
    <xacro:add_wheels name="left" flag="1" />
    <xacro:add_wheels name="right" flag="-1" />
    <!-- 支撑轮 -->
    <!-- 支撑轮属性 -->
    <xacro:property name="support_wheel_radius" value="0.0075" /> <!-- 支撑轮半径 -->

    <!-- 支撑轮宏 -->
    <xacro:macro name="add_support_wheel" params="name flag" >
    <link name="${name}_wheel">
    <visual>
    <geometry>
    <sphere radius="${support_wheel_radius}" />
    </geometry>
    <origin xyz="0 0 0" rpy="0 0 0" />
    <material name="black" />
    </visual>
    </link>

    <joint name="${name}_wheel2base_link" type="continuous">
    <parent link="base_link" />
    <child link="${name}_wheel" />
    <origin xyz="${flag * (base_link_radius - support_wheel_radius)} 0 ${-(base_link_length / 2 + earth_space / 2)}" />
    <axis xyz="1 1 1" />
    </joint>
    </xacro:macro>

    <xacro:add_support_wheel name="front" flag="1" />
    <xacro:add_support_wheel name="back" flag="-1" />

    </robot>


————————

代码解析:

属性定义

<xacro:property name="xxxx" value="yyyy" />


属性调用

${属性名称}

算数运算

${数学表达式}

宏定义

<xacro:macro name="宏名称" params="参数列表(多参数之间使用空格分隔)">

.....

参数调用格式: ${参数名}

</xacro:macro>


宏调用


<xacro:宏名称 参数1=xxx 参数2=xxx/>


文件包含(包含其他编写组成的文件 car.)


<robot name="xxx" xmlns:xacro="http://wiki.ros.org/xacro">
<xacro:include filename="my_base.xacro" />
<xacro:include filename="my_camera.xacro" />
<xacro:include filename="my_laser.xacro" />
....
</robot>


2.launch文件 

建立文件之后,需要有launch文件来启动这些节点,也就是一个个打开这些功能包

在下面,我们打开了集成的 car 文件,并且在rviz包里找到小车,并给他




那么其对应的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>

本文为二次转载,如侵权请联系删除。
收藏 0
分享
分享方式
微信

评论

游客

全部 0条评论

9228

文章

4.73W+

人气

12

粉丝

1

关注

官方媒体

轻松设计高效搭建,减少3倍设计改稿与开发运维工作量

开始免费试用 预约演示

扫一扫关注公众号 扫一扫联系客服

©Copyrights 2016-2022 杭州易知微科技有限公司 浙ICP备2021017017号-3 浙公网安备33011002011932号

互联网信息服务业务 合字B2-20220090

400-8505-905 复制
免费试用
微信社区
易知微-数据可视化
微信扫一扫入群