ROS仿真机器人学习笔记二:创建4轮小车模型及相关xraco文件修改

2023-05-16

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 前言
  • 一、构建新的XACRO文件
    • 1.变圆形底盘为方形底盘
    • 2.设置左右4个轮子
    • 3.设置激光雷达
  • 二、惯性矩阵设置
    • 1.head.xacro
    • 2.修改car_base.xacro
  • 三、运动控制设置
    • 1.修改运动模型
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

跟着上一节博主的教程,可以把ROS内的机器人仿真大概走一遍。不过大家最好还是在一个性能比较好的机器上运行,后来我把虚拟机拷贝到了台式机,运行起来顺畅多了。
下面就准备根据自己的模型在走一遍。
我自己的模型是一个四轮小车的模型,四个驱动轮。原来的模式是双驱动轮圆形的差速底盘。所以第一步就是来制作描述机器人模型的XACRO文件。


提示:以下是本篇文章正文内容,下面案例可供参考

一、构建新的XACRO文件

XACRO文件是URDF文件的一个优化版本,可以根据URDF文件修改而来,而URDF文件也可以从SOLIDWORKS来导入,那么感觉起来这样的通路很顺畅,但是还是低估了过程。
一个是主要是solidworks本身上手操作需要学习一段时间,而且从solidworks导成URDF有很多细节。后续过程也会相对麻烦。

一个是solidworks的工程实体,不是简单的方块和轮子,存在很多不规则结构,连接件等。这些在导出URDF文件的时候需要进行处理,通常将固定的结构和运动的结构体分开,单独合并。再导出。
第二个在Gazebo的仿真环境中,每个节点都要配置惯性矩阵,如果太复杂那么配置起来就太复杂了。
目前是这么理解的,因此还是简单一点,用矩形和圆形来简单的实现吧。

在原来的工程上修改吧:

1.变圆形底盘为方形底盘

    <xacro:property name="base_width" value="0.46"/>  
    <xacro:property name="base_length" value="0.66"/> 
    <xacro:property name="base_height" value="0.2"/>
 
    <link name="base_link">
      <visual>
        <geometry>
           <box size="${base_length} ${base_width} ${base_height}"/>
        </geometry>
        <origin xyz="0 0 ${base_height/2 + earth_space}" rpy="0 0 0" />
        <material name="yellow">
          <color rgba="0.5 0.3 0.0 0.5" />
        </material>
      </visual>

    </link>

定义BOX类型的长宽高三个变量,然后复制模板过来就可以了。主要的是origin的z坐标,如果是0的话,RVIZ里面就会看到机器人在地平线以下了。

2.设置左右4个轮子

<!-- 驱动轮 -->
    <!-- 驱动轮属性 -->
    <xacro:property name="wheel_radius" value="0.084" /><!-- 半径 -->
    <xacro:property name="wheel_length" value="0.05" /><!-- 宽度 -->
    <xacro:property name="wheel_x" value="0.18"/>  
    <xacro:property name="wheel_y" value="0.18"/> 
    <!-- 驱动轮宏实现 -->
    <xacro:macro name="add_wheels" params="name flag flag1" >
      <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="${flag1 * wheel_x} ${flag * wheel_y} ${-(earth_space + base_link_length / 2 - wheel_radius) }" />
        <axis xyz="0 1 0" />
      </joint>
    </xacro:macro>

    <xacro:add_wheels name="fleft" flag="1" flag1="1"/>
    <xacro:add_wheels name="fright" flag="-1" flag1="1"/>
    <xacro:add_wheels name="rleft" flag="1" flag1="-1"/>
    <xacro:add_wheels name="rright" flag="-1" flag1="-1"/>

原来的轮子宏定义只有1个flag参数来设置左右,这里增加了一个来设置前后。wheel_x wheel_y 是指轮子与中心点的距离,这里四个轮子是居中对称的。

