ROS入门教程(五)—— RViz仿真

2023-05-16

上篇文章我们介绍了URDF文件的导出,本文将继上文介绍安装完导出URDF文件后,如何在机器人操作系统(ROS)中显示,并且让它动起来。


目录

前言

RViz机器人模型可视化

launch启动RViz配置文件

Arbotix控制机器人模型运动


前言

ROS中提供了Gazebo与RViz两种仿真软件,本文将机器人模型在RViz仿真环境中可视化,同时利用Arbotix功能包使机器人完成圆周运动。


RViz机器人模型可视化

step1.创建工作空间

Ctrl+Alt+T打开终端分别输入:

mkdir -p helloworld/src
cd helloworld
catkin_make

其中robot_ws为我们命名的工作空间名称,catkin_make是一个编译命令,该编译命令会帮我们创建好我们所需的文件并输出若干日志,成功结果如下:

step2.创建功能包

继续在该终端输入:【启动VS Code】

code .

右键一级src目录选择Create Catkin Package【创建功能包】

输入功能包名称【robot】再输入依赖【urdf xacro】创建结果如下

step1~2若出现问题请学习参考ROS入门教程(三)—— 用C++实现Hello world

step3.覆盖原功能包

将刚新建的robot功能包删除,替换为我们利用sw2urdf插件导出的robot功能包,如下所示:

成功结果如下,功能包中包含display.launch文件与robot.urdf文件:

为了美观可以将base_link ,left_wheel_link 与right_wheel_link的color标签进行修改,即将34行改为"1 1 1 1",将74行与132行改为"0.412 0.412 0.412 1",结果如下所示:【Ctrl+S保存】

step4.运行launch文件

Ctrl+Shift+B执行编译命令,结果如下:

Ctrl+Shift+~启动命令行分别输入:

source ./devel/setup.bash
roslaunch robot display.launch

结果如下所示:

step5.在RViz中添加机器人模型

step6.修改大地坐标

这样我们就成功的在RViz中显示了我们的机器人模型,实现了机器人模型的可视化。


launch启动RViz配置文件

读者可以发现,每次打开RViz都需要添加机器人模型,重新设置大地坐标系这实在是过于复杂,RViz提供了配置文件以适用于不必每次打开都要重新配置RVi:

step1.保存配置文件

按Ctrl+Shift+S保存文件至robot功能包中的config文件夹中,命名为robot.rviz,如下所示:

step2.修改launch文件

将display.launch修改为以下:

<launch>
  <arg
    name="model" />
  <param
    name="robot_description"
    textfile="$(find robot)/urdf/robot.urdf" />
  <node
    name="joint_state_publisher_gui"
    pkg="joint_state_publisher_gui"
    type="joint_state_publisher_gui" />
  <node
    name="robot_state_publisher"
    pkg="robot_state_publisher"
    type="robot_state_publisher" />
  <node
    name="rviz"
    pkg="rviz"
    type="rviz"
    args="-d $(find robot)/config/robot.rviz" />
</launch>

这样每次运行该launch文件去启动RViz时就无需添加机器人模型与修改大地坐标了。


Arbotix控制机器人模型运动

step1.安装Arbotix功能包

Ctrl+Alt+T打开终端输入:

sudo apt install ros-melodic-arbotix

step2.配置yaml文件

在robot功能包下config文件夹中新建文件robot.yaml输入以下:

# 该文件是控制器配置,一个机器人模型可能有多个控制器,比如: 底盘、机械臂、夹持器(机械手)....
# 因此,根 name 是 controller
controllers: {
   # 单控制器设置
   base_controller: {
          #类型: 差速控制器
       type: diff_controller,
       #参考坐标
       base_frame_id: base_footprint, 
       #两个轮子之间的间距
       base_width: 0.2,
       #控制频率
       ticks_meter: 2000, 
       #PID控制参数,使机器人车轮快速达到预期速度
       Kp: 12, 
       Kd: 12, 
       Ki: 0, 
       Ko: 50, 
       #加速限制
       accel_limit: 1.0 
    }
}

 结果如下所示:

step3.修改URDF与launch文件

