机器人学习之项目- Project1 : Go Chase it!(一)

2023-05-16

1.项目简介

任务概述

在这个项目中,在catkin_ws/src中创建两个ROS包:drive_bot和ball_chaser。下面是设计机器人的步骤,把它安置在一个设定的世界里,并编程让它追逐白色的球:

1) drive_bot:

-创建一个my_robot ROS包来保存你的机器人、白球和世界(My World)。

-用统一的机器人描述格式(URDF)设计一个差动驱动机器人。给机器人添加两个传感器:一个激光雷达和一个摄像头。为机器人的差动驱动器、激光雷达和相机添加Gazebo插件。

-把机器人安置在项目中建造的世界(My World)里。

-添加一个白色的球到Gazebo 世界,并保存这个世界的一个新的副本。

-world.launch文件用于启动世界(My World)与白色的球和机器人。

2)ball_chaser:

-创建一个ball_chaser ROS包来保存c++节点。

-编写一个drive_bot c++节点,它将提供一个ball_chaser/command_robot服务,通过控制机器人的线性x和角z速度来驱动机器人。服务应该发布到车轮关节并返回请求的速度。

-写一个process_image c++节点来读取机器人的摄像头图像,分析它来确定一个白球的出现和位置。如果图像中出现一个白球,编写的节点将通过客户端请求一个服务驱动机器人追逐它。

-ball_chaser. launch应该同时运行drive_bot和process_image节点。

项目文件夹

项目的提交参照以下的目录结构,包含列出的所有文件:

Project                                # Go Chase It Project
    ├── my_robot                       # my_robot package                   
    │   ├── launch                     # launch folder for launch files   
    │   │   ├── robot_description.launch
    │   │   ├── world.launch
    │   ├── meshes                     # meshes folder for sensors
    │   │   ├── hokuyo.dae
    │   ├── urdf                       # urdf folder for xarco files
    │   │   ├── my_robot.gazebo
    │   │   ├── my_robot.xacro
    │   ├── world                      # world folder for world files
    │   │   ├── <myworld>.world
    │   ├── CMakeLists.txt             # compiler instructions
    │   ├── package.xml                # package info
    ├── ball_chaser                    # ball_chaser package                   
    │   ├── launch                     # launch folder for launch files   
    │   │   ├── ball_chaser.launch
    │   ├── src                        # source folder for C++ scripts
    │   │   ├── drive_bot.cpp
    │   │   ├── process_images.cpp
    │   ├── srv                        # service folder for ROS services
    │   │   ├── DriveToTarget.srv
    │   ├── CMakeLists.txt             # compiler instructions
    │   ├── package.xml                # package info                  
    └──               

2.设置my_robot

这个项目中的第一个任务是创建my_robot ROS包。在my_robot中,将存储并启动一个空的Gazebo世界文件。随着项目的进行,将建模并存储一个机器人,把空的世界文件替换为在项目中创建的世界。现在,按照以下步骤设置my_robot。

创建my_robot包

1)创建并初始化一个catkin_ws

$ mkdir -p /home/workspace/catkin_ws/src
$ cd /home/workspace/catkin_ws/src
$ catkin_init_workspace

2)导航到catkin_ws的src目录,创建my_robot包:

$ cd /home/workspace/catkin_ws/src/
$ catkin_create_pkg my_robot

3)接下来,创建一个worlds目录和一个launch目录,这将进一步定义包的结构:

$ cd /home/workspace/catkin_ws/src/my_robot/
$ mkdir launch
$ mkdir worlds

创建并存储一个空的 Gazebo World文件

在worlds目录中,创建并存储一个空的Gazebo world文件。提醒一下,在Gazebo中,世界是模型的集合,比如机器人,以及特定的环境。还可以定义一些特定于这个世界的其他物理属性。

1)创建一个空白的Gazebo world

Gazebo里的空白世界是一个简单的世界,没有物体,没有模型。

$ cd /home/workspace/catkin_ws/src/my_robot/worlds/
$ touch empty.world

