ROS中新建机器人模型(.xacro)并用rviz显示

本文介绍如何在ROS环境中使用.xacro文件定义机器人模型,并通过rviz进行可视化展示。内容涵盖创建ROS包、编辑.xacro及.launch文件,以及设置环境变量等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在很多情况下,ROS对urdf文件的支持并不是很好,使用宏定义的.xacro文件兼容性更好,扩展性也更好。而且urdf文件的语法比较复杂,代码太多。用.xacro文件表示模型更加简洁。

ROS中新建机器人模型(.xacro)并用rviz显示
步骤:
(1)新建包
(2)在包中新建并编辑.xacro文件
(3)在包中新建并编辑.launch文件
(4)使用rviz显示模型

1.新建包并配置全局变量

1)cd到~/dev/workspace/目录,使用命令创建包工作区roscreate-pkg myrobot urdf xacro
2)将包的工作区赋值给ROS-_PACKAGE_PATH变量

vim /root/.bashrc

在文件末尾加入
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/dev/workspace/myrobot
source /root/.bashrc
注意,环境变量很重要,一定要加入进去,否则包不能运行

2新建并编辑.xacro文件如下

新建文件夹mkdir urdf
在urdf文件夹下新建文件robot1_base.xacro
内容如下:

<?xml version="1.0"?>

<robot xmlns:xacro="http://www.ros.org/wiki/xacro" 
    xmlns:sensor="http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor"
        xmlns:controller="http://playerstage.sourceforge.net/gazebo/xmlschema/#controller"
        xmlns:interface="http://playerstage.sourceforge.net/gazebo/xmlschema/#interface"
    name="robot0">


    <xacro:property name="length_wheel" value="0.05" />
    <xacro:property name="radius_wheel" value="0.05" />
    <xacro:macro name="default_inertial" params="mass">
               <inertial>
                       <mass value="${mass}" />
                       <inertia ixx="1.0" ixy="0.0" ixz="0.0"
                                iyy="1.0" iyz="0.0"
                                izz="1.0" />
               </inertial>
    </xacro:macro>

    <link name="base_footprint">
        <visual>
            <geometry>
                    <box size="0.001 0.001 0.001"/>
                </geometry>
            <origin rpy="0 0 0" xyz="0 0 0"/>
        </visual>
        <xacro:default_inertial mass="0.0001"/>
    </link>

    <gazebo reference="base_footprint">
        <material>Gazebo/Green</material>
        <turnGravityOff>false</turnGravityOff>
    </gazebo>

    <joint name="base_footprint_joint" type="fixed">
        <origin xyz="0 0 0" />
        <parent link="base_footprint" />
        <child link="base_link" />
    </joint>


    <link name="base_link">
        <visual>
            <geometry>
                    <box size="0.2 .3 .1"/>
                </geometry>
            <origin rpy="0 0 1.54" xyz="0 0 0.05"/>
            <material name="white">
                <color rgba="1 1 1 1"/>
            </material>
        </visual>
        <collision>
            <geometry>
                    <box size="0.2 .3 0.1"/>
            </geometry>
        </collision>
        <xacro:default_inertial mass="10"/>
    </link>

    <link name="wheel_1">
        <visual>
                <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
                </geometry>
            <!-- <origin rpy="0 1.5 0" xyz="0.1 0.1 0"/> -->
            <origin rpy="0 0 0" xyz="0 0 0"/>
            <material name="black">
                <color rgba="0 0 0 1"/>
            </material>
        </visual>
        <collision>
            <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
            </geometry>
        </collision>
        <xacro:default_inertial mass="1"/>
    </link>

    <link name="wheel_2">
        <visual>
                <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
                </geometry>
            <!-- <origin rpy="0 1.5 0" xyz="-0.1 0.1 0"/> -->
            <origin rpy="0 0 0" xyz="0 0 0"/>
            <material name="black"/>
        </visual>
        <collision>
            <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
            </geometry>
        </collision>
        <xacro:default_inertial mass="1"/>

    </link>

    <link name="wheel_3">
        <visual>
                <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
                </geometry>
            <!-- <origin rpy="0 1.5 0" xyz="0.1 -0.1 0"/> -->

            <origin rpy="0 0 0" xyz="0 0 0"/>
            <material name="black"/>
        </visual>
        <collision>
            <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
            </geometry>
        </collision>
        <xacro:default_inertial mass="1"/>
    </link>

    <link name="wheel_4">
        <visual>
                <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
                </geometry>
        <!--    <origin rpy="0 1.5 0" xyz="-0.1 -0.1 0"/> -->
            <origin rpy="0 0 0" xyz="0 0 0" />
            <material name="black"/>
        </visual>
        <collision>
            <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
            </geometry>
        </collision>
        <xacro:default_inertial mass="1"/>

    </link>



 <joint name="base_to_wheel1" type="continuous">
   <parent link="base_link"/>
   <child link="wheel_1"/>
   <origin rpy="1.5707 0 0" xyz="0.1 0.15 0"/>
   <axis xyz="0 0 1" />
 </joint>

 <joint name="base_to_wheel2" type="continuous">
   <axis xyz="0 0 1" />
   <anchor xyz="0 0 0" />
   <limit effort="100" velocity="100" />
   <parent link="base_link"/>
   <child link="wheel_2"/>
   <origin rpy="1.5707 0 0" xyz="-0.1 0.15 0"/>
