松灵机器人Scout mini小车仿真指南

之前介绍了如何通过CAN TO USB串口实现用键盘控制小车移动。但是一直用小车测试缺乏安全性。而松灵官方贴心的为我们准备了gazebo仿真环境,提供了完整的仿真支持库,本文将介绍如何上手使用仿真。

官方仓库地址:https://github.com/agilexrobotics/ugv_gazebo_sim

1.仿真环境准备

整个功能包介绍

├── scout_control :该文件夹是小车仿真控制器功能包
├── scout_description :该文件夹是模型文件功能包
└── scout_gazebo_sim :该文件夹是gazebo模拟功能包

安装相关功能包依赖

所采用的开发环境是Ubuntu18.04+ROS Melodic

下载所需要的功能包

sudo apt-get install ros-melodic-ros-control
sudo apt-get install ros-melodic-ros-controllers
sudo apt-get install ros-melodic-gazebo-ros
sudo apt-get install ros-melodic-gazebo-ros-control
sudo apt-get install ros-melodic-joint-state-publisher-gui
sudo apt-get install ros-melodic-teleop-twist-keyboard

新建工作空间并初始化

打开一个新终端,创建一个名为scout_ws的工作区,并初始化:

mkdir -p scout_ws/src
cd scout_ws/src
catkin_init_workspace

下载对应的仿真模型功能包。本文采用的是scout mini。需要将https://github.com/agilexrobotics/ugv_gazebo_sim/tree/master/scout下的三个文件复制到src目录中

git clone https://github.com/agilexrobotics/ugv_gazebo_sim/tree/master/scout

正常编译

cd ..
rosdep install --from-paths src --ignore-src -r -y
caktin_make

2.仿真小车验证

进入scout_ws工作空间,运行系列车仿真模型,display_xxxx.launch 为不同车型在rviz仿真展示。scout_xxxx.launch为不同车型在gazebo模拟环境中展示。

source devel/setup.bash
roslaunch scout_description display_scout_mini.launch

source devel/setup.bash
roslaunch scout_gazebo_sim scout_empty_world.launch



如果想使用playgen地图,需要提取补全gazebo里面的models文件,不然会一直黑屏

3.添加自定义传感器

官方给定的只有小车底座,没有现成的传感器。在实际使用过程中,可以自定义一系列传感器。

scout系列车型的urdf描述文件位于scout_description/urdf中,在使用过程中,并未直接使用urdf进行描述,而是从xacro(xml xacro)描述文件中生成urdf信息。便于我们像编程一样复用urdf节点以及相关拆分组件等功能。

如果不了解xacro 可以参考xacro语法说明: http://wiki.ros.org/xarc

自定义简易摄像头

首先在scout_description/urdf中添加一个名为universal_sensor_adder.xacro的文件,其中保存内容如下:

<?xml version="1.0"?>
<!--
Author: AnthonySuen
Date: 2020-4-8
-->
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="universal_sensor_adder">
<!-- 用于生成一个新的传感器节点,
x_offset y_offset z_offset r p y对应于传感器和 base_link 的相对位置
sensor_config 为传感器的配置信息
sensor_plugin_config 为 gazebo 相关插件的配置内容 -->
<xacro:macro name="add_sensor" params="sensor_name type x_offset y_offset z_offset r p y **sensor_config **sensor_plugin_config">
<link name="sensor_${sensor_name}">
<!-- 配置传感器视觉信息 -->
<visual>
<geometry>
<box size="0.03 0.05 0.05"/>
</geometry>
<material name="red">
<color rgba="1.0 0.0 0.0 1.0"/>
</material>
</visual>
<!-- 配置碰撞体积, 为gazebo仿真使用 -->
<collision>
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
<geometry>
<box size="0.03 0.05 0.05"/>
</geometry>
</collision>
<!-- 配置惯性矩阵, 用于 gazebo 仿真,这里我假设传感器很轻很小 -->
<inertial>
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
<mass value="1e-5"/>
<inertia ixx="1e-6" ixy="1e-6" ixz="1e-6" iyy="1e-6" iyz="1e-6" izz="1e-6"/>
</inertial>
</link>
<!-- 配置关节信息, 这里我默认传感器是固定在车上的 -->
<joint name="sensor_${sensor_name}_joint" type="fixed">
<parent link="base_link"/>
<child link="sensor_${sensor_name}"/>
<origin xyz="${x_offset} ${y_offset} ${z_offset}" rpy="${r} ${p} ${y}"/>
</joint>
<!-- gazebo 配置仿真配置部分 -->
<gazebo reference="sensor_${sensor_name}"> <!-- 此部分要与 传感器 link 名称保持一致 -->
<sensor name="${sensor_name}" type="${type}">
<!-- 这里会插入传感器自身配置信息和相关插件的配置内容 -->
<xacro:insert_block name="sensor_config"/>
<xacro:insert_block name="sensor_plugin_config"/>
</sensor>
</gazebo>
</xacro:macro>
</robot>

