09 机器人仿真Gazebo实例

简介: 本文详细介绍了在ROS(机器人操作系统)中使用Gazebo进行机器人仿真的流程,包括安装Gazebo、创建URDF模型、使用xacro优化URDF、配置ROS_control以及为模型添加Gazebo属性和控制器插件,并提供了相应的示例代码。

零、Gazebo

1. Gazebo是开源物理仿真环境

支持:
三维可视化环境
传感器仿真、噪声仿真
云仿真、远程仿真等功能

2. 安装对应版本的Gazebo

sudo apt-get install ros-noetic-gazebo-ros-pkgs
sudo apt-get install ros-noetic-gazebo-ros-control

3.进入Gazebo

roscore
rosrun gazebo_ros gazebo

一、建立URDF模型

1. URDF

Unified Robot Description Format 统一机器人描述格式

2. 标签

1. 声明使用xml描述

<?xml version="1.0" ?>

2. link用于描述一个刚体部件的外观和物理属性

<link>下属的<visual>用于描述外观
<visual>下属的<origin>声明三维坐标与旋转姿态 定义起点
<visual>下属的<geometry>用于描述几何形状
<geometry>下属的<cylinder>用于描述该几何的圆柱形状的半径和高
<visual>下属的<material>用于描述材质,如颜色等
<material>下属的<color>用于描述具体的RGBA值

    <link name="base_link">
        <visual>
            <orgin xyz="0 0 0" rpy="0 0 0"/>
            <geometry>
                <cylinder length="0.005" radius="0.13"/>
            </geometry>
            <material name="yellow">
                <color rgba="1 0.4 0 1"/>
            </material>
        </visual>
    </link>

3. joint是用于连接两个刚体的关节

type用于描述关节的类型
fixed 固定关节
continuous 单轴旋转关节
<origin>定义了joint的起点
<parent>代表连接的一个刚体
<child>代表连接的另一个刚体
<axis>代表旋转轴

    <joint name="base_to_front_castor_joint" type="fixed">
        <origin xyz="0.1135 0 -0.0165" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="front_castor_link"/>
        <axis xyz="0 1 0"/>
    </joint>

4. robot是link和joint标签的父标签

link和joint标签都包含在robot标签内
当换用.xacro格式后
此处需改为

5. gazebo标签

在每个link中存在,包含material属性,与中的material相同,只是方便gazebo使用

3. 建立功能包

catkin_create_pkg robot_description urdf xacro

建立下属文件夹:
urdf:存.urdf或.xacro文件
meshes:存引用的模型渲染文件
launch:存启动文件
config:存rviz配置

4. 创建urdf模型

<?xml version="1.0" ?>

<robot name="robot" >



    <link name="base_link">
        <visual>
            <orgin xyz="0 0 0" rpy="0 0 0"/>
            <geometry>
                <cylinder length="0.005" radius="0.13"/>
            </geometry>
            <material name="yellow">
                <color rgba="1 0.4 0 1"/>
            </material>
        </visual>
    </link>



    <joint name="base_to_left_motor_joint" type="fixed">
        <origin xyz="-0.055 0.075 0" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="left_motor_link"/>
    </joint>



    <link name="left_motor_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0"/>
            <geometry>
                <cylinder radius="0.02" length="0.08"/>
            </geometry>
            <material name="gray">
                <color rgba="0.75 0.75 0.75 1"/>
            </material>
        </visual>
    </link>



    <joint name="left_wheel_joint" type="continuous">
        <origin xyz="0 0.0485 0" rpy="0 0 0"/>
        <parent link="left_motor_link"/>
        <child link="left_wheel_link"/>
    </joint>




    <link name="left_wheel_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0"/>
            <geometry>
                <cylinder radius="0.033" length= "0.017"/>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>



    <joint name="base_to_right_motor_joint" type="fixed">
        <origin xyz="-0.055 -0.075 0" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="right_motor_link"/>
    </joint>



    <link name="right_motor_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0"/>
            <geometry>
                <cylinder radius="0.02" length="0.08"/>
            </geometry>
            <material name="gray">
                <color rgba="0.75 0.75 0.75 1"/>
            </material>
        </visual>
    </link>



    <joint name="right_wheel_joint" type="continuous">
        <origin xyz="0 -0.0485 0" rpy="0 0 0"/>
        <parent link="right_motor_link"/>
        <child link="right_wheel_link"/>
    </joint>




    <link name="right_wheel_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0"/>
            <geometry>
                <cylinder radius="0.033" length= "0.017"/>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

    <joint name="base_to_front_castor_joint" type="fixed">
        <origin xyz="0.1135 0 -0.0165" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="front_castor_link"/>
        <axis xyz="0 1 0"/>
    </joint>

    <link name="front_castor_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0"/>
            <geometry>
                <sphere radius="0.0165"/>
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.95"/>
            </material>

        </visual>
    </link>