将robot功能包下urdf文件夹中的robot.urdf修改为以下:

<?xml version="1.0" encoding="utf-8"?>
<!-- This URDF was automatically created by SolidWorks to URDF Exporter! Originally created by Stephen Brawner (brawner@gmail.com) 
     Commit Version: 1.6.0-4-g7f85cfe  Build Version: 1.6.7995.38578
     For more information, please see http://wiki.ros.org/sw_urdf_exporter -->
<robot
  name="robot">
  <link
    name="base_footprint">
    <visual>
      <geometry>
        <sphere
          radius="0.001" />
      </geometry>
      <material
        name="">
        <color
          rgba="0 0 0 0" />
      </material>
    </visual>
  </link>
  <link
    name="base_link">
    <inertial>
      <origin
        xyz="0.00274864430655652 -2.24752503383601E-12 -0.000346282886867658"
        rpy="0 0 0" />
      <mass
        value="0.778495474667087" />
      <inertia
        ixx="0.00463138328383945"
        ixy="1.02152303406231E-11"
        ixz="1.71833341358258E-06"
        iyy="0.00512425828608217"
        iyz="4.71562842897777E-15"
        izz="0.00973908576728839" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://robot/meshes/base_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="1 1 1 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://robot/meshes/base_link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="base_link2base_footprint"
    type="fixed">
        <parent
          link="base_footprint" />
        <child
          link="base_link" />
        <origin
          xyz="0 0 0.035" />
  </joint>
  <link
    name="right_wheel_link">
    <inertial>
      <origin
        xyz="-4.81191200834309E-07 0.000476524651415774 1.07685290749495E-07"
        rpy="0 0 0" />
      <mass
        value="0.0474080147774195" />
      <inertia
        ixx="1.81764508915246E-05"
        ixy="1.12230898220564E-10"
        ixz="9.35470362535892E-11"
        iyy="3.36082622230467E-05"
        iyz="-1.04867422246077E-10"
        izz="1.81763222441443E-05" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://robot/meshes/right_wheel_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.412 0.412 0.412 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://robot/meshes/right_wheel_link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="right_wheel_joint"
    type="continuous">
    <origin
      xyz="0 0.09545 0"
      rpy="0 0 0" />
    <parent
      link="base_link" />
    <child
      link="right_wheel_link" />
    <axis
      xyz="0 1 0" />
    <limit
      lower="-3.14"
      upper="3.14"
      effort="0"
      velocity="0" />
  </joint>
  <link
    name="left_wheel_link">
    <inertial>
      <origin
        xyz="4.90089018379602E-07 -0.000476524651415788 5.43493115676996E-08"
        rpy="0 0 0" />
      <mass
        value="0.0474080147774195" />
      <inertia
        ixx="1.81764289862563E-05"
        ixy="1.23038640102816E-10"
        ixz="-1.05305567709027E-10"
        iyy="3.36082622230468E-05"
        iyz="9.19480494971147E-11"
        izz="1.81763441494127E-05" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://robot/meshes/left_wheel_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.412 0.412 0.412 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://robot/meshes/left_wheel_link.STL" />
      </geometry>
    </collision>
  </link>
  <joint
    name="left_wheel_joint"
    type="continuous">
    <origin
      xyz="0 -0.09545 0"
      rpy="0 0 0" />
    <parent
      link="base_link" />
    <child
      link="left_wheel_link" />
    <axis
      xyz="0 1 0" />
    <limit
      lower="-3.14"
      upper="3.14"
      effort="0"
      velocity="0" />
  </joint>
</robot>

其中与之前的URDF文件相比,增加了部件base_footprint,将其与base_link连接,读者可以发现,增加base_footprint后机器人正好基于地面了,相比与之前更加的合理,同时也为后续的里程计提供了便利,对比结果如下:

在此建议读者以后每次建立URDF文件都添加部件base_footprint。

将robot功能包下launch文件夹中的display.launch修改为以下:

<launch>
  <arg
    name="model" />
  <param
    name="robot_description"
    textfile="$(find robot)/urdf/robot.urdf" />
  <node
    name="joint_state_publisher_gui"
    pkg="joint_state_publisher_gui"
    type="joint_state_publisher_gui" />
  <node
    name="robot_state_publisher"
    pkg="robot_state_publisher"
    type="robot_state_publisher" />
  <node
    name="rviz"
    pkg="rviz"
    type="rviz"
    args="-d $(find robot)/config/robot.rviz" />
  <node name="arbotix" pkg="arbotix_python" type="arbotix_driver" output="screen">
     <rosparam file="$(find robot)/config/robot.yaml" command="load" />
     <param name="sim" value="true" />
  </node>
</launch>

step4.在RViz中添加odom里程计

在VS Code集成命令行输入:

source ./devel/setup.bash
roslaunch robot display.launch

 修改大地坐标为odom并添加odom里程计至RViz中:

step6.发布消息

Ctrl+Alt+T打开终端输入:

rostopic pub -r 10 /cmd_vel geometry_msgs/Twist "linear:
  x: 1.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 1.0" 

该代码段的旨在10HZ 的频率循环发送运动信息至订阅者,成功结果如下:

到这里我们就完成了通过Arbotix功能包实现了机器人模型的运动。


文章预告:ROS入门教程(六)—— Gazebo仿真

资料来源:奥特学院(Autolabor)

商业转载请联系官方授权,非商业转载请注明出处

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

ROS入门教程(五)—— RViz仿真 的相关文章