在使用过程中删除中文注释,xacro无法解析非ascii 字符!

编辑empty.urdf文件,修改内容如下:

<?xml version="1.0"?>
<!--
Author: AnthonySuen
Date: 2020-4-8
-->
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="sensors"> <!-- 加载我们之前编写的文件,之后可以使用其中相关内容 -->
<xacro:include filename="$(find scout_description)/urdf/universal_sensor_adder.xacro" />
<!-- 使用我们编写的函数,填入相关参数 -->
<xacro:add_sensor sensor_name="camera" type="camera" x_offset="0.1" y_offset="0.0" z_offset="0.085" r="0.0" p="0.0" y="0.0">
<!-- 这部分会替换 <xacro:insert_block name="sensor_config"/> 中的内容 -->
<sensor_config>
<update_rate>30</update_rate>
<camera name="general_camera">
<image width="640" height="480" hfov="1.5708" format="RGB8" near="0.01" far="50.0"/>
</camera>
</sensor_config>
<!-- 这部分会替换 <xacro:insert_block name="sensor_plugin_config"/> 中的内容 -->
<sensor_plugin_config>
<plugin name="general_camera_controller" filename="libgazebo_ros_camera.so">
<alwaysOn>true</alwaysOn>
<updateRate>36.0</updateRate>
<cameraName>sensor_camera</cameraName>
<imageTopicName>image_raw</imageTopicName>
<cameraInfoTopicName>camera_info</cameraInfoTopicName>
<frameName>sensor_camera</frameName> <!-- 需要与 传感器 link 名称保持一致 -->
<hackBaseline>0.1</hackBaseline>
<distortionK1>0.0</distortionK1>
<distortionK2>0.0</distortionK2>
<distortionK3>0.0</distortionK3>
<distortionT1>0.0</distortionT1>
<distortionT2>0.0</distortionT2>
</plugin>
</sensor_plugin_config>
</xacro:add_sensor>
</robot>

在使用过程中删除中文注释,xacro无法解析非ascii 字符!

之后再运行RIVZ查看修改后的模型

roslaunch scout_description display_mini_models.launch