</robot>

5. 检查urdf

安装检查工具

sudo apt-get install liburdfdom-tools

执行检查

check_urdf robot.urdf

生成关系树pdf

urdf_to_graphiz  robot.urdf

6. 导入rviz检查3d模型

1. 创建launch文件

<launch>
    <param name="robot_description" textfile="$(find robot_description)/urdf/robot.urdf"/>


<!-- Set GUI Parameters, Show Joints Control Plugins -->
    <param name="use_gui" value="true"/>

<!-- Run joint_state_publisher Node, Pub Joints Statement of Robot -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"/>

<!-- Run robot_state_publisher Node,Pub TF Data-->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"/>

<!-- Run RVIZ -->
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(find robot_description)/config/robot_urdf.rviz" required="true"/>

</launch>

注意需要先打开rviz加载机器人保存robot_urdf.rviz在config文件夹里以便launch文件调用

其他例子:

<launch>

    <arg name="model" default="$(find xacro)/xacro --inorder '$(find mrobot_description)/urdf/mrobot_with_camera.urdf.xacro'" />
    <arg name="gui" default="true" />

    <param name="robot_description" command="$(arg model)" />

    <!-- 设置GUI参数,显示关节控制插件 -->
    <param name="use_gui" value="$(arg gui)"/>

    <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />

    <!-- 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />

    <!-- 运行rviz可视化界面 -->
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(find mrobot_description)/config/mrobot.rviz" required="true" />

</launch>

2. 运行launch文件观察效果

7. 添加物理或碰撞模型(可选)

添加物理惯性和碰撞的属性
两者都是与同级的属性标签

            <inertial>
                <mass value="0.001" />
                <origin xyz="0 0 0" />
                <inertia ixx="0.0001" ixy="0.0" ixz="0.0"
                         iyy="0.0001" iyz="0.0"
                         izz="0.0001" />
            </inertial>
<collision>
                <origin xyz="0.0 0.0 0.0" rpy="0 0 0" />
                <geometry>
                    <box size="0.01 0.01 0.07" />
                </geometry>
            </collision>

二、xacro:改进的urdf

.xacro是.urdf的优化版 便于阅读、复用、模块化

1.修改robot处的标签

当换用.xacro格式后
robot标签首处需改为

\<robot name="robot_name" xmlns:xacro="http:www.ros.org/wiki/xacro">

1. xacro可以定义常量,便于后期修改

\<xacro:property name="wheel_radius" value="0.033"/>
\<xacro:property name="M_PI" value="3.14159"/>

调用常量的方法:
${}可以接调用的常量,在${}里面可以有数学式子做加减乘除
推荐把部件内部的各组件关系都用加减乘除来表示,这样只需要修改常量值即可适配整个文件

\<origin xyz="0 0 0" rpy="${M_PI/2} 0 0"/>

2. xacro可以使用宏定义

宏(英语:Macro)是一种批量处理的称谓。
计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。
宏定义,可近似看做编程里的“函数”概念,方便复用

注意:当没有调用该宏定义的时候,它不会出现在转化出的urdf文件里