2)将以下内容添加到empty.world

<?xml version="1.0" ?>

<sdf version="1.4">
  
  <world name="default">

    <include>
      <uri>model://ground_plane</uri>
    </include>

    <!-- Light source -->
    <include>
      <uri>model://sun</uri>
    </include>

    <!-- World camera -->
    <gui fullscreen='0'>
      <camera name='world_camera'>
        <pose>4.927360 -4.376610 3.740080 0.000000 0.275643 2.356190</pose>
        <view_controller>orbit</view_controller>
      </camera>
    </gui>
  </world>
</sdf>

.world文件使用XML文件格式描述与Gazebo环境有关的所有元素。在这里创建的简单世界有以下元素:

-<sdf>:封装整个文件结构和内容的基本元素。

-<world>: world元素定义了世界描述和一些与该世界相关的属性。在本例中的世界添加一个地平面、一个光源和一个摄像机。每个模型或属性都可以有进一步的元素来添加细节。例如,camera有一个pose元素,它定义了它的位置和方向。

-<include>: 包含元素,与<uri>元素,提供到特定模型的路径。在Gazebo中,默认情况下有几个可用的模型。

创建启动文件( Launch File )

ROS中的启动文件允许我们同时执行多个节点,这有助于避免在单独的shell或终端中定义和启动多个节点的潜在繁琐任务。

1)创建world.launch文件

$ cd /home/workspace/catkin_ws/src/my_robot/launch/
$ touch world.launch

2)将以下内容添加到world.launch

<?xml version="1.0" encoding="UTF-8"?>

<launch>

  <!-- World File -->
  <argname="world_file"default="$(find my_robot)/worlds/empty.world"/>
  
  <!-- Launch Gazebo World -->
  <includefile="$(find gazebo_ros)/launch/empty_world.launch">
    <argname="use_sim_time"value="true"/>
    <argname="debug"value="false"/>
    <argname="gui"value="true" />
    <argname="world_name"value="$(arg world_file)"/>
  </include>
</launch

.world文件一样,.launch文件也是基于XML的。启动文件的结构有两部分:

-首先,使用<arg>元素定义参数。每个这样的元素都有一个name属性和一个默认值。

-其次,从gazebo_ros包,包含world. launch文件。empty_worldhttps://github.com/ros-simulation/gazebo_ros_pkgs/blob/kinetic-devel/gazebo_ros/launch/empty_world.launch文件包含一组重要的定义,这些定义由我们所创建的世界继承。使用world_name参数和作为参数值(value)传递的.world文件路径,将能够在Gazebo中启动world。

启动empty.world
$ cd /home/workspace/catkin_ws/
$ catkin_make
$ source devel/setup.bash
$ roslaunch my_robot world.launch

3.理解统一机器人描述格式(URDF)

由于使用ROS,必须使用统一机器人描述格式(Unified robot Description Format, URDF)对机器人建模,使用XMLhttps://www.w3schools.com/xml/xml_whatis.asp标记语言。我们可以使用URDF文件定义一个机器人模型,它的运动学属性,视觉元素,甚至机器人的模型传感器。URDF只能描述由链状或树形结构的关节连接的刚性链接的机器人。它不能描述具有柔性或平行连杆的机器人。

一个有两个连杆和一个关节的简单机器人可以用URDF描述如下:

<?xml version="1.0"?>
<robot name="two_link_robot">
  <!--Links-->
  <linkname="link_1">
    <visual>
      <geometry>
        <cylinderlength="0.5"radius="0.2"/>
      </geometry>
    </visual>
  </link>
  <linkname="link_2">
    <visual>
      <geometry>
        <boxsize="0.6 0.1 0.2"/>
      </geometry>
    </visual>
  </link>
  <!--Joints-->
  <jointname="joint_1"type="continuous">
    <parentlink="link_1"/>
    <childlink="link_2"/>
  </joint>
</robot>