松灵机器人scout mini小车 自主导航(2)——仿真指南的更多相关文章

  1. QT--图灵机器人

    QT--图灵机器人 1.登陆图灵机器人官网注册一个图灵机器人 2.获取apikey 3.pro文件添加 QT       += core gui network 4.头文件 #include < ...

  2. weiphp---------图灵机器人存在的bug。

    1.很多人下载下来weiphp源码以后,配置好了图灵机器人却不能使用.原因是因为他源码里面存在一个小bug 上图红色框框内是他的源码,问题就出在这里. 修改方法: if($result ['code' ...

  3. ROS::message_filters中的一个报错(mt::TimeStamp……)

    『方便检索』 ros::Time msg_time = mt::TimeStamp<typename mpl::at_c<Messages, i>::type>::value( ...

  4. 机器人与机器人仿真技术(zz)

    http://www.viblue.com/archives/5587.htm 一.机器人简介: 机器人(Robot)是自动执行工作的机器装置.它既可以接受人类指挥,又可以运行预先编排的程序,也可以根 ...

  5. Android智能聊天机器人

    http://www.tuling123.com/       注册一个账号,申请一个KEY值.此网站也有文档,可以查看. package com.tulingdemo; import java.te ...

  6. ROS机器人程序设计(原书第2版)补充资料 (玖) 第九章 导航功能包集进阶 navigation

    ROS机器人程序设计(原书第2版)补充资料 (玖) 第九章 导航功能包集进阶 navigation 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中 ...

  7. ROS探索总结(十七)——构建完整的机器人应用系统

           上一篇博客介绍了HRMRP机器人平台的设计,基于该平台,可以完成丰富的机器人应用,以较为典型的机器人导航为例,如何使用HRMRP来完成相应的功能?本篇博客将详细介绍如何将HRMRP应用到 ...

  8. Adobe Scout 使用参考说明

    Adobe Scout 用于优化 Flash 内容,是一款极为强大的工具,因为它能让您看到 Flash Player 幕后正在发生的事情.但是若明白 Flash Player 为什么做这些事情,您看到 ...

  9. 机器人操作系统(ROS)在线实训平台学习实验指南

    机器人操作系统(ROS)在线学习指南       在高校开设ROS相关课程已经积累了一年多的经验,由于自动化类专业在课程安排中不同于计算机相关专业,通常没有Linux相关的课程基础,直接上手ROS较为 ...

  10. java最简单的方式实现httpget和httppost请求

    java实现httpget和httppost请求的方式多种多样,个人总结了一种最简单的方式,仅仅需几行代码,就能够完美的实现. 此处须要用到两个jar包,httpclient-4.3.1.jar.ht ...

随机推荐

  1. cesium教程5-用primitive加载glb和gltf格式的小模型

    primitive加载方法更底层,用起来更麻烦,但是效率更高. 完整示例代码: <!DOCTYPE html> <html lang="en"> <h ...

  2. ElasticSearch使用经验总结

    ElasticSearch总结 1.ElasticSearch的查询原理 Elasticsearch底层使用的Lucene的倒排索引技术来实现比关系型数据库更快的过滤的.所以要想了解Es的擦查询原理, ...

  3. OpenNESS NTS 的前世今生

    目录 文章目录 目录 NEV SDK NEV SDK 的软件架构 NEV SDK 的持续演进 OpenNESS NTS NTS 在 VM 场景中的应用 NTS 在 Container 场景中的应用 N ...

  4. debug技巧之远程调试

    一.前言 大家好啊,我是summo,今天给大家分享一下我平时是怎么调试代码的,不是权威也不是教学,就是简单分享一下,如果大家还有更好的调试方式也可以多多交流哦. 当我们的应用发布到线上之后,就不能随意 ...

  5. hadoop部署2

    完全分布式部署介绍 学习目标 完全分部式是真正利用多台Linux主机来进行部署Hadoop,对Linux机器集群进行规划,使得Hadoop各个模块分别 部署在不同的多台机器上. 能够了解完全分布式部署 ...

  6. 记录一次HTTPS无法访问的错误

    Https无法连接Nginx,日志报错 *2179 SSL_do_handshake() failed (SSL: error:1420918C:SSL routines:tls_early_post ...

  7. uniapp 组件使用

    组件使用情况:页面出现多个相似的页面这个时候我们就可以把公共的页面进行封装,避免冗余的代码 1. compoents 目录下新建组件,名称随意[案例就叫 newsList]2. 开始封装需要多次使用的 ...

  8. 不好分类的好题Record

    这里装的是一些不太好分类的. problem 1 给你 \(n\) 个序列,第 \(i\) 个序列的长度为 \(m_i\),要求在每个序列中选择一个数,每种选法的代价为选择的 \(n\) 个数之和,请 ...

  9. C#.NET X509Certificate2 该项不适于在指定状态下使用

    X509Certificate2 x509 = new X509Certificate2(lblPfxPath.Text,txtPfxPwd.Text.Trim() ); string xmlpri= ...

  10. 微软新Edge浏览器 WIN7 无法登录

    由于设备上的系统组件过期,不支持登录.请确保 Windows 为最新版本,然后重新尝试登录.访问 https://go.microsoft.com/fwlink/?linkid=2107246 了解详 ...