3.设置激光雷达

    <!-- 雷达属性 -->
    <xacro:property name="laser_length" value="0.05" /> <!-- 雷达长度 -->
    <xacro:property name="laser_radius" value="0.03" /> <!-- 雷达半径 -->
    <xacro:property name="laser_x" value="0.2" /> <!-- 雷达安装的x坐标 -->
    <xacro:property name="laser_y" value="0.0" /> <!-- 雷达安装的y坐标 -->
    <xacro:property name="laser_z" value="0.24" /> <!-- 雷达安装的z坐标:支架高度 / 2 + 雷达高度 / 2  -->

    <!-- 雷达关节以及link -->
    <link name="laser">
        <visual>
            <geometry>
                <cylinder radius="${laser_radius}" length="${laser_length}" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="black" />
        </visual>
    </link>

    <joint name="laser2support" type="fixed">
        <parent link="base_link" />
        <child link="laser" />
        <origin xyz="${laser_x} ${laser_y} ${laser_z}" />
    </joint>

激光雷达这里删除了原来的支撑杆,直接固定到了底盘的上方,这里parent link要记得改为 base_link。不然找不到参考平面了。

二、惯性矩阵设置

1.head.xacro

    <xacro:macro name="box_inertia" params="m w h d">
        <inertial>
        <origin xyz="0 0 0" rpy="${pi/2} 0 ${pi/2}"/>
        <mass value="${m}"/>
        <inertia ixx="${(m/12) * (h*h + d*d)}" ixy="0.0" ixz="0.0" iyy="${(m/12) * (w*w + d*d)}" iyz="0.0" izz="${(m/12) * (w*w + h*h)}"/>
        </inertial>
    </xacro:macro>

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

这里在head.xacro增加了两种惯性矩阵宏定义,其实跟上面的一样,也是从别的参考那里复制过来的。分别是计算长方体和圆环的惯性矩阵。

2.修改car_base.xacro

      <collision>
        <geometry>
          <box size="${base_length} ${base_width} ${base_height}"/>
        </geometry>
      </collision>
      <xacro:box_inertia m="15" w="${base_width}" d="${base_length}" h="${base_height}"/>

这里跟着操作步骤,在里面增加相应代码就行。

        <collision>
          <origin xyz="0 0 0" rpy="${pi/2} 0 0"/>
          <geometry>
            <cylinder radius="${wheel_radius}" length="${wheel_length}"/>
          </geometry>
        </collision>

        <xacro:cylinder_inertia m="0.5" r="${wheel_radius}" h="${wheel_length}"/> 

做完这些以后,在Gazebo里看到对应的模型了。

三、运动控制设置

运动控制是在示例的move.xacro问价里面描述。
由于我们的模型是4个轮子,所以首先在原来的基础上增加两个运动轮,并修改名称。

    <xacro:joint_trans joint_name="fleft_wheel2base_link" />
    <xacro:joint_trans joint_name="fright_wheel2base_link" />
    <xacro:joint_trans joint_name="rleft_wheel2base_link" />
    <xacro:joint_trans joint_name="rright_wheel2base_link" />

1.修改运动模型

原来的文件引用的运动模式插件是
libgazebo_ros_diff_drive.so
这个插件适合于双轮差速底盘。这里应该改为:
libgazebo_ros_planar_move.so
四轮差速的模型。
这些插件应该还有很多,这里还没有深入去研究,至少还要包含像是四轮差速带转向的模型。
只有模型匹配了,后面再做导航之类的,效果才最好。
然后按照给的参考修改即可。

    <gazebo>
    <plugin name="object_controller" filename="libgazebo_ros_planar_move.so">

    <updateRate>100.0</updateRate>
    <robotNamespace>/</robotNamespace>
    <leftFrontJoint>fleft_wheel2base_link</leftFrontJoint>
    <rightFrontJoint>fright_wheel2base_link</rightFrontJoint>
    <leftRearJoint>rleft_wheel2base_link</leftRearJoint>
    <rightRearJoint>rright_wheel2base_link</rightRearJoint>
    <wheelSeparation>4</wheelSeparation>
    <wheelDiameter>0.1</wheelDiameter>
    <robotBaseFrame>base_link</robotBaseFrame>
    <torque>1</torque>
    <topicName>cmd_vel</topicName>
    <broadcastTF>0</broadcastTF>

    <odometryTopic>odom</odometryTopic>
    <odometryFrame>odom</odometryFrame>

    </plugin>
  </gazebo>

