教程代码

First step with gazebo and ros

• setup a ROS workspace
• create projects for your simulated robot
• create a Gazebo world
• create your own robot model
• connect your robot model to ROS
• use a teleoperation node to control your robot
• add a camera to your robot
• use Rviz to vizualize all the robot information

Setup a new workspace

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ..
catkin_make
source ~/catkin_ws/devel/setup.bash

Create projects for your simulated robot

cd ~/catkin_ws/src
catkin_create_pkg mybot_gazebo gazebo_ros
catkin_create_pkg mybot_description
catkin_create_pkg mybot_control

Creating your own World

roscd mybot_gazebo
mkdir launch worlds
cd worlds
vim mybot.world

A basic world file defines at least a name:

<?xml version="1.0"?>
<sdf version="1.4">
<world name="myworld">
</world>
</sdf>

At first we just want to add some basic objects, like a ground and a basic illumination source inside the world tag.

<include><uri>model://sun</uri>
</include><include><uri>model://ground_plane</uri>
</include><include><uri>model://turtlebot</uri>
</include>
roscd mybot_gazebo/launch
vim mybot_world.launch

mybot_world.launch

<launch>      <include file="$(find gazebo_ros)/launch/empty_world.launch">       <arg name="world_name" value="$(find mybot_gazebo)/worlds/mybot.world"/>        <arg name="gui" value="true"/>    </include>
</launch>

make a test

roslaunch mybot_gazebo mybot_world.launch

Creating your own Model

roscd mybot_description
mkdir urdf
cd urdf
gedit mybot.xacro
XACRO CONCEPTS

• xacro:include: Import the content from other file. We can divide the content in different xacros and merge them using xacro:include.
• property: Useful to define constant values. Use it later using ${property_name}
• xacro:macro: Macro with variable values. Later, we can use this macro from another xacro file, and we specify the required value for the variables. To use a macro, you have to include the file where the macro is, and call it using the macro's name and filling
the required values.

mybot.xacro

This file will be the main description of our robot. Let's put some xacro basic structure:

<?xml version="1.0"?>
<robot name="mybot" xmlns:xacro="http://www.ros.org/wiki/xacro"><!-- Put here the robot description -->
</robot>

Let's define some physical properties for our robot, mainly the dimensions of the chassis, the caster wheel, the wheels and the camera:

<xacro:property name="PI" value="3.1415926535897931"/><xacro:property name="chassisHeight" value="0.1"/>
<xacro:property name="chassisLength" value="0.4"/>
<xacro:property name="chassisWidth" value="0.2"/>
<xacro:property name="chassisMass" value="50"/><xacro:property name="casterRadius" value="0.05"/>
<xacro:property name="casterMass" value="5"/><xacro:property name="wheelWidth" value="0.05"/>
<xacro:property name="wheelRadius" value="0.1"/>
<xacro:property name="wheelPos" value="0.2"/>
<xacro:property name="wheelMass" value="5"/><xacro:property name="cameraSize" value="0.05"/>
<xacro:property name="cameraMass" value="0.1"/>

We will also include three files :

 <xacro:include filename="$(find mybot_description)/urdf/mybot.gazebo" /><xacro:include filename="$(find mybot_description)/urdf/materials.xacro" /><xacro:include filename="$(find mybot_description)/urdf/macros.xacro" />

These three correspond respectively to:

• all the gazebo-specific aspects of our robot
• definition of the materials used (mostly colors)
• definitions of some macros for easier description of the robot

Add it to mybot.xacro

<link name='chassis'><collision> <origin xyz="0 0 ${wheelRadius}" rpy="0 0 0"/> <geometry> <box size="${chassisLength} ${chassisWidth} ${chassisHeight}"/> </geometry> </collision><visual> <origin xyz="0 0 ${wheelRadius}" rpy="0 0 0"/> <geometry> <box size="${chassisLength} ${chassisWidth} ${chassisHeight}"/> </geometry> <material name="orange"/></visual><inertial> <origin xyz="0 0 ${wheelRadius}" rpy="0 0 0"/> <mass value="${chassisMass}"/> <box_inertia m="${chassisMass}" x="${chassisLength}" y="${chassisWidth}" z="${chassisHeight}"/></inertial>
</link>

