ROS 第六天 机器人仿真

1、机器人URDF模型优化

URDF建模存在哪些问题:

模型冗长,重复内容过多;参数修改麻烦,不便于二次开发;没有参数计算的功能等。。。

URDF模型的进化版本----xacro模型文件

精简模型代码:创建宏定义,文件包含

提供可编程接口:常量,变量,数学计算,条件语句

xacro模型文件——

常量定义:

 常量使用:

 

 数学计算:

 

 注意:所有数学运算都会转换成浮点数进行,以保证运算的精度

宏定义:

宏调用: 

 

 文件包含:

 

 完成mbot_base.xacro文件的编写

<?xml version="1.0"?>
<robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro">

    <!-- PROPERTY LIST -->
    <xacro:property name="M_PI" value="3.1415926"/>
    <xacro:property name="base_radius" value="0.20"/>
    <xacro:property name="base_length" value="0.16"/>

    <xacro:property name="wheel_radius" value="0.06"/>
    <xacro:property name="wheel_length" value="0.025"/>
    <xacro:property name="wheel_joint_y" value="0.19"/>
    <xacro:property name="wheel_joint_z" value="0.05"/>

    <xacro:property name="caster_radius" value="0.015"/> <!-- wheel_radius - ( base_length/2 - wheel_joint_z) -->
    <xacro:property name="caster_joint_x" value="0.18"/>

    <!-- Defining the colors used in this robot -->
    <material name="yellow">
        <color rgba="1 0.4 0 1"/>
    </material>
    <material name="black">
        <color rgba="0 0 0 0.95"/>
    </material>
    <material name="gray">
        <color rgba="0.75 0.75 0.75 1"/>
    </material>
    
    <!-- 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 radius="${wheel_radius}" length = "${wheel_length}"/>
                </geometry>
                <material name="gray" />
            </visual>
        </link>
    </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 ${-(base_length/2 + caster_radius)}" 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="black" />
            </visual>
        </link>
    </xacro:macro>

    <xacro:macro name="mbot_base">
        <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>

        <joint name="base_footprint_joint" type="fixed">
            <origin xyz="0 0 ${base_length/2 + caster_radius*2}" 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>
        </link>

        <wheel prefix="left" reflect="-1"/>
        <wheel prefix="right" reflect="1"/>

        <caster prefix="front" reflect="-1"/>
        <caster prefix="back" reflect="1"/>
    </xacro:macro>
</robot>

 mbot_xacro上层文件

<?xml version="1.0"?>
<robot name="arm" xmlns:xacro="http://www.ros.org/wiki/xacro">

    <xacro:include filename="$(find mbot_description)/urdf/xacro/mbot_base.xacro" />

    <mbot_base/>

</robot>

模型显示

 使用第二种方法 打开一下文件夹

<launch>
	<arg name="model" default="$(find xacro)/xacro --inorder '$(find mbot_description)/urdf/xacro/mbot.xacro'" />
	<arg name="gui" default="true" />

	<param name="robot_description" command="$(arg model)" />

    <!-- 设置GUI参数,显示关节控制插件 -->
	<param name="use_gui" value="$(arg gui)"/>

    <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
	<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />

	<!-- 运行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" args="-d $(find mbot_description)/config/mbot.rviz" required="true" />

</launch>

这个launch文件就包含了解析器(方法二)

在当前路径下打开终端 运行launch文件 roslaunch mbot_description display_mbot_base_xacro.launch

 也可以得到同样的效果。

2、ArbotiX+rviz功能仿真

 安装ArbotiX

首先进入需要使用Arbotix功能包的ros项目的工作空间下的src目录,例如catkin_ws/src/目录,下载Arbotix源码

git clone -b indigo-devel https://github.com/vanadiumlabs/arbotix_ros.git

下载完成后在catkin_ws中编译 catkin_make

注意:arbotix_ros中的python文件需要添加可执行权限
例如给arbotix_ros文件夹下的bin中的python权限

 右键属性-权限

 ✔表示可执行文件

配置ArbotiX控制器

 

 在mbot_description-launch-xacro中

与前面的xacro文件不同的地方是启动了ArbotiX控制器,创建了配置文件

	<node name="arbotix" pkg="arbotix_python" type="arbotix_driver" output="screen">
        <rosparam file="$(find mbot_description)/config/fake_mbot_arbotix.yaml" command="load" />
        <param name="sim" value="true"/>
    </node>