这样我们的底盘就可以在Gazebo 通过运动指令控制起来了。

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

ROS仿真机器人学习笔记二:创建4轮小车模型及相关xraco文件修改 的相关文章

  • 因特尔神经计算棒(NCS)+树莓派+yolo-v3实现object-detection

    因特尔神经计算棒 NCS 43 树莓派 43 yolo v3实现object detection 踩了好多坑啊 一言难尽 Step1 在树莓派上安装环境 首先安装openVINO工具包 xff08 最好不要在树莓派上装NCSDK 太坑了 x
  • prometheus监控k8s集群

    prometheus监控k8s集群 1 监控方式 node expoter部署在k8s节点收集当前节点资源 xff0c Prometheus用来分析处理收集汇总的数据 xff0c grafana用来进行图形展示 2 部署Prometheus
  • 耦合、解耦是什么?怎么做到解耦呢?

    一 耦合 耦合指的是两个类之间的联系的紧密程度 xff1b 强耦合 类之间存在着直接关系 弱耦合 xff1a 在两个类的中间加入一层 xff0c 将原来的直接关系变成间接关系 xff0c 使得两个类对中间层是强耦合 xff0c 两类之间变为
  • 圈复杂度检测

    1 下载链接 xff1a https github com terryyin lizard 2 使用 xff1a python lizard py 文件名 文件路径 3 显示 NLOC xff1a 代码行数 CCN xff1a 复杂度 to
  • 服务限流降级

    https segmentfault com a 1190000015967922 高并发的线上服务 xff0c 有时候面对突发流量 xff0c 比如流量突然激增 xff0c 服务扛不住了 xff0c 类似这种场景 xff0c 需要有一个防
  • gdb调试

    c 43 43 编译生成可执行文件 g 43 43 main cpp 1 进入gdb gdb main 2 运行 r 查看 l 断点 b line num 查看 p 参数 展示display 参数 继续 c 3 比如展示vector首地址
  • git 修改commit的名字与撤回提交

    当你不小心 xff0c 写错了提交的注视 信息 xff0c 该如何处理呢 理论上 xff0c SCM是不应该修改历史的信息的 xff0c 提交的注释也是 不过在git中 xff0c 其commit提供了一个 amend参数 xff0c 可以
  • SQLAlchemy 的 scoped_session

    SQLAlchemy 的 scoped session 是啥玩意 通常我们用 SQLAlchemy 写数据的时候要创建 Session 对象来维护数据库会话 xff0c 用完了再关掉 但是听说还有个叫scoped session的玩意 xf
  • python 的StringIO

    1 IO的含义 在计算机中 xff0c IO是Input Output的简写 xff0c 也就是输入和输出 由于程序和运行时数据是在内存中驻留 xff0c 由CPU这个超快的计算核心来执行 xff0c 涉及到数据交换的地方 xff0c 通常
  • python 的fcntl模块

    python 中给文件加锁 fcntl模块 import fcntl 打开一个文件 f 61 open 39 test 39 当前目录下test文件要先存在 xff0c 如果不存在会报错 对该文件加密 xff1a fcntl flock f
  • Jmeter添加MD5方法插件

    1 xff1a 下载 https jmeter plugins org install Install 2 xff1a jmeter plugins manager 1 3 jar放到 apache jmeter 5 0 lib ext目录
  • sql 语句 将查询结果中数字等标示转成汉字

    使用case 语句 将sex 字段进行转换 0 1 2 男 xff0c 女 xff0c 未知 SELECT u userid u username CASE u sex WHEN 0 THEN 39 女 39 WHEN 1 THEN 39
  • linux的more命令

    more命令 xff0c 功能类似 cat xff0c cat命令是整个文件的内容从上到下显示在屏幕上 more会以一页一页的显 示方便使用者逐页阅读 xff0c 而最基本的指令就是按空白键 xff08 space xff09 就往下一页
  • docker入门实例

    1 image文件 Docker 把应用程序及其依赖 xff0c 打包在 image 文件里面 只有通过这个文件 xff0c 才能生成 Docker 容器 image 文件可以看作是容器的模板 Docker 根据 image 文件生成容器的
  • vim批量替换&行首尾增加&删除列

    删除列 删除列的方法 xff1a 1 ctrl 43 v 这样会启动可视模式 xff0c 按 j k 可以发现它能够在一列上面选中字符 2 按下 G 这样可以从文本的第一行选中到最后一行 3 按下 x 就会把这一列删掉 行首尾替换 xff1
  • vim 支持 python

    https www jianshu com p 3e606e31da5f 前段时间刚玩linux时为了图个简单打算直接用vim来写python代码省得再下个软件 xff08 好吧 xff0c 其实是自己下了好多次都失败了 xff0c 一气之
  • 用户态和核心态的概念以及为什么要区别?以及两者之间的切换

    一 用户态和核心态的概念 用户态 xff1a 内核态与用户态是操作系统的两种运行级别 当程序运行在3级特权级上时 xff0c 就可以称之为运行在用户态 xff0c 因为这是最低特权级 xff0c 是普通的用户进程运行的特权级 xff0c 大
  • strstr(str1,str2)函数使用时注意事项

    可能有的人还没听过strstr函数 xff0c 个人认为这个一个很实用的函数 xff0c strstr str1 str2 函数是字符串处理函数之一 xff0c 位于头文件 string h 中 对于处理字符串的一些问题有很大的帮助 定义
  • Java This 的用法

    JAVA This的用法 先写一个要调用的类 都放在名为test的包下面 在这里插入代码片package test span class token keyword public span span class token keyword
  • 关于松耦合和紧耦合的理解

    松耦合系统通常是基于消息的系统 xff0c 此时客户端和远程服务并不知道对方是如何实现的 客户端和服务之间的通讯由消息的架构支配 只要消息符合协商的架构 xff0c 则客户端或服务的实现就可以根据需要进行更改 xff0c 而不必担心会破坏对

