一、完整系列教程
如何使用gazebo进行机器人仿真(很重要):https://zhuanlan.zhihu.com/p/367796338
基础教程和关键概念讲解(很重要):https://zhuanlan.zhihu.com/p/363385163
古月居:http://www.guyuehome.com/34642
二、使用rviz显示urdf文件
1、创建软件包
先创建一个软件包,然后在src中创建一个节点文件夹robot1。在robot1中创建launch和urdf文件夹,my_robot.urdf放在urdf文件夹中,display2.launch放在launch文件夹中。在launch中使用roslaunch robot1 display2.launch命令运行即可。
2、编写urdf文件
urdf文件详解1:https://www.guyuehome.com/34641
urdf文件详解2:https://www.cnblogs.com/linuxAndMcu/p/10874789.html
urdf工具:https://blog.csdn.net/qq_40875849/article/details/119955957
例子my_robot.urdf
<?xml version="1.0"?>
<robot name="my_robot">
<link name="link_base"> //定义一个机构
<inertial> //惯性设置
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="10"/>
<inertia ixx="100" ixy="0" ixz="0" iyy="100" izz="100" iyz="0"/>
</inertial>
<visual> //外表设置
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
<geometry>
<box size="5.0 5.0 1.0"/>
</geometry>
<material name="123">
<color rgba="0.0 1.0 1.0 1.0"/>
</material>
</visual>
<collision> //碰撞体积设置
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
<geometry>
<box size="5.0 5.0 1.0"/>
</geometry>
</collision>
</link>
<link name="link_one">
<inertial>
<origin xyz="0.0 0.0 5.0" rpy="0.0 0.0 0.0"/>
<mass value="5"/>
<inertia ixx="100" ixy="0" ixz="0" iyy="100" izz="100" iyz="0"/>
</inertial>
<visual>
<origin xyz="0.0 0.0 5.0" rpy="0.0 0.0 0.0"/>
<geometry>
<box size="3.0 3.0 10.0"/>
</geometry>
<material name="234">
<color rgba="0.8 0.5 0 0.5"/>
</material>
</visual>
<collision>
<origin xyz="0.0 0.0 5.0" rpy="0.0 0.0 0.0"/>
<geometry>
<box size="1.0 1.0 10.0"/>
</geometry>
</collision>
</link>
<link name="link_two">
<inertial>
<origin xyz="0.0 0.0 5.0" rpy="0.0 0.0 0.0"/>
<mass value="5"/>
<inertia ixx="100" ixy="0" ixz="0" iyy="100" izz="100" iyz="0"/>
</inertial>
<visual>
<origin xyz="0.0 0.0 5.0" rpy="0.0 0.0 0.0"/>
<geometry>
<box size="1.0 1.0 10.0"/>
</geometry>
<material name="234">
<color rgba="0.0 5.0 1.0 1.0"/>
</material>
</visual>
<collision>
<origin xyz="0.0 0.0 5.0" rpy="0.0 0.0 0.0"/>
<geometry>
<box size="1.0 1.0 10.0"/>
</geometry>
</collision>
</link>
<joint name="joint_one" type="revolute"> //定义一个关节
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
<parent link="link_base"/>
<child link="link_one"/>
<axis xyz="1.0 0.0 0.0"/>
<limit lower="-3.0" upper="3.0" effort="10.0" velocity="3.0"/>
</joint>
<joint name="joint_two" type="revolute">
<origin xyz="0.0 0.0 10.0" rpy="0.0 0.0 0.0"/>
<parent link="link_one"/>
<child link="link_two"/>
<axis xyz="1.0 0.0 0.0"/>
<limit lower="-3.0" upper="3.0" effort="10.0" velocity="3.0"/>
</joint>
</robot>
注意urdf文件中不能有中文,所以要把这些注释去掉。uedf文件最基础的内容就是由link(机构)和joint(关节)组成的。
3、在rviz中显示urdf文件
launch文件添加模型到rviz:http://www.rply.cn/news/67476.html
https://www.cnblogs.com/caiyishuai/p/15030386.html
例子:display.launch2
<?xml version="1.0"?>
<launch>
<arg name="model" />
<!-- 加载机器人模型参数 -->
<param name="robot_description" textfile="/media/wangyuanhao/DATA/ros_data/gazebo_7_26/src/urdf/my_robot.urdf" />
<!-- 设置GUI参数,显示关节控制插件 -->
<param name="use_gui" value="true"/>
<!-- 运行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 urdf_tutorial)/urdf.rviz" />
</launch>
有一些资料说不能用joint_state_publisher,要用joint_state_publisher_gui。但是我用joint_state_publisher可行,加上gu反而不行,应该与版本有关。
三、gazebo引入world文件
资料:https://zhuanlan.zhihu.com/p/368032054
1、launch文件启动gazebo
1.1空白仿真文件的launch文件
先设置参数,再启动客户端和服务端
roslaunch gazebo_ros empty_world.launch
1.2 launch文件中启动空白仿真的launch文件,并导入world文件
例子:robot.launch
<?xml version="1.0" ?>
<launch>
<!-- We resume the logic in empty_world.launch, changing only the name of the world to be launched -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find robot2_gazebo)/worlds/robot.world"/>
<!-- more default parameters can be changed here -->
</include>
</launch>
2、launch文件引入模型urdf文件
可以启动对应的python节点用于向gazebo中导入模型
2.1 rosrun命令导入
rosrun gazebo_ros spawn_model -file `rospack find baxter_description`/urdf/baxter.urdf -urdf -z 1 -model baxter
2.2 launch文件导入
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-file $(find baxter_description)/urdf/baxter.urdf -urdf -z 1 -model baxter" />
两种方法其实美区别都是调用了gazebo_ros包的一个python脚本用于引入模型,这个脚本就是用python创建了一个订阅的节点,回调函数中就是调用了和gazebo的pythonapi。
3、world文件引入模型urdf文件
可以在world文件中直接加入sdf模型代码,也可以用include标签直接引用sdf文件
4、world文件引入插件so文件
(1)world文件是完整的仿真文件,可以插入sdf模型和so插件文件。插件通过c++文件编译成so文件引用。
(2)插件包括world、model、sensor、system、visual、gui六种。统一使用标签引入world文件,不同种类的插件以在不同的标签内引入,比如world插件在标签内引入。
插件标签使用:<plugin name=“xx”,filename=“xx/xx.so”>
例子:
<?xml version="1.0"?>
<sdf version="1.4">
<world name="default">
<plugin name="hello_world" filename="libhello_world.so"/>
</world>
</sdf>
上面这个例子引入了一个world类型插件
四、使用gazebo使用插件
1、gazebo增加插件文件
资料:https://zhuanlan.zhihu.com/p/363385163
资料:https://blog.csdn.net/lc1852109/article/details/126450496
2、自定义关节控制插件
资料:https://blog.csdn.net/Robot_Starscream/article/details/120323907
关节控制的插件主要利用模型插件,gzebo的模型插件有自带的api用于与gazebo中的模型传递消息。这个代码是用插件来获取gazebo中关节的参数,并将参数通过publish发送到back_wheel_steering的topic,主函数再订阅即可获得角度。