随机推荐

  • 数据可视化--实验四:地理数据可视化

    声明 xff1a 本文CSDN作者原创投稿文章 xff0c 未经许可禁止任何形式的转载 xff0c 原文链接 文章目录 概要实验过程Pyecharts实验结果 概要 学院 xff1a 计算机科学与技术学院实验日期 xff1a 2020 10
  • 课设-基于51单片机的智能小车(循迹+避障+APP控制)

    51单片机课设 智能小车 一 课设任务二 硬件设计及相关传感器模块1 车模2 51单片机3 红外循迹模块4 电机及驱动5 蓝牙模块6 硬件搭建 三 程序代码1 main c文件2 motor c文件 四 我的大学 造车 史 注 xff1a
  • 课设-基于51单片机+超声波模块的避障小车(源码+原理图+Protel仿真)

    基于51单片机 43 超声波模块的避障小车 xff08 源码 43 原理图 43 Protel仿真 xff09 一 功能二 模块2 1 电机驱动模块2 2 超声波模块 三 程序代码四 PCB原理图 一 功能 设计一辆利用超声波传感器来实现避
  • 路径规划(一):使用Matlab快速绘制栅格地图

    目录 一 Matlab快速绘制栅格地图1 几种常用的地图形式 xff1a 1 1 尺度地图 xff1a 1 2 拓扑地图 xff1a 1 3 语义地图 xff1a 2 栅格地图用于路径规划的优势 xff1a 3 matlab绘制栅格地图的核
  • 2、无人驾驶--路径规划算法:Dijkstra

    目录 2 Dijkstra2 1 算法简介2 2 算法思路具体流程 xff1a 2 3 算法具体实现2 3 1 程序详解 2 Dijkstra 声明 xff1a 本文是学习古月居 基于栅格地图的机器人路径规划算法指南 黎万洪 后写的笔记 x
  • 毕设--基于51单片机的温度报警器设计

    目录 1 简介2 设计要求与方案论证2 1 设计要求2 2 系统基本方案选择和论证2 2 1 单片机芯片的选择方案和论证2 2 2 温度传感器设计方案论证 2 3 电路设计最终方案决定 3 硬件设计介绍3 1 STC89C51介绍3 1 1
  • 基于51单片机的篮球比赛计时器

    目录 基于51单片机的篮球比赛计时器1 PCB原理图2 仿真图3 毕设要求 xff1a 4 总体方案设计5 程序源码6 资源下载 基于51单片机的篮球比赛计时器 注 xff1a 本毕设资源可在微信公众号 xff1a Kevin的学习站 中获
  • 毕设--基于51单片机数字电压表的设计

    目录 基于51单片机数字电压表的设计1 PCB原理图2 Proteus 仿真图3 设计目标3 1 基本功能3 2 主要技术参数 4 总设计框图5 硬件设计分析5 1 电源的设计5 2 单片机最小系统5 3 模数转换 6 软件设计的组成7 元
  • 基于51单片机的智能温控风扇(程序+仿真+原理图)

    目录 基于51单片机的智能温控风扇1 主要功能2 实验结果3 仿真工程4 原理图5 程序源码6 资源获取 基于51单片机的智能温控风扇 1 主要功能 基于51单片机的智能温控风扇 xff0c 通过DS180温度传感器采集温度 xff0c 并
  • 基于51单片机的八路竞赛抢答器设计

    目录 基于51单片机的八路抢答器设计1 主要功能2 仿真图3 测试图4 程序源码5 资源获取 基于51单片机的八路抢答器设计 1 主要功能 利用STC89C52单片机及外围接口实现的抢答系统 xff1b 在抢答过程中 xff0c 只有启动抢
  • 赛灵思-Zynq UltraScale+ MPSoC学习笔记汇总

    Zynq UltraScale 43 MPSoC学习目录 xff1a 1 赛灵思 Zynq UltraScale 43 MPSoCs xff1a 产品简介 2 赛灵思 Zynq UltraScale 43 MPSoC学习笔记 xff1a P
  • 数据可视化--实验五:高维非空间数据可视化

    声明 xff1a 本文CSDN作者原创投稿文章 xff0c 未经许可禁止任何形式的转载 xff0c 原文链接 文章目录 概要实验过程Pyecharts实验结果平行坐标系room1 6房间人员时长饼图 概要 学院 xff1a 计算机科学与技术
  • 7、AUTOSAR MCAL入门-实战:I/O驱动组

    7 AUTOSAR MCAL入门 实战 xff1a I O驱动组 在第三节中有介绍AUTOSAR 把MCAL 抽象分为4个驱动组 xff0c 分别为 xff1a 微控制器驱动组 xff0c 存储器驱动组 xff0c 通信驱动组 输入 输出驱
  • FreeRTOS学习笔记:FreeRTOS启动方式及流程

    FreeRTOS启动方式及流程 FreeRTOS有两种比较流行的启动方式 1 方式一 xff1a 在main函数中创建所有任务 具体说明 xff1a 在main函数中将硬件初始化 RTOS系统初始化 xff0c 创建所有的任务 xff0c
  • 树莓派4B与Android之缘——树莓派下LineageOS(Android 9)系统开机联网与远程控制

    一 树莓派连接屏幕 1 找到树莓派的micro hdmi口 xff0c 是视频图像的输出口 xff0c 见下图中的MICRO HDMI PORTS 2 连接屏幕 xff08 1 xff09 如果显示屏输入端口是HDMI xff0c 就用mi
  • Deep SDF 、NeuS学习

    DeepSDF Learning Continuous Signed Distance Functions for Shape Representation xff1a 学习用于形状表示的连续有符号距离函数 NeuS Learning Ne
  • layui 引入方式

    layui xff08 谐音 xff1a 类UI 是一款采用自身模块规范编写的前端 UI 框架 xff0c 遵循原生 HTML CSS JS 的书写与组织形式 xff0c 门槛极低 xff0c 拿来即用 其外在极简 xff0c 却又不失饱满
  • ubuntu20.04安装ROS及常见问题

    ubuntu20 04安装ROS及常见问题 一 ubuntu安装参考 xff08 双系统 xff09 1 ios镜像官网下载地址 xff1a https releases ubuntu com ga 61 2 239339907 18418
  • 在jetson xavier nx上配置orbslam3,带稠密重建

    这里写自定义目录标题 主要记录一下踩过的各种坑 xff0c 包括从配置开发板系统到配置orbslam3一条龙服务 xff0c 带cuda加速的opencv3 4 5开发板刷系统将系统移植到M 2硬盘上Sdkmanager安装cuda cud
  • ROS入门教程(五)—— RViz仿真

    上篇文章我们介绍了URDF文件的导出 xff0c 本文将继上文介绍安装完导出URDF文件后 xff0c 如何在机器人操作系统 ROS 中显示 xff0c 并且让它动起来 目录 前言 RViz机器人模型可视化 launch启动RViz配置文件