随机推荐

  • 第六篇 键盘中断与应用程序读取键盘缓冲区

    这篇博文主要介绍在X86下键盘的中断过程 xff0c 以及应用程序如何利用中断读取键盘缓冲区内容 一 撰写该篇博文的背景介绍 在我们全屏看视频时 xff0c 按下Esc键 xff0c 播放器还原或者最小化 xff1b 在利用其他软件的时候
  • 发现一个aruco在线生成器,可以在线生成aruco CharucoBoard GridBoard AprilTag 图片, 真香

    最近在研究 opencv 检测 aruco标记项目 xff0c 想弄点aruco标记码来测试 xff0c 发现网上很少在线生成aruco标记码的工具 xff0c 导致在做测试时候浪费了很多时间去搞这个码 xff0c 基本上大家都用 xff0
  • FreeRTOS基础六:中断管理1

    嵌入式实时系统需要对外界的某个事件做出及时的响应动作 例如串口外设收到了一帧数据后 xff0c 需要通知数据解析任务 xff0c 同时还要将数据帧传递给解析任务 xff0c 完成数据的处理 设计出一种好的策略来完成这个过程时需要考虑以下几个
  • FreeRTOS基础四:队列

    简介 FreeRTOS中的队列是一种用于实现 任务与任务 xff0c 任务与中断 以及 中断与任务 之间的通信 机制 此外 xff0c 任务从队列读数据或者写入数据到队列时 xff0c 都可能被阻塞 这个特性使得任务可以被设计成基于事件驱动
  • FreeRTOS基础二:堆内存管理之heap_4方案

    背景知识 从FreeRTOS V9 0 0内核版本开始 xff0c 内核对象占用的内存可以在编译期间静态分配 xff0c 也可以在运行期间动态分配 内核对象如 xff1a tasks xff08 任务 xff09 xff0c queues
  • MQ与Webservice的区别

    Webservice 和MQ MessageQueue 都是解决跨平台通信的常用手段 xff0c 两者有哪些区别呢 xff1f 个人认为最本质的区别在于 Webservice近乎实时通信 xff0c 而MQ却通常是延时通信 什么意思呢 xf
  • uORB通信机制和添加自己的topics学习笔记

    本文参考 Ubuntu16 04下PX4环境快速搭建及uORB通信机制进行操作 结合网上一篇uROB的介绍PX4 Pixhawk uORB深入理解和应用进行深入的了解 1 简介 uORB Micro Object Request Broke
  • 看到一篇很好的介绍磁力计原理的博客

    详细内容戳这里http blog sina com cn s blog 402c071e0102v8ig html
  • QT工程转换为VS2013项目文件

    xff08 win7系统 xff09 1 点击开始 xff0c 输入cmd xff0c 打开cmd 2 输入cd c apm点击回车键 注 xff1a apm是我的qt的工程文件夹 xff0c 最好放在c盘 xff0c 其他盘转换都不成功
  • C语言:函数返回字符串的四种方法

    转载连接 xff1a 1 https blog csdn net turkeyzhou article details 6104135 comments 2 https www cnblogs com qingergege p 649668
  • C语言:字符串中查找指定字符——strchr()和strrchr()

    参考文章连接 xff1a 1 http c biancheng net cpp html 161 html 2 http c biancheng net cpp html 172 html 1 头文件 xff1a include lt st
  • C语言:整型、浮点型和字符串间转换

    参考文章链接 xff1a 1 http c biancheng net cpp html 1573 html 2 http c biancheng net cpp html 1574 html 1 整型 浮点型 gt 字符串 整数转换为字符
  • 学习贵在坚持!

    最近学习颇为不顺 xff0c 周围都是一些不利的消息 xff0c 有些心灰意冷 可是这不是与我写本文的初衷相悖了么 xff1f 看到了比自己优秀的人干出来辉煌的事情 xff0c 写出来文字优美的文章 xff0c 自己就有相形见绌的自卑感 可
  • Qt中 QString 和int, char等的“相互”转换

    原文链接 xff1a https blog csdn net ei nino article details 7297791 Qt中 int float double转换为QString 有两种方法 1 使用QString number 如
  • 计算器第二版:C语言,VC++6.0

    使用栈实现 xff0c 前缀表达式变后缀表达式的原理 xff0c 但是没有转换 xff0c 是边转换边实现 xff1a include lt stdio h gt include lt stdlib h gt include lt coni
  • 计算器第三版:C语言,递归,VC++6.0

    参考文章 xff1a https blog csdn net u011692041 article details 49796343 https blog csdn net u011692041 article details 497991
  • 计算器第四版:C++,QT

    核心算法和第二版一样 xff1a 头文件 xff1a calculate h ifndef CALCULATE H define CALCULATE H include lt QMainWindow gt include lt QPushB
  • USB协议概念学习

    1 USB总线结构 usb的总线拓扑结构如下所示 xff1a 从USB总线结构可以看出 xff0c 主要由3部分组成 xff1a USB主机 Host USB线缆 USB设备 hub Func等 USB主机 xff1a 一般成为USB Ho
  • 创新工场两道笔试题0919

    题目1 字符串去重 xff0c 老题目 xff0c 只是要求不能开辟新空间用来复制原字符串 思路 xff1a 使用布尔型的简单hash表可以节省空间 xff0c 用来存储字符是否出现的信息 xff0c 刚开始hash表里面都是false x
  • ROS仿真机器人学习笔记二:创建4轮小车模型及相关xraco文件修改

    系列文章目录 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 例如 xff1a 第一章 Python 机器学习入门之pandas的使用 提示 xff1a 写完文章后 xff0c 目录可以自动生成 x