ROS Gazebo安装入门及仿真室内环境和小车实现(十九)

2023-05-16

目录

安装

简介

URDF与Gazebo基本集成流程

创建功能包

编写URDF文件 

启动Gazebo并显示模型

 launch 文件实现:

命令行启动(去掉launch中的第三行加载模型)

 集成到launch里启动

 URDF集成Gazebo相关设置

collision 

 inertial

颜色设置 

 URDF集成Gazebo实操

框架搭建 

 编写封装惯性矩阵算法的 xacro 文件

 底盘修改

驱动轮修改

支撑轮修改

 传感器修改

 雷达修改

Gazebo仿真环境搭建

方式一:用别人的仿真环境 

 方式二:自己搭建环境

 方式三:自定义仿真环境

 下载官方模型库


安装

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

以“ros- [ROS_DISTRO] -desktop-full”命令安装ROS时,gzebo会默认被安装。

运行使用命令gazeborosrun gazebo_ros gazebo

注意1:在 Ubuntu20.04 与 ROS Noetic 环境下,gazebo 启动异常以及解决

  • 问题1:VMware: vmw_ioctl_command error Invalid argument(无效的参数)

    解决:

    echo "export SVGA_VGPU10=0" >> ~/.bashrc

    source .bashrc

  • 问题2:[Err] [REST.cc:205] Error in REST request

    解决:sudo gedit ~/.ignition/fuel/config.yaml

    然后将url : https://api.ignitionfuel.org使用 # 注释

    再添加url: https://api.ignitionrobotics.org

  • 问题3:启动时抛出异常:[gazebo-2] process has died [pid xxx, exit code 255, cmd.....

    解决:killall gzserverkillall gzclient

注意2:如果 gazebo没有安装,请自行安装:

1.添加源:

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

wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -

2.安装:

第一步
sudo apt update
第二步
sudo apt install gazebo11 
第三步
sudo apt install libgazebo11-dev

简介

URDF 需要集成进 Rviz 或 Gazebo 才能显示可视化的机器人模型,前面已经介绍了URDF 与 Rviz 的集成,本节主要介绍:

  • URDF 与 Gazebo 的基本集成流程;
  • 如果要在 Gazebo 中显示机器人模型,URDF 需要做的一些额外配置;
  • 关于Gazebo仿真环境的搭建。

URDF与Gazebo基本集成流程

URDF 与 Gazebo 集成流程与 Rviz 实现类似,主要步骤如下:

  1. 创建功能包,导入依赖项

  2. 编写 URDF 或 Xacro 文件

  3. 启动 Gazebo 并显示机器人模型

创建功能包

 

编写URDF文件 

 

<!-- 
    创建一个机器人模型(盒状即可),显示在 Gazebo 中 
-->

<robot name="mycar">
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.5 0.2 0.1" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="yellow">
                <color rgba="0.5 0.3 0.0 1" />
            </material>
        </visual>
        <collision>
            <geometry>
                <box size="0.5 0.2 0.1" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
        </collision>
        <inertial>
            <origin xyz="0 0 0" />
            <mass value="6" />
            <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />
        </inertial>
    </link>
    <gazebo reference="base_link">
        <material>Gazebo/Black</material>
    </gazebo>

</robot>

 一个是设置碰撞参数一个是设置连杆矩阵的

注意, 当 URDF 需要与 Gazebo 集成时,和 Rviz 有明显区别:

1.必须使用 collision 标签,因为既然是仿真环境,那么必然涉及到碰撞检测,collision 提供碰撞检测的依据。

2.必须使用 inertial 标签,此标签标注了当前机器人某个刚体部分的惯性矩阵,用于一些力学相关的仿真计算。

3.颜色设置,也需要重新使用 gazebo 标签标注,因为之前的颜色设置为了方便调试包含透明度,仿真环境下没有此选项。

如果是标准集合体,复制visual的geometry和origin即可 

        <collision>
            <geometry>
                <box size="0.5 0.2 0.1" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
        </collision>

惯性矩阵

<mass value>代表的是质量此处为6kg

 <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />

        <inertial>
            <origin xyz="0 0 0" />
            <mass value="6" />
            <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />
        </inertial>

启动Gazebo并显示模型

 launch 文件实现:

<include file="$(find gazebo_ros)/launch/empty_world.launch" />这个是直接用默认gazebo配置无需新建 empty_world.launch

这个launch是在gazebo_ros包里的

<launch>

    <!-- 将 Urdf 文件的内容加载到参数服务器 -->
    <param name="robot_description" textfile="$(find demo02_urdf_gazebo)/urdf/urdf01_helloworld.urdf" />

    <!-- 启动 gazebo -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch" />

    <!-- 在 gazebo 中显示机器人模型 -->
    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />
</launch>

跟rviz不同还需要一行命令让gazebo显示机器人模型

<include file="$(find gazebo_ros)/launch/empty_world.launch" />
<!-- 启动 Gazebo 的仿真环境,当前环境为空环境 -->
<node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />

<!-- 
    在 Gazebo 中加载一个机器人模型,该功能由 gazebo_ros 下的 spawn_model 提供:
    -urdf 加载的是 urdf 文件
    -model mycar 模型名称是 mycar
    -param robot_description 从参数 robot_description 中载入模型
    -x 模型载入的 x 坐标
    -y 模型载入的 y 坐标
    -z 模型载入的 z 坐标
-->

 args="-urdf -model mycar -param robot_description"  />

-urdf 要用urdf类型数据 

-model mycar 模型取名叫mycar

 -param robot_description要加载的模型是从 robot_description获取的

命令行启动(去掉launch中的第三行加载模型)

 

 

 此时gazebo是空的

启动命令传给gazebo参数

 集成到launch里启动

 

 

 此时就完成了

 URDF集成Gazebo相关设置

 较之于 rviz,gazebo在集成 URDF 时,需要做些许修改,比如:必须添加 collision 碰撞属性相关参数、必须添加 inertial 惯性矩阵相关参数,另外,如果直接移植 Rviz 中机器人的颜色设置是没有显示的,颜色设置也必须做相应的变更。

collision 

 如果机器人link是标准的几何体形状,和link的 visual 属性设置一致即可。

 inertial

 惯性矩阵的设置需要结合link的质量与外形参数动态生成,标准的球体、圆柱与立方体的惯性矩阵公式如下(已经封装为 xacro 实现):

推导见下面的链接

(67条消息) ROS漫漫长路(一)——Gazebo中机器人圆柱,球,长方体惯性矩阵推导与代码实现_lzzzzzzm的博客-CSDN博客_长方体的惯性矩阵

 转动惯量的SI单位为kg·m²。对于一个质点,I=mr²,其中,m是其质量,r是质点和转轴的垂直距离。

 

所以对称物体的ixy ixz iyz iyx iyz izx izy为0 

(因为积分为0)

 球体惯性矩阵

<!-- Macro for inertia matrix -->
    <xacro:macro name="sphere_inertial_matrix" params="m r">
        <inertial>
            <mass value="${m}" />
            <inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"
                iyy="${2*m*r*r/5}" iyz="0" 
                izz="${2*m*r*r/5}" />
        </inertial>
    </xacro:macro>

圆柱惯性矩阵

<xacro:macro name="cylinder_inertial_matrix" params="m r h">
        <inertial>
            <mass value="${m}" />
            <inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
                iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
                izz="${m*r*r/2}" /> 
        </inertial>
    </xacro:macro>

 立方体惯性矩阵

 <xacro:macro name="Box_inertial_matrix" params="m l w h">
       <inertial>
               <mass value="${m}" />
               <inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0"
                   iyy="${m*(w*w + l*l)/12}" iyz= "0"
                   izz="${m*(w*w + h*h)/12}" />
       </inertial>
   </xacro:macro>

 需要注意的是,原则上,除了 base_footprint 外,机器人的每个刚体部分都需要设置惯性矩阵,且惯性矩阵必须经计算得出,如果随意定义刚体部分的惯性矩阵,那么可能会导致机器人在 Gazebo 中出现抖动,移动等现象。

颜色设置 

 在 gazebo 中显示 link 的颜色,必须要使用指定的标签:

<gazebo reference="link节点名称">
     <material>Gazebo/Blue</material>
</gazebo>

PS:material 标签中,设置的值区分大小写,颜色可以设置为 Red Blue Green Black .....

 URDF集成Gazebo实操

需求描述:

将之前的机器人模型(xacro版)显示在 gazebo 中

实现流程:

  1. 需要编写封装惯性矩阵算法的 xacro 文件

  2. 为机器人模型中的每一个 link 添加 collision 和 inertial 标签,并且重置颜色属性

  3. 在 launch 文件中启动 gazebo 并添加机器人模型

框架搭建 

 编写封装惯性矩阵算法的 xacro 文件

新建文件复制以下代码

<robot name="base" xmlns:xacro="http://wiki.ros.org/xacro">
    <!-- Macro for inertia matrix -->
    <xacro:macro name="sphere_inertial_matrix" params="m r">
        <inertial>
            <mass value="${m}" />
            <inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"
                iyy="${2*m*r*r/5}" iyz="0" 
                izz="${2*m*r*r/5}" />
        </inertial>
    </xacro:macro>

    <xacro:macro name="cylinder_inertial_matrix" params="m r h">
        <inertial>
            <mass value="${m}" />
            <inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
                iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
                izz="${m*r*r/2}" /> 
        </inertial>
    </xacro:macro>

    <xacro:macro name="Box_inertial_matrix" params="m l w h">
       <inertial>
               <mass value="${m}" />
               <inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0"
                   iyy="${m*(w*w + l*l)/12}" iyz= "0"
                   izz="${m*(w*w + h*h)/12}" />
       </inertial>
   </xacro:macro>
</robot>

把之前的小车xacro实现复制进来 

具体见 

(15条消息) ROS xacro URDF优化(十七)_啥也不是的py人的博客-CSDN博客https://blog.csdn.net/weixin_50920579/article/details/124189174?spm=1001.2014.3001.5501

 修改car.urdf.xacro

要增加包含惯性矩阵的xacro

 

 底盘修改

因为直接用的之前的rviz的xacro文件,所以要对应进行修改

对link增加<collision>属性

 跟visual保持一致就行

 

 调用xacro interia matrix


<!-- diaoyong interia matrix  -->
<xacro:cylinder_inertial_matrix m="${base_mass}" r="${base_link_radius}" h="${base_link_length}">

另外设置一下全局变量

<xacro:property name="base_mass" value="2" />

 最后是颜色设置

    <gazebo reference="base_link">
      <material>Gazebo/Yellow</material>
    </gazebo>

此处就完成了车体部分设置

然后执行一下看看有没有错

 

 可以看到车体正常显示了

雷达和摄像头还没有正常显示

驱动轮修改

添加<collision>

 

 添加颜色

 添加惯性矩阵

 

运行

 可以看到多出了红色的轮子

支撑轮修改

 设置<collision>

 添加惯性矩阵

 

 设置颜色

 运行

 传感器修改

<collision> 

 

惯性矩阵 

 

 

颜色设置 

 雷达修改

先改支架

 

惯性矩阵修改 

 

 颜色修改

 雷达修改

 

惯性矩阵调用 

 

 颜色修改

运行

 运行成功

Gazebo仿真环境搭建

 

到目前为止,我们已经可以将机器人模型显示在 Gazebo 之中了,但是当前默认情况下,在 Gazebo 中机器人模型是在 empty world 中,并没有类似于房间、家具、道路、树木... 之类的仿真物,如何在 Gazebo 中创建仿真环境呢?

Gazebo 中创建仿真实现方式有两种:

  • 方式1: 直接添加内置组件创建仿真环境

  • 方式2: 手动绘制仿真环境(更为灵活)

也还可以直接下载使用官方或第三方提高的仿真环境插件。

方式一:用别人的仿真环境 

以下为素材链接可以直接git clone下载 

 GitHub - zx595306686/sim_demoicon-default.png?t=M3K6https://github.com/zx595306686/sim_demo.git

 

新建目录并且把.world放进去 

 

 新建launch环境

 world_name是固定参数

启动

 方式二:自己搭建环境

启动gazebo

 

然后自己搭建再另存为即可 

 

另存为即可 

 

 方式三:自定义仿真环境

 

创建墙体 

 

创建门窗 

 

改变材质,改变颜色 

 

 

使用官方提供的插件

当前 Gazebo 提供的仿真道具有限,还可以下载官方支持,可以提供更为丰富的仿真实现,具体实现如下:

 下载官方模型库

git clone https://github.com/osrf/gazebo_models

之前是:hg clone https://bitbucket.org/osrf/gazebo_models但是已经不可用

注意: 此过程可能比较耗时

3.2 将模型库复制进 gazebo

将得到的gazebo_models文件夹内容复制到 /usr/share/gazebo-*/models

3.3 应用

重启 Gazebo,选择左侧菜单栏的 insert 可以选择并插入相关道具了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS Gazebo安装入门及仿真室内环境和小车实现(十九) 的相关文章

  • python的strip、lstrip、rstrip函数的用法和实例

    目录 1 strip函数的用法和实例 xff08 1 xff09 语法和用法 语法 xff1a str strip string 用法 xff1a 替代字符串两边某指定字符 xff08 2 xff09 实例 简单的用法 与if函数结合使用
  • python的list列表的增加方法运用

    目录 1 append方法的用法和实例 xff08 1 xff09 语法 xff1a list append object xff08 2 xff09 用法 xff1a 可以在原有列表尾部插入目标的值 xff08 3 xff09 实例 简单
  • python的list列表的删除方法运用

    目录 1 pop方法的用法和实例 1 语法 list pop index
  • python列表list的index方法的用法和实例

    目录 1 index方法的用法和实例 xff08 1 xff09 语法 xff1a list index xff08 object start end xff09 xff08 2 xff09 用法 xff1a 从列表中获取指定索引元素的第一
  • python的列表list排序方法——sort、reverse用法及实例

    目录 1 sort方法的用法和实例 xff08 1 xff09 语法 xff1a list sort key reverse xff08 2 xff09 用法 用于对列表进行排序 xff08 3 xff09 实例 简单的用法实例 与lamb
  • python数据类型之间的互相转换

    目录 1 将元组转为列表 xff08 1 xff09 语法 xff1a list tuple xff08 2 xff09 实例 简单的用法实例 与for函数 if函数 split函数结合使用 2 将列表转为元组 xff08 1 xff09
  • excel的frequency函数的用法和实例

    目录 1 语法和用法 xff08 1 xff09 语法 xff1a frequency data array bins array xff08 2 xff09 用法 xff1a 用于统计指定分组区间的频率 xff0c 以已裂垂直数组返回一组
  • Linux系统下通过命令行获取bios等相关信息

    查看服务器型号 xff1a dmidecode grep 39 Product Name 39 查看主板的序列号 xff1a dmidecode grep 39 Serial Number dmidecode t 1 查看序列号及品牌型号
  • python如何获取时间和格式化时间和日期 ?

    目录 1 time time xff08 1 xff09 用法 xff1a 用于获取当前时间戳 xff08 2 xff09 实例 2 time localtime xff08 1 xff09 语法 xff1a time localtime
  • python的datetime模块常用的语法和实例

    目录 1 datetime类获取日期时间 xff08 1 xff09 datetime datetime now 用法 xff1a 获取系统当前时间 xff08 2 xff09 datetime datetime today 用法 xff1
  • python的自定义函数的用法和实例

    目录 1 自定义函数的语法和用法 xff08 1 xff09 引入 xff08 2 xff09 语法 xff08 3 xff09 用法 xff1a 用于自定义目标函数语法 xff08 4 xff09 调用函数 语法 解释 2 实例 xff0
  • python的字典dict实例

    1 获取目标字典 xff0c 将字典中的字键和值调换 xff0c 读取名字 dict 61 39 Zara 39 39 Name 39 7 39 Age 39 39 First 39 39 Class 39 dict items 以列表返回
  • python利用read()、readline()、readlines()读取文件

    目录 1 语法和用法 2 实例 1 语法和用法 with open file mode 61 39 r 39 encoding 61 None as f 读取所有文本 data1 61 f read 读取第一行数据 data2 61 f r
  • python的panda库读写文件

    目录 1 读取excel文件 xff08 1 xff09 语法 xff08 2 xff09 实例 2 读取cvs文件 xff08 1 xff09 语法 xff08 2 xff09 实例 3 读取txt文件 xff08 1 xff09 语法
  • frankmocap

    1 配置和报错 1 1 模块缺失 ModuleNotFoundError No module named detectors body pose estimator pose2d models 下载问题 xff0c 下载完之后该文件夹下面的
  • java的三种代码注释方式

    1 注释的作用 注释是对程序语言的说明 xff0c 有助于开发者之间的交流 xff0c 方便理解和维护程序 注释不是编程语句 xff0c 不会被编译器执行 一些代码量少较少的程序 xff0c 我们加不加注释对我们的理解和修改代码没有太大影响
  • UCOS的多任务

    初学UCOS多任务调度 xff0c 总是有这样一个疑惑 xff1a 为什么多使用多任务 xff0c 写多个函数不就可以了吗 xff1f 随着不断学习 xff0c 后面终于有了一个答案 多任务是并发执行 xff0c 每个任务都做一点 xff1
  • IAR编译成功,但烧录不进去

    把默认的Simulator改为ST LINK试试 xff1f
  • ipmitool使用

    BMC IPMI常用命令 BMC Baseboard Management Controler 提供了多种通道来和主机通信 xff0c 进而检测主机的温度 风扇转速 电压 电源和现场可替代器件 为了便于用户使用 xff0c 它提供了非常丰富
  • 基于LMI的等效滑模控制

    目录 前言 1 一阶欠驱动倒立摆系统 2 基于LMI的等效滑模控制器 3 simulink仿真 3 1 simulink模型 3 2 结果分析 3 2 结论 前言 关于LMI和滑模控制的结合上两篇文章已有介绍和仿真分析 xff0c 本篇文章

随机推荐

  • 基于扩张观测器(LESO)的滑模控制

    目录 前言 1 二阶系统LESO观测器设计 2 基于LESO的滑模控制器设计 3 仿真分析 普通高增益项 3 1仿真模型 3 2仿真结果 3 3 总结 4 仿真分析 优化后的高增益项 4 1 优化高增益项 4 2仿真结果 4 2 1 高增益
  • 基于遗传算法和粒子群算法的PID悬架控制、LQR悬架控制和滑模悬架控制

    目录 1 基于遗传算法和粒子群算法的的PID悬架控制 1 1 两种悬架系统 1 1 1 将路面激励整合到悬架系统 1 1 2 不将路面激励整合到悬架系统 1 1 3 总结 1 2 PID经典控制理论 1 3 优化PID参数的目标函数和约束条
  • 2自由度陀螺仪滑模控制和PID控制跟踪目标轨迹

    目录 前言 1 陀螺仪模型 2 滑模跟踪控制 3 PID控制 4 总结 1 陀螺仪模型 2 滑模跟踪控制 对于2自由度陀螺仪有两个方向x y跟踪 xff0c 所以需要分别为两个方向单独设计滑模面 xff0c 这里仍以简单的线性滑模面设计分析
  • 自抗扰控制ADRC之三种微分跟踪器TD仿真分析

    目录 前言 1 全程快速微分器 1 1仿真分析 1 2仿真模型 1 3仿真结果 1 4结论 2 Levant微分器 2 1仿真分析 2 2仿真模型 2 3仿真结果 3 非线性跟踪微分器 韩教授 3 1仿真分析 3 2小结 4 总结 前言 工
  • 自抗扰控制ADRC之扩张观测器

    目录 前言 1 被控对象 被观测对象 2 非线性观测器 2 1仿真分析 2 2仿真模型 2 3仿真结果 3 线性观测器 3 1仿真模型 3 2仿真结果 4 总结和学习问题 前言 什么叫观测器 xff1f 为什么该类观测称为扩张观测器 xff
  • 基于神经网络(RBF)补偿的双关节机械手臂自适应控制

    目录 前言 1 双关节机械手臂模型 1 1 实际模型 1 2 名义模型 2 控制律设计 3 神经网络补偿自适应律设计 3 1自适应律 3 2自适应律 4 仿真分析 4 1仿真模型 4 2 仿真结果 4 3 小结 5学习问题 前言 所谓的补偿
  • PID、模糊PID、SkyHook、LQR、H2/H∞、ADRC等悬架控制合集

    罗列一下现成的悬架模型以及应用的控制算法 xff1a PID 模糊PID SkyHook LQR H2 H ADRC等 xff0c 以及kalman观测器 xff1a 半车 前后 左右 整车悬架详细推导建模和simulink仿真分析 侧倾
  • 1086:角谷猜想(C C++)

    题目描述 谓角谷猜想 xff0c 是指对于任意一个正整数 xff0c 如果是奇数 xff0c 则乘3加1 xff0c 如果是偶数 xff0c 则除以2 xff0c 得到的结果再按照上述规则重复处理 xff0c 最终总能够得到1 如 xff0
  • 渗透测试工具之Metasploit Framework(MSF)

    一 Metasploit Framework xff08 MSF xff09 简介 Metasploit是当前信息安全与渗透测试领域最流行的术语 xff0c 它的出现颠覆了以往的已有的渗透测试的方式 几乎所有流行的操作系统都支持Metasp
  • Test Case Framework (TCF) 简介

    TCF is a system that simplifies the creation and execution of test cases automation for that matter with minimal setup e
  • 小菜鸡的第一天

    1 CPU分配 xff0c i5四核所以给Linux分配两个核 2 内存分配 xff0c 有16GB所以分配8个g 3 硬盘 xff0c 需要创立一个独立的分区 xff0c 最好300G以上 xff08 由于个人原因分配了60G xff09
  • 小菜鸡的第二天

    绝对路径 xff1a 以 开头 代表当前路径 xff0c 或者 代表上一级目录 xff0c 或者 插入U盘之后 xff0c 在 dev文件夹下输入 ls sd 可以看到U盘信息 xff0c 要想知道插入的U盘是哪个 xff0c 重新插拔再次
  • 小菜鸡的第三天

    压缩与解压 tar vcjf 43 文件名 tar bz2 xxx xxx是要压缩的文件名 压缩命令 tar vxjf 43 xxx tar bz2 xxx是要解压缩的文件名 解压缩命令 f xff1a 使用归档文件或ARCHIVE设备 c
  • 初级算法:判断数组是否存在重复元素

    qsort函数原型是 void qsort xff08 void base size t num size t width int cdecl compare const void const void xff09 4个参数 xff1a v
  • 初级算法:删除排序数组中的重复项

    因为数组是排序的 xff0c 只要是相同的肯定是挨着的 xff0c 我们只需要遍历所有数组 xff0c 然后前后两两比较 xff0c 如果有相同的就把后面的给删除 双指针解决 使用两个指针 xff0c 右指针始终往右移动 xff0c 如果右
  • 运算符重载

    加号运算符重载 作用 xff1a 实现两个自定义数据类型相加的运算 span class token keyword class span span class token class name Person span span class
  • .在python中的作用

    的作用 点把前后连起来 xff0c 构成一种索引机制 前面是库 后面是函数 ex xff1a pybullet setAdditionalSearchPath是指在pybullet的库中引用setAdditionalSearchPath这个
  • ROS服务通信(七)C++、Python实现

    目录 简介 理论模型 服务通信自定srv 创建srv 编辑配置文件 C 43 43 实现 vscode配置 服务端实现 客户端实现 优化 Python实现 服务端实现 客户端实现 简介 服务通信也是ROS中一种极其常用的通信模式 xff0c
  • ROS中的API:C++、Python(十)实现及理解

    目录 简介 C 43 43 初始化 话题与服务相关对象 回旋函数 ros xff1a xff1a spinOnce xff08 xff09 ros xff1a xff1a spin xff08 xff09 时间相关API 时刻 持续时间 持
  • ROS Gazebo安装入门及仿真室内环境和小车实现(十九)

    目录 安装 简介 URDF与Gazebo基本集成流程 创建功能包 编写URDF文件 启动Gazebo并显示模型 launch 文件实现 命令行启动 xff08 去掉launch中的第三行加载模型 xff09 集成到launch里启动 URD