一.创建一个差速驱动移动机器人模型

前面我们已经创建了一个7-DOF机械臂机器人模型,接下来我们将创建一个差速机器人模型,差速轮式机器人在机器人底盘的两端安装两个轮子,

整个底盘由一个或两个脚轮支撑。轮子将通过调节速度来控制机器人的移动速度,如果两个马达以相同的速度运行,轮子会向前或者向后移动。

如果一个轮子的速度比另一个轮子慢,机器人就会偏向低速的那一边。

差速机器人由5个关节和5个连杆,两个主要的关节将轮子连接到机器人上。其余3个是固定关节,2个用于经支撑脚轮连接到机器人主体上,1个

用于将底盘连接到机器人主体上。

差速机器人的连杆与关节连接图如下:

接下来我们来解析差速机器人的代码,文件为:diff_wheeled_robot.xacro

机器人被命名为differential_wheeled_robot,还包含一个名为wheel.urdf.xacro的URDF文件。xacro文件包含轮子的定义及其传动方式。

如果我们使用该xacro文件,就可以避免为两个轮子写两套定义,因为两个轮子在形状和大小上是相同的,我们采用xacro的定义:

  1 <?xml version="1.0"?>
2 <robot name="differential_wheeled_robot" xmlns:xacro="http://ros.org/wiki/ xacro">
3
4 <xacro:include filename="$(find mastering_ros_robot_description_pkg)/urd f/wheel.urdf.xacro" />

轮子的定义在wheel.urdf.xacro中给出。我们可以指定轮子是否必须放在左边、右边、前面或后面。使用这个宏,我们最多可以创建4个轮子,但目前我们只需要两个:

19   <xacro:macro name="wheel" params="fb lr parent translateX translateY flipY"> <!--   fb : front, back ; lr: left, right -->
20 <link name="${fb}_${lr}_wheel">

我们还指定了仿真所需的Gazebo参数。这里提到的是与轮子相关的Gazebo参数。我们可以用gazeboreference标签说明摩擦系数和刚度系数:

41     <gazebo reference="${fb}_${lr}_wheel">
42 <mu1 value="1.0"/>
43 <mu2 value="1.0"/>
44 <kp value="10000000.0" />
45 <kd value="1.0" />
46 <fdir1 value="1 0 0"/>
47 <material>Gazebo/Grey</material>
48 <turnGravityOff>false</turnGravityOff>
49 </gazebo>

我们为轮子定义的关节是连续转动关节,因为在轮子关节中没有任何限值,这里的parent link是机器人底盘,child link是每个轮子:

51     <joint name="${fb}_${lr}_wheel_joint" type="continuous">
52 <parent link="${parent}"/>
53 <child link="${fb}_${lr}_wheel"/>
54 <origin xyz="${translateX * base_x_origin_to_wheel_origin} ${translateY * bas e_y_origin_to_wheel_origin} ${base_z_origin_to_wheel_origin}" rpy="0 0 0" />

我们还需要设定每个轮子的transmission标签。该轮子的宏定义如下:

60     <!-- Transmission is important to link the joints and the controller -->
61 <transmission name="${fb}_${lr}_wheel_joint_trans">
62 <type>transmission_interface/SimpleTransmission</type>
63 <joint name="${fb}_${lr}_wheel_joint" />
64 <actuator name="${fb}_${lr}_wheel_joint_motor">
65 <hardwareInterface>EffortJointInterface</hardwareInterface>
66 <mechanicalReduction>1</mechanicalReduction>
67 </actuator>
68 </transmission>
69
70 </xacro:macro>
71 </robot>

在diff_wheeled_robot.xacro中,我们可以用以下命令来使用wheel.urdf.xacro中定义的宏:

241   <wheel fb="front" lr="right" parent="base_link" translateX="0" translateY="0.5"     flipY="1"/>
242 <wheel fb="front" lr="left" parent="base_link" translateX="0" translateY="-0.5" flipY="1"/>

使用前面的几行代码,我们定义了机器人底盘的左侧和右侧的轮子。机器人底盘是圆柱形的。

下面给出了惯性计算的宏定义,xacro代码段将使用圆柱的质量、半径和高度来计算惯性张量,代码如下:

72   <!-- Macro for calculating inertia of cylinder -->
73 <xacro:macro name="cylinder_inertia" params="m r h">
74 <inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
75 iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
76 izz="${m*r*r/2}" />
77 </xacro:macro>

下面给出了启动文件的定义,可用于在RViz中显示该机器人模型。启动文件命名为view_mobile_robot.launch:

 1 <launch>
2 <arg name="model" />
3 <!-- Parsing xacro and setting robot_description parameter -->
4 <param name="robot_description" command="$(find xacro)/xacro --inorder $(find m astering_ros_robot_description_pkg)/urdf/diff_wheeled_robot.xacro" />
5 <!-- Setting gui parameter to true for display joint slider -->
6 <param name="use_gui" value="true"/>
7 <!-- Starting Joint state publisher node which will publish the joint values -- >
8 <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_stat e_publisher" />
9 <!-- Starting robot state publish which will publish tf -->
10 <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publ isher" />
11 <!-- Launch visualization in rviz -->
12 <node name="rviz" pkg="rviz" type="rviz" args="-d $(find mastering_ros_robot_de scription_pkg)/urdf.rviz" required="true" />
13 </launch>

与机械臂URDF文件相比较,唯一区别是名称不同,其他部分都是一样的。

