在创建一个mwRobot_description程序包那一节中,我们添加了依赖roscpp  rospy std_msgs 和 urdf , 现在我们再添加一个xacro依赖。

  如何添加依赖?

  打开程序包中的package.xml文件,添加以下内容:

    <build_depend>xacro</build_depend>

    <build_export_depend>xacro</build_export_depend>

    <exec_depend>xacro</exec_depend>

  具体添加到何处请参考已经添加的roscpp依赖。
  在程序包中新建以下文件夹:
    urdf  :存放机器人模型的URDF或xacro文件
    meshes :放置URDF中引用的模型渲染文件
    launch :保存相关启动文件
    config  :保存rviz的配置文件
    mkdir urdf meshes launch config
  在launch文件夹中添加 display_mwRobot_base_urdf.launch 文件
  display_mwRobot_base_urdf.launch 文件内容如下: 

<!-- 利用urdf建立模型 -->
<launch>
<param name="robot_description" textfile="$(find mwRobot_description)/urdf/mwRobot_base.urdf" /> <!-- 显示关节控制插件,可以使关节回到中心位置也能设置关节为随机角度 -->
<param name="use_gui" value="true" /> <!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<node name="joint_state_publisher_mwRobot" pkg="joint_state_publisher" type="joint_state_publisher" /> <!-- 运行robot_state_publisher节点,将机器人各个links、joints之间的关系通过tf发布 -->
<node name="mwRobot_state_publisher_mwRobot" pkg="robot_state_publisher" type="state_publisher" /> <!-- 运行rviz可视化界面 -->
<node name="mwRobot_rviz" pkg="rviz" type="rviz" args="-d $(find mwRobot_description)/config/mwRobot_urdf.rviz" required="true"/> </launch>

  这个launch文件的功能就是加载urdf模型文件,然后运行 joint_state_publisher 和 robot_state_publisher 这两个节点,它们是用来发布关节的状态信息和机器人各个links与joints之间的关系。所以这两个是必须要有的。最后一个就所运行rviz可视化工具来看我们机器人的模型。

  由上述文件可得,我们目前还缺少 urdf/mwRobot_base.urdf 和 config/mwRobot_urdf.rviz文件。

创建urdf/mwRobot_base.urdf文件

  在urdf文件夹中创建一个mwRobot_base.urdf文件。并输入以下内容:(在此文件中不能有中文注释,否则报错)

<?xml version="1.0" ?>
<robot name="mwRobot"> <!-- No Chinese annotations exist. --> <!-- Robot main body -->
<link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<cylinder length="0.16" radius="0.2"/>
</geometry>
<material name="yellow">
<color rgba="1 0.4 0 1" />
</material> </visual>
</link> <!-- The connection between the left wheel and the main body -->
<joint name ="left_wheel_joint" type="continuous">
<origin xyz="0 0.19 -0.05" rpy="0 0 0" />
<parent link="base_link"/>
<child link="left_wheel_link"/>
<axis xyz="0 1 0"/>
</joint> <!-- The definition of the left wheel -->
<link name="left_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder length="0.06" radius="0.08"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9" />
</material>
</visual>
</link> <!-- The connection between the right wheel and the main body -->
<joint name ="right_wheel_joint" type="continuous">
<origin xyz="0 -0.19 -0.05" rpy="0 0 0" />
<parent link="base_link"/>
<child link="right_wheel_link"/>
<axis xyz="0 1 0"/>
</joint> <!-- The definition of the right wheel -->
<link name="right_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder length="0.06" radius="0.08"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9" />
</material>
</visual>
</link> <!-- Joint of front universal wheel and main body -->
<joint name ="front_caster_joint" type="continuous">
<origin xyz="0.18 0 -0.095" rpy="0 0 0" />
<parent link="base_link"/>
<child link="front_caster_link"/>
<axis xyz="0 1 0"/>
</joint> <!-- Definition of front universal wheel -->
<link name="front_caster_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<sphere radius="0.015"/>
</geometry>
<material name="black">
<color rgba="0 0 0 0.9" />
</material>
</visual>
</link> <!-- Joint of back universal wheel and main body -->
<joint name ="back_caster_joint" type="continuous">
<origin xyz="-0.18 0 -0.095" rpy="0 0 0" />
<parent link="base_link"/>
<child link="back_caster_link"/>
<axis xyz="0 1 0"/>
</joint> <!-- Definition of back universal wheel -->
<link name="back_caster_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<sphere radius="0.015"/>
</geometry>
<material name="black">
<color rgba="0 0 0 0.9" />
</material>
</visual>
</link> </robot>

  此文件中定义了机器人的主体、两个主动轮、两个从动论轮以及它们与主体的关节(连接)。