Add it to mybot.gazebo

<gazebo reference="chassis"><material>Gazebo/Orange</material>
</gazebo>

Add this in the “materials.xacro” :

<?xml version="1.0"?>
<robot>
<material name="black"><color rgba="0.0 0.0 0.0 1.0"/>
</material><material name="blue"><color rgba="0.0 0.0 0.8 1.0"/>
</material><material name="green"><color rgba="0.0 0.8 0.0 1.0"/>
</material><material name="grey"><color rgba="0.2 0.2 0.2 1.0"/>
</material><material name="orange"><color rgba="${255/255} ${108/255} ${10/255} 1.0"/>
</material><material name="brown"><color rgba="${222/255} ${207/255} ${195/255} 1.0"/>
</material><material name="red"><color rgba="0.8 0.0 0.0 1.0"/>
</material><material name="white"><color rgba="1.0 1.0 1.0 1.0"/>
</material>
</robot>

Add this in the macros.xacro file, within the robot tag

<?xml version="1.0" ?>
<robot name="mybot" xmlns:xacro="http://www.ros.org/wiki/xacro"><macro name="cylinder_inertia" params="m r h"><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}"/>
</macro><macro name="box_inertia" params="m x y z"><inertia  ixx="${m*(y*y+z*z)/12}" ixy = "0" ixz = "0"iyy="${m*(x*x+z*z)/12}" iyz = "0"izz="${m*(x*x+z*z)/12}"/>
</macro><macro name="sphere_inertia" params="m r"><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}"/>
</macro></robot>

Add this before the chassis link in the mybot.xacro file :

<link name="footprint" /><joint name="base_joint" type="fixed"><parent link="footprint"/><child link="chassis"/>
</joint>

mybot_world.launch by adding the following two tags in the launch tag:

<!-- urdf xml robot description loaded on the Parameter Server, converting the xacro into a proper urdf file-->
<param name="robot_description" command="$(find xacro)/xacro.py '$(find mybot_description)/urdf/mybot.xacro'" /><!-- push robot_description to factory and spawn robot in gazebo -->
<node name="mybot_spawn" pkg="gazebo_ros" type="spawn_model" output="screen"args="-urdf -param robot_description -model mybot" />

make a test

 roslaunch mybot_gazebo mybot_world.launch 

mybot.xacro As a next step we add a caster wheel to the robot. This is the simplest wheel as we have no axis and no friction

<joint name="fixed" type="fixed"><parent link="chassis"/><child link="caster_wheel"/>
</joint><link name="caster_wheel"><collision><origin xyz="${casterRadius-chassisLength/2} 0 ${casterRadius-chassisHeight+wheelRadius}" rpy="0 0 0"/><geometry><sphere radius="${casterRadius}"/></geometry></collision><visual><origin xyz="${casterRadius-chassisLength/2} 0 ${casterRadius-chassisHeight+wheelRadius}" rpy="0 0 0"/><geometry><sphere radius="${casterRadius}"/></geometry><material name="red"/></visual><inertial><origin xyz="${casterRadius-chassisLength/2} 0 ${casterRadius-chassisHeight+wheelRadius}" rpy="0 0 0"/><mass value="${casterMass}"/><sphere_inertia m="${casterMass}" r="${casterRadius}"/></inertial>
</link>

mybot.gazebo Add a gazebo tag in the gazebo file for this link :

<gazebo reference="caster_wheel"><mu1>0.0</mu1><mu2>0.0</mu2><material>Gazebo/Red</material>
</gazebo>

As usual, we specify the color used in material. We also added mu1 and mu2, with value 0 to remove the friction.

macros.xacro .We could add the two links in the main file, but let's make one macro to make it simple.