<xacro:macro name="mrobot_standoff_2in" params="parent number x_loc y_loc z_loc">
        <joint name="standoff_2in_${number}_joint" type="fixed">
            <origin xyz="${x_loc} ${y_loc} ${z_loc}" rpy="0 0 0" />
            <parent link="${parent}"/>
            <child link="standoff_2in_${number}_link" />
        </joint>

        <link name="standoff_2in_${number}_link">
            <inertial>
                <mass value="0.001" />
                <origin xyz="0 0 0" />
                <inertia ixx="0.0001" ixy="0.0" ixz="0.0"
                         iyy="0.0001" iyz="0.0"
                         izz="0.0001" />
            </inertial>

            <visual>
                <origin xyz=" 0 0 0 " rpy="0 0 0" />
                <geometry>
                    <box size="0.01 0.01 0.07" />
                </geometry>
                <material name="black">
                    <color rgba="0.16 0.17 0.15 0.9"/>
                </material>
            </visual>

            <collision>
                <origin xyz="0.0 0.0 0.0" rpy="0 0 0" />
                <geometry>
                    <box size="0.01 0.01 0.07" />
                </geometry>
            </collision>
        </link>
    </xacro:macro>

调用宏(macro):

<xacro:macro_name parameter1 parameter2 parameter_and_so_on/>

例子:

<xacro:triangle_board_macro parent="base_link" number="6" x_location="standoff_x/2"  y_location="standoff_y"  z_location="Height/2"/>

为宏设置默认参数(忽视此部分,存在错误)

<xacro:macro name="kinect_camera" params="param_name:=defalut_value">
    <link name="${param_name}_link">
    <!-- and so on -->

3. 引用xacro

在xacro总文件里引用并调用其他机器人部件的.xacro文件
可以达到模块化开发,逻辑清晰的目的,当增删组件时,只需要修改总.xacro文件就可以了
先将部件的.xacro文件include

<xacro:include filename="$(find mrobot_description)/urdf/mrobot_body.urdf.xacro" />

|调用mrobot_body这个组件
mrobot_body是在body这个分部件.xacro文件下的一个xacro:macro宏定义,它不需要输入参数,而且构造了整个body,在body分部件的.xacro文件下还有其他的xacro:macro宏定义,他们是mrobot_body这个宏定义的嵌套小宏定义,因此在总.xacro文件下直接调用就可以填入整个body的数据

   <!-- 引用这个.xacro文件 即编程概念里的include某个函数库 -->
    <xacro:include filename="$(find mrobot_description)/urdf/mrobot_body.urdf.xacro" />
    <!-- 调用mrobot_body这个宏定义-->
    <xacro:mrobot_body/>

4.将xacro转化成urdf

rosrun xacro xacro filename.xacro > filename.urdf

可能出现的情况:xacro转urdf为空
解释:古月居及网上一些教程有错误,没有在调用宏定义的时候给予xacro:macro_name
因此xacro转换器无法识别这条命令,解决方法如下:
注意:当没有调用该宏定义的时候,它不会出现在转化出的urdf文件里
就像是编程里的函数,如果不调用,就不会生效

<xacro:function_name param1="xxxx" param2="xxxxxx" and_so_on="xxx"/>

5.在launch文件中转化xacro为urdf直接使用

<arg name="mode" default="$(find xacro)/xacro '$(find robot_description)/urdf/robot.urdf.xacro' "/>
<param name="robot_description" command="$(arg model)"/>

三、ROS_control

1.框架结构

ROS_control的框架结构为
1.Controller Manager 控制器管理器
使用通用接口用于管理各个控制器
2.Controller 控制器
控制joint 读取硬件资源接口状态 发布控制指令 提供pid控制器
3.Hardware Resource Interface Layer 硬件资源接口层
为上下两层提供硬件资源的接口
4.RobotHW 抽象硬件
接触硬件资源,通过Read和Write完成硬件操作
5.Real Robot 真实机器人
真实的控制器、执行器

2.运行工具controller_manager

1.controller_manager

