移动机器人简单笔记,从建模语言基础开始
ROS melodic & vrep & python & C++
一、URDF
基本格式示例
<?xml version="1.0"?>
<robot name=“myrobot”>
<!--link-->
<link name = “……”>
<visual> …… </visual>
<inertial> …… </inertial>
<collision> …… </collision>
……
</link>
……
<!--joint-->
<joint name = “……” type = “……”>
<axis xyz="0 0 1"/>
<parent link=“linkname1"/>
<child link=" linkname2"/>
<origin rpy=“… … …" xyz=“… … …"/>
……
</joint>
……
</robot>
URDF实例操作
-
创建工作空间
mkdir -p ~/catkin_ws/src/myrobot_project cd ~/catkin_ws/
-
创建ros功能包,包名myrobot_simulation,依赖roscpp,rospy,std_msgs
cd src/myrobot_project catkin_create_pkg myrobot_simulation roscpp rospy std_msgs cd.. catkin_make
-
在description/urdf下新建urdf_robot_base.urdf文件
-
搭建机器人底盘
要求:长宽高为25x16x5的蓝色机器人底盘<robot name="robot_base"> <!--机器人base_link在地面的投影--> <link name="base_footprint"> <visual> <!--几何形状设置:box形状--> <geometry> <box size="0.001 0.001 0.001" /> </geometry> </visual> </link> <!--底盘base_link中心--> <link name="base_link"> <!--外观设置--> <visual> <!--几何形状设置:box形状,参数设置为0.25x0.16x0.05--> <geometry> <box size="0.25 0.16 0.05"/> </geometry> <!--机器人初始位置姿态设置--> <origin rpy="0 0 0" xyz="0 0 0"/> <!--材料颜色、名称设置--> <material name="blue"> <color rgba="0 .5 .8 1"/> </material> </visual> </link> <!--使用关节关联底盘和投影点,固定关节,没有相对运动--> <joint name="base_link2base_footprint" type="fixed"> <parent link="base_footprint" /> <child link="base_link" /> <origin xyz="0 0 0.03" /> </joint> </robot>
-
添加驱动轮,以左前驱动轮为例
<link name="left_front_wheel"> <visual> <geometry> <cylinder length=".02" radius="0.025"/> </geometry> <material name="black"> <color rgba="0 0 0 1"/> </material> </visual> </link> <joint name="left_front_wheel_joint" type="continuous"> <axis xyz="0 0 1"/> <parent link="base_link"/> <child link="left_front_wheel"/> <origin rpy="1.57075 0 0" xyz="0.1 0.08 -0.03"/> </joint>
练习:添加其他三个轮
-
使用URDF语法检查工具检查URDF语法
-
配置launch文件,在catkin_ws/src/myrobot_project/myrobot_simulation/launch下新建urdf_robot_base.launch文件
<launch> <!-- 将 urdf 文件内容设置进参数服务器 --> <param name="robot_description" textfile="$(find myrobot_simulation)/description/urdf/urdf_robot_base.urdf" /> <!-- 启动 rivz --> <node pkg="rviz" type="rviz" name="rviz_test" /> </launch>
-
启动launch文件
roslaunch myrobot_simulation urdf_robot_base.launch
在Rviz中进行添加:
Add
➡RobotModel
➡Fixed Frame: base_link
Add
➡TF
➡Marker Scale=0.3
二、优化xacro文件
基本格式示例
<?xml version="1.0"?>
<!--空间声明-->
<robot name="robot_base" xmlns:xacro="http://www.ros.org/wiki/xacro">
<!--属性定义-->
<xacro:property name="xxxx" value="yyyy" />
<!--属性调用-->
${属性名称}
${数学表达式}
<!--宏定义-->
<xacro:macro name="宏名称" params="参数列表(多参数之间使用空格分隔)">
.....
参数调用格式: ${参数名}
</xacro:macro>
<!--宏调用-->
<xacro:宏名称 参数1=xxx 参数2=xxx/>
<!--文件包含-->
<robot name="myrobot" xmlns:xacro="http://wiki.ros.org/xacro">
<xacro:include filename="robot_base.urdf.xacro" />
<xacro:include filename="camera.urdf.xacro" />
<xacro:include filename="lidar.urdf.xacro" />
</robot>
参考内容:xacro
xacro实例操作
-
在description/xacro下新建robot_base.urdf.xacro文件
-
声明空间
<robot name="robot_base" xmlns:xacro="http://www.ros.org/wiki/xacro">
-
底盘搭建
<!--属性定义--> <xacro:property name="PI" value="3.1415926"/> <xacro:property name="base_link_width" value="0.16" /> <xacro:property name="base_link_length" value="0.25" /> <xacro:property name="base_link_height" value="0.05" /> <xacro:property name="earth_space" value="0.025" /> <!--投影link设置--> <link name="base_footprint"> <visual> <geometry> <box size="0.001 0.001 0.001" /> </geometry> </visual> </link> <!--机器人底盘设置--> <link name="base_link"> <visual> <geometry> <!--属性调用--> <box size="${base_link_width} ${base_link_length} ${base_link_height}"/> </geometry> <origin rpy="0 0 1.57075" xyz="0 0 0"/> <material name="blue"> <color rgba="0 0.5 0.8 1"/> </material> </visual> </link> <joint name="base_link2base_footprint" type="fixed"> <parent link="base_footprint" /> <child link="base_link" /> <!--算术运算求解相对位置--> <origin xyz="0 0 ${earth_space + base_link_height}" /> </joint>
-
左右前驱动轮描述
<!--属性定义--> <xacro:property name="wheel_radius" value="0.025" /> <xacro:property name="wheel_length" value="0.02" />、 <xacro:property name="wheel_offset" value="0.08" /> <!--宏定义--> <xacro:macro name="add_front_wheels" params="name flag"> <link name="${name}_wheel"> <visual> <geometry> <cylinder radius="${wheel_radius}" length="${wheel_length}" /> </geometry> <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" /> <material name="black" /> </visual> </link> <joint name="${name}_wheel2base_link" type="continuous"> <parent link="base_link" /> <child link="${name}_wheel" /> <origin xyz="${wheel_offset} ${flag * base_link_width/2} ${-(earth_space + base_link_height / 2 - wheel_radius) }" /> <axis xyz="0 1 0" /> </joint> </xacro:macro> <!--宏调用--> <xacro:add_front_wheels name="left_front" flag="1" /> <xacro:add_front_wheels name="right_front" flag="-1" />
练习:添加两个后轮
-
配置launch文件,在catkin_ws/src/myrobot_project/myrobot_simulation/launch下新建xacro_robot_base.launch文件
<launch> <param name="robot_description" command="$(find xacro)/xacro $(find myrobot_simulation)/description/xacro/robot_base.urdf.xacro" /> <node pkg="rviz" type="rviz" name="rviz_test" /> </launch>
command="$(find xacro)/xacro ……"的作用类似于
rosrun xacro xacro file.xacro > 自己创建的/xacro文件
-
启动launch文件
roslaunch myrobot_simulation xacro_robot_base.launch
最终实现效果
URDF和xacro都能够实现如下效果,但是xacro中属性、宏的使用,能够极大简化机器人重复部件(如驱动轮)的代码,包括文件包含能够更加快速实现机器人各部件的组合。