移动机器人仿真基础(一)—— 机器人建模相关

移动机器人简单笔记,从建模语言基础开始
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>

参考内容: link, joint

URDF实例操作

  1. 创建工作空间

    mkdir -p ~/catkin_ws/src/myrobot_project
    cd ~/catkin_ws/
    
  2. 创建ros功能包,包名myrobot_simulation,依赖roscpp,rospy,std_msgs

    cd src/myrobot_project
    catkin_create_pkg myrobot_simulation roscpp rospy std_msgs
    cd..
    catkin_make
    
  3. 在description/urdf下新建urdf_robot_base.urdf文件

  4. 搭建机器人底盘
    要求:长宽高为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>
    
  5. 添加驱动轮,以左前驱动轮为例

    	<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>  
    

    练习:添加其他三个轮

  6. 使用URDF语法检查工具检查URDF语法

  7. 配置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>
    
  8. 启动launch文件

    roslaunch myrobot_simulation urdf_robot_base.launch
    

    在Rviz中进行添加:
    AddRobotModelFixed Frame: base_link
    AddTFMarker 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实例操作

  1. 在description/xacro下新建robot_base.urdf.xacro文件

  2. 声明空间

    <robot name="robot_base" xmlns:xacro="http://www.ros.org/wiki/xacro">
    
  3. 底盘搭建

        <!--属性定义-->
        <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>
    
  4. 左右前驱动轮描述

    	<!--属性定义-->
    	<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" />
    

    练习:添加两个后轮

  5. 配置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文件

  6. 启动launch文件

     roslaunch myrobot_simulation xacro_robot_base.launch
    

最终实现效果

URDF和xacro都能够实现如下效果,但是xacro中属性、宏的使用,能够极大简化机器人重复部件(如驱动轮)的代码,包括文件包含能够更加快速实现机器人各部件的组合。

Rviz中的显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值