ROS学习笔记15——Xacro

xacro 提供了可编程接口,类似于计算机语言,包括变量声明调用、函数声明与调用等语法实现。在使用 xacro 生成 urdf 时,根标签robot中必须包含命名空间声明:xmlns:xacro="http://wiki.ros.org/xacro"

1、属性和算术运算

用于封装 URDF 中的一些字段,比如: PAI 值,小车的尺寸,轮子半径 ....

1.1 属性定义

<xacro:property name="xxxx" value="yyyy" />

1.2 属性调用

${属性名称}

1.3 算术运算

${数学表达式}

2、宏

类似于函数实现,提高代码复用率,优化代码结构,提高安全性

2.1 宏定义

<xacro:macro name="宏名称" params="参数列表(参数不是必须的,多参数之间使用空格分隔)">

    .....

    参数调用格式: ${参数名}

</xacro:macro>

2.2 宏调用

<xacro:宏名称 参数1=xxx 参数2=xxx/>

3、文件包含

 机器人由多部件组成,不同部件可能封装为单独的 xacro 文件,最后再将不同的文件集成,组合为完整机器人,可以使用文件包含实现。

<robot name="xxx" xmlns:xacro="http://wiki.ros.org/xacro">
      <xacro:include filename="my_base.xacro" />
      <xacro:include filename="my_camera.xacro" />
      <xacro:include filename="my_laser.xacro" />
      ....
</robot>

4、例

/xacro

<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
    <xacro:property name="footprint_radius" value="0.001" />
    
    <!-- base_footprint link -->
    <link name="base_footprint">
        <visual>
            <geometry>
                <sphere radius="${footprint_radius}" />
            </geometry>
        </visual>
    </link>

    <!-- 
        形状:圆柱
        半径:0.1m
        高度:0.08m
        离地间距:0.015m
     -->
    <xacro:property name="base_radius" value="0.1" />
    <xacro:property name="base_length" value="0.08" />
    <xacro:property name="lidi" value="0.015" />
    <xacro:property name="base_joint_z" value="${base_length / 2 + lidi}" />
    
    <!-- 底盘link -->
    <link name="base_link">
        <visual>
            <geometry>
                <cylinder radius="${base_radius}" length="${base_length}" />
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <material name="base_link_color">
                <color rgba="0.3 0.5 0.2 0.5" />
            </material>
        </visual>    
    </link>
    <!-- 底盘link 和 base_footprint 之间的 joint -->
    <joint name="Base_linkToBase_footprint" type="fixed">
        <parent link="base_footprint" />
        <child link="base_link" />
        <!-- 关节z上的设置 = 车体高度/2 + 离地间距 -->
        <origin xyz="0 0 ${base_joint_z}" rpy="0 0 0" />
    </joint>

    <!-- 
        驱动轮
        形状:圆柱
        半径:0.035m
        长度:0.015m
     -->
    <xacro:property name="wheel_radius" value="0.0325" />
    <xacro:property name="wheel_length" value="0.015" />
    <xacro:property name="PI" value="3.1415927" />
    <xacro:property name="wheel_joint_z" value="${(-1)*(base_length / 2 + lidi - wheel_radius)}" />

    <!-- 
        wheel_name: left 或 right
        flag: 1 或 -1
     -->
    <xacro:macro name="wheel_func" params="wheel_name flag">

        <!-- 驱动轮 link -->
        <link name="${wheel_name}_wheel">
            <visual>
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_length}" />
                </geometry>
                <origin xyz="0 0 0" rpy="${PI / 2} 0 0" />
                <material name="${wheel_name}_wheel_color">
                    <color rgba="0.0 0.0 0.0 1.0" />
                </material>
            </visual>
        </link>
        
        <!-- 驱动轮 和 底盘 joint -->
        <joint name="${wheel_name}_wheelToBase_link" type="continuous">
            <parent link="base_link" />
            <child link="${wheel_name}_wheel" />
            <origin xyz="0 ${0.1 * flag} ${wheel_joint_z}" rpy="0 0 0" />
            <axis xyz="0 1 0" />
        </joint>

    </xacro:macro>

    <xacro:wheel_func wheel_name="left" flag="1" />
    <xacro:wheel_func wheel_name="right" flag="-1" />


    <!-- 添加万向轮 
        形状:球
        半径:0.0075m
    -->
    <!-- 万向支撑轮 link -->
    <xacro:property name="support_wheel_radius" value="0.0075" />
    <!-- 关节 z的偏移量 = 车体高度 / 2 + 离地间距 - 万向轮半径 -->
    <xacro:property name="support_joint_z" value="${base_length / 2 + lidi - support_wheel_radius}" />
    <xacro:property name="support_joint_x" value="0.0925" />

    <!-- 
        wheel_name: front 或 back
        flag: 1 或 -1
     -->
    <xacro:macro name="support_wheel_func" params="support_wheel_name flag" >
        <link name="${support_wheel_name}_wheel">
            <visual>
                <geometry>
                    <sphere radius="${support_wheel_radius}" />
                </geometry>
                <origin xyz="0 0 0" rpy="0 0 0" />
                <material name="${support_wheel_name}_wheel_color">
                    <color rgba="0.0 0.0 0.0 1.0" />
                </material>
            </visual>
        </link>
        <!-- 万向支撑轮前 和 底盘 joint -->
        <joint name="${support_wheel_name}_wheelToBase_link" type="continuous">
            <parent link="base_link" />
            <child link="${support_wheel_name}_wheel" />
            <origin xyz="${0.0925 * flag} 0 ${-1 * support_joint_z}" />
            <axis xyz="1 1 1" />
        </joint>
    
    </xacro:macro>

    <xacro:support_wheel_func support_wheel_name="front" flag="1" />
    <xacro:support_wheel_func support_wheel_name="back" flag="-1" />