<macro name="wheel" params="lr tY"><link name="${lr}_wheel"><collision><origin xyz="0 0 0" rpy="0 ${PI/2} ${PI/2}" /><geometry><cylinder length="${wheelWidth}" radius="${wheelRadius}"/></geometry></collision><visual><origin xyz="0 0 0" rpy="0 ${PI/2} ${PI/2}" /><geometry><cylinder length="${wheelWidth}" radius="${wheelRadius}"/></geometry><material name="black"/></visual><inertial><origin xyz="0 0 0" rpy="0 ${PI/2} ${PI/2}" /><mass value="${wheelMass}"/><cylinder_inertia m="${wheelMass}" r="${wheelRadius}" h="${wheelWidth}"/></inertial>
</link><gazebo reference="${lr}_wheel"><mu1 value="1.0"/><mu2 value="1.0"/><kp  value="10000000.0" /><kd  value="1.0" /><fdir1 value="1 0 0"/><material>Gazebo/Black</material>
</gazebo><joint name="${lr}_wheel_hinge" type="continuous"><parent link="chassis"/><child link="${lr}_wheel"/>
<origin xyz="${-wheelPos+chassisLength/2} ${tY*wheelWidth/2+tY*chassisWidth/2} ${wheelRadius}" rpy="0 0 0" /><axis xyz="0 1 0" rpy="0 0 0" /><limit effort="100" velocity="100"/><joint_properties damping="0.0" friction="0.0"/>
</joint><transmission name="${lr}_trans"><type>transmission_interface/SimpleTransmission</type><joint name="${lr}_wheel_hinge"><hardwareInterface>EffortJointInterface</hardwareInterface></joint><actuator name="${lr}Motor"><hardwareInterface>EffortJointInterface</hardwareInterface><mechanicalReduction>10</mechanicalReduction></actuator>
</transmission></macro>

mybot.xacro

<wheel lr="left" tY="1"/>
<wheel lr="right" tY="-1"/>

Connect your robot to ROS

Alright, our robot is all nice and has this new car smell, but we can't do anything with it yet as it has no connection with
ROS In order to add this connection we need to add gazebeo plugins to our model. There are different kinds of plugins:

  • World: Dynamic changes to the world, e.g. Physics, like illumination or gravity, inserting models
  • Model: Manipulation of models (robots), e.g. move the robots
  • Sensor: Feedback from virtual sensor, like camera, laser scanner
  • System: Plugins that are loaded by the GUI, like saving images

First of all we'll use a plugin to provide access to the joints of the wheels. The transmission tags in our URDF will be used by this plugin the define how to link the joints to controllers. To activate the plugin, add the following to mybot.gazebo:

<gazebo><plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so"><robotNamespace>/mybot</robotNamespace></plugin>
</gazebo>

With this plugin, we will be able to control the joints, however we need to provide some extra configuration and explicitely
start controllers for the joints. In order to do so, we'll use the package mybot_control that we have defined before. Let's first create the configuration file:

roscd mybot_control
mkdir config
cd config
vim mybot_control.yaml

This file will define three controllers: one for each wheel, connections to the joint by the transmission tag, one for
publishing the joint states. It also defined the PID gains to use for this controller:

mybot:# Publish all joint states -----------------------------------joint_state_controller:type: joint_state_controller/JointStateControllerpublish_rate: 50  # Effort Controllers ---------------------------------------leftWheel_effort_controller:type: effort_controllers/JointEffortControllerjoint: left_wheel_hingepid: {p: 100.0, i: 0.1, d: 10.0}rightWheel_effort_controller:type: effort_controllers/JointEffortControllerjoint: right_wheel_hingepid: {p: 100.0, i: 0.1, d: 10.0}

Now we need to create a launch file to start the controllers. For this let's do:

roscd mybot_control
mkdir launch
cd launch
vim mybot_control.launch

In this file we'll put two things. First we'll load the configuration and the controllers, and we'll also start a node that will
provide 3D transforms (tf) of our robot. This is not mandatory but that makes the simulation more complete

<launch><!-- Load joint controller configurations from YAML file to parameter server --><rosparam file="$(find mybot_control)/config/mybot_control.yaml" command="load"/><!-- load the controllers --><node name="controller_spawner"pkg="controller_manager"type="spawner" respawn="false"output="screen" ns="/mybot"args="joint_state_controllerrightWheel_effort_controllerleftWheel_effort_controller"/><!-- convert joint states to TF transforms for rviz, etc --><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" respawn="false" output="screen"><param name="robot_description" command="$(find xacro)/xacro.py '$(find mybot_description)/urdf/mybot.xacro'" /><remap from="/joint_states" to="/mybot/joint_states" /></node></launch>

