首页 > 技术文章 > Gazebo-Tutorial(Connect to ROS)

jimlee123 2020-12-15 11:32 原文

地址:http://gazebosim.org/tutorials?cat=connect_ros

1.ROS Overview

  gazebo_ros_pkgs框图:

 

2.Installing gazebo_ros_pkgs

  查找装在哪里 which gzserver ,一般从source安装,会装在/usr/local/bin/,从debian安装,会装在/usr/bin/

  启动gazebo: rosrun gazebo_ros gazebo ,也可以用roslaunch启动一个世界: roslaunch gazebo_ros empty_world.launch ,可以用rostopic/rosservice查看,gazebo话题都转化成了ros话题

  初始化工作空间

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws
catkin_make

  添加到bash的环境变量中:

echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc

3.Using roslaunch

  roslaunch带参数:

roslaunch gazebo_ros empty_world.launch paused:=true use_sim_time:=false gui:=true throttled:=false recording:=false debug:=true verbose:=true gui_required:=true

  查看gazebo资源环境: env | grep GAZEBO_RESOURCE_PATH 

  使用roslaunch产生urdf机器人,一种是ROS call service(使用脚本,更灵活),另一种是从模型库中添加(include到.world中,要把模型添加到Gazebo环境变量),推荐第一种。例如:

  直接在终端添加: rosrun gazebo_ros spawn_model -file `rospack find baxter_description`/urdf/baxter.urdf -urdf -z 1 -model baxter 

  在.launch文件中添加:

  添加urdf模型

<!-- Spawn a robot into Gazebo -->
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-file $(find baxter_description)/urdf/baxter.urdf -urdf -z 1 -model baxter" />

  添加xacro模型

<!-- Convert an xacro and put on parameter server -->
<param name="robot_description" command="$(find xacro)/xacro.py $(find pr2_description)/robots/pr2.urdf.xacro" />

<!-- Spawn a robot into Gazebo -->
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model pr2" />

  第二种方法是使用Model Database(在.world文件中include添加robot),需要设置环境变量,原因是.world中无法定位ROS的package。

  添加模型路径到环境变量:

export GAZEBO_MODEL_PATH=/home/user/catkin_ws/src/

  在环境变量中后,在Gazebo的insert中可以看到自己的robot,之后就可以在.world文件中直接include,不需要使用rospack find。

4.Using a urdf in Gazebo

  首先介绍了urdf( Unified Robotic Description Format)和sdf( Simulation Description Format)的背景,sdf进行了优化。

  在Gazebo中使用urdf,必须加上标签<inertia>,有三种<gazebo> elements,分别是<robot>,<link>,<joint>。一般先在rviz中测试urdf是否正确,launch文件一般在robot_description功能包中,然后启动gazebo的launch文件一般在robot_gazebo功能包中。

  下面对urdf文件进行了详细的介绍

  <link>:可以将模型与世界坐标系固定,单位是kg, m, 重力9.81m/s^2,<collision>和<visual>都要设置,否则将不进行碰撞检测,雷达也检测不到。简化碰撞模型可以使用别的工具。<material>颜色、纹理的使用。还可以使用STL和Collada文件,后者(.dae)支持颜色和纹理,前者只有颜色。<inertial>必须提供,mass必须大于0,可以通过第三方软件来求。<mu1><mu2>设置两个关节的摩擦系数。

  <joint>:可以用<dynamic damping>设置damping系数,指作用力的反力。还列举了很多其他的标签,都跟力相关。

  这里还提供了一个小工具,用来检测urdf文件是否可以转化成sdf:gz sdf -p MODEL.urdf

5.Gazebo plugins in ROS

roslaunch rrbot_gazebo rrbot_world.launch
roslaunch rrbot_description rrbot_rviz.launch

  rrbot_world.launch中,启动了一个empty_world,启动了本地的rrrbot.world,然后将robot_description上传至参数服务器,最后在使用gazebo_ros功能包中的spawn_model添加urdf模型。模型文件为rrbot_description中的rrbot.xacro,其中include了rrbot.gazebo(用于gazebo插件),materials.xacro(用于设置颜色宏定义),核心是rrbot.gazebo的libgazebo_ros_camera.so插件(电脑中没有,下了源码编译才跑通),此插件将gazebo中的图像信息转化成ros的topic并发布出来。

  rrbot_rviz.launch,订阅这个话题。

   之后,有介绍了双目相机、深度相机、Openni Kinect、雷达、GPU Laser,Laser(he non-GPU version of GPU Laser)、Block Laser(provides grid style laser range scanner simulation)、F3D(Force Feedback Ground Truth)、Force、IMU(GazeboRosImu,是通过ROS插件计算测量的,不是Gazebo)、IMU sensor(GazeboRosImuSensor,是通过Gazebo插件计算测量的,不是ROS)、(Joint Pose Trajectory,监听jointtrajectoryaction ,从而设置关节的位置)、P3D(3D Position Interface for Ground Truth)、Projector、Prosilica Camera、Bumper(provides contact feedback via ContactsState message)、Differential Drive(model plugin that provides a basic controller for differential drive robots in Gazebo)、Skid Steering Drive(model plugin that provides a basic controller for skid steering drive robots in Gazebo)、Video Plugin、Planar Move Plugin、Template