</joint>

 <joint name="base_to_wheel3" type="continuous">
   <parent link="base_link"/>
   <axis xyz="0 0 1" />
   <child link="wheel_3"/>
   <origin rpy="1.5707 0 0" xyz="0.1 -0.15 0"/>
 </joint>

 <joint name="base_to_wheel4" type="continuous">
   <parent link="base_link"/>
   <axis xyz="0 0 1" />
   <child link="wheel_4"/>
   <origin rpy="1.5707 0 0" xyz="-0.1 -0.15 0"/>
 </joint>
</robot>

3.新建并编辑.launch脚本文件

a)在工程文件夹下新建文件夹mkdir launch
b)新建文件display_xacro.launch并编辑如下

<launch>
        <arg name="model" />
        <arg name="gui" default="False" />
        <param name="robot_description" command="$(find xacro)/xacro.py $(find myrobot)/urdf/robot1_base.xacro" />
        <param name="use_gui" value="$(arg gui)"/>
        <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
        <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
        <node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.rviz" />
</launch>

注意这行代码:

.launch文件是个脚本文件,这行代码robot_description表示机器人模型描述,command表示参数,
find xacro表示寻找包,(find myrobot)/urdf/robot1_base.xacro 实际上表示的是模型的绝对路径,将这行代码用.xacro模型的绝对路径表示也是一样的。

4.使用rviz显示模型

控制台输入命令

roslaunch myrobot display_xacro.launch gui:=true

可以显示模型。

