Gazebo-Tutorial(Connect to ROS)
地址: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模型
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-file $(find baxter_description)/urdf/baxter.urdf -urdf -z 1 -model baxter" />
添加xacro模型
<param name="robot_description" command="$(find xacro)/xacro.py $(find pr2_description)/robots/pr2.urdf.xacro" /> <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,必须加上标签
下面对urdf文件进行了详细的介绍
:可以将模型与世界坐标系固定,单位是kg, m, 重力9.81m/s^2,
这里还提供了一个小工具,用来检测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",然后
然后,添加gazebo_ros_control插件,解释transmission标签,加载正确的hardware interface以及controller manager。其中包含
到此,我们完成了一个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