zoukankan      html  css  js  c++  java
  • 机器人系统仿真(八)——xacro小车底盘模型案例

    参考视频:【奥特学园】ROS机器人入门课程《ROS理论与实践》零基础教程_哔哩哔哩_bilibili

    参考文档:http://www.autolabor.com.cn/book/ROSTutorials/

    需求描述:

    使用 Xacro 优化 URDF 版的小车底盘模型实现

    结果演示:

    1.编写 Xacro 文件

    <!--
        使用 xacro 优化 URDF 版的小车底盘实现:
    
        实现思路:
        1.将一些常量、变量封装为 xacro:property
          比如:PI 值、小车底盘半径、离地间距、车轮半径、宽度 ....
        2.使用 宏 封装驱动轮以及支撑轮实现,调用相关宏生成驱动轮与支撑轮
    
    -->
    <!-- 根标签,必须声明 xmlns:xacro -->
    <robot name="my_base" xmlns:xacro="http://www.ros.org/wiki/xacro">
        <!-- 封装变量、常量 -->
        <xacro:property name="PI" value="3.141"/>
        <!-- 宏:黑色设置 -->
        <material name="black">
            <color rgba="0.0 0.0 0.0 1.0" />
        </material>
        <!-- 底盘属性 -->
        <xacro:property name="base_footprint_radius" value="0.001" /> <!-- base_footprint 半径  -->
        <xacro:property name="base_link_radius" value="0.1" /> <!-- base_link 半径 -->
        <xacro:property name="base_link_length" value="0.08" /> <!-- base_link 长 -->
        <xacro:property name="earth_space" value="0.015" /> <!-- 离地间距 -->
    
        <!-- 底盘 -->
        <link name="base_footprint">
          <visual>
            <geometry>
              <sphere radius="${base_footprint_radius}" />
            </geometry>
          </visual>
        </link>
    
        <link name="base_link">
          <visual>
            <geometry>
              <cylinder radius="${base_link_radius}" length="${base_link_length}" />
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <material name="green">
              <color rgba="0.3 0.5 0.0 0.5" />
            </material>
          </visual>
        </link>
    
        <joint name="base_link2base_footprint" type="fixed">
          <parent link="base_footprint" />
          <child link="base_link" />
          <origin xyz="0 0 ${earth_space + base_link_length / 2 }" />
        </joint>
    
        <!-- 驱动轮 -->
        <!-- 驱动轮属性 -->
        <xacro:property name="wheel_radius" value="0.0325" /><!-- 半径 -->
        <xacro:property name="wheel_length" value="0.015" /><!-- 宽度 -->
        <!-- 驱动轮宏实现 -->
        <xacro:macro name="add_wheels" params="name flag">
          <link name="${name}_wheel">
            <visual>
              <geometry>
                <cylinder radius="${wheel_radius}" length="${wheel_length}" />
              </geometry>
              <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
              <material name="black" />
            </visual>
          </link>
    
          <joint name="${name}_wheel2base_link" type="continuous">
            <parent link="base_link" />
            <child link="${name}_wheel" />
            <origin xyz="0 ${flag * base_link_radius} ${-(earth_space + base_link_length / 2 - wheel_radius) }" />
            <axis xyz="0 1 0" />
          </joint>
        </xacro:macro>
        <xacro:add_wheels name="left" flag="1" />
        <xacro:add_wheels name="right" flag="-1" />
        <!-- 支撑轮 -->
        <!-- 支撑轮属性 -->
        <xacro:property name="support_wheel_radius" value="0.0075" /> <!-- 支撑轮半径 -->
    
        <!-- 支撑轮宏 -->
        <xacro:macro name="add_support_wheel" params="name flag" >
          <link name="${name}_wheel">
            <visual>
                <geometry>
                    <sphere radius="${support_wheel_radius}" />
                </geometry>
                <origin xyz="0 0 0" rpy="0 0 0" />
                <material name="black" />
            </visual>
          </link>
    
          <joint name="${name}_wheel2base_link" type="continuous">
              <parent link="base_link" />
              <child link="${name}_wheel" />
              <origin xyz="${flag * (base_link_radius - support_wheel_radius)} 0 ${-(base_link_length / 2 + earth_space / 2)}" />
              <axis xyz="1 1 1" />
          </joint>
        </xacro:macro>
    
        <xacro:add_support_wheel name="front" flag="1" />
        <xacro:add_support_wheel name="back" flag="-1" />
    
    </robot>

    2.集成launch文件

    方式1:先将 xacro 文件转换出 urdf 文件,然后集成

    先将 xacro 文件解析成 urdf 文件:rosrun xacro xacro xxx.xacro > xxx.urdf然后再按照之前的集成方式直接整合 launch 文件,内容示例:

    <launch>
        <!--1.在参数服务器中载入urdf-->
        <param name="robot_description" textfile="$(find urdf01_rviz)/urdf/xacro/demo05_car_base.urdf" />
    
        <!--2.启动rviz-->
        <node pkg="rviz" name="rviz" type="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz"/>
    
        <!--3.关节状态发布节点-->
        <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher"/>
        <!--4.机器人状态发布节点-->
        <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher"/>
        <!--5.添加控制关节运动的节点-->
        <node pkg="joint_state_publisher_gui"  type="joint_state_publisher_gui"  name="joint_state_publisher_gui" />
    </launch>

    输入命令运行:

    cys@ubuntu:~/demo05_ws$ source ./devel/setup.bash
    cys@ubuntu:~/demo05_ws$ roslaunch urdf01_rviz demo06_car_base.launch 

    方式2:在 launch 文件中直接加载 xacro(建议使用)

    launch 内容示例:

    <launch>
        <!--1.在参数服务器中载入urdf-->
        <!--<param name="robot_description" textfile="$(find urdf01_rviz)/urdf/xacro/demo05_car_base.urdf" />-->
        <param name="robot_description" command="$(find xacro)/xacro  $(find urdf01_rviz)/urdf/xacro/demo05_car_base.urdf.xacro" />
        <!--2.启动rviz-->
        <node pkg="rviz" name="rviz" type="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz"/>
    
        <!--3.关节状态发布节点-->
        <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher"/>
        <!--4.机器人状态发布节点-->
        <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher"/>
        <!--5.添加控制关节运动的节点-->
        <node pkg="joint_state_publisher_gui"  type="joint_state_publisher_gui"  name="joint_state_publisher_gui" />
    </launch>

    核心代码:

    <param name="robot_description" command="$(find xacro)/xacro  $(find urdf01_rviz)/urdf/xacro/demo05_car_base.urdf.xacro" />

    加载 robot_description 时使用 command 属性,属性值就是调用 xacro 功能包的 xacro 程序直接解析 xacro 文件。

  • 相关阅读:
    CF 461B Appleman and Tree
    POJ 1821 Fence
    NOIP 2012 开车旅行
    CF 494B Obsessive String
    BZOJ2337 XOR和路径
    CF 24D Broken robot
    POJ 1952 BUY LOW, BUY LOWER
    SPOJ NAPTIME Naptime
    POJ 3585
    CF 453B Little Pony and Harmony Chest
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/15047996.html
Copyright © 2011-2022 走看看