美文网首页ROS
week32 车体与环境仿真 navigation导航

week32 车体与环境仿真 navigation导航

作者: 吃醋不吃辣的雷儿 | 来源:发表于2020-06-12 11:43 被阅读0次

    地图

    通过gazebo,搭建自己想要的地图。我一共搭建了三幅,分别应用于不同的场景。第一副是足球场,模拟户外环境。第二幅是家居环境。第三幅地图稍大,类似于迷宫。


    ground
    home
    labyrinth

    机器人

    我仿真了两款机器人。第一款是圆形底盘的二轮差分机器人,白色轮子是主动轮,绿色轮子是万向轮,上面放置了hokuyo激光雷达。第二款是官方提供的turtlebot机器人,配有kinect深度相机和LDS激光雷达。


    myrobot
    turtlebot

    导航

    在此任务中,语音导航指令为主要任务。 使用SLAM预先构建的地图,机器人可以通过语音导航。 让我们想象一个炎热和你的情况‘ 我们坐在你的客厅里想要一杯啤酒,啤酒在没有空调的储藏室里。 所以,在这个时候,你可以要求机器人从仓库里给你买一瓶啤酒,只要说“储存”,它就会去往storage储藏室。 当你说“卧室”的工作方式相同时,机器人会自动进入卧室。 语音导航的基础是智能语音交互,使机器人能够理解你说了什么并采取了行动。 用move_base包移动机器人,我们可以使用actionlib将机器人引导到特定的目标位置。


    start2storage
    storage2bedroom
    rqt_tf_tree
    image.png
    image.png
    image.png

    下面是车体仿真的源代码

    <?xml version="1.0"?>
    <robot name="myrobot" xmlns:xacro="http://www.ros.org/wiki/xacro">
    
    <!-- property list -->
        <xacro:property name="M_PI" value="3.1415926"/>
        <xacro:property name="base_mass" value="1"/>
        <xacro:property name="base_length" value="0.20"/>
        <xacro:property name="base_radius" value="0.30"/>
    
        <xacro:property name="wheel_mass" value="0.2"/>
        <xacro:property name="wheel_length" value="0.05"/>
        <xacro:property name="wheel_radius" value="0.08"/>
        <xacro:property name="wheel_joint_y" value="0.28"/>
        <xacro:property name="wheel_joint_z" value="0.10"/>
    
        <xacro:property name="caster_mass" value="0.1"/>
        <xacro:property name="caster_radius" value="0.04"/>
        <xacro:property name="caster_joint_x" value="0.25"/>
        <xacro:property name="caster_joint_z" value="0.14"/>
    
    <!-- define color -->
        <material name="white">
        <color rgba="1 1 1 0.95"/>
        </material>
        <material name="black">
        <color rgba="0 0 0 1"/>
        </material>
        <material name="blue">
        <color rgba="0 0 1 1"/>
        </material>
        <material name="red">
        <color rgba="1 0 0 1"/>
        </material>
        <material name="green">
        <color rgba="0 1 0 1"/>
        </material>
        <material name="yellow">
        <color rgba="1 0.4 0 1"/>
        </material>
        <material name="coffee">
        <color rgba="0.8 0.7 0.55 1"/>
        </material>
        <material name="gray">
            <color rgba="0.75 0.75 0.75 1"/>
        </material>
    
    <!-- macro for inertia matrix -->
        <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>
    
        <xacro:macro name="cylinder_inertial_matrix" params="m r h">
        <inertial>
            <mass value="${m}"/>
            <inertia ixx="${m*(3*r*r+h*h)/12}" ixy="0" ixz="0"
            iyy="${m*(3*r*r+h*h)/12}" iyz="0"
            izz="${m*r*r/2}" />
        </inertial>
        </xacro:macro>
    
    <!-- macro for robot wheel -->
        <xacro:macro name="wheel" params="prefix reflect">
        <joint name="${prefix}_wheel_joint" type="continuous">
            <origin xyz="0 ${reflect*wheel_joint_y} ${-wheel_joint_z}" 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 length="${wheel_length}" radius="${wheel_radius}"/>
            </geometry>
            <material name="gray"/>
            </visual>
            <collision>
            <origin xyz="0 0 0" rpy="${M_PI/2} 0 0"/>
            <geometry>
                <cylinder length="${wheel_length}" radius="${wheel_radius}"/>
            </geometry>
            </collision>
            <cylinder_inertial_matrix m="${wheel_mass}" r="${wheel_radius}" h="${wheel_length}"/>
        </link>
    
        <gazebo reference="${prefix}_wheel_link">
            <material> Gazebo/Gray </material>
        </gazebo>
    
        <transmission name="${prefix}_wheel_joint_trans">
            <type> transmission_interface/SimpleTransmission </type>
            <joint name="${prefix}_wheel_joint">
            <hardwareInterface> hardware_interface/VelocityJointInterFace </hardwareInterface>
            </joint>
            <acutator name="${prefix}_wheel_joint_motor">
            <hardwareInterface> hardware_interface/VelocityJointInterFace </hardwareInterface>
            </acutator>
        </transmission>
        </xacro:macro>
    
    <!-- macro for robot caster -->
        <xacro:macro name="caster" params="prefix reflect">
        <joint name="${prefix}_caster_joint" type="continuous">
            <origin xyz="${reflect*caster_joint_x} 0 ${-caster_joint_z}" rpy="0 0 0"/>
            <parent link="base_link"/>
            <child link="${prefix}_caster_link"/>
            <axis xyz="0 1 0"/>
        </joint>
    
        <link name="${prefix}_caster_link">
            <visual>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <geometry>
                <sphere radius="${caster_radius}"/>
            </geometry>
            <material name="green"/>
            </visual>
            <collision>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <geometry>
                <sphere radius="${caster_radius}"/>
            </geometry>
            <material name="green"/>
            </collision>
            <sphere_inertial_matrix m="${caster_mass}" r="${caster_radius}"/>
        </link>
    
        <gazebo reference="${prefix}_caster_link">
            <material> Gazebo/Green </material>
        </gazebo>
        </xacro:macro>
    
    <!-- main function -->
        <xacro:macro name="myrobot_base_gazebo">
        <link name="base_footprint">
            <visual>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <geometry>
                <box size="0.001 0.001 0.001"/>
            </geometry>
            </visual>
        </link>
        <gazebo reference="base_footprint">
            <turnGravityOff> false </turnGravityOff>
        </gazebo>
        <joint name="base_footprint_joint" type="fixed">
            <origin xyz="0 0 ${base_length/2+wheel_radius}" rpy="0 0 0"/>
            <parent link="base_footprint"/>
            <child link="base_link"/>
        </joint>
        
        <link name="base_link">
            <visual>
            <origin xyz="0 0 0" rpy="0 0 0"/>
                <geometry>
                <cylinder length="${base_length}" radius="${base_radius}"/>
                </geometry>
                <material name="yellow"/>
            </visual>
            <collision>
            <origin xyz="0 0 0" rpy="0 0 0"/>
                <geometry>
                <cylinder length="${base_length}" radius="${base_radius}"/>
                </geometry>
            </collision>
            <cylinder_inertial_matrix m="${base_mass}" r="${base_radius}" h="${base_length}"/>
        </link>
    
        <gazebo reference="base_link">
            <material> Gazebo/Blue </material>
        </gazebo>
    
        <wheel prefix="left" reflect="1"/>
        <wheel prefix="right" reflect="-1"/>
        <caster prefix="front" reflect="1"/>
        <caster prefix="back" reflect="-1"/>
    
        <!-- controller -->
        <gazebo>
            <plugin name="differential_drive_controller"
                filename="libgazebo_ros_diff_drive.so">
            <rosDebugLevel> Debug </rosDebugLevel>
            <publishWheelTF> true </publishWheelTF>
            <robotNamespace> / </robotNamespace>
            <publishTf> 1 </publishTf>
            <publishWheelJointState> true </publishWheelJointState>
            <alwaysOn> true </alwaysOn>
            <updateRate> 100 </updateRate>
            <legacyMode> true </legacyMode>
            <leftJoint> left_wheel_joint </leftJoint>
            <rightJoint> right_wheel_joint </rightJoint>
            <wheelSeparation> ${wheel_joint_y*2} </wheelSeparation>
            <wheelDiameter> ${wheel_radius*2} </wheelDiameter>
            <broadcastTF> 1 </broadcastTF>
            <wheelTorque> 30 </wheelTorque>
            <wheelAcceleration> 1.8 </wheelAcceleration>
            <commandTopic> cmd_vel </commandTopic>
            <odometryFrame> odom </odometryFrame>
            <odometryTopic> odom </odometryTopic>
            <robotBaseFrame> base_footprint </robotBaseFrame>
            </plugin>
        </gazebo>
        </xacro:macro>
    
    </robot>
    
    

    下面是雷达仿真的源代码

    <?xml version="1.0"?>
    <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="laser">
    
        <xacro:macro name="hokuyo" params="prefix:=laser">
            <!-- reference frame -->
            <link name="${prefix}_link">
                <inertial>
                    <mass value="0.1"/>
                    <origin xyz="0 0 0"/>
                    <inertia ixx="0.01" ixy="0" ixz="0"
                         iyy="0.01" iyz="0"
                         izz="0.01"/>
                </inertial>
    
                <visual>
                    <origin xyz="0 0 0" rpy="0 0 0"/>
                    <geometry>
                        <cylinder length="0.05" radius="0.05"/>
                    </geometry>
                    <material name="white"/>
                </visual>
    
                <collision>
                    <origin xyz="0 0 0" rpy="0 0 0"/>
                    <geometry>
                        <cylinder length="0.06" radius="0.05"/>
                    </geometry>
                </collision>
            </link>
    
            <gazebo reference="${prefix}_link">
                <material> Gazebo/White </material>
            </gazebo>
    
            <gazebo reference="${prefix}_link">
                <sensor type="ray" name="head_hokuyo_sensor">
                    <pose> 0 0 0 0 0 0 </pose>
                    <visualize> false </visualize>
                    <update_rate> 40 </update_rate>
                    <ray>
                        <scan>
                            <horizontal>
                                <samples> 720 </samples>
                                <resolution> 1 </resolution>
                                <min_angle> -3.14 </min_angle>
                                <max_angle> 3.14 </max_angle>
                            </horizontal>
                        </scan>
                        <range>
                            <min> 0.1 </min>
                            <max> 30 </max>
                            <resolution> 0.01 </resolution>
                        </range>
                        <noise>
                            <type> gaussian </type>
                            <mean> 0 </mean>
                            <stddev> 0.01 </stddev>
                        </noise>
                    </ray>
                    <plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_laser.so">
                        <topicName> /scan </topicName>
                        <frameName> laser_link </frameName>
                    </plugin>
                </sensor>
            </gazebo>
        </xacro:macro>
    </robot>
    

    相关文章

      网友评论

        本文标题:week32 车体与环境仿真 navigation导航

        本文链接:https://www.haomeiwen.com/subject/lujvahtx.html