由于我们使用URDF文件来描述几个机器人和环境属性,因此这些文件往往又长又乏味。这就是为什么我们使用Xacro (XML宏)将单个URDF文件划分为多个Xacro文件的原因。虽然语法保持不变,但我们现在可以将机器人描述划分为更小的子系统。

由于URDF(和Xacro)文件基本上是XML,所以它们使用标记来定义机器人的几何形状和属性。最重要和最常用的标签及其元素如下所示:

<robot> </robot>

这是一个顶级(top)标签,包含与给定机器人相关的所有其他标签。

<link> </link>

机器人中的每个刚性连杆(link)都必须与此标签相关联。

属性

名称:需要唯一的连杆(link)名称属性。

元素
<visual> </visual>

此元素指定用于可视化目的的对象的外观。

名称

描述

<origin>

可视元素相对于连杆(link)的参考框架的参考框架。

<geometry>

视觉对象的形状。

<material>

可视元素的材料。

<collision> </collision>

连杆(link)的碰撞属性。请注意,这可能与连杆(link)的视觉属性不同,例如,通常使用更简单的碰撞模型来减少计算时间。

名称

描述

<origin>

碰撞元素的参考框架,相对于连杆(link)的参考框架。

<geometry>

请参阅上面可视化元素中的几何描述。

<inertial> </inertial>

这个标签描述了连杆的惯性特性。

名称

描述

<origin>

这是惯性参照系的姿态,相对于连杆参照系。惯性参照系的原点需要在重心上。

<mass>

连杆的质量由该元素的value属性表示。

<inertia>

3x3转动惯量矩阵,表示在惯量坐标系中。因为转动惯量矩阵是对称的,这里只指定了这个矩阵的6个对角线以上的元素,使用属性ixx, ixy, ixz, iyy, iyz, izz。

包含重要元素的<link>标签示例片段:

<linkname="link_1">
  <inertial>
    <origin xyz="0 0 0.4" rpy="0 0 0"/>
    <massvalue="${mass1}"/>
    <inertia ixx="30" ixy="0" ixz="0" iyy="50" iyz="0" izz="50"/>
  </inertial>
  <visual>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <geometry>
      <mesh filename="package://kuka_arm/meshes/kr210l150/visual/link_1.dae"/>
    </geometry>
    <material name="">
      <color rgba="0.75294 0.75294 0.75294 1"/>
    </material>
   </visual>
   <collision>
     <origin xyz="0 0 0" rpy="0 0 0"/>
     <geometry>
       <mesh filename="package://kuka_arm/meshes/kr210l150/collision/link_1.stl"/>
     </geometry>
    </collision>
</link>

<link>标签有更多可选元素,可用于定义其他属性,如颜色、材质、纹理等。有关这些标签的详细信息,请参阅此链接urdf/XML/link - ROS Wiki

<joint> </joint>

该标签通常定义机器人中两个连杆之间的单个关节。可以使用此标签定义的关节类型包括:

Name

Description

Fixed

没有自由度的刚性接头。用于焊接连接。

Revolute

绕轴旋转的有一定范围的关节。

Prismatic

滑动关节:沿轴滑动的范围有限的关节

Continuous

类似于转动关节,但没有限制。它可以围绕一个轴连续旋转。

Planar

二维移动关节,允许在垂直于轴的平面上运动

Floating

具有6个自由度的关节,一般用于四旋翼飞行器和无人机

属性

名称 唯一的关节名

类型 关节类型

元素

为了定义关节,我们需要声明旋转/平移轴以及组成关节的两个连杆之间的关系。

名称

描述

<origin>

这是从父连杆到子连杆的转换。关节位于子连杆的原始点。

<parent>

各自连接的父连杆的名称。

<child>

各自连接的子连杆的名称。

<axis>

为转动关节定义旋转轴,为移动关节定义平移轴,为平面关节定义曲面法线。固定和浮动关节不使用轴场。

包含重要元素的<joint>标签示例片段:

<joint name="joint_2"type="revolute">
  <origin xyz="0.35 0 0.42" rpy="0 0 0"/>
  <parent link="link_1"/>
  <childlink="link_2"/>
  <axisxyz="0 1 0"/>
