Basic of Xacro with Rviz

这篇文章备忘的主要内容
1.一个xacro文件的example
2.在rviz里显示这个模型
最终完成的情况

0.准备工作

先在工作空间中建一个包,名字随便取,主要依赖urdf包
建好之后在其中创建meshes(用来存放3d模型文件,stl,dae等),launch(用来存放launch文件和rviz配置文件)等文件夹
弄好之后大概这样
之后照常catkin_make以及rospack profile

1.完整的xacro文件+解析

mnm.xacro

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0"?>
<robot name="mnm" xmlns:xacro="http://www.ros.org/wiki/xacro">
<link name="base_link">
<visual>
<origin rpy="0 0 0" xyz="0 0 0" />
<geometry>
<box size="1 1 1"/>
</geometry>
</visual>
</link>
<joint name="base_link_to_link_01" type="revolute">
<axis xyz="0 0 1" />
<limit effort="1000.0" lower="-3.14" upper="3.14" velocity="0.5"/>
<!-- let me explain these two lines above(12 and 13)
<axis xyz="0 0 1" />
<limit effort="1000.0" lower="-3.14" upper="3.14" velocity="0.5"/>
because it's a revolute joint,so the axis means it can routate around z axis,
and the 3.14 means 180 degree
-->
<origin rpy="0 0 0" xyz="0 0 0.5"/>
<!-- and why the xyz ="0 0 0.5"
because the base_link 's origin is "0 0 0",and the height is 1,so the top of it is 0.5
-->
<parent link="base_link" />
<child link="link_01"/>
</joint>
<link name="link_01">
<visual>
<origin rpy="0 0 0" xyz="0 0 0.2" />
<geometry>
<cylinder radius="0.35" length="0.4" />
</geometry>
</visual>
</link>

</robot>

解释:
ROS里我们想为机器人建模需要一个urdf文件。
xacro文件是用来简化urdf文件的,如果没有xacro,就会有很多不必要的重复性劳动,但是这个简单的xacro看上去和一个urdf也没什么区别。
如上图所见,这段urdf的意思是两个link,分别是作为底座的长方体base_link和上面的圆柱体link_01。
具体的解释在roswiki里搜索关键词“urdf/XML”,可以找到每个tag的具体细节。
http://wiki.ros.org/urdf/XML

编写launch文件,启动rviz来显示这个模型

1
2
3
4
5
6
7
8
9
10
<launch>
<param name="robot_description" command="$(find xacro)/xacro --inorder '$(find urdf_my_test)/urdf/mnm.xacro'"/>

<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher"/>
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_my_test)/launch/config.rviz" />
<!-- <node name="rviz" pkg="rviz" type="rviz"/> --><!--一开始先不用args,等到设置好rviz之后另存为配置文件到launch文件夹里再用args,这样就不用每次都设置那么多了>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher">
<param name="use_gui" value="true"/>
</node>
</launch>

等rviz启动完毕之后先将FixedFrame改为base_link
image.png
再点击下方Add按钮,添加一个RobotModel
image.png

可以看到之前在launch文件里传入的参数Robot Description已经在robotmodel里了
param name="robot_description"
而joint_state_publisher可以用来转动上面那个圆柱体的link
joint_state_publisher
添加好之后可以将配置文件另存为到launch文件夹里,以后再运行的时候在launch文件里的rviz节点下增加一个args(配置文件config.rviz的路径)就可以不用再设置一遍了。