make a test

roslaunch mybot_gazebo mybot_world.launch
roslaunch mybot_control mybot.launch
rostopic list

We could launch our model on gazebo and then launch the controller, but to save some time (and terminals), we'll start the controllers automatically by adding a line to the mybot_world.launch in the mybot_gazebo package :

<!-- ros_control mybot launch file -->
<include file="$(find mybot_control)/launch/mybot_control.launch" />
rostopic pub -1 /mybot/leftWheel_effort_controller/command std_msgs/Float64 "data: 1.5"
rostopic pub -1 /mybot/rightWheel_effort_controller/command std_msgs/Float64 "data: 1.0"
rostopic echo /mybot/joint_states

Teleoperation of your robot

Adding a camera

    <joint name="camera_joint" type="fixed"><axis xyz="0 1 0" /><origin xyz="0 0 0.2" rpy="0 0 0"/><parent link="footprint"/><child link="camera"/></joint><link name="camera"><collision><origin xyz="0 0 0" rpy="0 0 0"/><geometry><box size="${cameraSize} ${cameraSize} ${cameraSize}"/></geometry></collision><visual><origin xyz="0 0 0" rpy="0 0 0"/><geometry><box size="${cameraSize} ${cameraSize} ${cameraSize}"/></geometry><material name="blue"/></visual><inertial><mass value="${cameraMass}" /><origin xyz="0 0 0" rpy="0 0 0"/><box_inertia m="${cameraMass}" x="${cameraSize}" y="${cameraSize}" z="${cameraSize}" /></inertial></link>

Add the plugin to gazebo file

<gazebo reference="camera"><material>Gazebo/Blue</material><sensor type="camera" name="camera1"><update_rate>30.0</update_rate><camera name="head"><horizontal_fov>1.3962634</horizontal_fov><image><width>800</width><height>800</height><format>R8G8B8</format></image><clip><near>0.02</near><far>300</far></clip></camera><plugin name="camera_controller" filename="libgazebo_ros_camera.so"><alwaysOn>true</alwaysOn><updateRate>0.0</updateRate><cameraName>mybot/camera1</cameraName><imageTopicName>image_raw</imageTopicName><cameraInfoTopicName>camera_info</cameraInfoTopicName><frameName>camera_link</frameName><hackBaseline>0.07</hackBaseline><distortionK1>0.0</distortionK1><distortionK2>0.0</distortionK2><distortionK3>0.0</distortionK3><distortionT1>0.0</distortionT1><distortionT2>0.0</distortionT2></plugin></sensor></gazebo>
rosrun image_view image_view image:=/mybot/camera1/image_raw

Visualisation with RViz

rosrun rviz rviz

整个代码框架如下:

转载于:https://www.cnblogs.com/shhu1993/p/5067749.html