rosrun controller_manager controller_manager command controller_name

commands:
load unload start stop spawn(加载并启动控制器) kill(停止并卸载控制器)
list 列出所有控制器,并显示其状态
list-types等

2.spawner/unspawner

controller_manager包下也存在可以一次性加载多个控制器的命令
如果需要加载并启动,可以去掉–stopped

rosrun controller_manager spawner --stopped name1 name2 name3

一次性停止但不卸载

rosrun controller_manager unspawner name1 name2 name3

3.在launch文件中使用controller_manager

参数–stopped为可选项 添加后可仅加载不启动

<launch>
<node pkg="controller_manager" type="spawner" args="--stopped controller_name1 controller_name2 controller_name3"/>
</launch>

四、为模型添加 属性标签

1.

每个link都需要添加标签,包含属性仅有material
因为gazebo不支持的material,需要单独设置,否则默认为灰白
在link中添加:

<gazebo reference="link_name">
    <material>Gazebo/Black</material>
</gazebo>

referrence若不添加,则默认作用在标签上

2.

传动装置可以用来表示驱动机器人运动的动力源
actuator 执行器
joint为要绑定驱动器的joint,是提供动力的原件
type为使用的传动类型
hardwareInterface定义硬件接口类型

<transmission name="wheel_joint_trans">
    <type>transmission_interface/SimpleTransmission</type>
    <joint name="base_to_wheel_joint"/>
    <actuator name="wheel_joint_motor">
        <hardwareInterface>VelocityJointInterface</hardwareInterface>
        <mechanicalReduction>1<mechanicalReduction>
    </actuator>
</transmission>

五、添加gazebo控制器插件

1. 为添加gazebo插件

<gazebo>
    <plugin name="unique_name" filename="plugin_name.so">
    <!-- more plugin parameters -->
    </plugin>
</gazebo>

2. 为或者添加gazebo插件

<gazebo reference="link_or_joint_name">
    <plugin name="unique_name" filename="plugin_name.so">
    <!-- more plugin parameters -->
    </plugin>
</gazebo>

gazebo默认的插件存放位置为/opt/ros/noetic/lib,形式为libgazeboXXXX.so

0000

安装ROS自带的导航包

move-base在包中

