【Nav2】ROS2 Eloquent中使用robot_state_publisher发布松灵Scout mini的urdf

news2024/11/17 5:44:38

【背景】

本来打算把ROS1版本的松灵Scout mini 模型描述文件直接移植到ROS2的工作空间里去,用robot_state_publisher加载出来,结果行不通;于是找到了ROS2版本的Scout mini 模型描述,结果因为我用的是 Eloquent 版本,而他这urdf是基于Humble版本写的,用了一个 Launch.Command模块,而这个模块没找到办法安装,所以最后只有自己亲手改写了。

【效果一览】

 

 【系统环境】

Ubuntu18.04

ROS Eloquent

 【实现步骤】

话不多说,直接上干货,我这里不再解释为什么要这么迂回去实现这个!!!

1、首先去这个目录下建一个文件夹(如果没有这个目录,说明你没安装Turtlebot3仿真)

cd /opt/ros/eloquent/share/turtlebot3_description
sudo mkdir scout

2、然后把Scout mini官方的模型描述文件夹中的 meshes 文件夹拷进去

sudo cp -r ./meshes /opt/ros/eloquent/share/turtlebot3_description/scout

3、新建一个 scout_v2.urdf 描述文件,内容如下

<?xml version="1.0" ?>
<!-- =================================================================================== -->
<!-- |    This document was autogenerated by xacro from scout_description/urdf/scout_v2_webots.xacro | -->
<!-- |    EDITING THIS FILE BY HAND IS NOT RECOMMENDED                                 | -->
<!-- =================================================================================== -->
<robot name="scout_v2" xmlns:xacro="http://ros.org/wiki/xacro">

  <link name="base_footprint"/>

  <joint name="base_joint" type="fixed">
    <parent link="base_footprint"/>
    <child link="base_link" />
    <origin xyz="0 0 0.010" rpy="0 0 0"/>
  </joint>
  
  <!-- Base link -->
  <link name="base_link">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://turtlebot3_description/scout/meshes/base_link.dae"/>
      </geometry>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0.008"/>
      <geometry>
        <box size="0.925 0.38 0.21"/>
      </geometry>
    </collision>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0.035"/>
      <geometry>
        <box size="0.154166666667 0.627 0.07"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="40"/>
      <origin xyz="0.0 0.0 0.0"/>
      <inertia ixx="2.288641" ixy="0" ixz="0" iyy="5.103976" iyz="0" izz="3.431465"/>
    </inertial>
  </link>

  <link name="front_right_wheel_link">
    <inertial>
      <mass value="3"/>
      <origin xyz="0 0 0"/>
      <inertia ixx="0.7171" ixy="0" ixz="0" iyy="0.1361" iyz="0" izz="0.7171"/>
    </inertial>
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://turtlebot3_description/scout/meshes/wheel_type1.dae"/>
      </geometry>
    </visual>
    <collision>
      <origin rpy="1.570795 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.11653" radius="0.16459"/>
      </geometry>
    </collision>
  </link>

  <joint name="front_right_wheel" type="fixed">
    <parent link="base_link"/>
    <child link="front_right_wheel_link"/>
    <origin rpy="3.14 0 0" xyz="0.249 -0.29153 -0.0702"/>
    <axis rpy="0 0 0" xyz="0 -1 0"/>
  </joint>

  <link name="front_left_wheel_link">
    <inertial>
      <mass value="3"/>
      <origin xyz="0 0 0"/>
      <inertia ixx="0.7171" ixy="0" ixz="0" iyy="0.1361" iyz="0" izz="0.7171"/>
    </inertial>
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://turtlebot3_description/scout/meshes/wheel_type2.dae"/>
      </geometry>
    </visual>
    <collision>
      <origin rpy="1.570795 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.11653" radius="0.16459"/>
      </geometry>
    </collision>
  </link>

  <joint name="front_left_wheel" type="fixed">
    <parent link="base_link"/>
    <child link="front_left_wheel_link"/>
    <origin rpy="0 0 0" xyz="0.249 0.29153 -0.0702"/>
    <axis rpy="0 0 0" xyz="0 -1 0"/>
  </joint>

  <link name="rear_left_wheel_link">
    <inertial>
      <mass value="3"/>
      <origin xyz="0 0 0"/>
      <inertia ixx="0.7171" ixy="0" ixz="0" iyy="0.1361" iyz="0" izz="0.7171"/>
    </inertial>
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://turtlebot3_description/scout/meshes/wheel_type2.dae"/>
      </geometry>
    </visual>
    <collision>
      <origin rpy="1.570795 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.11653" radius="0.16459"/>
      </geometry>
    </collision>
  </link>

  <joint name="rear_left_wheel" type="fixed">
    <parent link="base_link"/>
    <child link="rear_left_wheel_link"/>
    <origin rpy="0 0 0" xyz="-0.249 0.29153 -0.0702"/>
    <axis rpy="0 0 0" xyz="0 -1 0"/>
  </joint>

  <link name="rear_right_wheel_link">
    <inertial>
      <mass value="3"/>
      <origin xyz="0 0 0"/>
      <inertia ixx="0.7171" ixy="0" ixz="0" iyy="0.1361" iyz="0" izz="0.7171"/>
    </inertial>
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://turtlebot3_description/scout/meshes/wheel_type1.dae"/>
      </geometry>
    </visual>
    <collision>
      <origin rpy="1.570795 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.11653" radius="0.16459"/>
      </geometry>
    </collision>
  </link>

  <joint name="rear_right_wheel" type="fixed">
    <parent link="base_link"/>
    <child link="rear_right_wheel_link"/>
    <origin rpy="3.14 0 0" xyz="-0.249 -0.29153 -0.0702"/>
    <axis rpy="0 0 0" xyz="0 -1 0"/>
  </joint>

  <!-- Robosense16 -->
  <link name="laser">
    <visual>
      <origin xyz="0.0 0.0 0.0" />
      <geometry>
        <cylinder length="0.10" radius="0.03" />
      </geometry>
      <material name="orange" />
    </visual>
  </link>

  <!-- IMU -->
  <link name="imu">
    <visual>
      <origin xyz="0.0 0.0 0.0" />
      <geometry>
        <box size="0.06 0.04 0.02" />
      </geometry>
      <material name="orange" />
    </visual>
  </link>

  <!--<link name="base_link" />-->

  <joint name="laser_joint" type="fixed">
    <parent link="base_link" />
    <child link="laser" />
    <origin xyz="0.1 0.0 0.5" rpy="0 0 0" />
  </joint>

  <joint name="imu_joint" type="fixed">
    <parent link="base_link" />
    <child link="imu" />
    <origin xyz="0 0 0" rpy="0 0 0" />
  </joint>