</joint>

<joint>标签下的其他可选元素可以在这里找到urdf/XML/joint - ROS Wiki

还有更多可选的标签和属性,有助于定义机器人的各种动态和运动学属性,以及传感器和执行器。要获得完整的列表,请参阅URDF上的ROS文档urdf - ROS Wiki

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

机器人学习之项目- Project1 : Go Chase it!(一) 的相关文章

  • Mac OS X 的包管理器 HomeBrew

    Homebrew 是最简单和灵活的方式 xff0c 用来在 Mac OS X 安装 Linux 工具包 Homebrew 国内高速安装脚本 xff1a HomebrewCN Homebrew 国内安装脚本 安装过程很简单 xff1a rub
  • Android中Parcelable的原理和使用方法

    Parcelable的简单介绍 介绍Parcelable不得不先提一下Serializable接口 xff0c Serializable是Java为我们提供的一个标准化的序列化接口 那什么是序列化呢 进行Android开发的时候 xff0c
  • 小米路由器安装mt工具箱

    去年六月底的时候在小米路由3上开启了ssh 安装了mt工具箱 现在回头看来 xff0c 开启ssh的方法已经大相径庭 不过 xff0c 今天的主角换成了小米路由器pro半个月前替换掉原来的小米路由3 那么 xff0c 肯定也是要在小米路由器
  • SSD的随机读能力 和一个高访问量的读写服务系统

    昨天晚上写了个代码 xff0c 测试了下目前我这个1000块钱的SSD的随机读能力 主机配置 i5 4核 两物理核 8G内存 linux 内核版本 2 6 18 128 el5 一个50G的文件 gt gt 8G内存 防止全缓存至内存中 p
  • 系统过载及保护的思考

    家用电器为了防止电流过大 xff0c 都会有保险装置 当电流过大时 xff0c 自动切断电流 xff0c 防止电器损坏 防洪大坝的水位超过了警戒线 xff0c 会开闸泄洪 xff0c 防止大坝崩溃 而我们的服务系统如果一旦流量过大 用户或请
  • 系统调用,上下文切换及中断概念的汇总

    仔细揣摩了一段时间 系统调用和上下文切换 1 1 首先每个进程都拥有两个堆栈 用户态栈和内核态栈 1 2 每CPU变量中会有两个栈单独用于中断过程 分别用于每个独立核的软中断和硬中断 2 6 x版本后 1 3 系统调用过程 进程进入内核态
  • 吞吐量和延时

    某单机计算秘钥的服务 cpu bound 4核 xff0c 接受网络req 最大吞吐10万 s xff0c 4核cpu均达到99 以上 当吞吐达到10万 s时 xff0c 对于单个req延时是多少 xff1f 假设服务有个队列 xff08
  • io wait

    准确的说iowait只是表示在统计CPU空闲周期时间片内 xff0c 有多少时间在等待IO执行 xff0c 反应的是IO设备的性能 这里CPU并不会等待IO xff0c 但是相应的 操作IO的线程或者进程需要等到IO操作完成 以下是man
  • 技术的变革

    最近几个月陆续接触和使用了pinpoint spring cloud 构建一个成熟的分布式环境已经越来越简单了 系统的统计和监控也越来越容易了 特别是pinpoint 完全不要侵入业务逻辑 技术的发展真是可怕
  • 系统的分类

    我所接触过的系统可以分为5类 1 以关系数据库为主要存储的一类系统的 xff0c 或者附加少量数据的noSql的存储 xff0c 特点是逻辑复杂 xff0c 多变 如各类业务类系统 xff0c 传统的信息系统 中小型电商系统的各类业务系统
  • android倒计时功能的实现(CountDownTimer)

    在逛论坛的时候 xff0c 看到一个网友提问 xff0c 说到了CountDownTimer这个类 xff0c 从名字上面大家就可以看出来 xff0c 记录下载时间 将后台线程的创建和Handler队列封装成一个方便的类调用 查看了一下官方
  • 【STM32】几款常用产品(F1、F4、F7)的区别

    STM32系列单片机 xff0c 是目前极为常用的单片机 xff0c 它以ARM Cortex M为内核 xff0c 具有高性能 低成本 低功耗 可裁剪等特点 其中使用最广泛的是STM32F1 STM32F4 STM32F7系列 xff0c
  • VMware虚拟机看不到共享目录

    VMware虚拟机看不到共享目录 确认VMtools已经装好 xff0c 开启共享文件夹 xff0c 设置好共享目录执行命令 sudo mount t vmhgfs host mnt hgfs 如果出现错误 xff1a Error cann
  • 【Linux基础】Makefile基础入门

    基础Makefile规则和样例展示 基础的makefile样例 目标 xff1a 依赖 命令 单文件编译 mian o main c gcc c mian c o mian 多文件编译 mian o main c mian h includ
  • Json基础

    Json是什么 JSON 或者 JavaScript 对象表示法是一种轻量级的基于文本的开放标准 xff0c 被设计用于可读的数据交换 约定使用 JSON 的程序包括 C xff0c C 43 43 xff0c Java xff0c Pyt
  • STM32 BOOT引起硬件死机

    STM32的三种启动方式依靠BOOT0和BOOT1两个引脚的电平来决定 xff0c ST官方推荐的是串联10k电阻然后在接高电平或接地 我用0R直接接地的 xff0c 没有串联10k电阻 xff0c 造成STM32的硬件死机 在实际的应用中
  • 远程 sshd提示:Server unexpectedly closed network connection

    root 64 xx vim etc ssh sshd config 修改端口为3330 root 64 xx iptables I INPUT p tcp dport 3330 j ACCEPT 添加防火墙3330端口 允许 root 6