sudo apt-get install ros-noetic-navigation
相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
ROS入门实践
本课程将基于基础设施即代码 IaC 的理念,介绍阿里云自动化编排服务ROS的概念、功能和使用方式,并通过实际应用场景介绍如何借助ROS实现云资源的自动化部署,使得云上资源部署和运维工作更为高效。
目录
相关文章
|
8月前
|
运维 算法 机器人
阿里云AnalyticDB具身智能方案:破解机器人仿真数据、算力与运维之困
本文将介绍阿里云瑶池旗下的云原生数据仓库AnalyticDB MySQL推出的全托管云上仿真解决方案,方案采用云原生架构,为开发者提供从开发环境、仿真计算到数据管理的全链路支持。
|
机器学习/深度学习 算法 机器人
基于QLearning强化学习的较大规模栅格地图机器人路径规划matlab仿真
本项目基于MATLAB 2022a,通过强化学习算法实现机器人在栅格地图中的路径规划。仿真结果显示了机器人从初始位置到目标位置的行驶动作序列(如“下下下下右右...”),并生成了详细的路径图。智能体通过Q-Learning算法与环境交互,根据奖励信号优化行为策略,最终学会最优路径。核心程序实现了效用值排序、状态转换及动作选择,并输出机器人行驶的动作序列和路径可视化图。
721 85
|
8月前
|
传感器 算法 安全
机器人路径规划和避障算法matlab仿真,分别对比贪婪搜索,最安全距离,RPM以及RRT四种算法
本程序基于MATLAB 2022A实现机器人路径规划与避障仿真,对比贪婪搜索、最安全距离、RPM和RRT四种算法。通过地图模拟环境,输出各算法的路径规划结果,展示其在避障性能与路径优化方面的差异。代码包含核心路径搜索逻辑,并附有测试运行图示,适用于机器人路径规划研究与教学演示。
990 64
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
533 68
|
9月前
|
机器学习/深度学习 算法 数据可视化
基于Qlearning强化学习的机器人迷宫路线搜索算法matlab仿真
本内容展示了基于Q-learning算法的机器人迷宫路径搜索仿真及其实现过程。通过Matlab2022a进行仿真,结果以图形形式呈现,无水印(附图1-4)。算法理论部分介绍了Q-learning的核心概念,包括智能体、环境、状态、动作和奖励,以及Q表的构建与更新方法。具体实现中,将迷宫抽象为二维网格世界,定义起点和终点,利用Q-learning训练机器人找到最优路径。核心程序代码实现了多轮训练、累计奖励值与Q值的可视化,并展示了机器人从起点到终点的路径规划过程。
462 0
|
机器学习/深度学习 算法 机器人
基于Qlearning强化学习的机器人路线规划matlab仿真
本内容展示了基于Q-learning强化学习算法的路径规划研究,包括MATLAB仿真效果、理论知识及核心代码。通过训练与测试,智能体在离散化网格环境中学习最优策略以规避障碍并到达目标。代码实现中采用epsilon-贪婪策略平衡探索与利用,并针对紧急情况设计特殊动作逻辑(如后退)。最终,Q-table收敛后可生成从起点到终点的最优路径,为机器人导航提供有效解决方案。
374 20
|
机器人 数据安全/隐私保护
基于模糊PID控制器的puma560机器人控制系统的simulink建模与仿真
本课题研究基于模糊PID控制器的PUMA 560机器人控制系统建模与仿真,对比传统PID控制器性能。通过Simulink实现系统建模,分析两种控制器的误差表现。模糊PID结合了PID的线性控制优势与模糊逻辑的灵活性,提升动态性能和抗干扰能力。以PUMA 560机器人为例,其运动学和动力学模型为基础,设计针对各关节的模糊PID控制器,包括模糊化、规则制定、推理及去模糊化等步骤,最终实现更优的控制效果。
|
算法 机器人 数据安全/隐私保护
四自由度SCARA机器人的运动学和动力学matlab建模与仿真
本课题深入研究SCARA机器人系统,提出其动力学与运动学模型,并基于MATLAB Robotics Toolbox建立四自由度SCARA机器人仿真对象。通过理论结合仿真实验,实现了运动学正解、逆解及轨迹规划等功能,完成系统实验和算法验证。SCARA机器人以其平面关节结构实现快速定位与装配,在自动生产线中广泛应用,尤其在电子和汽车行业表现优异。使用D-H参数法进行结构建模,推导末端执行器的位姿,建立了机器人的运动学方程。
|
机器人 数据安全/隐私保护
基于PID控制器的六自由度串联机器人控制系统的simulink建模与仿真
本课题基于MATLAB2022a的Simulink环境,对六自由度串联机器人控制系统进行建模与仿真,采用PID控制器实现关节的位置、速度或力矩控制。PID控制器通过比例、积分、微分三种策略有效减小系统误差,提高响应速度和稳定性。仿真结果显示系统运行良好,无水印。尽管PID控制简单实用,但在复杂动力学环境下,常结合其他控制策略以增强鲁棒性。
|
机器学习/深度学习 算法 数据可视化
基于QLearning强化学习的机器人避障和路径规划matlab仿真
本文介绍了使用MATLAB 2022a进行强化学习算法仿真的效果,并详细阐述了Q-Learning原理及其在机器人避障和路径规划中的应用。通过Q-Learning算法,机器人能在未知环境中学习到达目标的最短路径并避开障碍物。仿真结果展示了算法的有效性,核心程序实现了Q表的更新和状态的可视化。未来研究可扩展至更复杂环境和高效算法。![](https://ucc.alicdn.com/pic/developer-ecology/nymobwrkkdwks_d3b95a2f4fd2492381e1742e5658c0bc.gif)等图像展示了具体仿真过程。
769 0

热门文章

最新文章