</robot>

 launch

 <launch>
    <!-- <param name="robot_description" textfile="$(find urdf01_rviz)/urdf/xacro/demo03_car_base.urdf" /> -->
    <!-- xacro 和 launch 集成 -->
    <param name="robot_description" command="$(find xacro)/xacro $(find urdf01_rviz)/urdf/xacro/demo03_car_base.urdf.xacro" />
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz" />

    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" />
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />

    <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
</launch>

<think>好的,我现在需要帮助用户寻找关于ROS学习资料或笔记。用户提到了ROS学习教程、笔记以及开源机器人操作系统相关的资料。我需要结合提供的引用内容来回答,并且按照系统级指令的要求来组织内容。 首先,我需要回顾用户提供的四个引用内容: 引用1和2介绍了ROS的基本概念和用途,提到它是一个开源的软件框架,用于机器人软件开发,适用于多节点多任务的场景,应用广泛。 引用3提到仿真机器人gazebo和开源功能包,这可能涉及到ROS的仿真工具和学习资源。 引用4提到了在Ubuntu系统上运行程序时需要注意的权限问题,比如使用chmod命令,这可能与ROS环境配置相关。 接下来,用户需要学习资料和笔记。我需要根据这些引用内容,推荐相关的资源,并确保回答结构清晰,分步骤说明。 可能需要包括以下几个方面: 1. 官方文档和教程:ROS官网的教程是基础,适合入门。 2. 书籍推荐:结合引用中的内容,可能有相关书籍。 3. 开源项目和实践平台:如Gazebo仿真环境,结合引用3提到的内容。 4. 社区和论坛:如ROS Answers、GitHub等,用户可能在这里找到笔记和解决方案。 5. 注意事项:比如系统权限问题,引用4提到的chmod命令,需要在学习过程中注意。 需要确保回答中引用的每个部分都正确标注引用标识,例如[^1]、[^2]等。同时,根据用户要求生成相关问题,这些问题应该与ROS学习资料相关,帮助用户进一步探索。 现在需要组织这些信息,用清晰的结构分点说明,并且使用正确的LaTeX格式,虽然用户的问题中没有数学公式,但如果有的话需要按照规则处理。但在这个回答中可能不需要数学公式,所以主要注意中文回答和相关问题生成。 最后,检查是否符合所有系统级指令,特别是引用标注的位置是否正确,是否有生成相关问题,以及回答结构是否合理。</think>以下是关于ROS学习资料及笔记的整理和推荐: ### 1. **ROS官方文档与教程** - **核心内容**:ROS官方提供了完整的入门指南和进阶教程,涵盖节点通信、消息格式、工具链使用等基础内容[^2]。 - **学习路径**: 1. 安装ROS(推荐Ubuntu系统,注意权限设置[^4])。 2. 学习`roscore`、`rosnode`、`rostopic`等核心命令。 3. 实践消息发布/订阅、服务调用等基础通信模型。 --- ### 2. **推荐书籍与开源项目** - **书籍**: - *《ROS机器人编程实践》*:结合仿真工具Gazebo[^3],讲解机器人建模与算法实现。 - *《A Gentle Introduction to ROS》*:适合初学者的开源电子书。 - **开源项目**: - **TurtleBot3**:入门级移动机器人平台,配套教程详细。 - **MoveIt!**:机械臂运动规划框架,提供丰富的案例[^3]。 --- ### 3. **仿真工具与实战平台** - **Gazebo**:ROS官方推荐的仿真环境,支持多种机器人模型(如无人机、无人车)[^3]。 - **实践建议**: ```bash # 安装Gazebo与ROS插件 sudo apt-get install ros-<distro>-gazebo-ros-pkgs ``` - 通过仿真实验验证SLAM、路径规划等算法。 --- ### 4. **社区资源与学习笔记** - **ROS Answers**:官方问答社区,可搜索常见问题(如权限错误)。 - **GitHub仓库**:搜索`ROS学习笔记`或`ROS Tutorial`,许多开发者分享代码与配置示例。 - **博客与视频**: - 知乎专栏“ROS从入门到放弃”提供避坑指南。 - YouTube频道“The Construct”提供免费ROS课程。 --- ### 5. **关键注意事项** - **系统权限**:在Ubuntu中运行ROS节点时,需使用`chmod +x`赋予可执行权限[^4]。 - **版本兼容性**:ROS 1(Noetic)与ROS 2(Foxy)差异较大,需明确学习目标版本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值