</robot>

4、把这个描述文件拷到下面这个目录

sudo cp ./scout_v2.urdf /opt/ros/eloquent/share/turtlebot3_description/urdf

5、然后在你的 launch 文件中这样写

    urdf = os.path.join(
            get_package_share_directory('turtlebot3_description'), 'urdf', 'scout_v2.urdf')

    start_robot_state_publisher_cmd = Node(
        condition=IfCondition(use_robot_state_pub),
        package='robot_state_publisher',
        node_executable='robot_state_publisher',
        node_name='robot_state_publisher',
        output='screen',
        parameters=[{'use_sim_time': use_sim_time}],
        use_remappings=IfCondition(use_remappings),
        remappings=remappings,
        arguments=[urdf])

6、成功在 RViz 中看到 Scout mini完整模型

【后言】

点个关注,不迷路!!!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/452122.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MobTech MobPush|A/B测试提升运营决策

在实际推送过程中&#xff0c;我们常常有这样的困惑&#xff1a; 我们如何确定哪种推送内容更能吸引用户&#xff1f; 我们如何衡量推送效果的提升程度&#xff1f; 我们如何优化推送方案&#xff0c;实现更高的ROI&#xff1f; 为了解决这些困惑&#xff0c;我们需要一种科…

碳中和成“必答题”,宁德时代创造产业“零碳”新维度