<think>好的,我现在需要帮助用户解决在Gazebo中使用Cartographer算法进行三维激光雷达和IMU联合建图的问题。用户已经安装了Ubuntu 16.04和ROS Kinetic,并且有两个工作空间:carto_ws和gazebo_ws。用户没有实物雷达和IMU,所以需要在Gazebo中进行仿真,使用现有的稍微复杂的环境模型,而不是空的empty.world。 首先,我需要确认用户的需求。他们想分步骤实现仿真,所以步骤需要详细,包括命令和执行路径。用户可能对ROS工作空间结构和Gazebo的启动流程不太熟悉,所以需要明确每个步骤在哪个工作空间下执行。 接下来,用户的问题可以分为几个部分:配置仿真环境、添加传感器(激光雷达和IMU)、配置Cartographer、运行建图和可视化。我需要确保每个步骤都正确无误,并且命令在正确的路径下执行。 首先,用户需要安装必要的ROS包,比如gazebo_ros、velodyne仿真模型和robot_localization。这些包可能不在默认安装中,所以需要确认用户是否已经安装,如果没有,需要提供安装命令。 然后,选择一个非空的Gazebo环境模型,比如cafe.world或者bookstore.world。用户可能不知道如何启动这些环境,需要给出具体的启动命令,并确保这些环境确实存在于他们的系统中。如果不存在,可能需要安装额外的包,比如aws_robomaker_hospital_world。 接下来,加载带有激光雷达和IMU的机器人模型。用户可能使用现有的机器人模型,比如TurtleBot3,但需要确认该模型是否包含Velodyne雷达和IMU。如果没有,可能需要修改URDF文件,添加相应的传感器插件。这里需要指导用户如何修改URDF,或者直接使用现有的仿真模型包,比如turtlebot3_gazebo。 在传感器配置方面,需要确保激光雷达和IMU的话题名称与Cartographer的配置匹配。例如,Velodyne雷达通常发布/velodyne_points话题,而IMU可能发布/imu/data。如果话题名称不匹配,需要指导用户如何remap话题。 然后,配置Cartographer的启动文件,确保订阅正确的话题,并启用IMU数据融合。用户可能已经安装了Cartographer,但需要检查其配置文件和参数,特别是关于3D建图和IMU的设置。可能需要修改lua配置文件,调整参数如TRAJECTORY_BUILDER_3D.use_imu_data为true。 运行建图节点时,需要确保所有相关节点都已正确启动,包括Gazebo环境、机器人模型、Cartographer节点和RViz可视化。用户可能需要同时打开多个终端,或者使用launch文件来整合这些步骤。需要给出具体的启动命令,并说明每个命令的执行路径和工作空间。 可视化部分需要配置RViz,添加PointCloud2和Map显示,并设置正确的话题。用户可能不熟悉RViz的配置,所以需要详细说明如何在RViz中添加这些显示项,或者提供预配置的RViz配置文件。 最后,保存生成的地图。用户可能需要使用Cartographer提供的工具将地图保存为PGM和YAML文件,或者点云格式如PCD。需要提供相应的命令,并说明保存路径。 同时,需要注意用户提到的两个工作空间,carto_ws和gazebo_ws。需要明确每个步骤在哪个工作空间下执行,比如安装依赖包可能在gazebo_ws,而运行Cartographer节点在carto_ws。这可能涉及到source不同工作空间的setup.bash文件,避免环境变量冲突。 潜在的问题可能包括传感器话题名称不匹配、TF树错误、Gazebo环境无法启动、IMU数据未正确融合等。需要提供常见问题的解决方法,比如检查话题列表、查看TF树、调整Cartographer参数等。 总结来说,步骤应包括:安装依赖、启动Gazebo环境、加载机器人模型、配置并启动Cartographer、RViz可视化以及保存地图。每个步骤需要详细的命令和路径说明,确保用户能够逐步执行,并处理可能出现的错误。</think>--- ### **分步操作指南** --- #### **步骤1:安装必要依赖** **执行路径**: `gazebo_ws` 工作空间 ```bash # 安装Gazebo基础功能包 sudo apt-get install ros-kinetic-gazebo-ros-pkgs ros-kinetic-gazebo-ros-control # 安装Velodyne雷达仿真插件 sudo apt-get install ros-kinetic-velodyne-simulator # 安装IMU仿真支持包 sudo apt-get install ros-kinetic-robot-localization ``` --- #### **步骤2:启动Gazebo仿真环境** **执行路径**: 任意路径(全局命令) ```bash # 启动带有家具的室内场景(需提前安装环境包) # 若未安装,先执行: sudo apt-get install ros-kinetic-aws-robomaker-hospital-world roslaunch aws_robomaker_hospital_world hospital.launch gui:=true # 或使用Gazebo自带的cafe场景 roslaunch gazebo_ros cafe.launch ``` --- #### **步骤3:加载带传感器(激光雷达+IMU)的机器人** **执行路径**: `gazebo_ws/src` 下创建机器人模型 1. **创建URDF模型文件** 在 `gazebo_ws/src/my_robot/urdf/` 路径下新建 `my_robot.urdf.xacro`,包含以下内容: ```xml <!-- 激光雷达配置 --> <xacro:include filename="$(find velodyne_description)/urdf/VLP-16.urdf.xacro" /> <xacro:VLP-16 parent="base_link" name="velodyne" topic="/velodyne_points"> <origin xyz="0 0 0.2" rpy="0 0 0" /> </xacro:VLP-16> <!-- IMU配置 --> <xacro:include filename="$(find robot_localization)/urdf/imu.gazebo.xacro" /> <xacro:imu_plugin_gazebo name="imu" parent="base_link"> <origin xyz="0.1 0 0.1" rpy="0 0 0" /> <topicName>/imu/data</topicName> </xacro:imu_plugin_gazebo> ``` 2. **生成机器人模型** ```bash cd ~/gazebo_ws catkin_make source devel/setup.bash roslaunch my_robot spawn_robot.launch # 需自行编写对应launch文件 ``` --- #### **步骤4:配置Cartographer参数** **执行路径**: `carto_ws/src/cartographer_ros/cartographer_ros/configuration_files` 1. 修改 `my_robot_3d.lua` 配置文件: ```lua include "map_builder.lua" include "trajectory_builder.lua" options = { map_builder = MAP_BUILDER, trajectory_builder = TRAJECTORY_BUILDER, sensor_bridge = { enable_imu = true, -- 启用IMU融合 }, ... } -- 设置传感器话题名称 TRAJECTORY_BUILDER_3D.num_accumulated_range_data = 1 TRAJECTORY_BUILDER_3D.use_imu_data = true -- 关键参数 ``` --- #### **步骤5:启动Cartographer节点** **执行路径**: `carto_ws` 工作空间 ```bash source devel/setup.bash roslaunch cartographer_ros my_robot_3d.launch ``` *launch文件关键配置*: ```xml <launch> <param name="use_sim_time" value="true" /> <node name="cartographer_node" pkg="cartographer_ros" type="cartographer_node" args="-configuration_directory $(find cartographer_ros)/configuration_files -configuration_basename my_robot_3d.lua"> <remap from="points2" to="/velodyne_points" /> <!-- 雷达话题映射 --> <remap from="imu" to="/imu/data" /> <!-- IMU话题映射 --> </node> </launch> ``` --- #### **步骤6:RViz可视化配置** **执行路径**: 任意终端 ```bash rosrun rviz rviz -d $(find cartographer_ros)/configuration_files/demo_3d.rviz ``` *手动添加以下显示层*: 1. **PointCloud2** → Topic设为 `/velodyne_points` 2. **Map** → Topic设为 `/map` 3. **TF** → 勾选显示坐标系树 --- #### **步骤7:启动仿真与建图** **分终端执行**: | 终端编号 | 执行命令 | 工作空间 | |----------|-----------------------------------------|--------------| | 1 | `roslaunch gazebo_ros hospital.launch` | gazebo_ws | | 2 | `roslaunch my_robot spawn_robot.launch` | gazebo_ws | | 3 | `roslaunch cartographer_ros my_robot_3d.launch` | carto_ws | | 4 | `rosrun rviz rviz` | 无 | --- ### **验证与调试** 1. **检查传感器数据**: ```bash rostopic echo /velodyne_points # 查看雷达数据 rostopic echo /imu/data # 查看IMU数据 ``` 2. **TF树验证**: ```bash rosrun tf view_frames # 生成frames.pdf文件 evince frames.pdf # 检查map->odom->base_link的链接 ``` 3. **保存最终地图**: ```bash rosrun map_server map_saver -f ~/map_3d ``` --- ### **关键路径总结** $$ \begin{array}{ll} \text{操作域} & \text{对应工作空间} \\ \hline \text{环境启动} & \rightarrow \text{gazebo_ws} \\ \text{机器人模型} & \rightarrow \text{gazebo_ws/src/my_robot} \\ \text{SLAM算法} & \rightarrow \text{carto_ws} \\ \text{可视化} & \rightarrow \text{全局路径} \\ \end{array} $$ --- 通过以上步骤,您可以在Gazebo的标准复杂环境中实现激光雷达+IMU的联合三维建图。若遇到传感器数据未发布或TF树断裂,请重点检查步骤3的URDF模型配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值