创建config/mwRobot_urdf.rviz 文件

  此文件为rviz的配置文件,可以在rviz软件中随意修改,要求并不苛刻。所有参数的修改都可以通过RVIZ来完成。

  首先,启动rviz。启动rviz之前需要启动roscore。所以打开两个控制终端,先在一个中启动roscore,然后在另一个启动rosrun rviz rviz。

    roscore

    rosrun rviz rviz

  执行之后会打开一个软件,然后在左上角的files中点击Save Config As,然后保存到 config/mwRobot_urdf.rviz 即可。

  

  图:rviz软件启动界面

  

查看我们创建的模型

  我们把打开的软件关闭,关闭roscore。然后执行roslaunch 包名  launch文件名。

    roslaunch mwRobot_description display_mwRobot_base_urdf.launch
  然后程序会自动创建roscore(如果已经存在则不创建),并打开rviz。

  但是打开的RVIZ中并没有任何物体,这是因为我们还没有添加显示模型这个组件。

  打开的RVIZ和创建RVIZ配置文件时的是一模一样。

  这里我们先在左边Displays一栏的Global Options中,讲Fixed Frame修改为 base_link。

  然后添加显示模型组件,在程序左下角有 Add Duplicate Remove Rename几个按钮,点击Add ,找到RobotModel选中并点击确定。这个时候就可以看到我们创建的模型了。

  

  再点击Add 选择TF并添加。就可以看到模型中有5个TF坐标显示。我们可以在另一个窗口Joint State Publisher 中来控制轮子的角度。

  

  至此,我们已经可以看到我们的模型了。我们可以将RVIZ此时配置保存起来,那么在下次打开的时候就和我们现在看到的一样,不用在手动去添加tf、robotmodel了。在rviz中按Ctrl+S即可完成保存。

改进URDF模型,使用xacro模型文件

  在urdf文件中,我们发现有大量的代码重复,且参数修改麻烦,不便于二次开发,没有参数计算等功能。那么我们换成以一种形式 xacro。

  在使用xacro模型文件中,我们可以使用xacro模型解析器,也可以生成udrf文件来使用。

  我们先创建一个xacro文件 mwRobot_Mainpart.xacro文件。此文件将会包含机器人主体部分,不包含传感器等。

  以下是mwRobot_Mainpart.xacro的内容:

<?xml version="1.0" ?>
<robot name="mwRobot" xmlns:xacro="http://www.ros.org/wiki/xacro"> <!-- No Chinese annotations exist. --> <!-- PROPERTY LIST -->
<xacro:property name="M_PI" value="3.1415926"/>
<xacro:property name="base_radius" value="0.20"/>
<xacro:property name="base_length" value="0.16"/> <xacro:property name="wheel_radius" value="0.06"/>
<xacro:property name="wheel_length" value="0.025"/>
<xacro:property name="wheel_joint_y" value="0.19"/>
<xacro:property name="wheel_joint_z" value="0.05"/> <xacro:property name="caster_radius" value="0.015"/> <!-- wheel_radius - ( base_length/2 - wheel_joint_z) -->
<xacro:property name="caster_joint_x" value="0.18"/> <!-- Defining the colors used in this robot -->
<material name="yellow">
<color rgba="1 0.4 0 1"/>
</material>
<material name="black">
<color rgba="0 0 0 0.95"/>
</material>
<material name="gray">
<color rgba="0.75 0.75 0.75 1"/>
</material> <xacro:macro name="wheel" params="prefix reflect">
<!-- The connection between the wheel and the main body -->
<joint name ="${prefix}_wheel_joint" type="continuous">
<origin xyz="0 ${reflect*wheel_joint_y} ${-wheel_joint_z}" rpy="0 0 0" />
<parent link="base_link"/>
<child link="${prefix}_wheel_link"/>
<axis xyz="0 1 0"/>
</joint> <!-- The definition of the wheel -->
<link name="${prefix}_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
<geometry>
<cylinder length="${wheel_radius}" radius="${wheel_length}"/>
</geometry>
<material name="gray"/>
</visual>
</link>
</xacro:macro> <xacro:macro name="caster" params="prefix reflect">
<!-- Joint of universal wheel and main body -->
<joint name ="${prefix}_caster_joint" type="continuous">
<origin xyz="${reflect*caster_joint_x} 0 ${-(base_length/2+caster_radius)}" rpy="0 0 0" />
<parent link="base_link"/>
<child link="${prefix}_caster_link"/>
<axis xyz="0 1 0"/>
</joint> <!-- Definition of universal wheel -->
<link name="${prefix}_caster_link">
<visual>
<origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
<geometry>
<sphere radius="${caster_radius}"/>
</geometry>
<material name="black"/>
</visual>
</link>
</xacro:macro> <!-- Robot main body -->
<xacro:macro name="mwRobot_MainPart"> <!-- The joints between robots and his shadow -->
<joint name="base_footprint_joint" type="fixed">
<origin xyz="0 0 ${base_length/2 + caster_radius*2}" rpy="0 0 0" />
<parent link="base_footprint"/>
<child link="base_link" />
</joint> <!-- Projection of robot body on the ground -->
<link name="base_footprint">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.001 0.001 0.001" />
</geometry>
</visual>
</link> <link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<cylinder length="${base_length}" radius="${base_radius}"/>
</geometry>
<material name="yellow"/>
</visual>
</link> <wheel prefix="left" reflect="-1"/>
<wheel prefix="right" reflect="1"/> <caster prefix="front" reflect="-1"/>
<caster prefix="back" reflect="1"/> </xacro:macro> </robot>

 上面文件中,定义了机器人的地盘结构,但是我们的机器人也有可能添加双目相机、激光雷达等传感器,这些传感器大多分开写成一个xacro文件,所以我们还需要一个文件把一个机器人的各个模块组合起来。这里我新建一个 mwRobot_CompleteModel.xacro文件来处理这个事儿。

  mwRobot_CompleteModel.xacro文件内容如下:

<?xml version="1.0"?>
<robot name="wmRobot" xmlns:xacro="http://www.ros.org/wiki/xacro"> <xacro:include filename="$(find mwRobot_description)/urdf/mwRobot_Mainpart.xacro" /> <mwRobot_MainPart/> </robot>

  下面,我们就要修改launch文件来启动加载我们的模型文件了。这里我用的是xacro模型解析器。

  复制原来的launch文件,并重命名为 display_mwRobot_CompleteModel.launch ,然后修改其中的代码:

<!-- 利用urdf建立模型 -->
<launch>
<arg name="model" default="$(find xacro)/xacro --inorder '$(find mwRobot_description)/urdf/mwRobot_CompleteModel.xacro'"/>
<param name="robot_description" command="$(arg model)" /> <!-- 显示关节控制插件,可以使关节回到中心位置也能设置关节为随机角度 -->
<param name="use_gui" value="true" /> <!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<node name="joint_state_publisher_mwRobot" pkg="joint_state_publisher" type="joint_state_publisher" /> <!-- 运行robot_state_publisher节点,将机器人各个links、joints之间的关系通过tf发布 -->
<node name="mwRobot_state_publisher_mwRobot" pkg="robot_state_publisher" type="state_publisher" /> <!-- 运行rviz可视化界面 -->
<node name="mwRobot_rviz" pkg="rviz" type="rviz" args="-d $(find mwRobot_description)/config/mwRobot_urdf.rviz" required="true"/> </launch>

  保存,然后启动程序。

    roslaunch mwRobot_description display_mwRobot_CompleteModel.launch
  rviz启动后应该就可以看到模型了,和我们之前用urdf创建的是一样的。(有些误差,因为修改了两个轮子的参数)

  如果不能看到模型先看看左侧的RVIZ设置是不是正确的。

  下面是我打开的界面:

  

  这样,我们的一个机器人模型就创建好了,大家可以自行修改参数来设计一个自己喜欢的机器人。

  本节工程已经上传,代号为V3.