随机推荐

  • linux驱动开发流程和方法

    方法一 xff1a 将驱动编入内核的方法 手把手教你写第一个Linux驱动程序 https blog csdn net morixinguan article details 54620088 方法二 xff1a 简单实例讲解linux的m
  • Ubuntu 出现apt-get: Package has no installation candidate问题解决办法

    apt get install tftpd tftp openbsd inetd 提示apt get Package has no installation candidate 解决方法如下 xff1a 先检查虚拟机网络是否NAT模式 xf
  • Vim/gVim 中文显示为乱码的解决办法

    打开vimrc文件 xff0c 在vim的安装目录下可以找到该文件 xff0c 或在windows下是在vim gvim下输入 edit vim vimrc 在文件的末尾添加一句 set fileencodings 61 utf 8 gbk
  • 关于字,半字,字节之间的关系

    一直搞不清楚字 xff0c 半字 xff0c 字节之间的关系 xff0c 查了一下资料 xff0c 明白了 字 xff0c 半字 xff0c 字节 大小是根据不同的操作系统来说的 xff0c 32位系统 字 gt 32bit 半字 gt 1
  • android json解析及简单例子

    JSON的定义 xff1a 一种轻量级的数据交换格式 xff0c 具有良好的可读和便于快速编写的特性 业内主流技术为其提供了完整的解决方案 xff08 有点类似于正则表达式 xff0c 获得了当今大部分语言的支持 xff09 xff0c 从
  • vim-plug的使用方法

    vim plug介绍 Vim plug 是一个自由 开源 速度非常快的 并行地安装或更新插件 xff0c 极简的 vim 插件管理器 GIT获取和安装 https git scm com 插件获取 https github com june
  • .NetCore swagger发布到iis时访问api出现404的解决方案

    介绍 使用netcore作为纯后端提供api已经变得越来越频繁 xff0c swagger也成为很多人的选择 通常会在代码中限制ASPNETCORE ENVIRONMENT为Production时关闭swagger 但是往往我们需要将api
  • 新手树莓派4B安装Supervised+Home Assistant及问题解决

    测试平台 xff1a 树莓派4B 4G 系统版本 xff1a Raspberry Pi OS with desktop and recommended software Release date September 22nd 2022 Sy
  • 无人机高精度定位之——RTK与PPK概念扫盲

    无人机高精度定位之 RTK与PPK概念扫盲 无人机的兴起 xff0c 已经让很多行业激动不已 xff0c 如电力巡检 应急救援 测绘 农业植保等行业 而随着高精度卫星导航技术的加持 xff0c 让无人机定位更加高效 安全 灵活 xff0c
  • 数据结构与算法--01数组:为什么大多编程语言中数组从0开始编号?

    数据结构与算法 01数组 xff1a 为什么很多编程语言中数组从0开始编号 xff1f 一 数组特性二 数组访问越界问题三 数组与容器四 回到开篇五 总结 一 数组特性 1 数组本质上是一种线性表数据结构 xff0c 用一组连续的内存空间来
  • 数据结构与算法--02链表-如何轻松写出链表代码

    数据结构与算法 02链表 如何轻松写出链表代码 写好链表并不是件容易的事情 xff0c 尤其是一些复杂的链表操作 xff0c 如链表反转 有序链表合并等等 即使能够写出代码 xff0c 但及其容易出错 所以付出一定量的精力是前提条件 xff
  • QT for Windows安装配置总结及采坑问题汇总

    QT for Windows安装配置总结及采坑问题汇总 一 安装包下载二 安装三 Qt Creator配置四 遇到的问题 一 安装包下载 1 Qt官方下载地址 xff1a http download qt io archive qt xff
  • IOS系统历届版本大回顾(<iOS7)

    APPLE xff0c 一种常见的水果 xff0c 但在人类的进化史上扮演了2次拯救世界的角色 第一次是在1666年一个夏末的傍晚 xff0c 在英格兰林肯郡的乌尔斯索普 xff0c 当一个年轻人坐在树下 xff0c 埋头读书的时候 xff
  • 总结-虚拟机安装OS X系统步骤及遇到的问题

    一 安装步骤 1 创建一个文件夹 xff0c 用于向虚拟机系统共享文件 xff0c 如 xff1a work 2 下载好所需的安装包 xff1a a VMware虚拟机安装包 xff08 包含unlocker软件 xff0c 用于解锁VMw
  • Git-回退到指定版本

    Git 回退到指定版本 1 方法一 xff1a git reset2 方法二 xff1a git commit amend 1 方法一 xff1a git reset 直接回退到指定版本 xff0c 目标版本之后的提交将被删除 情况一 xf
  • 我的2011--快乐最重要

    呵呵 xff0c 听着郭德纲和于谦老师的相声 xff0c 开始写这篇文章 xff0c 刚毕业不到六个月 xff0c 就换了一份工作 xff0c 很多事情都在意料之外 xff0c 很多事情又在意料之中 xff0c 总之 xff0c 以后回忆到
  • 如何在github的wiki中添加新的图片

    本文简单介绍在github的wiki中添加新的图片对方法 在github的wiki中 xff0c 可以展现图片 xff0c 可是 xff0c 怎么添加图片 xff0c 从网页上展示的信息来看 xff0c 不是很清楚 添加图片 xff0c 基
  • iOS-AppStore上传应用更新之——Xcode上传ipa

    iOS AppStore上传应用更新之 Xcode上传ipa 一 App Store Connect添加新版本配置二 Xcode验证IPA有效性三 生成IPA包 xff0c 通过xcode直接上传至AppStore四 注意事项 好久没有打包
  • CSDN博客搬家至掘金

    博客搬家说明 xff1a 作为一名程序员 xff0c 掘金是目前最适合我们的一个平台 xff0c 所以决定将CSDN博客搬迁至掘金 xff01 CSDN是我第一个接触的博客平台 xff0c 你将成为我最美的回忆 xff0c 永远爱你 xff
  • 机器人学习之项目- Project1 : Go Chase it!(一)

    1 项目简介 任务概述 在这个项目中 xff0c 在catkin ws src中创建两个ROS包 drive bot和ball chaser 下面是设计机器人的步骤 xff0c 把它安置在一个设定的世界里 xff0c 并编程让它追逐白色的球