Gazebo Ros入门相关推荐

  1. ROS入门(八)——仿真机器人四(Gazebo+Rviz+雷达、摄像头、kinet仿真显示)

    所用的学习链接: [奥特学园]ROS机器人入门课程<ROS理论与实践>零基础教程P278-288 [以上视频笔记见http://www.autolabor.com.cn/book/ROST ...

  2. ROS入门笔记(一): ROS简介

    ROS入门笔记(一): ROS简介 文章目录 1 ROS是什么? 2 ROS历史发展 2.1 ROS参考资料 2.2 ROS历史演变 2.3 ROS的官方解释(重点) 3 ROS设计目标 4 ROS特 ...

  3. ros入门--中科院软件所ros学习笔记

    视频链接: 中科院软件所-机器人操作系统入门(ROS入门教程)_哔哩哔哩_bilibili 中科院软件所-机器人操作系统入门(ROS入门教程)_哔哩哔哩_bilibili 另外有一个不错的 学习网址: ...

  4. 古月居ROS入门21讲笔记

    ROS入门21讲笔记--古月居 1 C++&Python极简基础 1.1 安装编译/解析器 1.2 for循环 1.3 while循环 1.4 面向对象 2. ROS基础 2.1 ROS概念 ...

  5. 【ROS入门教程】---- 01 ROS介绍

    ROS,机器人系统的不二选择 文章目录 ROS,机器人系统的不二选择 ROS是什么 ROS的强大之处 ROS的学习方法 总结 ROS是什么 作为新世纪的孩子们,可能从出生以来,我们就伴随着机器人的飞速 ...

  6. ROS入门(九)——机器人自动导航(介绍、地图、定位和路径规划)

    所用的学习链接: [奥特学园]ROS机器人入门课程<ROS理论与实践>零基础教程P289-314 [以上视频笔记见http://www.autolabor.com.cn/book/ROST ...

  7. ROS入门七 机器人建模——URDF

    ROS入门七 机器人建模--URDF urdf ufdf介绍 语法 创建机器人URDF模型 创建机器人描述功能包 创建URDF模型 在rviz中显示模型 改进URDF模型 添加物理和碰撞属性 使用xa ...

  8. ROS入门21讲 | ROS机器人入门教程 【简明笔记】

    古月·ROS入门21讲 | 一学就会的ROS机器人入门教程 文章目录 ROS核心概念 ROS命令行 工作空间与功能包 订阅与发布 发布者 Publisher 订阅者 Subscriber 话题消息的自 ...

  9. 古月ROS入门21讲学习笔记

    古月ROS入门21讲学习笔记 1.VMware+Ubuntu18.04+ROS安装 2.Linux命令 3.ROS是什么 ROS中的通信机制 ROS的开发工具 ROS的应用功能 ROS中的生态系统 老 ...

  10. ROS入门的基本操作

    ROS入门的基本操作 一.ROS命令行工具的使用 二.创建工作空间与功能包 创建工作空间的流程 创建功能包的流程 三.发布者Publisher的编程实现 如何实现一个发布者 如何配置CMakeLIst ...

最新文章

  1. 【面试锦囊】位运算介绍与经典例题总结
  2. Mac Android Studio 常用快捷键
  3. [转]程序实现调用迅雷(以C#为例)
  4. PostgreSQL的Checkpoint 发生的时机
  5. oracle 11g jdbc jar包在哪个文件目录
  6. 【英语学习】【Daily English】U01 Greetings / L03 Have we met before?
  7. mysql orderby 指定值_首先在MySQL中指定字段值ORDER BY
  8. 大家有没有发现,女生带上口罩后,感觉颜值升高了,尤其眼睛好看?
  9. 提升工作效率的优秀工具收藏
  10. 神经网络之BP神经网络
  11. net core文件接收(jpg、png、zip、pdf等自己设置)
  12. 单个产品出库扣减库存
  13. 手机wap网站制作教程
  14. 数据分析师岗位需求分析
  15. 詹姆斯麦迪逊大学计算机专业,詹姆斯麦迪逊大学简介_詹姆斯麦迪逊大学介绍_詹姆斯麦迪逊大学James Madison University (JMU)...
  16. 笔记本连接显示器后没有声音_电脑连接HDMI电视/显示器后没声音怎么解决
  17. 计网‖已知主机IP地址、子网掩码求网络地址
  18. daterangepicker 清空_Date Range Picker 中文网
  19. Avoid mutating a prop directly子传父报错解决
  20. XCTF final noxss

热门文章

  1. thinkphp3.2独立分组的建立
  2. 浅谈C#中的延“.NET研究”迟加载(2)——善用virtual
  3. 2018-2019-2 20165234 《网络对抗技术》 Exp1 PC平台逆向破解
  4. nuget包循环引用问题
  5. hdu_5894_hannnnah_j’s Biological Test(打表找规律)
  6. 2nd scrum站立会议
  7. windows服务应用--做个简单的定时调用EXE功能(笔记)
  8. 利用 Arrays.sort 字符串 进行排序 完全按字符 排序 忽略字符大小写
  9. IOS之Objective-C学习 工厂模式
  10. ECMA-262 6th Edition