#gazebo 仿真

1. 给 base_link 添加惯性,碰撞以及 gazebo 属性

在路径xqrobot_description/urdf/xacro ⽂件夹下新建⽂件夹 gazebo,并在 gazebo ⽂件下创建xqrobot_base_gazebo.xacro ⽂件。

lzw08@ubuntu:~$ cd ros_ws/src/xqrobot_description/urdf/xacro/
lzw08@ubuntu:~/ros_ws/src/xqrobot_description/urdf/xacro$ mkdir gazebo
lzw08@ubuntu:~/ros_ws/src/xqrobot_description/urdf/xacro$ cd gazebo/
lzw08@ubuntu:~/ros_ws/src/xqrobot_description/urdf/xacro/gazebo$ touch xqrobot_base_gazebo.xacro
lzw08@ubuntu:~/ros_ws/src/xqrobot_description/urdf/xacro/gazebo$ gedit xqrobot_base_gazebo.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_mass" value="20" /><xacro:property name="base_radius" value="0.20"/> <xacro:property name="base_length" value="0.16"/> <xacro:property name="wheel_mass" value="2" /><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_mass" value="0.5" /><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 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 radius="${wheel_radius}" length = "${wheel_length}"/></geometry><material name="gray" /></visual><collision><origin xyz="0 0 0" rpy="${M_PI/2} 0 0" /><geometry><cylinder radius="${wheel_radius}" length = "${wheel_length}"/></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 is important to link the joints and the controller --><transmission name="${prefix}_wheel_joint_trans"><type>transmission_interface/SimpleTransmission</type><joint name="${prefix}_wheel_joint" ><hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface></joint><actuator name="${prefix}_wheel_joint_motor"><hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface><mechanicalReduction>1</mechanicalReduction></actuator></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 ${-(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><collision><origin xyz="0 0 0" rpy="0 0 0"/><geometry><sphere radius="${caster_radius}" /></geometry></collision><sphere_inertial_matrix m="${caster_mass}" r="${caster_radius}" /></link><gazebo reference="${prefix}_caster_link"><material>Gazebo/Black</material></gazebo></xacro:macro><!---机器⼈本体宏定义--><xacro:macro name="xqrobot_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 + 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><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"/><!--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.0</updateRate><legacyMode>true</legacyMode><leftJoint>left_wheel_joint</leftJoint><rightJoint>right_wheel_joint</rightJoint><wheelSeparation>${wheel_joint_y*2}</wheelSeparation><wheelDiameter>${2*wheel_radius}</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>

2. 在路径xqrobot_description/urdf/xacro/sensors 文件夹下创建 lidar_gazebo.xacro 文件

lzw08@ubuntu:~/ros_ws/src/xqrobot_description/urdf/xacro/gazebo$ cd ..
lzw08@ubuntu:~/ros_ws/src/xqrobot_description/urdf/xacro$ cd sensors/
lzw08@ubuntu:~/ros_ws/src/xqrobot_description/urdf/xacro/sensors$ touch lidar_gazebo.xacro
lzw08@ubuntu:~/ros_ws/src/xqrobot_description/urdf/xacro/sensors$ gedit lidar_gazebo.xacro

粘贴以下代码:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="laser"> <xacro:macro name="rplidar" params="prefix:=laser">
<!-- Create laser reference frame -->
<link name="${prefix}_link">
<inertial>
<mass value="0.1" />
<origin xyz="0 0 0" /><inertia ixx="0.01" ixy="0.0" ixz="0.0"iyy="0.01" iyz="0.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="black"/></visual><collision><origin xyz="0.0 0.0 0.0" rpy="0 0 0" /><geometry><cylinder length="0.06" radius="0.05"/></geometry></collision></link><gazebo reference="${prefix}_link"><material>Gazebo/Black</material></gazebo><gazebo reference="${prefix}_link"><sensor type="ray" name="rplidar"><pose>0 0 0 0 0 0</pose><visualize>false</visualize><update_rate>5.5</update_rate><ray><scan><horizontal><samples>360</samples><resolution>1</resolution><min_angle>-3</min_angle><max_angle>3</max_angle></horizontal></scan><range><min>0.10</min><max>6.0</max><resolution>0.01</resolution></range><noise><type>gaussian</type><mean>0.0</mean><stddev>0.01</stddev></noise></ray><plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so"><topicName>/scan</topicName><frameName>laser_link</frameName></plugin></sensor></gazebo></xacro:macro></robot>

3. 在 gazebo 中显示机器人模型

在xqrobot_description/urfd/xacro/gazebo ⽬录下创建xqrobot_gazebo.xacro ⽂件。

lzw08@ubuntu:~/ros_ws/src/xqrobot_description/urdf/xacro/sensors$ cd ..
lzw08@ubuntu:~/ros_ws/src/xqrobot_description/urdf/xacro$ cd gazebo/
lzw08@ubuntu:~/ros_ws/src/xqrobot_description/urdf/xacro/gazebo$ touch xqrobot_gazebo.xacro
lzw08@ubuntu:~/ros_ws/src/xqrobot_description/urdf/xacro/gazebo$ gedit xqrobot_gazebo.xacro

粘贴以下代码:

<?xml version="1.0"?>
<robot name="arm" xmlns:xacro="http://www.ros.org/wiki/xacro"> <xacro:include filename="$(find xqrobot_description)/urdf/xacro/gazebo/xqrobot_base_gazebo.xacro" />
<xacro:include filename="$(find xqrobot_description)/urdf/xacro/sensors/lidar_gazebo.xacro" /> <xacro:property name="lidar_offset_x" value="0" />
<xacro:property name="lidar_offset_y" value="0" />
<xacro:property name="lidar_offset_z" value="0.105" /><!--mbot_base/--><!-- lidar --><joint name="lidar_joint" type="fixed"><origin xyz="${lidar_offset_x} ${lidar_offset_y} ${lidar_offset_z}" rpy="0 0 0" /><parent link="base_link"/><child link="laser_link"/></joint><xacro:rplidar prefix="laser"/><xqrobot_base_gazebo/></robot>

4. 创建display_xqrobot_gazebo.launch文件

lzw08@ubuntu:~/ros_ws/src/xqrobot_description/urdf/xacro/gazebo$ cd ../../..
lzw08@ubuntu:~/ros_ws/src/xqrobot_description$ cd launch/
lzw08@ubuntu:~/ros_ws/src/xqrobot_description/launch$ touch display_xqrobot_gazebo.launch
lzw08@ubuntu:~/ros_ws/src/xqrobot_description/launch$ gedit display_xqrobot_gazebo.launch

粘贴以下代码:

<?xml version="1.0"?>
<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 xqrobot_description)/urdf/xacro/gazebo/xqrobot_gazebo.xacro'" /><!-- 运⾏joint_state_publisher节点,发布机器⼈的关节状态 --><node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" ></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>

5. 回到工作空间运行

lzw08@ubuntu:~/ros_ws/src/xqrobot_description/launch$ cd ~/ros_ws
lzw08@ubuntu:~/ros_ws$ source devel/setup.bash
lzw08@ubuntu:~/ros_ws$ roslaunch xqrobot_description display_xqrobot_gazebo.launch

会发现一个黄色的窗口一闪而过,并出现下图所示的错误:

解决方法:
先把刚才那个出现错误的终端停了(Ctrl+C),注意不是关闭!

lzw08@ubuntu:~$ export SVGA_VGPU10=0
lzw08@ubuntu:~$ roslaunch xqrobot_description display_xqrobot_gazebo.launch

这样就可以运行了。

但是界面却空空如也,因为“insert”选项卡 下缺了东西。
解决方法:
去学习通这门课的资料里下载model.tar.gz这个压缩包。

或者通过百度网盘分享的链接下载 → model.tar.gz (提取码:r4do)
下载完成之后解压缩,然后将model文件夹复制,粘贴到Home目录的.gazebo文件夹内。(.gazebo是隐藏文件夹,在Home目录下使用快捷键Ctrl+H即可显示隐藏文件)


模型正常显示的效果:

6. rviz

打开一个新的终端,输入rviz,回车。

参数更改:
(TF有没有都可以,没有的话模型那里就不会显示由红绿蓝三条线构成的坐标系,如果你觉得有坐标系比较好看那就加上去)

  1. Fixed Frame选择“odom”。
  2. 点击“Add”,添加“RobotModel”。

    显示效果:

7. 开源键盘移动节点

老师已经写好一个利用键盘移动上面生成的那个机器人的节点,若想了解具体内容,复制下列链接到浏览器中粘贴并进入。

https://gitee.com/hanzq03/xqrobot.git

然后打开一个新的终端进入工作空间的src目录,运行命令。

lzw08@ubuntu:~$ cd ros_ws/src/
lzw08@ubuntu:~/ros_ws/src$ git clone https://gitee.com/hanzq03/xqrobot.git


此时你会发现工作空间的src目录下多了一个名为“xqrobot”的功能包。

点进去xqrobot,把里面那个xqrobot_teleop的文件夹复制/剪切出来,然后xqrobot文件夹就可以丢弃到回收站了。


进入xqrobot_teleop→scripts,右击空白处,选择“Open in Terminal”。

然后将xqrobot_teleop.py的权限更改为可读可写可执行。

8. 运行键盘移动节点移动机器人

lzw08@ubuntu:~/ros_ws$ source devel/setup.bash
lzw08@ubuntu:~/ros_ws$ roslaunch xqrobot_teleop xqrobot_teleop.launch


与移动小海龟机器人类似,此节点可使用键盘中的u,i, o,j,k,l,m,逗号,句号移动或者旋转机器人。

9. 最终效果

把rviz运行起来,最终效果如下图所示:

下期见下期见

# gazebo 仿真相关推荐

  1. 【从零开始的ROS四轴机械臂控制】(二) - ROS与Gazebo连接,Gazebo仿真及urdf文件修改

    [从零开始的ROS四轴机械臂控制(二)] 四.urdf文件及gazebo仿真 1.simple_arm示例 (1)config文件夹 (2)launch文件夹 (3)meshes文件夹 (4)urdf ...

  2. ROS笔记(18) Gazebo仿真

    ROS笔记(18) Gazebo仿真 1. 添加属性 2. 配置节点 3. 带传感器仿真 1. 添加属性 link添加<gezebo>标签 对于机器模型,需要对每个link添加<ge ...

  3. ROS+Gazebo仿真差速小车并实现控制

    本工程的功能包有两个,分别用于gazebo仿真与键盘控制运动 功能包原文件如下: diff_wheeled_robot_control : https://huffie.lanzouw.com/iXi ...

  4. 基于ROS搭建简易软件框架实现ROV水下目标跟踪(补1)--gazebo仿真

    项目地址:https://github.com/cabinx/cabin_auv_simulation 鉴于水下机器人调试的复杂性,在仿真环境中对水下机器人进行先期调试能降低调试难度,节约大量的时间成 ...

  5. gazebo仿真时在加入差分运动插件后没有cmd_vel话题

    一.问题描述: gazebo仿真时在加入差分运动插件后没有cmd_vel话题 joes@joes:~/jiao/ROS_Project$ roslaunch ros23_urdf02_gazebo d ...

  6. 通过Gazebo仿真学TurtleBot3(四)——简单的/cmd_vel控制

    1. 通过命令发送/cmd_vel控制底盘移动 - 启动tb3仿真: 启动: $ roslaunch tb3_sim_bringup tb3_empty_world.launch 开启rviz显示: ...

  7. 如何生成gazebo仿真环境的二维地图真值

    在移动机器人仿真中,二维地图真值可以用来评价slam建图结果,也可以直接给路径规划算法提供输入. 利用gazebo进行仿真时,有很多方法都可以获取静态仿真环境的二维地图真值,本文将对以下链接: hyf ...

  8. 「 Gazebo仿真 」地图创建、多模型显示、基本指令

    一.前言 小白最近在Gazebo仿真平台中更换了使用.txt生成的虚拟物理地图(非刚体),并在新的环境布置多个物体,将过程记录下来分享. 首先知道地图由二部分构成,一部分是在物理环境中实际的接触形状( ...

  9. 机器人SLAM与自主导航——(四)Gazebo仿真机器人导航

    (1)创建launch文件 启动Gazebo仿真环境: mrobot_gazebo/launch/mrobot_laser_nav_gazebo.launch 启动move_base导航功能节点: m ...

  10. turtlebot3 在gazebo仿真下 通过 gmapping slam 建立二维平面地图——全过程

    turtlebot3 在gazebo仿真下 通过 gmapping slam 建立二维平面地图--全过程 ROS中的地图 使用rosbag记录数据 rosbag record rosbag play ...

最新文章

  1. 打包本地文件, 并使用Winscp上传脚本
  2. hbase报错:org.apache.hadoop.hbase.PleaseHoldException: Master is initializing
  3. TensorBoard(二)
  4. linux中端口的欺骗,Linux中的端口占用问题
  5. camera ---(6)双摄成像原理
  6. JAVA设置输入数据范围,如何使用Apache POI(SXSSF)为特定单元格设置数据(数字)格式区域设置?...
  7. MVC系列学习(十一)-客户端的验证
  8. 【图像几何】基于matlab GUI傅立叶+DCT图像变换【含Matlab源码 844期】
  9. 锌离子荧光探针Zinquin 乙酯
  10. UCOS操作系统——任务内嵌信号量(十一)
  11. 计算机科目三教学设计,驾校科目三教案
  12. 详解POW工作量证明原理
  13. 计算机可以谭音乐吗,武汉音乐学院作曲系师生作品入选第44届国际计算机音乐大会...
  14. cocos2d_lua 2.5D
  15. 在 Adob​​e MAX 深入研究 UI/UX 设计
  16. docker 中安装Jenkins-Jenkins持续化集成(GIT/maven/钉钉机器人)详细步骤
  17. Hank的无线802.11学习笔记--2
  18. firefox网页自动翻译
  19. JQuery,图片的放大和缩小
  20. Web前端框架学习—Bootstrap

热门文章

  1. 十年前开发的平板游戏:HyllCube 三维四子棋游戏,获得了全国一等奖
  2. Lambda将搬砖变成艺术
  3. MTK平台创建Vendor方法(最大化复用代码)
  4. phusion passenger standalone
  5. 5种赚钱方式,设计师加薪不用靠老板!
  6. 3rd Batch请查收!您的问题解答清单
  7. nanopi 2 fire s5p4418 初次体验 (1)uboot,linux kernel编译
  8. 3D资产大掌柜—Connecter
  9. 借助云开发实现小程序列表页(包含json数据的请求和解析)
  10. 腾讯云开发低代码平台初探