我们用以下命令查看移动机器人:

$roslaunch mastering_ros_robot_description_pkg view_mobile_robot.launch

机器人如下:

ROS中3D机器人建模(五)的更多相关文章

  1. ROS中3D机器人建模(四)

    一.创建一个7-DOF机械臂机器人 创建一个名为seven_dof_arm.xacro的文件,写入相应的代码,其关节名称如下: bottom_joint shoulder_pan_joint shou ...

  2. ROS中3D机器人建模(一)

    一,机器人建模的ROS软件包 *urdf : 机器人建模最重要的ros软件包是urdf软件包.这个软件包包含一个用于统一机器人描述格式(URDF)的C++解析器,它是一个表示机器人模型的XML文件,还 ...

  3. ROS中测试机器人里程计信息

    在移动机器人建图和导航过程中,提供相对准确的里程计信息非常关键,是后续很多工作的基础,因此需要对其进行测试保证没有严重的错误或偏差.实际中最可能发生错误的地方在于机器人运动学公式有误,或者正负号不对, ...

  4. ROS中的3D建模机器人(三)

    一.利用xacro理解机器人建模 当我们创建复杂的机器人模型时,URDF的灵活性将会降低,URDF缺少的主要特性是简单的.可重用性,模块化和可编程性. URDF是一个单独的文件我们不能在它里面包含其他 ...

  5. ROS中的3D机器人建模(二)

    一,创建我们的第一个URDF模型 我们设计的第一个机器人模型是pan-and-tilt机械结构,代码如下 pan_tilt.urdf: 1 <?xml version="1.0&quo ...

  6. 机器人操作系统(ROS)教程22:ROS的3D可视化工具—rviz

    rviz是ROS中的一个3D可视化工具,有了它就可以把你用代码建的机器人模型转化为可视的3D模型. 首先需要安装: rosdep install rviz 然后编译rviz: rosmake rviz ...

  7. ROS_Kinetic_07 ROS中机器人三维物理引擎高保真仿真利器gazebo 7.0

    ROS_Kinetic_07 ROS中机器人三维物理引擎高保真仿真利器gazebo 7.0 ROS kinetic中的gazebo版本是7.0,有很多新的特性. 首先,启动gazebo: ~$ gaz ...

  8. 对比几种在ROS中常用的几种SLAM算法

    在此因为要总结写一个文档,所以查阅资料,将总结的内容记录下来,欢迎大家指正! 文章将介绍使用的基于机器人操作系统(ROS)框架工作的SLAM算法. 在ROS中提供的五种基于2D激光的SLAM算法分别是 ...

  9. ROS学习笔记十二:使用gazebo在ROS中仿真

    想要在ROS系统中对我们的机器人进行仿真,需要使用gazebo. gazebo是一种适用于复杂室内多机器人和室外环境的仿真环境.它能够在三维环境中对多个机器人.传感器及物体进行仿真,产生实际传感器反馈 ...

随机推荐

  1. OpenVINO 入门

    关于OpenVINO 入门,今天给大家分享一个好东西和好消息! 现如今,说人工智能(AI)正在重塑我们的各行各业绝不虚假,深度学习神经网络的研究可谓如火如荼, 但这一流程却相当复杂,但对于初学者来说也 ...

  2. [NoSQL] 从模型关系看 Mongodb 的选择理由

    往期:Mongodb攻略 回顾 Mongodb 与关系型数据库的对应关系: MySQL   MongoDB database(数据库) database(数据库) table(表) collectio ...

  3. Spring中常见的设计模式——代理模式

    一.代理模式的应用场景 生活中的中介,黄牛,等一系列帮助甲方做事的行为,都是代理模式的体现.代理模式(Proxy Pattern)是指为题对象提供一种代理,以控制对这个对象的访问.代理对象在客户端和目 ...

  4. 通俗易懂理清mybatis中SqlSessionSql、SqlSessionTemplate、SessionFactory和SqlSessionFactoryBean之间的关系

    我潇洒的灰大狼又回来啦.今天送大家的一句话是: 保持耐心,永远年轻,永远热泪盈眶. 前言 先容我哭一会儿,呜呜呜~昨晚写了一半的文章,还没保存就盖上盖子准备回家,拔下电源准备把电脑塞进书包带回家完成时 ...

  5. 应届生/社招面试最爱问的几道Java基础问题

    本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb ([Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识)如果觉得不错 ...

  6. linux下安装OpenCV-2.4

    OpenCV(Open Source Computer Vision Library),是一个跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV由一系列 C 函数和少量 ...

  7. 2019年全网最热门的123个Java并发面试题总结

    前言 并发编程几乎是所有互联网公司面试必问的问题,并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能.它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰.思维缜密, ...

  8. jdk1.7扩容时,不论是否有链表,并发都可能出现循环链表

    扩容时使用transfertransfer不同于put时的判断hash冲突,直接使用头插法,如果没有冲突,则next为null.如下:e.next = newTable[i];newTable[i] ...

  9. [JavaScript设计模式]惰性单例模式

    惰性单例模式 之前介绍了JS中类的单例模式,这次我们讨论下单例模式的应用.在众多网站中,登录框的实现方式就是一个单例,点击一次就展示一次,所以我们可以在页面加载好的时候就创建一个登录框,点击页面上的登 ...

  10. Sentinel :微服务哨兵

    1. Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性. Sentin ...