文 | 智能相对论 作者 | leo陈 2021年&#xff0c;麻省理工学院的教授索尔格里菲斯出版了《零碳未来》一书&#xff0c;这本著作总结了数十年的研究经验和数据&#xff0c;紧迫地提出&#xff0c;我们需要可以利用现有技术和资源快速应对气候变化的“零碳行动方案”。 既要保…

Netty时间轮源码解析

Netty主要应用用于网络通信&#xff0c;Netty还有一个非常重要的应用领域&#xff0c;即时通信系统IM, 在IM聊天系统中&#xff0c;有成千上万条条链路&#xff0c; Netty是如何管理这些链路的呢 &#xff1f; Netty还有一套自带的心跳检测机制&#xff0c;这套检测机制的原理是…

HCIP-7.0华为交换机技术基础学习

交换机基础 1、交换机工作原理1.1、VLAN虚拟局域网1.1.1、VLAN帧格式1.1.2、VLAN的划分方式&#xff1a;1.1.3、PVID1.1.4、Access端口类型1.1.5、Trunk端口类型1.1.6、Hybird端口类型 1.2、MUX VLAN应用场景和原理1.2.1、MUX VLAN原理1.2.2、MUX VLAN配置 1、交换机工作原理 …

软件测试—用例篇(上)

软件测试—用例篇 &#x1f50e;测试用例的概念&#x1f50e;测试用例的好处&#x1f50e;测试用例的设计方法&#x1f338;基于需求的设计方法&#x1f338;等价类划分法&#x1f338;边界值分析法&#x1f338;判定表 &#x1f50e;结尾 &#x1f50e;测试用例的概念 为了实…

【Python】如何用pyth做游戏脚本(太简单了吧)

文章目录 前言一、开发前景二、开发流程3.1、获取窗口句柄&#xff0c;把窗口置顶3. 2、截取游戏界面&#xff0c;分割图标&#xff0c;图片比较 二、程序核心-图标连接算法&#xff08;路径寻找&#xff09;四、开发总结五、源码总结 前言 简述&#xff1a;本文将以4399小游戏…

使用@Import注解给容器中快速导入一个组件

注册bean的方式 向Spring容器中注册bean通常有以下几种方式&#xff1a; 包扫描给组件标注注解&#xff08;Controller、Servcie、Repository、Component&#xff09;&#xff0c;但这种方式比较有局限性&#xff0c;局限于我们自己写的类Bean注解&#xff0c;通常用于导入第…

软测如果这么学,培训班都得倒闭,直接省去上万元的学费

俗话说外行看热闹&#xff0c;内行看门道。 写这篇文章&#xff0c;是希望把我的一些我认为是非常有价值的经验总结出来&#xff0c;能够帮助刚做测试不久的新同学&#xff0c;或者是测试经验丰富的老同学以共享。 希望我们可爱的新同学&#xff0c;准备要在测试领域耕耘的伙…

Git推出大文件储存工具Git LFS,但它真的好用吗?

Git LFS&#xff08;全称为Git Large File Storage&#xff0c;Git大文件存储&#xff09;被许多团队用来管理和存储大文件。本篇文章将解释Git LFS是什么&#xff0c;它的功能和使用场景&#xff0c;以及它究竟是不是管理大文件的最佳版本控制工具。 什么是Git LFS&#xff0…

共治、共建、共享!龙蜥社区第 16 次运营委员会会议顺利召开!

4 月 14 日&#xff0c;龙蜥社区在凝思软件召开了第 16 次运营委员会会议&#xff0c;本次会议由统信软件运营委员会委员崔开主持。来自阿里云、红旗软件、海光、Intel、联通软研院、浪潮信息、凝思软件、普华基础软件、统信软件、万里红、新华三、中科方德等理事单位的 23 位委…

第一章 Go环境搭建