参数配置文件在

 第三步:启动仿真平台

打开终端输入roslaunch mbot_description arbotix_mbot_with_camera_xacro.launch 

 第四步:启动键盘控制 

另外打开一个终端 输入 roslaunch mbot_teleop mbot_teleop.launch(前提是提前导入mbot_teleop的包)

 

 可以输入 rostopic list  查看话题列表

 导航仿真示例(需要使用ROS by Example的源码 git clone https://github.com/pirobot/rbx1.git )

 

 打开终端输入 启动一个机器人

roslaunch rbx1_bringup fake_turtlebot.launch

再打开一个终端输入:

3、Gazebo物理仿真环境搭建

ros_control功能包

 

 

 

 控制器:

joint_effort_controller

joint_state_controller

joint_pisition_controller

joint_velocity_controller

 可参考:https://github.com/ros-controls/ros_control/wiki/controller_interface

仿真步骤

第一步:为link添加惯性参数和碰撞属性

 在这个文件中添加

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

第二步:为link添加gazebo标签

配置每个link的颜色

 

 

第三步:为joint添加传动装置

标签Transmission 

 第四步:添加gazebo控制器插件

 

 

在gazebo中加载机器人模型

 启动多个节点

<launch>

    <!-- 设置launch文件的参数 -->
    <arg name="paused" default="false"/>
    <arg name="use_sim_time" default="true"/>
    <arg name="gui" default="true"/>
    <arg name="headless" default="false"/>
    <arg name="debug" default="false"/>

    <!-- 运行gazebo仿真环境 -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="debug" value="$(arg debug)" />
        <arg name="gui" value="$(arg gui)" />
        <arg name="paused" value="$(arg paused)"/>
        <arg name="use_sim_time" value="$(arg use_sim_time)"/>
        <arg name="headless" value="$(arg headless)"/>
    </include>

    <!-- 加载机器人模型描述参数 -->
    <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find mbot_description)/urdf/xacro/gazebo/mbot_gazebo.xacro'" /> 

    <!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node> 

    <!-- 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"  output="screen" >
        <param name="publish_frequency" type="double" value="50.0" />
    </node>

    <!-- 在gazebo中加载机器人模型-->
    <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
          args="-urdf -model mrobot -param robot_description"/> 

</launch>

其中多关注设置模型的路径

 运行launch文件

打开终端输入

roslaunch mbot_gazebo view_mbot_gazebo_empty_world.launch

 创建仿真环境

方法一:直接添加环境模型

 方法二:使用Building Editor

软件中点击Edit 中的Building Editor

建立完成后点击file中的save world保存当前创建的环境保存到mobot_gazebo文件夹的world文件夹下面

可以运行launch文件看一下效果

打开也是一样的效果

开始机器人仿真

打开终端输入:roslaunch mbot_gazebo view_mbot_gazebo_play_ground.launch 

打开话题控制指令 输入rostopic list

启动键盘控制节点 输入roslaunch mbot_teleop mbot_teleop.launch      就可以控制机器人运动 

 也可以打开终端查看机器人位置在哪

输入rostopic echo /odom  

  

传感器仿真

摄像头仿真

 

 

 在这个文件夹里存放了摄像头仿真文件

启动仿真环境

打开终端输入:roslaunch mbot_gazebo view_mbot_with_camera_gazebo.launch

 查看话题rostopic list

 也可以输入rqt_image_view查看摄像头仿真图像(需要设置摄像头数据来源)

 

 kinect摄像头仿真

 启动仿真环境 打开终端输入:roslaunch mbot_gazebo view_mbot_with_kinect_gazebo.launch

 打开话题列表

 在rviz中的查看kinect信息

打开终端输入 rosrun rviz rviz

点击add添加pointcloud2

 更改点云信息就可以得到kinect传递的信息了

同样也可以添加图像信息

 键盘控制移动

 激光雷达仿真:

 启动仿真环境:roslaunch mbot_gazebo view_mbot_with_laser_gazebo.launch 

打开rviz查看仿真效果: rosrun rviz rviz

坐标系(Fixed Frame)改一下改成odom

add robotmodel 

add laserscan 同时添加话题/scan 如果看不清楚可以调整size大小

 可以打开键盘控制小车运动

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值