【探索之路】机器人篇(3)-给mwRobot建立模型的更多相关文章

  1. entity framework 新手入门篇(1)-建立模型

    entity framework是微软官方免费提供给大家的一套ORM(Object Relational Mapping对象关系映射)解决方案.它不仅可以帮助我们解决数据缓存的问题,还能在最小的开销下 ...

  2. 【探索之路】机器人篇(5)-Gazebo物理仿真环境搭建_让机器人运动起来

    如果完成了前两步,那么其实我们已经可以去连接我们的现实中的机器人了. 但是,做机器人所需要的材料还没有到,所以我们这里先在电脑平台上仿真一下.这里我们用到的就算gazebo物理仿真环境,他能很好的和R ...

  3. 《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高?

    能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! <[面试突击]— Redis篇>-- Redis的线程模型了解吗?为啥单线程效率还这 ...

  4. 微服务探索之路02篇liunx ubuntu服务器部署k8s(kubernetes)-kubernetes/dashboard

    本章介绍所需环境:ubuntu18.04,建立在上一篇微服务探索之路01篇已经安装了docker的基础上. 1 替换k8s镜像源为国内镜像 进入目录 cd /etc/apt/sources.list. ...

  5. 揭秘Keras推荐系统如何建立模型、获取用户爱好

    你是否有过这样的经历?当你在亚马逊商城浏览一些书籍,或者购买过一些书籍后,你的偏好就会被系统学到,系统会基于一些假设为你推荐相关书目.为什么系统会知道,在这背后又藏着哪些秘密呢? 荐系统可以从百万甚至 ...

  6. django模型:为已存在的表建立模型

    为已经存在的表建立模型:参考https://blog.csdn.net/opera95/article/details/78200024 为已经存在的表建立模型1.python manage.py i ...

  7. 2016级算法第一次练习赛-F.AlvinZH的儿时梦想——机器人篇

    864 AlvinZH的儿时梦想----机器人篇 题目链接:https://buaacoding.cn/problem/868/index 思路 中等题. 判断无限玩耍: \(p\) 的值能够承担的起 ...

  8. pytorch 建立模型的几种方法

    利用pytorch来构建网络模型,常用的有如下三种方式 前向传播网络具有如下结构: 卷积层-->Relu层-->池化层-->全连接层-->Relu层 对各Conv2d和Line ...

  9. 中文代码之Django官方入门:建立模型

    参考编写你的第一个 Django 应用,第 2 部分 创建项目后,首先用中文命名应用: $ python3 manage.py startapp 投票 之后在models.py建立模型,其他各种相关配 ...

随机推荐

  1. 关于你天天见到的JDK、JRE和JVM

    什么是JDK.JRE.JVM? 大家都知道电脑的操作系统是由汇编和C语言写出,因此操作系统无法直接识别其他语言.这时我们就需要为我们写的Java程序配备一名翻译官 ----- 编译环境,将Java程序 ...

  2. 第一次UML作业

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE2/ 这个作业要求在哪里 https://edu.cnblogs.com/campus/f ...

  3. 【NOIP2015模拟11.2晚】JZOJ8月4日提高组T2 我的天

    [NOIP2015模拟11.2晚]JZOJ8月4日提高组T2 我的天 题目 很久很以前,有一个古老的村庄--xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着 ...

  4. 区块链学习7:超级账本项目Hyperledger与Fabric以及二者的关系

    ☞ ░ 前往老猿Python博文目录 ░ 一.超级账本(hyperledger) 超级账本(hyperledger)是Linux基金会于2015年发起的推进区块链数字技术和交易验证的开源项目,成员包括 ...

  5. PyQt(Python+Qt)学习随笔:QAbstractItemView的verticalScrollMode和horizontalScrollMode属性

    老猿Python博文目录 老猿Python博客地址 一.概述 verticalScrollMode和horizontalScrollMode属性用于控制视图如何在垂直方向和水平方向滚动内容.滚动可以按 ...

  6. PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的按钮改变缺省文字的方法

    在Qt Designer中可以预先定义标准按钮,相关支持的标准按钮请见<PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的StandardButton ...

  7. 分布式文件系统HDFS-部署和配置

    1 部署HDFS HDFS的基本操作可以分为集群管理和文件系统操作两种类型: 集群管理:包括Namenodede 的格式化.集群的启动和停止.集群信息查看等. 文件系统:包括对目录.文件和权限等内容的 ...

  8. Day6 Scrum 冲刺博客

    一.站立式会议# 1. 会议照片 2. 工作进度+燃尽图  团队成员 昨日完成工作  今日工作计划 遇到的困难  周梓波  将方块旋转变形  添加键盘监听事件  不熟悉监听事件的操作  纪昂学  左右 ...

  9. 数组的翻转(非reverse)

    var arr = [1, 5, 8, 9, 6, 3]; var arr2 = []; while (arr.length) { var temp = arr.pop(); arr2.push(te ...

  10. 一文看懂 Kubernetes 服务发现: Service

    Service 简介   K8s 中提供微服务的实体是 Pod,Pod 在创建时 docker engine 会为 pod 分配 ip,"外部"流量通过访问该 ip 获取微服务.但 ...