6.ROS control
https://wiki.ros.org/ros_control:介绍了ros_conntrol的功能

  首先给urdf添加transmission(将执行器链接到关节上),其中transmission的type一般为: "transmission_interface/SimpleTransmission",然后<hardwareInterface>告诉gazebo_ros_control插件哪种hardware interface将会被加载,这里我们只是用effort interface。

  然后,添加gazebo_ros_control插件,解释transmission标签,加载正确的hardware interface以及controller manager。其中包含<robotNamespace>:ROS的namespace,默认为robot name;<controlPeriod>:controller的跟新周期,默认为Gazebo的周期;<robotParam>:参数服务器上的robot_description;<robotSimType>:本地的robot sim interface的插件名字 ,默认为DefauktRobotHWSim,默认时,将会匀速ros_control支持的所有controller,一般是足够用的。

  到此,我们完成了一个HWSim,确定了其类型,捆绑了关节和执行器,其加速比为1,以及确定了交互的类型(EffortJointInterface)。启动了一个controller manager。

  下面我们主要是设置控制器。首先创建一个配置文件,设置控制器和PID增益,通过roslaunch上传至参数服务器,然后通过controller_spawner节点来产生关节位置控制器,以及一个发布关节状态的控制器/joint_states。这里的spawner只是一个辅助脚本,实现向ros_control controller manager请求产生控制器的服务,使上述功能可以在roslaunch中实现。

  最后开启了一个robot_state_publisher节点,监听上文从joint_state_controller发布的/joint_states,将其转换成/tf,这可以让我们在Rviz中看到方针robot。

  相关代码:

  启动RRbot仿真:

roslaunch rrbot_gazebo rrbot_world.launch

  加载两个关节的控制器:  

roslaunch rrbot_control rrbot_control.launch

  也可以手动加载控制器(与上条功能相同):

rosservice call /rrbot/controller_manager/load_controller "name: 'joint1_position_controller'"
rosservice call /rrbot/controller_manager/load_controller "name: 'joint2_position_controller'"

  开启控制器:

rosservice call /rrbot/controller_manager/switch_controller "{start_controllers: ['joint1_position_controller','joint2_position_controller'], stop_controllers: [], strictness: 2}"

  停止控制器:

rosservice call /rrbot/controller_manager/switch_controller "{start_controllers: [], stop_controllers: ['joint1_position_controller','joint2_position_controller'], strictness: 2}"

  手动发送指令:

rostopic pub -1 /rrbot/joint1_position_controller/command std_msgs/Float64 "data: 1.5"
rostopic pub -1 /rrbot/joint2_position_controller/command std_msgs/Float64 "data: 1.0"

  使用RQT发送指令:

rosrun rqt_gui rqt_gui

  在其中添加一个command publisher,然后也可以在里面添加plot可视化相关变量,调整PID参数(添加dynamic reconfigure)等。本例中,我们观测的变量为:

/rrbot/joint1_position_controller/command/data
/rrbot/joint1_position_controller/state/process_value

  在运行时,遇到一个问题,两只曲线(发布的指令与实际的状态)之间相差了一定的值(大约是6),但是重启后解决了。

  有了joint_state_controller之后,我们便可以启动rviz:

rosrun rviz rviz

  将固定坐标系设置成world即可。

7.ROS communication

  这里提供了大量的API让用户修改或者获取仿真世界中的各种信息,包含了大量的消息和服务。

  gazebo_ros_api_plugin:这个插件随着gzserver启动,初始化了一个ROS节点gazebo,功能是让用户可以通过ROS来操作Gazebo中的各种属性,包括产生模型、观测模型的状态等。

  gazebo_ros_paths_plugin:这个插件随着gzserver和gzclient启动,功能是让Gazebo能够找到ROS的相关资源,识别ROS的功能包。

  gazebo发布的参数:use_sim_time

  gazebo订阅的话题:~/set_link_state、~/set_model_state

  gazebo发布的话题:/clock~/link_states~/model_states

  服务:在仿真中创建和销毁model:~/spawn_urdf_model~/spawn_sdf_model~/delete_model

  服务:设置状态和属性:~/set_link_properties~/set_physics_properties~/set_model_state~/set_model_configuration~/set_joint_properties~/set_link_state~/set_link_state~/set_model_state

  服务:获取状态和属性:~/get_model_properties~/get_model_state~/get_world_properties~/get_joint_properties~/get_link_properties~/get_link_state~/get_physics_properties~/link_states~/model_states

  服务:力控制:~/apply_body_wrench~/apply_joint_effort~/clear_joint_forces~/clear_body_wrenches

  服务:仿真控制:~/pause_physics~/unpause_physics~/reset_simulation~/reset_world

8. ROS plugin

  这边主要是介绍在ROS功能包中写Gazebo的插件,与前面plugin那章差不多,这里提供了模板,可以参考。

9.Advanced ROS Intergration

  Dynamic Reconfigure:可以改变各种参数,包括物理环境、模型参数、关节控制器系数等。

rosrun gazebo_ros gazebo
rosrun rqt_gui rqt_gui

 

推荐阅读