首先需要在你的主目录新建一个工作空间,名字就随便取,比如我取的是rm_eng
然后再在新建的工作空间下创建一个名为src的文件夹,用来存放具体功能包的源码。创建完成后,我们要对其进行一个初始化,在src文件夹下打开终端,并输入
catkin_init_workspace
接下来我们就可以到我们的工作空间rm_eng下进行编译,输入
catkin_make
编译完成后,会生成build和devel两个文件夹
然后我们要设置环境变量,在我们当前页面打开终端,并输入指令
source devel/setup.bash
因为我们用的终端是bash,所以尾缀是bash。如果用的是zsh的话,把bash改为zsh即可。
接下来我们要在src下创建机械臂模型的一个功能包,在src下打开终端,输入指令
catkin_create_pkg eng_arm roscpp tf urdf xacro
其中,catkin_create_pkg是创建功能包的指令,eng_arm是我们所建立功能包的名字,后面的roscpp等是我们所需要用到的各种依赖。
创建后我们会得到这样四个文件(.rviz的文件是后来创建的,这里可以不用管他)
然后到eng_arm下再编译一次,再设置一次环境变量。
以上的两个文件夹,urdf用来存放机器人模型的urdf或xacro文件,launch用来保存相关启动文件。
故在urdf文件夹下,我们可以用gedit生成一个.xacro的文件用来描述我们机械臂的模型。
gedit eng_arm.xacro
在.xacro文件中我们可提前设置颜色,pai以及惯性矩阵等常量。
示例如下
<material name="White">
<color rgba="1 1 1 1"/>
</material>
<xacro:property name="M_PI" value="3.14159"/>
设置link如下所示
<link name="link1" >
<visual>
<origin xyz="-${link1_len/2} 0 0" rpy="0 ${M_PI/2} 0" />
<geometry>
<cylinder radius="${link1_width}" length="${link1_len}"/>
</geometry>
<material name="Blue" />
</visual>
<collision>
<origin xyz="-${link1_len/2} 0 0" rpy="0 ${M_PI/2} 0" />
<geometry>
<cylinder radius="${link1_width}" length="${link1_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
其中的xyz为link在xyz轴的偏移量,而rpy则是其在不同轴角度的偏移量。cylinder表示该link为圆柱体,radius为圆柱体半径,length为长度。
设置joint如下所示
<joint name="joint2" type="prismatic">
<parent link="link1"/>
<child link="link2"/>
<origin xyz="-${link1_len} 0 0" rpy="-${M_PI/2} 0 ${M_PI/2}" />
<axis xyz="1 0 0" />
<limit effort="300" velocity="1" lower="-0.5" upper="0.5" />
<dynamics damping="50" friction="1"/>
</joint>
在我所设置的joint2中,link1为父link,link2为子link。prismatic表示其为一个滑移关节,axis描述的是该关节往那个轴向进行运动。
写完.xacro文件后,我们还需要一个启动文件,也就是launch文件。因此,我们可以在launch文件夹下创建arm_start.launch文件。
<launch>
<arg name="model" />
<!-- 加载机器人模型参数 -->
<param name="robot_description" command="$(find xacro)/xacro --inorder $(find eng_arm)/urdf/eng_arm.xacro" />
<!-- 设置GUI参数,显示关节控制插件 -->
<param name="use_gui" value="true"/>
<!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<node name="joint_state_publisher" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
<!-- 运行robot_state_publisher节点,发布tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
<!-- 运行rviz可视化界面 -->
<node name="rviz" pkg="rviz" type="rviz" />
</launch>
然后我们就可以运行我们的机械臂模型哩。
在终端输入
roslaunch eng_arm arm_start.launch
我们就可以看到我们的机械比模型还有一个控制插件。
但是如果你是第一次进这个rviz,你会惊奇的发现没有模型。
那是因为你并没有加入机械臂的模型,只要点击左下角的add,并选中RobotModel,点击ok,再将你左上角的fixed frame选为你的底座link即可,比如我的是base_link。
但是如果每次进rviz都要这样点的话就很麻烦,那你就可以点击左上角file中的save config as,将这个rviz保存下来。只要将我们launch文件中的这段话改成这样,那我们就不用每次进去都点了。
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find eng_arm)/eng_arm.rviz" required="true" />