前言 Golang是一种比较新颖的编程语言&#xff0c;其强大的功能以及底层的强大支撑快速的成为了编程语言的佼佼者&#xff0c;使其备受欢迎。 1、Go的安装与配置 如果你有一定的开发经验或者学习知识肯定知道&#xff0c;如何语言的开发都需要进行环境的配置与相关资源的安装…

12. 图的进阶

12. 图的进阶 12.1 有向图 在实际生活中&#xff0c;很多应用相关的图都是有方向性的&#xff0c;最直观的就是网络&#xff0c;可以从A页面通过链接跳转到B页面&#xff0c;那么a和b连接的方向是a->b,但不能说是b->a,此时我们就需要使用有向图来解决这一类问题&#x…

8 年后端开发,API 设计的学习方法分享

笔者目前在参与一个开源项目&#xff0c;平时接触多的也是 API 相关的核心功能开发&#xff0c;经常会有读者私信我&#xff0c;对于开发新人而言&#xff0c;如何快速学习 API 设计&#xff0c;我简单总结了一下&#xff1a; 1. 学习基础知识&#xff1a;学习HTTP、RESTful AP…

Vue表单基本操作-收集表单数据

收集表单数据 使用vue中的v-model收集表单里面的数据&#xff0c;不同的表单元素配合v-model会有不同的写法和技巧 本次的表单元素包括&#xff1a;文本框&#xff0c;单选&#xff0c;多选&#xff0c;下拉框&#xff0c;文本域 编写表单元素 首先编写表单元素&#xff0c;…

IT项目管理 PPT 选择题【太原理工大学】

单选题&#xff0c;10*2分20分 填空题&#xff0c;10*2分20分 判断题&#xff0c;10*1分10分 画图题&#xff0c;10分 进度计算题&#xff0c;15分 成本计算题&#xff0c;15分 简答题&#xff0c;5*2分10分 重点章节&#xff1a;3、4、5、6、7章 我觉得小题应该是在 PP…

如何在短时间内完成短视频app的上线及推广?

作为一款充满活力和创意的短视频app&#xff0c;想要快速上线并赢得用户的喜爱是一项艰巨的任务。在本文中&#xff0c;我们将探讨如何在短时间内完成短视频app的上线及推广。 短视频app搭建 首先&#xff0c;要成功地上线一款短视频app&#xff0c;您需要一套高质量的小视频…

从零入门激光SLAM(八)——ROS常用消息

大家好呀&#xff0c;我是一个SLAM方向的在读博士&#xff0c;深知SLAM学习过程一路走来的坎坷&#xff0c;也十分感谢各位大佬的优质文章和源码。随着知识的越来越多&#xff0c;越来越细&#xff0c;我准备整理一个自己的激光SLAM学习笔记专栏&#xff0c;从0带大家快速上手激…

Scrapy框架 -- POST请求实现案例

一、创建一个Scrapy项目fanyi&#xff0c;并进入该项目创建&#xff0c;fanyipc爬虫文件 scrapy startproject fanyi cd fanyi scrapy genspider example example.com 二、修改配置文件settings&#xff0c;关闭君子协议&#xff0c;只看报错信息&#xff0c;自定义UA头 ROB…

Vue.prototype 详解及使用

前言&#xff1a; 我们可能会在很多组件里用到数据/实用工具&#xff0c;但是不想污染全局作用域。这种情况下&#xff0c;可以通过在原型上定义它们使其在每个 Vue 的实例中可用。 1. 基本示例 在main.js中添加一个变量到 Vue.prototype Vue.prototype.$appName My App这…

ChatGPT应用篇:如何快速生成精美PPT提高工作效率-附资料下载

一、ChatGPT生成markdown源代码 问&#xff1a; 我想做一份ChatGPT变现方法的PPT&#xff0c;请生成丰富的教学展示内容&#xff0c;因为生成PPT是需要MarkDown格式的&#xff0c;请您输出Markdown格式的内容 ChatGPT回复&#xff1a; 二、Mindshow登录/注册 用浏览器打开Mi…