请先看你的.rviz配置文件,以我的display_rviz.rviz为例(实际抄古月居的)
Panels:
- Class: rviz_common/Displays
Name: Displays
- Class: rviz_common/Views
Name: Views
Visualization Manager:
Class: ""
Displays:
- Class: rviz_default_plugins/Grid
Name: Grid
Value: true
- Alpha: 0.8
Class: rviz_default_plugins/RobotModel
Description Source: Topic
Description Topic:
Value: /robot_description
Enabled: true
Name: RobotModel
Value: true
- Class: rviz_default_plugins/TF
Name: TF
Value: true
Global Options:
Fixed Frame: base_link
Frame Rate: 30
Name: root
Tools:
- Class: rviz_default_plugins/MoveCamera
Value: true
Views:
Current:
Class: rviz_default_plugins/Orbit
Distance: 1.7
Name: Current View
Pitch: 0.33
Value: Orbit (rviz)
Yaw: 5.5
Window Geometry:
Height: 800
Width: 1200
其中
Global Options:
Fixed Frame: base_link
Frame Rate: 30
这三行定义了rviz的固定坐标系与刷新帧率,你的模型中必须有一个link与固定坐标系名字相同,便于模型在rviz中确定位置。假设你改了这个link的名字,模型会因为无法确定初始位姿而无法显示。
可以显示的xacro文件示例
<?xml version="1.0"?>
<!--xacro基本语法-->
<!--常量定义: <xacro:property name="M_PI" value="3.1415926" />-->
<!--常量使用: <origin xyz="0 0 0" rpy="${M_PI/2} 0 0">-->
<!--数学计算: <origin xyz="0 ${(mortor_length_wheel_length)/2} 0" rpy="0 0 0" />-->
<!--宏定义:一般用于定义轮子等,便于复用。也可以设置一些参数,便于适配不同情况-->
<!--宏定义:<xacro:macro name="wheel" params="A B C">
......
</xacro:macro>
-->
<!--宏调用: <xacro:wheel A="A_value" B="B_value" C="C_value" />-->
<!--文件包含:<xacro:include filename="$(find package_name)/urdf/xacro_file_name" />-->
<robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:property name="M_PI" value="3.1415926" />
<xacro:property name="base_wide" value="0.8" />
<xacro:property name="base_high" value="0.3" />
<xacro:property name="wheel_radius" value="0.20" />
<xacro:property name="length_middle_distance" value="0.05" />
<xacro:property name="wheel_wide" value="0.06" />
<!--定义颜色-->
<material name="yellow">
<color rgba="1 0.4 0 1" />
</material>
<material name="black">
<color rgba="0 0 0 0.95" />
</material>
<material>
<color rgba="0.75 0.75 0.75 1" />
</material>
<!--定义惯性矩阵-->
<!--定义球体惯性矩阵:接受两个参数 质量m 半径r 根据计算公式计算惯性矩阵-->
<xacro:macro name="sphere_inertial_matrix" params="m r">
<inertial>
<mass value="${m}" />
<inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0" iyy="${2*m*r*r/5}" iyz="0" izz="${2*m*r*r/5}" />
</inertial>
</xacro:macro>
<!--定义圆柱体惯性矩阵:接受三个参数 质量m 半径r 高度h 根据计算公式计算惯性矩阵-->
<xacro:macro name="cylinder_inertial_matrix" params="m r h">
<inertial>
<mass value="${m}" />
<inertia ixx="${m*(3*r*r+h*h)}" ixy="0" ixz="0"
iyy="${m*(3*r*r+h*h)/12}" iyz="0" izz="${m*r*r/2}" />
</inertial>
</xacro:macro>
<!--定义立方体惯性矩阵 m:质量 l w h: 立方体长 宽 高 -->
<xacro:macro name="Box_inertial_matrix" params="m l w h">
<inertial>
<mass value="${m}" />
<inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0"
iyy="${m*(w*w + l*l)/12}" iyz= "0"
izz="${m*(w*w + h*h)/12}" />
</inertial>
</xacro:macro>
<!--定义轮子-->
<xacro:macro name="wheel" params="prefix x_positive y_positive">
<joint name="${prefix}_wheel_joint" type="continuous">
<!--根据具体位置计算链接节点的位置-->
<origin xyz= "${x_positive*0.5*(length_middle_distance+wheel_radius)} ${y_positive*0.5*(wheel_wide+base_wide)} ${0.5*wheel_radius}" rpy="0 0 0" />
<parent link="base_link" />
<child link="${prefix}_wheel_link" />
<axis xyz="0 1 0" />
</joint>
<link name="${prefix}_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
<geometry>
<cylinder radius="${wheel_radius}" length="${wheel_wide}" />
</geometry>
<material name="gray" />
</visual>
</link>
</xacro:macro>
<xacro:macro name="my_robot_base">
<xacro:wheel prefix="front_left" x_positive="1" y_positive="-1" />
<xacro:wheel prefix="front_right" x_positive="1" y_positive="1" />
<xacro:wheel prefix="last_left" x_positive="-1" y_positive="-1" />
<xacro:wheel prefix="last_right" x_positive="-1" y_positive="1" />
<link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<sphere radius="4" />
</geometry>
<material name="yellow" rgba="1 0 0 0.5" />
</visual>
</link>
</xacro:macro>
</robot>
无法显示的xacro文件示例
<?xml version="1.0"?>
<!--xacro基本语法-->
<!--常量定义: <xacro:property name="M_PI" value="3.1415926" />-->
<!--常量使用: <origin xyz="0 0 0" rpy="${M_PI/2} 0 0">-->
<!--数学计算: <origin xyz="0 ${(mortor_length_wheel_length)/2} 0" rpy="0 0 0" />-->
<!--宏定义:一般用于定义轮子等,便于复用。也可以设置一些参数,便于适配不同情况-->
<!--宏定义:<xacro:macro name="wheel" params="A B C">
......
</xacro:macro>
-->
<!--宏调用: <xacro:wheel A="A_value" B="B_value" C="C_value" />-->
<!--文件包含:<xacro:include filename="$(find package_name)/urdf/xacro_file_name" />-->
<robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:property name="M_PI" value="3.1415926" />
<xacro:property name="base_wide" value="0.8" />
<xacro:property name="base_high" value="0.3" />
<xacro:property name="wheel_radius" value="0.20" />
<xacro:property name="length_middle_distance" value="0.05" />
<xacro:property name="wheel_wide" value="0.06" />
<!--定义颜色-->
<material name="yellow">
<color rgba="1 0.4 0 1" />
</material>
<material name="black">
<color rgba="0 0 0 0.95" />
</material>
<material>
<color rgba="0.75 0.75 0.75 1" />
</material>
<!--定义惯性矩阵-->
<!--定义球体惯性矩阵:接受两个参数 质量m 半径r 根据计算公式计算惯性矩阵-->
<xacro:macro name="sphere_inertial_matrix" params="m r">
<inertial>
<mass value="${m}" />
<inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0" iyy="${2*m*r*r/5}" iyz="0" izz="${2*m*r*r/5}" />
</inertial>
</xacro:macro>
<!--定义圆柱体惯性矩阵:接受三个参数 质量m 半径r 高度h 根据计算公式计算惯性矩阵-->
<xacro:macro name="cylinder_inertial_matrix" params="m r h">
<inertial>
<mass value="${m}" />
<inertia ixx="${m*(3*r*r+h*h)}" ixy="0" ixz="0"
iyy="${m*(3*r*r+h*h)/12}" iyz="0" izz="${m*r*r/2}" />
</inertial>
</xacro:macro>
<!--定义立方体惯性矩阵 m:质量 l w h: 立方体长 宽 高 -->
<xacro:macro name="Box_inertial_matrix" params="m l w h">
<inertial>
<mass value="${m}" />
<inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0"
iyy="${m*(w*w + l*l)/12}" iyz= "0"
izz="${m*(w*w + h*h)/12}" />
</inertial>
</xacro:macro>
<!--定义轮子-->
<xacro:macro name="wheel" params="prefix x_positive y_positive">
<joint name="${prefix}_wheel_joint" type="continuous">
<!--根据具体位置计算链接节点的位置-->
<origin xyz= "${x_positive*0.5*(length_middle_distance+wheel_radius)} ${y_positive*0.5*(wheel_wide+base_wide)} ${0.5*wheel_radius}" rpy="0 0 0" />
<parent link="base_link" />
<child link="${prefix}_wheel_link" />
<axis xyz="0 1 0" />
</joint>
<link name="${prefix}_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
<geometry>
<cylinder radius="${wheel_radius}" length="${wheel_wide}" />
</geometry>
<material name="gray" />
</visual>
</link>
</xacro:macro>
<xacro:macro name="my_robot_base">
<xacro:wheel prefix="front_left" x_positive="1" y_positive="-1" />
<xacro:wheel prefix="front_right" x_positive="1" y_positive="1" />
<xacro:wheel prefix="last_left" x_positive="-1" y_positive="-1" />
<xacro:wheel prefix="last_right" x_positive="-1" y_positive="1" />
<link name="tast_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<sphere radius="4" />
</geometry>
<material name="yellow" rgba="1 0 0 0.5" />
</visual>
</link>
</xacro:macro>
</robot>
两个文件的区别仅仅是将base_link改为其他名字。