From fdeebf78ea1fac28ff12641880dfd3ab1424429b Mon Sep 17 00:00:00 2001 From: zhangshuai Date: Mon, 13 May 2019 10:45:18 +0800 Subject: [PATCH] Add "gazebo_ros_pkgs" to adapt the MPI Gazebo for naming ros node --- gazebo_ros_pkgs/CONTRIBUTING.md | 35 + gazebo_ros_pkgs/README.md | 17 + gazebo_ros_pkgs/SENSORS.md | 241 ++ gazebo_ros_pkgs/gazebo_dev/CHANGELOG.rst | 16 + gazebo_ros_pkgs/gazebo_dev/CMakeLists.txt | 8 + .../gazebo_dev/cmake/gazebo_dev-extras.cmake | 13 + gazebo_ros_pkgs/gazebo_dev/package.xml | 25 + gazebo_ros_pkgs/gazebo_msgs/CHANGELOG.rst | 164 + gazebo_ros_pkgs/gazebo_msgs/CMakeLists.txt | 68 + .../gazebo_msgs/msg/ContactState.msg | 8 + .../gazebo_msgs/msg/ContactsState.msg | 2 + gazebo_ros_pkgs/gazebo_msgs/msg/LinkState.msg | 6 + .../gazebo_msgs/msg/LinkStates.msg | 4 + .../gazebo_msgs/msg/ModelState.msg | 7 + .../gazebo_msgs/msg/ModelStates.msg | 4 + .../gazebo_msgs/msg/ODEJointProperties.msg | 11 + .../gazebo_msgs/msg/ODEPhysics.msg | 10 + .../gazebo_msgs/msg/WorldState.msg | 42 + gazebo_ros_pkgs/gazebo_msgs/package.xml | 36 + .../gazebo_msgs/srv/ApplyBodyWrench.srv | 22 + .../gazebo_msgs/srv/ApplyJointEffort.srv | 13 + .../gazebo_msgs/srv/BodyRequest.srv | 2 + .../gazebo_msgs/srv/DeleteLight.srv | 4 + .../gazebo_msgs/srv/DeleteModel.srv | 4 + .../gazebo_msgs/srv/GetJointProperties.srv | 18 + .../gazebo_msgs/srv/GetLightProperties.srv | 8 + .../gazebo_msgs/srv/GetLinkProperties.srv | 16 + .../gazebo_msgs/srv/GetLinkState.srv | 9 + .../gazebo_msgs/srv/GetModelProperties.srv | 11 + .../gazebo_msgs/srv/GetModelState.srv | 14 + .../gazebo_msgs/srv/GetPhysicsProperties.srv | 9 + .../gazebo_msgs/srv/GetWorldProperties.srv | 6 + .../gazebo_msgs/srv/JointRequest.srv | 3 + .../gazebo_msgs/srv/SetJointProperties.srv | 5 + .../gazebo_msgs/srv/SetJointTrajectory.srv | 8 + .../gazebo_msgs/srv/SetLightProperties.srv | 8 + .../gazebo_msgs/srv/SetLinkProperties.srv | 16 + .../gazebo_msgs/srv/SetLinkState.srv | 4 + .../gazebo_msgs/srv/SetModelConfiguration.srv | 9 + .../gazebo_msgs/srv/SetModelState.srv | 4 + .../gazebo_msgs/srv/SetPhysicsProperties.srv | 8 + .../gazebo_msgs/srv/SpawnModel.srv | 11 + gazebo_ros_pkgs/gazebo_plugins/CHANGELOG.rst | 563 ++++ gazebo_ros_pkgs/gazebo_plugins/CMakeLists.txt | 415 +++ .../gazebo_plugins/Media/models/chair/doc.kml | 58 + .../Media/models/chair/images/texture0.jpg | Bin 0 -> 2449 bytes .../Media/models/chair/images/texture1.jpg | Bin 0 -> 644 bytes .../Media/models/chair/models/Chair.dae | 1382 +++++++++ .../Media/models/chair/models/Chair.stl | Bin 0 -> 40584 bytes .../Media/models/chair/textures.txt | 2 + .../gazebo_plugins/cfg/CameraSynchronizer.cfg | 92 + .../gazebo_plugins/cfg/GazeboRosCamera.cfg | 13 + .../cfg/GazeboRosOpenniKinect.cfg | 13 + gazebo_ros_pkgs/gazebo_plugins/cfg/Hokuyo.cfg | 58 + .../gazebo_plugins/MultiCameraPlugin.h | 56 + .../include/gazebo_plugins/PubQueue.h | 195 ++ .../gazebo_plugins/gazebo_ros_block_laser.h | 128 + .../gazebo_plugins/gazebo_ros_bumper.h | 93 + .../gazebo_plugins/gazebo_ros_camera.h | 54 + .../gazebo_plugins/gazebo_ros_camera_utils.h | 230 ++ .../gazebo_plugins/gazebo_ros_depth_camera.h | 151 + .../gazebo_plugins/gazebo_ros_diff_drive.h | 159 + .../gazebo_plugins/gazebo_ros_elevator.h | 71 + .../include/gazebo_plugins/gazebo_ros_f3d.h | 111 + .../include/gazebo_plugins/gazebo_ros_force.h | 126 + .../gazebo_plugins/gazebo_ros_ft_sensor.h | 160 + .../gazebo_plugins/gazebo_ros_gpu_laser.h | 99 + .../gazebo_plugins/gazebo_ros_hand_of_god.h | 71 + .../gazebo_plugins/gazebo_ros_harness.h | 80 + .../include/gazebo_plugins/gazebo_ros_imu.h | 130 + .../gazebo_plugins/gazebo_ros_imu_sensor.h | 107 + .../gazebo_ros_joint_pose_trajectory.h | 133 + .../gazebo_ros_joint_state_publisher.h | 91 + .../gazebo_ros_joint_trajectory.h | 133 + .../include/gazebo_plugins/gazebo_ros_laser.h | 100 + .../gazebo_plugins/gazebo_ros_multicamera.h | 65 + .../gazebo_plugins/gazebo_ros_openni_kinect.h | 147 + .../include/gazebo_plugins/gazebo_ros_p3d.h | 133 + .../gazebo_plugins/gazebo_ros_planar_move.h | 99 + .../gazebo_plugins/gazebo_ros_projector.h | 127 + .../gazebo_plugins/gazebo_ros_prosilica.h | 104 + .../include/gazebo_plugins/gazebo_ros_range.h | 145 + .../gazebo_ros_skid_steer_drive.h | 142 + .../gazebo_plugins/gazebo_ros_template.h | 56 + .../gazebo_ros_tricycle_drive.h | 170 ++ .../gazebo_ros_triggered_camera.h | 77 + .../gazebo_ros_triggered_multicamera.h | 67 + .../include/gazebo_plugins/gazebo_ros_utils.h | 293 ++ .../gazebo_ros_vacuum_gripper.h | 161 + .../include/gazebo_plugins/gazebo_ros_video.h | 100 + .../gazebo_plugins/vision_reconfigure.h | 70 + gazebo_ros_pkgs/gazebo_plugins/package.xml | 55 + .../gazebo_plugins/scripts/gazebo_model | 68 + .../gazebo_plugins/scripts/set_pose.py | 218 ++ .../gazebo_plugins/scripts/set_wrench.py | 131 + .../gazebo_plugins/scripts/test_range.py | 22 + gazebo_ros_pkgs/gazebo_plugins/setup.py | 9 + .../gazebo_plugins/src/MultiCameraPlugin.cpp | 118 + .../src/camera_synchronizer.cpp | 48 + .../src/gazebo_plugins/__init__.py | 0 .../gazebo_plugins_interface.py | 26 + .../src/gazebo_ros_block_laser.cpp | 414 +++ .../gazebo_plugins/src/gazebo_ros_bumper.cpp | 330 ++ .../gazebo_plugins/src/gazebo_ros_camera.cpp | 113 + .../src/gazebo_ros_camera_utils.cpp | 686 +++++ .../src/gazebo_ros_depth_camera.cpp | 536 ++++ .../src/gazebo_ros_diff_drive.cpp | 493 +++ .../src/gazebo_ros_elevator.cpp | 92 + .../gazebo_plugins/src/gazebo_ros_f3d.cpp | 200 ++ .../gazebo_plugins/src/gazebo_ros_force.cpp | 160 + .../src/gazebo_ros_ft_sensor.cpp | 255 ++ .../src/gazebo_ros_gpu_laser.cpp | 209 ++ .../src/gazebo_ros_hand_of_god.cpp | 204 ++ .../gazebo_plugins/src/gazebo_ros_harness.cpp | 109 + .../gazebo_plugins/src/gazebo_ros_imu.cpp | 373 +++ .../src/gazebo_ros_imu_sensor.cpp | 237 ++ .../src/gazebo_ros_joint_pose_trajectory.cpp | 456 +++ .../src/gazebo_ros_joint_state_publisher.cpp | 154 + .../src/gazebo_ros_joint_trajectory.cpp | 458 +++ .../gazebo_plugins/src/gazebo_ros_laser.cpp | 204 ++ .../src/gazebo_ros_multicamera.cpp | 130 + .../src/gazebo_ros_openni_kinect.cpp | 481 +++ .../gazebo_plugins/src/gazebo_ros_p3d.cpp | 397 +++ .../src/gazebo_ros_planar_move.cpp | 295 ++ .../src/gazebo_ros_projector.cpp | 176 ++ .../src/gazebo_ros_prosilica.cpp | 346 +++ .../gazebo_plugins/src/gazebo_ros_range.cpp | 348 +++ .../src/gazebo_ros_skid_steer_drive.cpp | 478 +++ .../src/gazebo_ros_template.cpp | 80 + .../src/gazebo_ros_tricycle_drive.cpp | 485 +++ .../src/gazebo_ros_triggered_camera.cpp | 133 + .../src/gazebo_ros_triggered_multicamera.cpp | 110 + .../gazebo_plugins/src/gazebo_ros_utils.cpp | 152 + .../src/gazebo_ros_vacuum_gripper.cpp | 259 ++ .../gazebo_plugins/src/gazebo_ros_video.cpp | 254 ++ .../gazebo_plugins/src/hokuyo_node.cpp | 60 + .../gazebo_plugins/src/vision_reconfigure.cpp | 144 + .../test/bumper_test/gazebo_ros_bumper.world | 108 + .../test/bumper_test/test_bumper.launch | 6 + .../test/bumper_test/test_bumper.py | 120 + .../gazebo_plugins/test/camera/camera.cpp | 15 + .../gazebo_plugins/test/camera/camera.h | 87 + .../gazebo_plugins/test/camera/camera.test | 17 + .../gazebo_plugins/test/camera/camera.world | 138 + .../test/camera/camera16bit.cpp | 15 + .../test/camera/camera16bit.test | 17 + .../test/camera/camera16bit.world | 138 + .../test/camera/depth_camera.cpp | 128 + .../test/camera/depth_camera.test | 17 + .../test/camera/depth_camera.world | 144 + .../gazebo_plugins/test/camera/distortion.h | 183 ++ .../test/camera/distortion_barrel.cpp | 13 + .../test/camera/distortion_barrel.test | 12 + .../test/camera/distortion_barrel.world | 127 + .../test/camera/distortion_pincushion.cpp | 13 + .../test/camera/distortion_pincushion.test | 12 + .../test/camera/distortion_pincushion.world | 127 + .../test/camera/multicamera.cpp | 116 + .../test/camera/multicamera.test | 11 + .../test/camera/multicamera.world | 146 + .../test/camera/triggered_camera.cpp | 114 + .../test/camera/triggered_camera.test | 17 + .../test/camera/triggered_camera.world | 140 + .../test/config/example_models.yaml | 31 + .../launch/multi_robot_scenario.launch | 28 + .../launch/pioneer3dx.gazebo.launch | 21 + .../launch/pioneer3dx.rviz | 482 +++ .../launch/pioneer3dx.urdf.launch | 12 + .../meshes/laser/hokuyo.dae | 253 ++ .../meshes/p3dx/Coordinates | 20 + .../meshes/p3dx/back_rim.stl | Bin 0 -> 1094884 bytes .../meshes/p3dx/back_sonar.stl | Bin 0 -> 12084 bytes .../meshes/p3dx/center_hubcap.stl | Bin 0 -> 1684 bytes .../meshes/p3dx/center_wheel.stl | Bin 0 -> 11284 bytes .../meshes/p3dx/chassis.stl | Bin 0 -> 11084 bytes .../meshes/p3dx/front_rim.stl | Bin 0 -> 1094884 bytes .../meshes/p3dx/front_sonar.stl | Bin 0 -> 12084 bytes .../meshes/p3dx/left_hubcap.stl | Bin 0 -> 7284 bytes .../meshes/p3dx/left_wheel.stl | Bin 0 -> 28884 bytes .../meshes/p3dx/right_hubcap.stl | Bin 0 -> 7284 bytes .../meshes/p3dx/right_wheel.stl | Bin 0 -> 28884 bytes .../meshes/p3dx/swivel.stl | Bin 0 -> 10284 bytes .../multi_robot_scenario/meshes/p3dx/top.stl | Bin 0 -> 30684 bytes .../xacro/camera/camera.xacro | 81 + .../xacro/laser/hokuyo.xacro | 70 + .../xacro/laser/hokuyo_gpu.xacro | 76 + .../xacro/materials.xacro | 36 + .../xacro/p3dx/battery_block.xacro | 36 + .../xacro/p3dx/inertia_tensors.xacro | 72 + .../xacro/p3dx/pioneer3dx.xacro | 23 + .../xacro/p3dx/pioneer3dx_body.xacro | 38 + .../xacro/p3dx/pioneer3dx_chassis.xacro | 65 + .../xacro/p3dx/pioneer3dx_plugins.xacro | 39 + .../xacro/p3dx/pioneer3dx_sonar.xacro | 41 + .../xacro/p3dx/pioneer3dx_swivel.xacro | 114 + .../xacro/p3dx/pioneer3dx_wheel.xacro | 78 + .../p3d_test/test_3_double_pendulums.launch | 21 + .../p3d_test/test_3_single_pendulums.launch | 12 + .../test/p3d_test/test_double_pendulum.launch | 9 + .../test/p3d_test/test_link_pose.py | 175 ++ .../test/p3d_test/test_single_pendulum.launch | 6 + .../p3d_test/worlds/3_double_pendulums.world | 459 +++ .../p3d_test/worlds/3_single_pendulums.world | 249 ++ .../p3d_test/worlds/double_pendulum.world | 165 + .../p3d_test/worlds/single_pendulum.world | 96 + .../test/pub_joint_trajectory_test.cpp | 80 + .../test/range/range_plugin.test | 12 + .../set_model_state_test.cpp | 110 + .../set_model_state_test.test | 12 + .../set_model_state_test_p2dx.world | 356 +++ .../spawn_test/parameter_server_test.launch | 9 + .../test/spawn_test/spawn_robots.sh | 18 + .../test/test_worlds/bumper_test.world | 257 ++ .../test/test_worlds/elevator.world | 334 ++ .../test_worlds/gazebo_ros_block_laser.world | 660 ++++ .../test/test_worlds/gazebo_ros_camera.world | 146 + .../test_worlds/gazebo_ros_depth_camera.world | 223 ++ .../test_worlds/gazebo_ros_gpu_laser.world | 646 ++++ .../test/test_worlds/gazebo_ros_laser.world | 445 +++ .../test/test_worlds/gazebo_ros_range.world | 231 ++ .../gazebo_ros_trimesh_collision.world | 552 ++++ .../test/test_worlds/test_lasers.world | 443 +++ .../test/tricycle_drive/launch/.directory | 4 + .../launch/tricycle.gazebo.launch | 21 + .../test/tricycle_drive/launch/tricycle.rviz | 237 ++ .../launch/tricycle.urdf.launch | 17 + .../launch/tricycle_drive_scenario.launch | 31 + .../launch/tricycle_rviz.launch | 6 + .../test/tricycle_drive/xacro/.directory | 3 + .../test/tricycle_drive/xacro/materials.xacro | 36 + .../xacro/tricycle/inertia_tensors.xacro | 72 + .../xacro/tricycle/tricycle.xacro | 10 + .../xacro/tricycle/tricycle_body.xacro | 30 + .../xacro/tricycle/tricycle_chassis.xacro | 37 + .../xacro/tricycle/tricycle_plugins.xacro | 36 + .../tricycle_drive/xacro/tricycle/wheel.xacro | 41 + .../xacro/tricycle/wheel_actuated.xacro | 36 + .../test2/CMakeLists_tests_pkg.txt | 44 + .../contact_tolerance/contact_tolerance.cpp | 135 + .../contact_tolerance.launch | 10 + .../test2/large_models/large_model.launch | 27 + .../test2/large_models/large_model.urdf.xacro | 270 ++ .../test2/large_models/large_models.world | 54 + .../large_models/smaller_large_model.launch | 25 + .../smaller_large_model.urdf.xacro | 242 ++ .../test2/lcp_tests/balance.launch | 19 + .../test2/lcp_tests/balance.world | 186 ++ .../test2/lcp_tests/stack.launch | 19 + .../test2/lcp_tests/stack.world | 111 + .../test2/lcp_tests/stacks.launch | 19 + .../test2/lcp_tests/stacks.world | 243 ++ .../gazebo_plugins/test2/meshes/cube.wings | Bin 0 -> 580872 bytes .../gazebo_plugins/test2/meshes/cube_20k.stl | Bin 0 -> 683284 bytes .../gazebo_plugins/test2/meshes/cube_30k.stl | Bin 0 -> 791784 bytes .../test2/spawn_model/check_model.cpp | 112 + .../test2/spawn_model/spawn_box.cpp | 163 + .../test2/spawn_model/spawn_box.launch | 10 + .../test2/spawn_model/spawn_box_file.launch | 13 + .../test2/spawn_model/spawn_box_param.launch | 16 + .../test2/trimesh_tests/test_trimesh.launch | 10 + .../gazebo_plugins/test2/urdf/box.urdf | 25 + .../gazebo_plugins/test2/urdf/cube.urdf | 27 + .../gazebo_plugins/test2/worlds/empty.world | 130 + gazebo_ros_pkgs/gazebo_ros/CHANGELOG.rst | 409 +++ gazebo_ros_pkgs/gazebo_ros/CMakeLists.txt | 109 + gazebo_ros_pkgs/gazebo_ros/cfg/Physics.cfg | 59 + .../gazebo_ros/gazebo_ros_api_plugin.h | 418 +++ .../gazebo_ros/launch/elevator_world.launch | 42 + .../launch/empty_world (另一个复件).launch | 47 + .../launch/empty_world (复件).launch | 46 + .../gazebo_ros/launch/empty_world.launch | 53 + .../gazebo_ros/launch/empty_world_o.launch | 47 + .../gazebo_ros/launch/empty_world_try.launch | 52 + .../gazebo_ros/launch/mud_world.launch | 14 + .../gazebo_ros/launch/range_world.launch | 26 + .../gazebo_ros/launch/rubble_world.launch | 14 + .../gazebo_ros/launch/shapes_world.launch | 14 + .../launch/willowgarage_world.launch | 14 + gazebo_ros_pkgs/gazebo_ros/package.xml | 42 + gazebo_ros_pkgs/gazebo_ros/scripts/debug | 22 + gazebo_ros_pkgs/gazebo_ros/scripts/gazebo | 50 + gazebo_ros_pkgs/gazebo_ros/scripts/gdbrun | 25 + gazebo_ros_pkgs/gazebo_ros/scripts/gzclient | 42 + gazebo_ros_pkgs/gazebo_ros/scripts/gzclient1 | 43 + gazebo_ros_pkgs/gazebo_ros/scripts/gzclient2 | 43 + gazebo_ros_pkgs/gazebo_ros/scripts/gzserver | 41 + .../gazebo_ros/scripts/gzserver (复件) | 41 + gazebo_ros_pkgs/gazebo_ros/scripts/gzserver1 | 85 + gazebo_ros_pkgs/gazebo_ros/scripts/gzserver2 | 54 + .../gazebo_ros/scripts/gzserver_mpi | 51 + gazebo_ros_pkgs/gazebo_ros/scripts/hostfile | 4 + .../gazebo_ros/scripts/libcommon.sh | 23 + gazebo_ros_pkgs/gazebo_ros/scripts/perf | 21 + .../gazebo_ros/scripts/spawn_model | 317 ++ .../gazebo_ros/scripts/spawn_model1 | 317 ++ .../gazebo_ros/scripts/spawn_model2 | 317 ++ gazebo_ros_pkgs/gazebo_ros/setup.py | 9 + .../gazebo_ros/src/gazebo_ros/__init__.py | 0 .../src/gazebo_ros/gazebo_interface.py | 52 + .../src/gazebo_ros/gazebo_interface.pyc | Bin 0 -> 2852 bytes .../gazebo_ros/src/gazebo_ros_api_plugin.cpp | 2695 +++++++++++++++++ .../src/gazebo_ros_paths_plugin.cpp | 102 + .../gazebo_ros_control/CHANGELOG.rst | 365 +++ .../gazebo_ros_control/CMakeLists.txt | 62 + gazebo_ros_pkgs/gazebo_ros_control/README.md | 13 + .../gazebo_ros_control/default_robot_hw_sim.h | 147 + .../gazebo_ros_control_plugin.h | 131 + .../include/gazebo_ros_control/robot_hw_sim.h | 119 + .../gazebo_ros_control/package.xml | 36 + .../robot_hw_sim_plugins.xml | 11 + .../src/default_robot_hw_sim.cpp | 518 ++++ .../src/gazebo_ros_control_plugin.cpp | 310 ++ gazebo_ros_pkgs/gazebo_ros_pkgs/CHANGELOG.rst | 165 + .../gazebo_ros_pkgs/CMakeLists.txt | 4 + .../documentation/gazebo_ros_api.odg | Bin 0 -> 68731 bytes .../documentation/gazebo_ros_api.pdf | Bin 0 -> 43310 bytes .../documentation/gazebo_ros_api.png | Bin 0 -> 293237 bytes .../documentation/gazebo_ros_transmission.odg | Bin 0 -> 69578 bytes .../documentation/gazebo_ros_transmission.pdf | Bin 0 -> 41488 bytes .../documentation/gazebo_ros_transmission.png | Bin 0 -> 254711 bytes gazebo_ros_pkgs/gazebo_ros_pkgs/package.xml | 27 + 321 files changed, 38183 insertions(+) create mode 100755 gazebo_ros_pkgs/CONTRIBUTING.md create mode 100755 gazebo_ros_pkgs/README.md create mode 100755 gazebo_ros_pkgs/SENSORS.md create mode 100755 gazebo_ros_pkgs/gazebo_dev/CHANGELOG.rst create mode 100755 gazebo_ros_pkgs/gazebo_dev/CMakeLists.txt create mode 100755 gazebo_ros_pkgs/gazebo_dev/cmake/gazebo_dev-extras.cmake create mode 100755 gazebo_ros_pkgs/gazebo_dev/package.xml create mode 100755 gazebo_ros_pkgs/gazebo_msgs/CHANGELOG.rst create mode 100755 gazebo_ros_pkgs/gazebo_msgs/CMakeLists.txt create mode 100755 gazebo_ros_pkgs/gazebo_msgs/msg/ContactState.msg create mode 100755 gazebo_ros_pkgs/gazebo_msgs/msg/ContactsState.msg create mode 100755 gazebo_ros_pkgs/gazebo_msgs/msg/LinkState.msg create mode 100755 gazebo_ros_pkgs/gazebo_msgs/msg/LinkStates.msg create mode 100755 gazebo_ros_pkgs/gazebo_msgs/msg/ModelState.msg create mode 100755 gazebo_ros_pkgs/gazebo_msgs/msg/ModelStates.msg create mode 100755 gazebo_ros_pkgs/gazebo_msgs/msg/ODEJointProperties.msg create mode 100755 gazebo_ros_pkgs/gazebo_msgs/msg/ODEPhysics.msg create mode 100755 gazebo_ros_pkgs/gazebo_msgs/msg/WorldState.msg create mode 100755 gazebo_ros_pkgs/gazebo_msgs/package.xml create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/ApplyBodyWrench.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/ApplyJointEffort.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/BodyRequest.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/DeleteLight.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/DeleteModel.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/GetJointProperties.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/GetLightProperties.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/GetLinkProperties.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/GetLinkState.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/GetModelProperties.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/GetModelState.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/GetPhysicsProperties.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/GetWorldProperties.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/JointRequest.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/SetJointProperties.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/SetJointTrajectory.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/SetLightProperties.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/SetLinkProperties.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/SetLinkState.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/SetModelConfiguration.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/SetModelState.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/SetPhysicsProperties.srv create mode 100755 gazebo_ros_pkgs/gazebo_msgs/srv/SpawnModel.srv create mode 100755 gazebo_ros_pkgs/gazebo_plugins/CHANGELOG.rst create mode 100755 gazebo_ros_pkgs/gazebo_plugins/CMakeLists.txt create mode 100755 gazebo_ros_pkgs/gazebo_plugins/Media/models/chair/doc.kml create mode 100755 gazebo_ros_pkgs/gazebo_plugins/Media/models/chair/images/texture0.jpg create mode 100755 gazebo_ros_pkgs/gazebo_plugins/Media/models/chair/images/texture1.jpg create mode 100755 gazebo_ros_pkgs/gazebo_plugins/Media/models/chair/models/Chair.dae create mode 100755 gazebo_ros_pkgs/gazebo_plugins/Media/models/chair/models/Chair.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/Media/models/chair/textures.txt create mode 100755 gazebo_ros_pkgs/gazebo_plugins/cfg/CameraSynchronizer.cfg create mode 100755 gazebo_ros_pkgs/gazebo_plugins/cfg/GazeboRosCamera.cfg create mode 100755 gazebo_ros_pkgs/gazebo_plugins/cfg/GazeboRosOpenniKinect.cfg create mode 100755 gazebo_ros_pkgs/gazebo_plugins/cfg/Hokuyo.cfg create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/MultiCameraPlugin.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/PubQueue.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_block_laser.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_bumper.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_camera.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_camera_utils.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_depth_camera.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_diff_drive.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_elevator.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_f3d.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_force.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_ft_sensor.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_gpu_laser.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_hand_of_god.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_harness.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_imu.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_imu_sensor.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_joint_pose_trajectory.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_joint_state_publisher.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_joint_trajectory.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_laser.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_multicamera.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_openni_kinect.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_p3d.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_planar_move.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_projector.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_prosilica.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_range.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_skid_steer_drive.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_template.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_tricycle_drive.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_triggered_camera.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_triggered_multicamera.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_utils.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_vacuum_gripper.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_video.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/vision_reconfigure.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/package.xml create mode 100755 gazebo_ros_pkgs/gazebo_plugins/scripts/gazebo_model create mode 100755 gazebo_ros_pkgs/gazebo_plugins/scripts/set_pose.py create mode 100755 gazebo_ros_pkgs/gazebo_plugins/scripts/set_wrench.py create mode 100755 gazebo_ros_pkgs/gazebo_plugins/scripts/test_range.py create mode 100755 gazebo_ros_pkgs/gazebo_plugins/setup.py create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/MultiCameraPlugin.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/camera_synchronizer.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_plugins/__init__.py create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_plugins/gazebo_plugins_interface.py create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_block_laser.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_bumper.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_camera.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_camera_utils.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_depth_camera.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_diff_drive.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_elevator.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_f3d.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_force.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_ft_sensor.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_gpu_laser.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_hand_of_god.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_harness.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_imu.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_imu_sensor.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_joint_pose_trajectory.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_joint_state_publisher.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_joint_trajectory.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_laser.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_multicamera.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_openni_kinect.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_p3d.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_planar_move.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_projector.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_prosilica.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_range.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_skid_steer_drive.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_template.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_tricycle_drive.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_triggered_camera.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_triggered_multicamera.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_utils.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_vacuum_gripper.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_video.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/hokuyo_node.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/src/vision_reconfigure.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/bumper_test/gazebo_ros_bumper.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/bumper_test/test_bumper.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/bumper_test/test_bumper.py create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.test create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/camera16bit.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/camera16bit.test create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/camera16bit.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/depth_camera.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/depth_camera.test create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/depth_camera.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion.h create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_barrel.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_barrel.test create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_barrel.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_pincushion.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_pincushion.test create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_pincushion.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/multicamera.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/multicamera.test create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/multicamera.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/triggered_camera.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/triggered_camera.test create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/camera/triggered_camera.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/config/example_models.yaml create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/multi_robot_scenario.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/pioneer3dx.gazebo.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/pioneer3dx.rviz create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/pioneer3dx.urdf.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/laser/hokuyo.dae create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/Coordinates create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/back_rim.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/back_sonar.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/center_hubcap.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/center_wheel.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/chassis.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/front_rim.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/front_sonar.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/left_hubcap.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/left_wheel.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/right_hubcap.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/right_wheel.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/swivel.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/top.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/camera/camera.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/laser/hokuyo.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/laser/hokuyo_gpu.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/materials.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/battery_block.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/inertia_tensors.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_body.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_chassis.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_plugins.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_sonar.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_swivel.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_wheel.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_3_double_pendulums.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_3_single_pendulums.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_double_pendulum.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_link_pose.py create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_single_pendulum.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/3_double_pendulums.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/3_single_pendulums.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/double_pendulum.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/single_pendulum.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/pub_joint_trajectory_test.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/range/range_plugin.test create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/set_model_state_test/set_model_state_test.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/set_model_state_test/set_model_state_test.test create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/set_model_state_test/set_model_state_test_p2dx.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/spawn_test/parameter_server_test.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/spawn_test/spawn_robots.sh create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/bumper_test.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/elevator.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_block_laser.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_camera.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_depth_camera.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_gpu_laser.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_laser.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_range.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_trimesh_collision.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/test_lasers.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/.directory create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle.gazebo.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle.rviz create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle.urdf.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle_drive_scenario.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle_rviz.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/.directory create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/materials.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/inertia_tensors.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle_body.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle_chassis.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle_plugins.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/wheel.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/wheel_actuated.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/CMakeLists_tests_pkg.txt create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/contact_tolerance/contact_tolerance.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/contact_tolerance/contact_tolerance.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/large_models/large_model.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/large_models/large_model.urdf.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/large_models/large_models.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/large_models/smaller_large_model.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/large_models/smaller_large_model.urdf.xacro create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/balance.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/balance.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stack.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stack.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stacks.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stacks.world create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/meshes/cube.wings create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/meshes/cube_20k.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/meshes/cube_30k.stl create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/check_model.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box.cpp create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box_file.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box_param.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/trimesh_tests/test_trimesh.launch create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/urdf/box.urdf create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/urdf/cube.urdf create mode 100755 gazebo_ros_pkgs/gazebo_plugins/test2/worlds/empty.world create mode 100755 gazebo_ros_pkgs/gazebo_ros/CHANGELOG.rst create mode 100755 gazebo_ros_pkgs/gazebo_ros/CMakeLists.txt create mode 100755 gazebo_ros_pkgs/gazebo_ros/cfg/Physics.cfg create mode 100755 gazebo_ros_pkgs/gazebo_ros/include/gazebo_ros/gazebo_ros_api_plugin.h create mode 100755 gazebo_ros_pkgs/gazebo_ros/launch/elevator_world.launch create mode 100755 gazebo_ros_pkgs/gazebo_ros/launch/empty_world (另一个复件).launch create mode 100755 gazebo_ros_pkgs/gazebo_ros/launch/empty_world (复件).launch create mode 100755 gazebo_ros_pkgs/gazebo_ros/launch/empty_world.launch create mode 100755 gazebo_ros_pkgs/gazebo_ros/launch/empty_world_o.launch create mode 100755 gazebo_ros_pkgs/gazebo_ros/launch/empty_world_try.launch create mode 100755 gazebo_ros_pkgs/gazebo_ros/launch/mud_world.launch create mode 100755 gazebo_ros_pkgs/gazebo_ros/launch/range_world.launch create mode 100755 gazebo_ros_pkgs/gazebo_ros/launch/rubble_world.launch create mode 100755 gazebo_ros_pkgs/gazebo_ros/launch/shapes_world.launch create mode 100755 gazebo_ros_pkgs/gazebo_ros/launch/willowgarage_world.launch create mode 100755 gazebo_ros_pkgs/gazebo_ros/package.xml create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/debug create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/gazebo create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/gdbrun create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/gzclient create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/gzclient1 create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/gzclient2 create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/gzserver create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/gzserver (复件) create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/gzserver1 create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/gzserver2 create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/gzserver_mpi create mode 100644 gazebo_ros_pkgs/gazebo_ros/scripts/hostfile create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/libcommon.sh create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/perf create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model1 create mode 100755 gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model2 create mode 100755 gazebo_ros_pkgs/gazebo_ros/setup.py create mode 100755 gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros/__init__.py create mode 100755 gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros/gazebo_interface.py create mode 100755 gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros/gazebo_interface.pyc create mode 100755 gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros_api_plugin.cpp create mode 100755 gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros_paths_plugin.cpp create mode 100755 gazebo_ros_pkgs/gazebo_ros_control/CHANGELOG.rst create mode 100755 gazebo_ros_pkgs/gazebo_ros_control/CMakeLists.txt create mode 100755 gazebo_ros_pkgs/gazebo_ros_control/README.md create mode 100755 gazebo_ros_pkgs/gazebo_ros_control/include/gazebo_ros_control/default_robot_hw_sim.h create mode 100755 gazebo_ros_pkgs/gazebo_ros_control/include/gazebo_ros_control/gazebo_ros_control_plugin.h create mode 100755 gazebo_ros_pkgs/gazebo_ros_control/include/gazebo_ros_control/robot_hw_sim.h create mode 100755 gazebo_ros_pkgs/gazebo_ros_control/package.xml create mode 100755 gazebo_ros_pkgs/gazebo_ros_control/robot_hw_sim_plugins.xml create mode 100755 gazebo_ros_pkgs/gazebo_ros_control/src/default_robot_hw_sim.cpp create mode 100755 gazebo_ros_pkgs/gazebo_ros_control/src/gazebo_ros_control_plugin.cpp create mode 100755 gazebo_ros_pkgs/gazebo_ros_pkgs/CHANGELOG.rst create mode 100755 gazebo_ros_pkgs/gazebo_ros_pkgs/CMakeLists.txt create mode 100755 gazebo_ros_pkgs/gazebo_ros_pkgs/documentation/gazebo_ros_api.odg create mode 100755 gazebo_ros_pkgs/gazebo_ros_pkgs/documentation/gazebo_ros_api.pdf create mode 100755 gazebo_ros_pkgs/gazebo_ros_pkgs/documentation/gazebo_ros_api.png create mode 100755 gazebo_ros_pkgs/gazebo_ros_pkgs/documentation/gazebo_ros_transmission.odg create mode 100755 gazebo_ros_pkgs/gazebo_ros_pkgs/documentation/gazebo_ros_transmission.pdf create mode 100755 gazebo_ros_pkgs/gazebo_ros_pkgs/documentation/gazebo_ros_transmission.png create mode 100755 gazebo_ros_pkgs/gazebo_ros_pkgs/package.xml diff --git a/gazebo_ros_pkgs/CONTRIBUTING.md b/gazebo_ros_pkgs/CONTRIBUTING.md new file mode 100755 index 0000000..fb9f8ee --- /dev/null +++ b/gazebo_ros_pkgs/CONTRIBUTING.md @@ -0,0 +1,35 @@ +# How to Contribute + +We welcome contributions to this repo and encourage you to fork the project, thanks! + +## Implementations of simulations + +It is highly recommended to place the code that performs simulation inside +[upstream gazebo code](https://bitbucket.org/osrf/gazebo/). The Gazebo project +provides documentation about [how to create and code +plugins](http://gazebosim.org/tutorials?cat=write_plugin) Ideally +gazebo_ros_pkgs should implement the ROS wrapper over an existing gazebo +plugin. + +## Issues and Pull Requests + +There are several maintainers of different packages in this repository. If you +are submitting an issue or a pull request, please prefix the title of the issue +or pull resquest with the package name. This way the appropriate maintainers +can more easily recognize contributions which require their attention. + +## Style + +We follow the [C++ ROS style guidelines](http://ros.org/wiki/CppStyleGuide) and +conventions as closely as possible. However, because the plugins inherit from Gazebo +classes and Gazebo follows a very different formatting standard, there are a few +exceptions where Gazebo's function names do not comply to the ROS guidelines. + +## Tests + +We encourage developers to include tests in their pull requests when possible, +both for bug fixes and new features. +Examples of tests are in the `gazebo_plugins/test*` folders. +Currently the tests must not be run in parallel (see issue +[issue 409](https://github.com/ros-simulation/gazebo_ros_pkgs/issues/409)) +so it is recommented to use the `-j1` argument to `catkin run_tests`. diff --git a/gazebo_ros_pkgs/README.md b/gazebo_ros_pkgs/README.md new file mode 100755 index 0000000..00720c3 --- /dev/null +++ b/gazebo_ros_pkgs/README.md @@ -0,0 +1,17 @@ +# gazebo_ros_pkgs + +[![Build Status](http://build.ros.org/buildStatus/icon?job=Kpr__gazebo_ros_pkgs__ubuntu_xenial_amd64)](http://build.ros.org/job/Kpr__gazebo_ros_pkgs__ubuntu_xenial_amd64) + +Wrappers, tools and additional API's for using ROS with the Gazebo simulator. Formally simulator_gazebo stack, gazebo_pkgs is a meta package. Now Catkinized and works with the standalone Gazebo debian. + +### Installation +[Installing gazebo_ros_pkgs](http://gazebosim.org/tutorials?tut=ros_installing&cat=connect_ros) + +### Documentation and Tutorials +[On gazebosim.org](http://gazebosim.org/tutorials?cat=connect_ros) + +### Develop and Contribute + +See [Contribute](https://github.com/ros-simulation/gazebo_ros_pkgs/blob/hydro-devel/CONTRIBUTING.md) page. + + diff --git a/gazebo_ros_pkgs/SENSORS.md b/gazebo_ros_pkgs/SENSORS.md new file mode 100755 index 0000000..f2a8658 --- /dev/null +++ b/gazebo_ros_pkgs/SENSORS.md @@ -0,0 +1,241 @@ +# Plugins supported in Gazebo ROS packages + +## Initial note + +As detailed in the CONTRIBUITON.md guide, Gazebo ROS packages are a wrapper that +connects upstream Gazebo simulations with the ROS framework. Ideally all the +plugins in this repository should implement the ROS wrapper over a gazebo plugin +(plugin code in the [upstream gazebo repository](https://bitbucket.org/osrf/gazebo/)). + +## Sensors + +### Template + + - ***description:*** short description of the wrapper. + - ***status:*** + - **maintained**: no big issues, should work fine + - **autotest**: the wrapper has automatic tests + - **doxygen**: the wrapper implements doxygen comments + - **needs-cleanup**: the code of the wrapper should be improved + - **not-just-a-wrapper**: the code in this repo is not just a wrapper and + contains simulation code. The simulation code should be migrated to + the Gazebo repository. + - ***gazebo plugin:*** gazebo upstream plugin used by the wrapper + - ***example:*** example files that use the wrapper + +### ROS wrappers for Gazebo upstream sensors + + * ***gazebo_ros_block_laser*** + - ***description:*** implements ray based sensors (lasers). Publishes + sensors_msgs::PointCloud. + - ***status:*** maintained + - ***gazebo plugin:*** RayPlugin + - ***example:*** gazebo_plugins/test/test_worlds/gazebo_ros_block_laser.world + gazebo_plugins/test/test_worlds/gazebo_ros_trimesh_collision.world + + * ***gazebo_ros_bumper*** + - ***description:*** implements a contact sensor. Publishes + gazebo_msgs::ContactsState. + - ***status:*** maintained, needs-cleanup + - ***gazebo plugin:*** + - ***example:*** gazebo_plugins/test/bumper_test/gazebo_ros_bumper.world: + - test: gazebo_plugins/test/test_worlds/bumper_test.world: + + * ***gazebo_ros_camera*** + gazebo_ros_camera_utils + - ***description:*** implements a camera. Publishes: sensor_msgs::Image, sensor_msgs::CameraInfo + - ***status:*** maintained, dynamic-reconfigure, autotest + - ***gazebo plugin:*** CameraPlugin, GazeboRosCameraUtils + - ***example:*** gazebo_plugins/test/test_worlds/gazebo_ros_block_laser.world: + gazebo_plugins/test/test_worlds/gazebo_ros_depth_camera.world: + gazebo_plugins/test/test_worlds/gazebo_ros_camera.world: + gazebo_plugins/test/test_worlds/gazebo_ros_trimesh_collision.world: + gazebo_plugins/test/multi_robot_scenario/xacro/camera/camera.xacro: + + * ***gazebo_ros_f3d*** + - ***description:*** controller that fake (empty publisher) a 6 dof force sensor + Publishes geometry_msgs::WrenchStamped + - ***status:*** stub + - ***gazebo plugin:*** ModelPlugin (generic) + - ***example:*** -- + + * ***gazebo_ros_force*** + - ***description:*** collects data from a ROS topic and applies wrench to a body accordingly. + - ***status:*** maintained, doxygen + - ***gazebo plugin:*** ModelPlugin (generic) + - ***example:*** -- + + * ***gazebo_ros_ft_sensor*** + - ***description:*** implements Force/Torque sensor. + Publishes: geometry_msgs/WrenchStamped messages + - ***status:*** maintained, doxygen + - ***gazebo plugin:*** ModelPlugin (generic) + - ***example:*** -- + + * ***gazebo_ros_gpu_laser*** + - ***description:*** implements GPU laser based sensors. + Publishes: sensor_msgs::LaserScan + - ***status:*** maintained + - ***gazebo plugin:*** GpuRayPlugin + - ***example:*** gazebo_plugins/test/test_worlds/gazebo_ros_gpu_laser.world + gazebo_plugins/test/multi_robot_scenario/xacro/laser/hokuyo_gpu.xacro + + * ***gazebo_ros_laser*** + - ***description:*** ROS wrapper for ray based sensors (lasers). + Publishes sensor_msgs::LaserScan. + - ***status:*** maintained + - ***gazebo plugin:*** RayPlugin + - ***example:*** test/test_worlds/gazebo_ros_laser.world + test/test_worlds/test_lasers.world + test/multi_robot_scenario/xacro/laser/hokuyo.xacro + + * ***gazebo_ros_multicamera*** + MultiCameraPlugin + gazebo_ros_camera_utils + - ***description:*** ROS wrapper for one or more synchronized cameras. + Publishes: sensor_msgs::Image, sensor_msgs::CameraInfo + - ***status:*** maintained, autotest + - ***gazebo plugin:*** MultiCameraPlugin + - ***example:*** -- + + * ***gazebo_ros_openni_kinect*** + - ***description:*** ROS wrapper for depth camera sensors (Kinect like) + Publishes: sensor_msgs::PointCloud2, sensor_msgs::Image + - ***status:*** maintained + - ***gazebo plugin:*** DepthCameraPlugin + - ***example:*** -- + + * ***gazebo_ros_prosilica*** + - ***description:*** plugin for simulating prosilica cameras in gazebo + Publishes: sensor_msgs::Image, sensor_msgs::CameraInfo + - ***status:*** maintained + - ***gazebo plugin:*** > CameraPlugin > ModelPlugin (generic) + - ***example:*** -- + + * ***gazebo_ros_range*** + - ***description:*** simulate range sensors like infrared or ultrasounds + Publishes: sensor_msgs/Range + - ***status:*** maintained + - ***gazebo plugin:*** RayPlugin + - ***example:*** gazebo_plugins/test/test_worlds/gazebo_ros_range.world + gazebo_ros/launch/range_world.launch + + + +### ROS implementations for sensors (not recommended) + +Although there is some code in this repo that implements simulations, this +should be an exception. Please checkout the CONTRIBUTION.md guide for more +details about which code should be submitted to this repository. + + * ***gazebo_ros_depth_camera*** + - ***description:*** implements depth camera based sensors. Publishes: sensor_msgs::Image, + sensor_msgs::CameraInfo, sensors_msgs::PointCloud2 + - ***status:*** maintained, not-just-a-wrapper, autotest, needs-cleanup + - ***gazebo plugin:*** DepthCameraPlugin + - ***example:*** gazebo_plugins/test/test_worlds/gazebo_ros_depth_camera.world + gazebo_plugins/test/test_worlds/gazebo_ros_trimesh_collision.world + + * ***gazebo_ros_diff_drive*** + - ***description:*** implements a diff drive base. Publishes: sensor_msgs::JointState, + nav_msgs::Odometry + - ***status:*** maintained, not-just-a-wrapper, rosparams, needs-cleanup + - ***gazebo plugin:*** ModelPlugin (generic) + - ***example:*** gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_plugins.xacro + gazebo_plugins/test/multi_robot_scenario/launch/pioneer3dx.gazebo.launch + + +## Other plugins (not related to sensors) + + * ***gazebo_ros_elevator*** + - ***description:*** implements an elevator + - ***status:*** maintained + - ***gazebo plugin:*** ElevatorPlugin + - ***example:*** gazebo_plugins/test/test_worlds/elevator.world + + * ***gazebo_ros_hand_of_god*** + - ***description:*** Drives floating object around based on the location of a TF frame + - ***status:*** maintained, doxygen + - ***gazebo plugin:*** ModelPlugin (generic) + - ***example:*** -- + + * ***gazebo_ros_joint_pose_trajectory*** + - ***description:*** get a pose trajectory (trajectory_msgs::JointTrajectory) and execute it + - ***status:*** maintained + - ***gazebo_plugin:*** -- + - ***example:*** gazebo_plugins/test/pub_joint_trajectory_test.cpp + + * ***gazebo_ros_joint_state_publisher*** + - ***description:*** ROS plugin that publishes the state of a given set of joints at a given rate + Publishes: sensors_msgs::JointState + - ***status:*** maintained + - ***gazebo_plugin:*** -- + - ***example:*** multi_robot_scenario/xacro/p3dx/pioneer3dx_plugins.xacro + + * ***gazebo_ros_p3d*** + - ***description:*** publish 3D position interface for ground truth + Publishes: nav_msgs::Odometry + - ***status:*** maintained + - ***gazebo plugin:*** ModelPlugin (generic) + - ***example:*** test/p3d_test/worlds/single_pendulum.world + test/p3d_test/worlds/3_double_pendulums.world + test2/large_models/smaller_large_model.urdf.xacro + test2/large_models/large_model.urdf.xacro + + * ***gazebo_ros_planar_move*** + - ***description:*** simple model controller that uses a twist message to move a robot on the xy plane + Publishes: nav_msgs::Odometry, tf + - ***status:*** maintained + - ***gazebo plugin:*** ModelPlugin (generic) + - ***example:*** + + * ***gazebo_ros_projector*** + - ***description:*** controller that controls texture projection into the world from a given body. + Publish: msgs::Projector + - ***status:*** maintained + - ***gazebo plugin:*** ModelPlugin (generic) + - ***example:*** -- (some information in the header file) + + * ***gazebo_ros_skid_steer_drive*** + - ***description:*** A skid steering drive plugin + Publish: nav_msgs::Odometry + - ***status:*** maintained + - ***gazebo plugin:*** ModelPlugin (generic) + - ***example:*** -- + + * ***gazebo_ros_tricycle_drive*** + - ***description:*** a tricycle drive plugin for gazebo + Publish: nav_msgs::Odometry, sensor_msgs::JointState + - ***status:*** maintained, rosparams + - ***gazebo plugin:*** ModelPlugin (generic) + - ***example:*** gazebo_plugins/test/tricycle_drive/ + xacro, launch, world, rviz, etc. + + * ***gazebo_ros_video*** + - ***description:*** Video plugin for displaying ROS image topics on Ogre textures + - ***status:*** maintained + - ***gazebo plugin:*** VisualPlugin + - ***example:*** -- + + +## List of deprecated plugins (to be removed) + + * ***gazebo_ros_joint_trajectory*** + - ***description:*** migrate to gazebo_ros_joint_pose_trajectory + - ***status:*** deprecated. To be removed in Lunar. + - ***gazebo plugin:*** -- + - ***example:*** -- + + * ***camera_synchronizer*** + * ***vision_reconfigure*** + - ***description:*** + - ***status:*** needs-work, dead? + - ***gazebo plugin:*** CameraSynchronizerConfig + - ***example:*** + + * ***gazebo_ros_imu*** + - ***description:*** implements an IMU sensor. Publishes: sensor_msgs::Imu + - ***status:*** maintained, not-just-a-wrapper + - ***gazebo plugin:*** ModelPlugin (generic) + - ***example:*** -- + diff --git a/gazebo_ros_pkgs/gazebo_dev/CHANGELOG.rst b/gazebo_ros_pkgs/gazebo_dev/CHANGELOG.rst new file mode 100755 index 0000000..3bd922b --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_dev/CHANGELOG.rst @@ -0,0 +1,16 @@ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Changelog for package gazebo_dev +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +2.5.15 (2018-02-12) +------------------- + +2.5.14 (2017-12-11) +------------------- + +2.5.13 (2017-06-24) +------------------- +* Add catkin package(s) to provide the default version of Gazebo - take II (kinetic-devel) (`#571 `_) + * Added catkin package gazebo_dev which provides the cmake config of the installed Gazebo version + * gazebo_dev: added execution dependency gazebo +* Contributors: Jose Luis Rivero diff --git a/gazebo_ros_pkgs/gazebo_dev/CMakeLists.txt b/gazebo_ros_pkgs/gazebo_dev/CMakeLists.txt new file mode 100755 index 0000000..563a8e7 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_dev/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 2.8.3) +project(gazebo_dev) + +find_package(catkin REQUIRED) + +catkin_package( + CFG_EXTRAS gazebo_dev-extras.cmake +) diff --git a/gazebo_ros_pkgs/gazebo_dev/cmake/gazebo_dev-extras.cmake b/gazebo_ros_pkgs/gazebo_dev/cmake/gazebo_dev-extras.cmake new file mode 100755 index 0000000..d4bdd3b --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_dev/cmake/gazebo_dev-extras.cmake @@ -0,0 +1,13 @@ +# Depend on system install of Gazebo +find_package(gazebo REQUIRED) + +message(STATUS "Gazebo version: ${GAZEBO_VERSION}") + +# The following lines will tell catkin to add the Gazebo directories and libraries to the +# respective catkin_* cmake variables. +set(gazebo_dev_INCLUDE_DIRS ${GAZEBO_INCLUDE_DIRS}) +set(gazebo_dev_LIBRARY_DIRS ${GAZEBO_LIBRARY_DIRS}) +set(gazebo_dev_LIBRARIES ${GAZEBO_LIBRARIES}) + +# Append gazebo CXX_FLAGS to CMAKE_CXX_FLAGS (c++11) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GAZEBO_CXX_FLAGS}") diff --git a/gazebo_ros_pkgs/gazebo_dev/package.xml b/gazebo_ros_pkgs/gazebo_dev/package.xml new file mode 100755 index 0000000..cc682a7 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_dev/package.xml @@ -0,0 +1,25 @@ + + + gazebo_dev + 2.5.15 + + Provides a cmake config for the default version of Gazebo for the ROS distribution. + + + John Hsu + Dave Coleman + + Apache 2.0 + + http://gazebosim.org/tutorials?cat=connect_ros + https://github.com/ros-simulation/gazebo_ros_pkgs/issues + https://github.com/ros-simulation/gazebo_ros_pkgs + + Johannes Meyer + + catkin + + libgazebo7-dev + gazebo + + diff --git a/gazebo_ros_pkgs/gazebo_msgs/CHANGELOG.rst b/gazebo_ros_pkgs/gazebo_msgs/CHANGELOG.rst new file mode 100755 index 0000000..bcdf004 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/CHANGELOG.rst @@ -0,0 +1,164 @@ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Changelog for package gazebo_msgs +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +2.5.15 (2018-02-12) +------------------- + +2.5.14 (2017-12-11) +------------------- + +2.5.13 (2017-06-24) +------------------- +* Add catkin package(s) to provide the default version of Gazebo (`#571 `_) + * Added catkin package gazebo_dev which provides the cmake config of the installed Gazebo version +* Contributors: Jose Luis Rivero + +2.5.12 (2017-04-25) +------------------- + +2.5.11 (2017-04-18) +------------------- +* Changed the spawn model methods to spawn also lights. (`#511 `_) +* Contributors: Alessandro Ambrosano + +2.5.10 (2017-03-03) +------------------- + +2.5.9 (2017-02-20) +------------------ +* Removed all trailing whitespace +* Contributors: Dave Coleman + +2.5.8 (2016-12-06) +------------------ + +2.5.7 (2016-06-10) +------------------ + +2.5.6 (2016-04-28) +------------------ + +2.5.5 (2016-04-27) +------------------ +* merge indigo, jade to kinetic-devel +* Update maintainer for Kinetic release +* Contributors: Jose Luis Rivero, Steven Peters + +2.5.3 (2016-04-11) +------------------ + +2.5.2 (2016-02-25) +------------------ +* merging from indigo-devel +* 2.4.9 +* Generate changelog +* GetModelState modification for jade +* Contributors: John Hsu, Jose Luis Rivero, Markus Bader + +2.5.1 (2015-08-16) +------------------ + +2.5.0 (2015-04-30) +------------------ + +2.4.10 (2016-02-25) +------------------- + +2.4.9 (2015-08-16) +------------------ + +2.4.8 (2015-03-17) +------------------ + +2.4.7 (2014-12-15) +------------------ +* Update Gazebo/ROS tutorial URL +* Contributors: Jose Luis Rivero + +2.4.6 (2014-09-01) +------------------ + +2.4.5 (2014-08-18) +------------------ + +2.4.4 (2014-07-18) +------------------ +* Fix repo names in package.xml's +* Contributors: Jon Binney + +2.4.3 (2014-05-12) +------------------ + +2.4.2 (2014-03-27) +------------------ +* merging from hydro-devel +* bump patch version for indigo-devel to 2.4.1 +* merging from indigo-devel after 2.3.4 release +* "2.4.0" +* catkin_generate_changelog +* Contributors: John Hsu + +2.4.1 (2013-11-13) +------------------ +* rerelease because sdformat became libsdformat, but we also based change on 2.3.4 in hydro-devel. + +2.4.0 (2013-10-14) +------------------ + +2.3.5 (2014-03-26) +------------------ + +2.3.4 (2013-11-13) +------------------ + +2.3.3 (2013-10-10) +------------------ + +2.3.2 (2013-09-19) +------------------ + +2.3.1 (2013-08-27) +------------------ + +2.3.0 (2013-08-12) +------------------ + +2.2.1 (2013-07-29) +------------------ + +2.2.0 (2013-07-29) +------------------ + +2.1.5 (2013-07-18) +------------------ + +2.1.4 (2013-07-14) +------------------ + +2.1.3 (2013-07-13) +------------------ + +2.1.2 (2013-07-12) +------------------ +* Cleaned up CMakeLists.txt for all gazebo_ros_pkgs +* 2.1.1 + +2.1.1 (2013-07-10 19:11) +------------------------ + +2.1.0 (2013-06-27) +------------------ + +2.0.2 (2013-06-20) +------------------ + +2.0.1 (2013-06-19) +------------------ +* Incremented version to 2.0.1 + +2.0.0 (2013-06-18) +------------------ +* Changed version to 2.0.0 based on gazebo_simulator being 1.0.0 +* Updated package.xml files for ros.org documentation purposes +* Imported from bitbucket.org diff --git a/gazebo_ros_pkgs/gazebo_msgs/CMakeLists.txt b/gazebo_ros_pkgs/gazebo_msgs/CMakeLists.txt new file mode 100755 index 0000000..e15014c --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/CMakeLists.txt @@ -0,0 +1,68 @@ +cmake_minimum_required(VERSION 2.8.3) +project(gazebo_msgs) + +find_package(catkin REQUIRED COMPONENTS + std_msgs + trajectory_msgs + geometry_msgs + sensor_msgs + std_srvs + message_generation + ) + +add_message_files( + DIRECTORY msg + FILES + ContactsState.msg + ContactState.msg + LinkState.msg + LinkStates.msg + ModelState.msg + ModelStates.msg + ODEJointProperties.msg + ODEPhysics.msg + WorldState.msg + ) + +add_service_files(DIRECTORY srv FILES + ApplyBodyWrench.srv + DeleteModel.srv + DeleteLight.srv + GetLinkState.srv + GetPhysicsProperties.srv + SetJointProperties.srv + SetModelConfiguration.srv + SpawnModel.srv + ApplyJointEffort.srv + GetJointProperties.srv + GetModelProperties.srv + GetWorldProperties.srv + SetLinkProperties.srv + SetModelState.srv + BodyRequest.srv + GetLinkProperties.srv + GetModelState.srv + JointRequest.srv + SetLinkState.srv + SetPhysicsProperties.srv + SetJointTrajectory.srv + GetLightProperties.srv + SetLightProperties.srv + ) + +generate_messages(DEPENDENCIES + std_msgs + geometry_msgs + sensor_msgs + trajectory_msgs + ) + +catkin_package( + CATKIN_DEPENDS + message_runtime + std_msgs + trajectory_msgs + geometry_msgs + sensor_msgs + std_srvs + ) diff --git a/gazebo_ros_pkgs/gazebo_msgs/msg/ContactState.msg b/gazebo_ros_pkgs/gazebo_msgs/msg/ContactState.msg new file mode 100755 index 0000000..f8240c2 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/msg/ContactState.msg @@ -0,0 +1,8 @@ +string info # text info on this contact +string collision1_name # name of contact collision1 +string collision2_name # name of contact collision2 +geometry_msgs/Wrench[] wrenches # list of forces/torques +geometry_msgs/Wrench total_wrench # sum of forces/torques in every DOF +geometry_msgs/Vector3[] contact_positions # list of contact position +geometry_msgs/Vector3[] contact_normals # list of contact normals +float64[] depths # list of penetration depths diff --git a/gazebo_ros_pkgs/gazebo_msgs/msg/ContactsState.msg b/gazebo_ros_pkgs/gazebo_msgs/msg/ContactsState.msg new file mode 100755 index 0000000..6682350 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/msg/ContactsState.msg @@ -0,0 +1,2 @@ +Header header # stamp +gazebo_msgs/ContactState[] states # array of geom pairs in contact diff --git a/gazebo_ros_pkgs/gazebo_msgs/msg/LinkState.msg b/gazebo_ros_pkgs/gazebo_msgs/msg/LinkState.msg new file mode 100755 index 0000000..6dcf278 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/msg/LinkState.msg @@ -0,0 +1,6 @@ +# @todo: FIXME: sets pose and twist of a link. All children link poses/twists of the URDF tree are not updated accordingly, but should be. +string link_name # link name, link_names are in gazebo scoped name notation, [model_name::body_name] +geometry_msgs/Pose pose # desired pose in reference frame +geometry_msgs/Twist twist # desired twist in reference frame +string reference_frame # set pose/twist relative to the frame of this link/body + # leave empty or "world" or "map" defaults to world-frame diff --git a/gazebo_ros_pkgs/gazebo_msgs/msg/LinkStates.msg b/gazebo_ros_pkgs/gazebo_msgs/msg/LinkStates.msg new file mode 100755 index 0000000..275dd1d --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/msg/LinkStates.msg @@ -0,0 +1,4 @@ +# broadcast all link states in world frame +string[] name # link names +geometry_msgs/Pose[] pose # desired pose in world frame +geometry_msgs/Twist[] twist # desired twist in world frame diff --git a/gazebo_ros_pkgs/gazebo_msgs/msg/ModelState.msg b/gazebo_ros_pkgs/gazebo_msgs/msg/ModelState.msg new file mode 100755 index 0000000..10b5ad8 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/msg/ModelState.msg @@ -0,0 +1,7 @@ +# Set Gazebo Model pose and twist +string model_name # model to set state (pose and twist) +geometry_msgs/Pose pose # desired pose in reference frame +geometry_msgs/Twist twist # desired twist in reference frame +string reference_frame # set pose/twist relative to the frame of this entity (Body/Model) + # leave empty or "world" or "map" defaults to world-frame + diff --git a/gazebo_ros_pkgs/gazebo_msgs/msg/ModelStates.msg b/gazebo_ros_pkgs/gazebo_msgs/msg/ModelStates.msg new file mode 100755 index 0000000..1eac239 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/msg/ModelStates.msg @@ -0,0 +1,4 @@ +# broadcast all model states in world frame +string[] name # model names +geometry_msgs/Pose[] pose # desired pose in world frame +geometry_msgs/Twist[] twist # desired twist in world frame diff --git a/gazebo_ros_pkgs/gazebo_msgs/msg/ODEJointProperties.msg b/gazebo_ros_pkgs/gazebo_msgs/msg/ODEJointProperties.msg new file mode 100755 index 0000000..40ea605 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/msg/ODEJointProperties.msg @@ -0,0 +1,11 @@ +# access to low level joint properties, change these at your own risk +float64[] damping # joint damping +float64[] hiStop # joint limit +float64[] loStop # joint limit +float64[] erp # set joint erp +float64[] cfm # set joint cfm +float64[] stop_erp # set joint erp for joint limit "contact" joint +float64[] stop_cfm # set joint cfm for joint limit "contact" joint +float64[] fudge_factor # joint fudge_factor applied at limits, see ODE manual for info. +float64[] fmax # ode joint param fmax +float64[] vel # ode joint param vel diff --git a/gazebo_ros_pkgs/gazebo_msgs/msg/ODEPhysics.msg b/gazebo_ros_pkgs/gazebo_msgs/msg/ODEPhysics.msg new file mode 100755 index 0000000..c0e6b7e --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/msg/ODEPhysics.msg @@ -0,0 +1,10 @@ +bool auto_disable_bodies # enable auto disabling of bodies, default false +uint32 sor_pgs_precon_iters # preconditioning inner iterations when uisng projected Gauss Seidel +uint32 sor_pgs_iters # inner iterations when uisng projected Gauss Seidel +float64 sor_pgs_w # relaxation parameter when using projected Gauss Seidel, 1 = no relaxation +float64 sor_pgs_rms_error_tol # rms error tolerance before stopping inner iterations +float64 contact_surface_layer # contact "dead-band" width +float64 contact_max_correcting_vel # contact maximum correction velocity +float64 cfm # global constraint force mixing +float64 erp # global error reduction parameter +uint32 max_contacts # maximum contact joints between two geoms diff --git a/gazebo_ros_pkgs/gazebo_msgs/msg/WorldState.msg b/gazebo_ros_pkgs/gazebo_msgs/msg/WorldState.msg new file mode 100755 index 0000000..e523e77 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/msg/WorldState.msg @@ -0,0 +1,42 @@ +# This is a message that holds data necessary to reconstruct a snapshot of the world +# +# = Approach to Message Passing = +# The state of the world is defined by either +# 1. Inertial Model pose, twist +# * kinematic data - connectivity graph from Model to each Link +# * joint angles +# * joint velocities +# * Applied forces - Body wrench +# * relative transform from Body to each collision Geom +# Or +# 2. Inertial (absolute) Body pose, twist, wrench +# * relative transform from Body to each collision Geom - constant, so not sent over wire +# * back compute from canonical body info to get Model pose and twist. +# +# Chooing (2.) because it matches most physics engines out there +# and is simpler. +# +# = Future = +# Consider impacts on using reduced coordinates / graph (parent/child links) approach +# constraint and physics solvers. +# +# = Application = +# This message is used to do the following: +# * reconstruct the world and objects for sensor generation +# * stop / start simulation - need pose, twist, wrench of each body +# * collision detection - need pose of each collision geometry. velocity/acceleration if +# +# = Assumptions = +# Assuming that each (physics) processor node locally already has +# * collision information - Trimesh for Geoms, etc +# * relative transforms from Body to Geom - this is assumed to be fixed, do not send oved wire +# * inertial information - does not vary in time +# * visual information - does not vary in time +# + +Header header + +string[] name +geometry_msgs/Pose[] pose +geometry_msgs/Twist[] twist +geometry_msgs/Wrench[] wrench diff --git a/gazebo_ros_pkgs/gazebo_msgs/package.xml b/gazebo_ros_pkgs/gazebo_msgs/package.xml new file mode 100755 index 0000000..56c7814 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/package.xml @@ -0,0 +1,36 @@ + + + gazebo_msgs + 2.5.15 + + Message and service data structures for interacting with Gazebo from ROS. + + + Jose Luis Rivero + + BSD + + http://gazebosim.org/tutorials?cat=connect_ros + https://github.com/ros-simulation/gazebo_ros_pkgs/issues + https://github.com/ros-simulation/gazebo_ros_pkgs + + John Hsu + + catkin + + geometry_msgs + sensor_msgs + trajectory_msgs + std_msgs + std_srvs + message_generation + + geometry_msgs + sensor_msgs + trajectory_msgs + std_msgs + message_runtime + std_srvs + + + diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/ApplyBodyWrench.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/ApplyBodyWrench.srv new file mode 100755 index 0000000..ca27ab5 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/ApplyBodyWrench.srv @@ -0,0 +1,22 @@ +# Apply Wrench to Gazebo Body. +# via the callback mechanism +# all Gazebo operations are made in world frame +string body_name # Gazebo body to apply wrench (linear force and torque) + # wrench is applied in the gazebo world by default + # body names are prefixed by model name, e.g. pr2::base_link +string reference_frame # wrench is defined in the reference frame of this entity + # use inertial frame if left empty + # frame names are bodies prefixed by model name, e.g. pr2::base_link +geometry_msgs/Point reference_point # wrench is defined at this location in the reference frame +geometry_msgs/Wrench wrench # wrench applied to the origin of the body +time start_time # (optional) wrench application start time (seconds) + # if start_time is not specified, or + # start_time < current time, start as soon as possible +duration duration # optional duration of wrench application time (seconds) + # if duration < 0, apply wrench continuously without end + # if duration = 0, do nothing + # if duration < step size, apply wrench + # for one step size +--- +bool success # return true if set wrench successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/ApplyJointEffort.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/ApplyJointEffort.srv new file mode 100755 index 0000000..5ba9523 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/ApplyJointEffort.srv @@ -0,0 +1,13 @@ +# set urdf joint effort +string joint_name # joint to apply wrench (linear force and torque) +float64 effort # effort to apply +time start_time # optional wrench application start time (seconds) + # if start_time < current time, start as soon as possible +duration duration # optional duration of wrench application time (seconds) + # if duration < 0, apply wrench continuously without end + # if duration = 0, do nothing + # if duration < step size, assume step size and + # display warning in status_message +--- +bool success # return true if effort application is successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/BodyRequest.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/BodyRequest.srv new file mode 100755 index 0000000..d219112 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/BodyRequest.srv @@ -0,0 +1,2 @@ +string body_name # name of the body requested. body names are prefixed by model name, e.g. pr2::base_link +--- diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/DeleteLight.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/DeleteLight.srv new file mode 100755 index 0000000..0743f76 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/DeleteLight.srv @@ -0,0 +1,4 @@ +string light_name # name of the light to be deleted +--- +bool success # return true if deletion is successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/DeleteModel.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/DeleteModel.srv new file mode 100755 index 0000000..fa895aa --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/DeleteModel.srv @@ -0,0 +1,4 @@ +string model_name # name of the Gazebo Model to be deleted +--- +bool success # return true if deletion is successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/GetJointProperties.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/GetJointProperties.srv new file mode 100755 index 0000000..dd207bd --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/GetJointProperties.srv @@ -0,0 +1,18 @@ +string joint_name # name of joint +--- +# joint type +uint8 type +uint8 REVOLUTE = 0 # single DOF +uint8 CONTINUOUS = 1 # single DOF (revolute w/o joints) +uint8 PRISMATIC = 2 # single DOF +uint8 FIXED = 3 # 0 DOF +uint8 BALL = 4 # 3 DOF +uint8 UNIVERSAL = 5 # 2 DOF +# dynamics properties +float64[] damping +# joint state +float64[] position +float64[] rate +# service return status +bool success # return true if get successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/GetLightProperties.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/GetLightProperties.srv new file mode 100755 index 0000000..bd85949 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/GetLightProperties.srv @@ -0,0 +1,8 @@ +string light_name # name of Gazebo Light +--- +std_msgs/ColorRGBA diffuse # diffuse color as red, green, blue, alpha +float64 attenuation_constant +float64 attenuation_linear +float64 attenuation_quadratic +bool success # return true if get successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/GetLinkProperties.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/GetLinkProperties.srv new file mode 100755 index 0000000..ad83b54 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/GetLinkProperties.srv @@ -0,0 +1,16 @@ +string link_name # name of link + # link names are prefixed by model name, e.g. pr2::base_link +--- +geometry_msgs/Pose com # center of mass location in link frame + # and orientation of the moment of inertias + # relative to the link frame +bool gravity_mode # set gravity mode on/off +float64 mass # linear mass of link +float64 ixx # moment of inertia +float64 ixy # moment of inertia +float64 ixz # moment of inertia +float64 iyy # moment of inertia +float64 iyz # moment of inertia +float64 izz # moment of inertia +bool success # return true if get info is successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/GetLinkState.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/GetLinkState.srv new file mode 100755 index 0000000..63bdcf3 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/GetLinkState.srv @@ -0,0 +1,9 @@ +string link_name # name of link + # link names are prefixed by model name, e.g. pr2::base_link +string reference_frame # reference frame of returned information, must be a valid link + # if empty, use inertial (gazebo world) frame + # reference_frame names are prefixed by model name, e.g. pr2::base_link +--- +gazebo_msgs/LinkState link_state +bool success # return true if get info is successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/GetModelProperties.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/GetModelProperties.srv new file mode 100755 index 0000000..c83783d --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/GetModelProperties.srv @@ -0,0 +1,11 @@ +string model_name # name of Gazebo Model +--- +string parent_model_name # parent model +string canonical_body_name # name of canonical body, body names are prefixed by model name, e.g. pr2::base_link +string[] body_names # list of bodies, body names are prefixed by model name, e.g. pr2::base_link +string[] geom_names # list of geoms +string[] joint_names # list of joints attached to the model +string[] child_model_names # list of child models +bool is_static # returns true if model is static +bool success # return true if get successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/GetModelState.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/GetModelState.srv new file mode 100755 index 0000000..9c6b6ee --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/GetModelState.srv @@ -0,0 +1,14 @@ +string model_name # name of Gazebo Model +string relative_entity_name # return pose and twist relative to this entity + # an entity can be a model, body, or geom + # be sure to use gazebo scoped naming notation (e.g. [model_name::body_name]) + # leave empty or "world" will use inertial world frame +--- +Header header # Standard metadata for higher-level stamped data types. + # * header.seq holds the number of requests since the plugin started + # * header.stamp timestamp related to the pose + # * header.frame_id not used but currently filled with the relative_entity_name +geometry_msgs/Pose pose # pose of model in relative entity frame +geometry_msgs/Twist twist # twist of model in relative entity frame +bool success # return true if get successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/GetPhysicsProperties.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/GetPhysicsProperties.srv new file mode 100755 index 0000000..4c276fa --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/GetPhysicsProperties.srv @@ -0,0 +1,9 @@ +--- +# sets pose and twist of a link. All children link poses/twists of the URDF tree will be updated accordingly +float64 time_step # dt in seconds +bool pause # true if physics engine is paused +float64 max_update_rate # throttle maximum physics update rate +geometry_msgs/Vector3 gravity # gravity vector (e.g. earth ~[0,0,-9.81]) +gazebo_msgs/ODEPhysics ode_config # contains physics configurations pertaining to ODE +bool success # return true if set wrench successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/GetWorldProperties.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/GetWorldProperties.srv new file mode 100755 index 0000000..422167b --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/GetWorldProperties.srv @@ -0,0 +1,6 @@ +--- +float64 sim_time # current sim time +string[] model_names # list of models in the world +bool rendering_enabled # if X is used +bool success # return true if get successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/JointRequest.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/JointRequest.srv new file mode 100755 index 0000000..448941c --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/JointRequest.srv @@ -0,0 +1,3 @@ +string joint_name # name of the joint requested +--- + diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/SetJointProperties.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/SetJointProperties.srv new file mode 100755 index 0000000..e2781ed --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/SetJointProperties.srv @@ -0,0 +1,5 @@ +string joint_name # name of joint +gazebo_msgs/ODEJointProperties ode_joint_config # access to ODE joint dynamics properties +--- +bool success # return true if get successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/SetJointTrajectory.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/SetJointTrajectory.srv new file mode 100755 index 0000000..62169e6 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/SetJointTrajectory.srv @@ -0,0 +1,8 @@ +string model_name +trajectory_msgs/JointTrajectory joint_trajectory +geometry_msgs/Pose model_pose +bool set_model_pose +bool disable_physics_updates # defaults to false +--- +bool success # return true if set wrench successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/SetLightProperties.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/SetLightProperties.srv new file mode 100755 index 0000000..5e33866 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/SetLightProperties.srv @@ -0,0 +1,8 @@ +string light_name # name of Gazebo Light +std_msgs/ColorRGBA diffuse # diffuse color as red, green, blue, alpha +float64 attenuation_constant +float64 attenuation_linear +float64 attenuation_quadratic +--- +bool success # return true if get successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/SetLinkProperties.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/SetLinkProperties.srv new file mode 100755 index 0000000..65e8dd3 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/SetLinkProperties.srv @@ -0,0 +1,16 @@ +string link_name # name of link + # link names are prefixed by model name, e.g. pr2::base_link +geometry_msgs/Pose com # center of mass location in link frame + # and orientation of the moment of inertias + # relative to the link frame +bool gravity_mode # set gravity mode on/off +float64 mass # linear mass of link +float64 ixx # moment of inertia +float64 ixy # moment of inertia +float64 ixz # moment of inertia +float64 iyy # moment of inertia +float64 iyz # moment of inertia +float64 izz # moment of inertia +--- +bool success # return true if get info is successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/SetLinkState.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/SetLinkState.srv new file mode 100755 index 0000000..6530a15 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/SetLinkState.srv @@ -0,0 +1,4 @@ +gazebo_msgs/LinkState link_state +--- +bool success # return true if set wrench successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/SetModelConfiguration.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/SetModelConfiguration.srv new file mode 100755 index 0000000..e65a928 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/SetModelConfiguration.srv @@ -0,0 +1,9 @@ +# Set Gazebo Model pose and twist +string model_name # model to set state (pose and twist) +string urdf_param_name # parameter name that contains the urdf XML. + +string[] joint_names # list of joints to set positions. if joint is not listed here, preserve current position. +float64[] joint_positions # set to this position. +--- +bool success # return true if setting state successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/SetModelState.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/SetModelState.srv new file mode 100755 index 0000000..2095e2a --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/SetModelState.srv @@ -0,0 +1,4 @@ +gazebo_msgs/ModelState model_state +--- +bool success # return true if setting state successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/SetPhysicsProperties.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/SetPhysicsProperties.srv new file mode 100755 index 0000000..3ac6524 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/SetPhysicsProperties.srv @@ -0,0 +1,8 @@ +# sets pose and twist of a link. All children link poses/twists of the URDF tree will be updated accordingly +float64 time_step # dt in seconds +float64 max_update_rate # throttle maximum physics update rate +geometry_msgs/Vector3 gravity # gravity vector (e.g. earth ~[0,0,-9.81]) +gazebo_msgs/ODEPhysics ode_config # configurations for ODE +--- +bool success # return true if set wrench successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_msgs/srv/SpawnModel.srv b/gazebo_ros_pkgs/gazebo_msgs/srv/SpawnModel.srv new file mode 100755 index 0000000..7dadd64 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_msgs/srv/SpawnModel.srv @@ -0,0 +1,11 @@ +string model_name # name of the model to be spawn +string model_xml # this should be an urdf or gazebo xml +string robot_namespace # spawn robot and all ROS interfaces under this namespace +geometry_msgs/Pose initial_pose # only applied to canonical body +string reference_frame # initial_pose is defined relative to the frame of this model/body + # if left empty or "world", then gazebo world frame is used + # if non-existent model/body is specified, an error is returned + # and the model is not spawned +--- +bool success # return true if spawn successful +string status_message # comments if available diff --git a/gazebo_ros_pkgs/gazebo_plugins/CHANGELOG.rst b/gazebo_ros_pkgs/gazebo_plugins/CHANGELOG.rst new file mode 100755 index 0000000..45a5665 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/CHANGELOG.rst @@ -0,0 +1,563 @@ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Changelog for package gazebo_plugins +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +2.5.15 (2018-02-12) +------------------- +* Merge pull request `#669 `_ from ahcorde/kinetic-devel +* Adding velocity to joint state publisher gazebo plugin +* Fix last gazebo8 warnings! (`#658 `_) +* Fix gazebo8 warnings part 10: ifdefs for GetModel, GetEntity, Light (`#656 `_) +* gazebo8 warnings: ifdefs for Get.*Vel() (`#653 `_) +* Fix gazebo8 warnings part 8: ifdef's for GetWorldPose (`#650 `_) +* Fix gazebo8 warnings part 7: ifdef's for Joint::GetAngle and some cleanup (`#642 `_) +* Contributors: Alejandro Hernández Cordero, Steven Peters + +2.5.14 (2017-12-11) +------------------- +* for gazebo8+, call functions without Get (`#639 `_) +* Fix gazebo8 warnings part 4: convert remaining local variables in plugins to ign-math (`#633 `_) +* Fix gazebo8 warnings part 3: more ign-math in plugins (`#631 `_) +* Fix gazebo8 warnings part 2: replace private member gazebo::math types with ignition (`#628 `_) +* Replace Events::Disconnect* with pointer reset (`#623 `_) +* Merge pull request `#542 `_ from davetcoleman/kinetic-gazebo7-only + Remove compiler directive flags for < GAZEBO 7 +* Contributors: Dave Coleman, Steven Peters + +2.5.13 (2017-06-24) +------------------- +* Fix inverted height in block laser plugin (`#582 `_) +* Allow disabling distorted camera border crop (and associated tests) (`#572 `_) +* Add an IMU sensor plugin that inherits from SensorPlugin (`#363 `_) + * now the plugin works with multiple robots + * using GetParentName name instead of GetScopedName + * added comments to highlight the differents between GazeboRosImuSensor and GazeboRosIMU + * now the message header is properly handled, using bodyName parameter as frame_id + * added check on gazebo version + * added check for sensor null pointer + * changed deprecated functions for gazebo version >= 6 + * fixed version check + * added missing sensor variable for LastUpdateTime() function call + * considering '/' included in the robotNamespace + * replaced "bodyFrame" with "frameName" +* Less exciting console output (`#561 `_) +* Add catkin package(s) to provide the default version of Gazebo (`#571 `_) + * gazebo_dev: added execution dependency gazebo +* Contributors: Adam Allevato, Alessandro Settimi, Dave Coleman, Jose Luis Rivero, Shohei Fujii + +2.5.12 (2017-04-25) +------------------- +* Revert catkin warning fix (`#567 `_) + Many regressions in third party software (see https://github.com/yujinrobot/kobuki_desktop/issues/50) +* Contributors: Jose Luis Rivero + +2.5.11 (2017-04-18) +------------------- +* Change build system to set DEPEND on Gazebo/SDFormat (fix catkin warning) + Added missing DEPEND clauses to catkin_package to fix gazebo catkin warning. + Note that after the change problems could appear related to -lpthreads + errors. This is an known issue related to catkin: + https://github.com/ros/catkin/issues/856 + +* Fix: add gazebo_ros_range to catkin package libraries (`#558 `_) +* Contributors: Christoph Rist, Dave Coleman + +2.5.10 (2017-03-03) +------------------- +* Revert catkin warnings to fix regressions (problems with catkin -lpthreads errors) + For reference and reasons, please check: + https://discourse.ros.org/t/need-to-sync-new-release-of-rqt-topic-indigo-jade-kinetic/1410/4 + * Revert "Fix gazebo catkin warning, cleanup CMakeLists (`#537 `_)" + This reverts commit 5a0305fcb97864b66bc2e587fc0564435b4f2034. + * Revert "Fix gazebo and sdformat catkin warnings" + This reverts commit 11f95d25dcd32faccd2401d45c722f7794c7542c. +* Fix destructor of GazeboRosVideo (`#547 `_) +* Less exciting console output (`#549 `_) +* Fix SDF namespacing for Video Plugin (`#546 `_) +* Contributors: Dave Coleman, Jose Luis Rivero + +2.5.9 (2017-02-20) +------------------ +* Fix gazebo catkin warning, cleanup CMakeLists (`#537 `_) +* Fix timestamp issues for rendering sensors (kinetic-devel) +* Namespace console output (`#543 `_) +* Adding depth camera world to use in test to make depth camera have right timestamp `#408 `_- appears to be working (though only looking at horizon) but getting these sdf errors: +* `#408 `_ Make the multi camera timestamps current rather than outdated, also reuse the same update code +* Fix merge with kinetic branch +* `#408 `_ Making a test for multicamra that shows the timestamps are currently outdated, will fix them similar to how the regular camera was fixed. +* Fix for issue `#408 `_. The last measurement time is the time that gazebo generated the sensor data, so ought to be used. updateRate doesn't seem that useful. + The other cameras need similar fixes to have the proper timestamps. +* Bugfix: duplicated tf prefix resolution +* fill in child_frame_id of odom topic +* Fix gazebo and sdformat catkin warnings +* Contributors: Dave Coleman, Jose Luis Rivero, Kei Okada, Lucas Walter, Yuki Furuta + +2.5.8 (2016-12-06) +------------------ +* Fix camera distortion coefficients order. Now {k1, k2, p1, p2, k3} +* Added an interface to gazebo's harness plugin +* Contributors: Enrique Fernandez, Steven Peters, Nate Koenig + +2.5.7 (2016-06-10) +------------------ + +2.5.6 (2016-04-28) +------------------ +* fix gazebo7 deprecation warnings on kinetic +* Contributors: Steven Peters + +2.5.5 (2016-04-27) +------------------ +* merge indigo, jade to kinetic-devel +* Accept /world for the frameName parameter in gazebo_ros_p3d +* Upgrade to gazebo 7 and remove deprecated driver_base dependency + * Upgrade to gazebo 7 and remove deprecated driver_base dependency + * disable gazebo_ros_control until dependencies are met + * Remove stray backslash +* Update maintainer for Kinetic release +* use HasElement in if condition +* Contributors: Hugo Boyer, Jackie Kay, Jose Luis Rivero, Steven Peters, William Woodall, Yuki Furuta + +2.5.3 (2016-04-11) +------------------ + +2.5.2 (2016-02-25) +------------------ +* Fix row_step of openni_kinect plugin +* remove duplicated code during merge +* merging from indigo-devel +* Merge pull request `#368 `_ from l0g1x/jade-devel + Covariance for published twist in skid steer plugin +* gazebo_ros_utils.h: include gazebo_config.h + Make sure to include gazebo_config.h, + which defines the GAZEBO_MAJOR_VERSION macro +* Fix compiler error with SetHFOV + In gazebo7, the rendering::Camera::SetHFOV function + is overloaded with a potential for ambiguity, + as reported in the following issue: + https://bitbucket.org/osrf/gazebo/issues/1830 + This fixes the build by explicitly defining the + Angle type. +* Add missing boost header + Some boost headers were remove from gazebo7 header files + and gazebo_ros_joint_state_publisher.cpp was using it + implicitly. +* Fix gazebo7 build errors + The SensorPtr types have changed from boost:: pointers + to std:: pointers, + which requires boost::dynamic_pointer_cast to change to + std::dynamic_pointer_cast. + A helper macro is added that adds a `using` statement + corresponding to the correct type of dynamic_pointer_cast. + This macro should be narrowly scoped to protect + other code. +* gazebo_ros_utils.h: include gazebo_config.h + Make sure to include gazebo_config.h, + which defines the GAZEBO_MAJOR_VERSION macro +* Use Joint::SetParam for joint velocity motors + Before gazebo5, Joint::SetVelocity and SetMaxForce + were used to set joint velocity motors. + The API has changed in gazebo5, to use Joint::SetParam + instead. + The functionality is still available through the SetParam API. + cherry-picked from indigo-devel + Add ifdefs to fix build with gazebo2 + It was broken by `#315 `_. + Fixes `#321 `_. +* Fix gazebo6 deprecation warnings + Several RaySensor functions are deprecated in gazebo6 + and are removed in gazebo7. + The return type is changed to use ignition math + and the function name is changed. + This adds ifdef's to handle the changes. +* Fix compiler error with SetHFOV + In gazebo7, the rendering::Camera::SetHFOV function + is overloaded with a potential for ambiguity, + as reported in the following issue: + https://bitbucket.org/osrf/gazebo/issues/1830 + This fixes the build by explicitly defining the + Angle type. +* Add missing boost header + Some boost headers were remove from gazebo7 header files + and gazebo_ros_joint_state_publisher.cpp was using it + implicitly. +* Fix gazebo7 build errors + The SensorPtr types have changed from boost:: pointers + to std:: pointers, + which requires boost::dynamic_pointer_cast to change to + std::dynamic_pointer_cast. + A helper macro is added that adds a `using` statement + corresponding to the correct type of dynamic_pointer_cast. + This macro should be narrowly scoped to protect + other code. +* Fix gazebo6 deprecation warnings + Several RaySensor functions are deprecated in gazebo6 + and are removed in gazebo7. + The return type is changed to use ignition math + and the function name is changed. + This adds ifdef's to handle the changes. +* Publish organized point cloud from openni_kinect plugin +* Added covariance matrix for published twist message in the skid steer plugin, as packages such as robot_localization require an associated non-zero covariance matrix +* Added a missing initialization inside Differential Drive +* 2.4.9 +* Generate changelog +* Merge pull request `#335 `_ from pal-robotics-forks/add_range_sensor_plugin + Adds range plugin for infrared and ultrasound sensors from PAL Robotics +* Import changes from jade-branch +* Add range world and launch file +* Adds range plugin for infrared and ultrasound sensors from PAL Robotics +* Add ifdefs to fix build with gazebo2 + It was broken by `#315 `_. + Fixes `#321 `_. +* Use Joint::SetParam for joint velocity motors + Before gazebo5, Joint::SetVelocity and SetMaxForce + were used to set joint velocity motors. + The API has changed in gazebo5, to use Joint::SetParam + instead. + The functionality is still available through the SetParam API. +* Set GAZEBO_CXX_FLAGS to fix c++11 compilation errors +* Contributors: Bence Magyar, John Hsu, Jose Luis Rivero, Kentaro Wada, Krystian, Mirko Ferrati, Steven Peters, hsu + +2.5.1 (2015-08-16) +------------------ +* Port of Pal Robotics range sensor plugin to Jade +* Added a comment about the need of libgazebo5-dev in runtime +* Added gazebo version check +* Added missing files +* Added elevator plugin +* Use c++11 +* run_depend on libgazebo5-dev (`#323 `_) + Declare the dependency. + It can be fixed later if we don't want it. +* Contributors: Jose Luis Rivero, Nate Koenig, Steven Peters + +* Port of Pal Robotics range sensor plugin to Jade +* Added a comment about the need of libgazebo5-dev in runtime +* Added gazebo version check +* Added missing files +* Added elevator plugin +* Use c++11 +* run_depend on libgazebo5-dev +* Contributors: Jose Luis Rivero, Nate Koenig, Steven Peters + +2.5.0 (2015-04-30) +------------------ +* run_depend on libgazebo5-dev instead of gazebo5 +* Changed the rosdep key for gazebo to gazebo5, for Jade Gazebo5 will be used. +* Contributors: Steven Peters, William Woodall + +2.4.9 (2015-08-16) +------------------ +* Adds range plugin for infrared and ultrasound sensors from PAL Robotics +* Import changes from jade-branch +* Add range world and launch file +* Add ifdefs to fix build with gazebo2 +* Use Joint::SetParam for joint velocity motors +* Set GAZEBO_CXX_FLAGS to fix c++11 compilation errors +* Contributors: Bence Magyar, Jose Luis Rivero, Steven Peters + +2.4.8 (2015-03-17) +------------------ +* fixed mistake at calculation of joint velocity +* [gazebo_ros_diff_drive] force call SetMaxForce since this Joint::Reset in gazebo/physics/Joint.cc reset MaxForce to zero and ModelPlugin::Reset is called after Joint::Reset +* add PointCloudCutoffMax +* Contributors: Kei Okada, Michael Ferguson, Sabrina Heerklotz + +2.4.7 (2014-12-15) +------------------ +* fix missing ogre flags: removed from gazebo default (5.x.x candidate) cmake config +* Fixing handling of non-world frame velocities in setModelState. +* fix missing ogre flags (removed from gazebo cmake config) +* change header to use opencv2/opencv.hpp issue `#274 `_ +* Update Gazebo/ROS tutorial URL +* Merge pull request `#237 `_ from ros-simulation/update_header_license + Update header license for Indigo +* Contributors: John Hsu, Jose Luis Rivero, Robert Codd-Downey, Tom Moore, hsu + +2.4.6 (2014-09-01) +------------------ +* Update gazebo_ros_openni_kinect.cpp +* merging from hydro-devel into indigo-devel +* Merge pull request `#204 `_ from fsuarez6/hydro-devel + gazebo_plugins: Adding ForceTorqueSensor Plugin +* Updated to Apache 2.0 license +* Merge pull request `#180 `_ from vrabaud/indigo-devel + remove PCL dependency +* merging +* check deprecation of gazebo::Joint::SetAngle by SetPosition +* compatibility with gazebo 4.x +* Update changelogs for the upcoming release +* Fix build with gazebo4 and indigo +* Added Gaussian Noise generator +* publish organized pointcloud from openni plugin +* Changed measurement direction to "parent to child" +* gazebo_plugin: Added updateRate parameter to the gazebo_ros_imu plugin +* gazebo_plugins: Adding ForceTorqueSensor Plugin +* remove PCL dependency +* ros_camera_utils: Adding CameraInfoManager to satisfy full ROS camera API (relies on https://github.com/ros-perception/image_common/pull/20 ) + ros_camera_utils: Adding CameraInfoManager to satisfy full ROS camera API (relies on https://github.com/ros-perception/image_common/pull/20 ) +* Contributors: John Hsu, Jonathan Bohren, Jose Luis Rivero, Nate Koenig, Ryohei Ueda, Vincent Rabaud, fsuarez6, gborque, John Binney + +2.4.5 (2014-08-18) +------------------ +* Replace SetAngle with SetPosition for gazebo 4 and up +* Port fix_build branch for indigo-devel + See pull request `#221 `_ +* Contributors: Jose Luis Rivero, Steven Peters + +2.4.4 (2014-07-18) +------------------ +* Merge branch 'hydro-devel' into indigo-devel +* gazebo_ros_diff_drive gazebo_ros_tricycle_drive encoderSource option names updated +* gazebo_ros_diff_drive is now able to use the wheels rotation of the optometry or the gazebo ground truth based on the 'odometrySource' parameter +* simple linear controller for the tricycle_drive added +* second robot for testing in tricycle_drive_scenario.launch added +* Merge remote-tracking branch 'upstream/hydro-devel' into hydro-devel +* BDS licenses header fixed and tricycle drive plugin added +* format patch of hsu applied +* Updated package.xml +* Fix repo names in package.xml's +* ros diff drive supports now an acceleration limit +* Pioneer model: Diff_drive torque reduced +* GPU Laser test example added +* fixed gpu_laser to work with workspaces +* hand_of_god: Adding hand-of-god plugin + ros_force: Fixing error messages to refer to the right plugin +* Remove unneeded dependency on pcl_ros +* minor fixes on relative paths in xacro for pioneer robot +* gazebo test model pionneer 3dx updated with xacro path variables +* pioneer model update for the multi_robot_scenario +* Merge remote-tracking branch 'upstream/hydro-devel' into hydro-devel +* fixed camera to work with workspaces +* fixed links related to changed name +* diff drive name changed to multi robot scenario +* working camera added +* Merge remote-tracking branch 'upstream/hydro-devel' into hydro-devel +* fix in pioneer xacro model for diff_drive +* Laser colour in rviz changed +* A test model for the ros_diff_drive ros_laser and joint_state_publisher added +* the ros_laser checkes now for the model name and adds it als prefix +* joint velocity fixed using radius instead of diameter +* ROS_INFO on laser plugin added to see if it starts +* fetched with upstream +* gazebo_ros_diff_drive was enhanced to publish the wheels tf or the wheels joint state depending on two additinal xml options +* Gazebo ROS joint state publisher added +* Contributors: Dave Coleman, John Hsu, Jon Binney, Jonathan Bohren, Markus Bader, Steven Peters + +2.4.3 (2014-05-12) +------------------ +* gazebo_plugins: add run-time dependency on gazebo_ros +* Merge pull request `#176 `_ from ros-simulation/issue_175 + Fix `#175 `_: dynamic reconfigure dependency error +* Remove unneeded dependency on pcl_ros +* Fix `#175 `_: dynamic reconfigure dependency error +* Contributors: Steven Peters + +2.4.2 (2014-03-27) +------------------ +* merging from hydro-devel +* bump patch version for indigo-devel to 2.4.1 +* merging from indigo-devel after 2.3.4 release +* "2.4.0" +* catkin_generate_changelog +* Contributors: John Hsu + +2.4.1 (2013-11-13) +------------------ + +2.3.5 (2014-03-26) +------------------ +* update test world for block laser +* this corrects the right orientation of the laser scan and improves on comparison between 2 double numbers +* Initialize ``depth_image_connect_count_`` in openni_kinect plugin +* multicamera bad namespace. Fixes `#161 `_ + There was a race condition between GazeboRosCameraUtils::LoadThread + creating the ros::NodeHandle and GazeboRosCameraUtils::Load + suffixing the camera name in the namespace +* Use function for accessing scene node in gazebo_ros_video +* readded the trailing whitespace for cleaner diff +* the parent sensor in gazebo seems not to be active +* Contributors: Dejan Pangercic, Ian Chen, John Hsu, Jordi Pages, Toni Oliver, Ugo Cupcic + +2.3.4 (2013-11-13) +------------------ +* rerelease because sdformat became libsdformat, but we also based change on 2.3.4 in hydro-devel. +* Simplify ``gazebo_plugins/CMakeLists.txt`` + Replace ``cxx_flags`` and ``ld_flags`` variables with simpler cmake macros + and eliminate unnecessary references to ``SDFormat_LIBRARIES``, since + they are already part of ``GAZEBO_LIBRARIES``. +* Put some cmake lists on multiple lines to improve readability. +* Add dependencies on dynamic reconfigure files + Occasionally the build can fail due to some targets having an + undeclared dependency on automatically generated dynamic + reconfigure files (GazeboRosCameraConfig.h for example). This + commit declares several of those dependencies. + +2.4.0 (2013-10-14) +------------------ + +2.3.3 (2013-10-10) +------------------ +* gazebo_plugins: use shared pointers for variables shared among cameras + It is not allowed to construct a shared_ptr from a pointer to a member + variable. +* gazebo_plugins: moved initialization of shared_ptr members of + GazeboRosCameraUtils to `GazeboRosCameraUtils::Load()` + This fixes segfaults in gazebo_ros_depth_camera and + gazebo_ros_openni_kinect as the pointers have not been initialized + there. +* Use `RenderingIFace.hh` + +2.3.2 (2013-09-19) +------------------ +* Make gazebo includes use full path + In the next release of gazebo, it will be required to use the + full path for include files. For example, + `include ` will not be valid + `include ` must be done instead. +* Merge branch 'hydro-devel' of `gazebo_ros_pkgs `_ into synchronize_with_drcsim_plugins +* change includes to use brackets in headers for export +* per pull request comments +* Changed resolution for searchParam. +* Don't forget to delete the node! +* Removed info message on robot namespace. +* Retreive the tf prefix from the robot node. +* synchronize with drcsim plugins + +2.3.1 (2013-08-27) +------------------ +* Remove direct dependency on pcl, rely on the transitive dependency from pcl_ros +* Cleaned up template, fixes for header files + +2.3.0 (2013-08-12) +------------------ +* enable image generation when pointcloud is requested, as the generated image is used by the pointcloud +* gazebo_plugins: replace deprecated boost function + This is related to this `gazebo issue #581 `_ +* gazebo_plugins: fix linkedit issues + Note: other linkedit errors were fixed upstream + in gazebo +* gazebo_ros_openni_kinect plugin: adds publishing of the camera info + again (fixes `#95 `_) +* Merge pull request `#90 `_ from piyushk/add_model_controller + added a simple model controller plugin that uses a twist message +* renamed plugin from model controller to planar move +* prevents dynamic_reconfigure from overwritting update rate param on start-up +* removed anonymizer from include guard +* fixed odometry publication for model controller plugin +* added a simple model controller plugin that uses a twist message to control models + +2.2.1 (2013-07-29) +------------------ +* Added prosilica plugin to install TARGETS + +2.2.0 (2013-07-29) +------------------ +* Switched to pcl_conversions instead of using compiler flags for Hydro/Groovy PCL support +* fixed node intialization conflict between gzserver and gzclient. better adherance to gazebo style guidelines +* Fixed template +* removed ros initialization from plugins +* Standardized the way ROS nodes are initialized in gazebo plugins +* Remove find_package(SDF) from CMakeLists.txt + It is sufficient to find gazebo, which will export the information about the SDFormat package. +* ROS Video Plugin for Gazebo - allows displaying an image stream in an OGRE texture inside gazebo. Also provides a fix for `#85 `_. +* patch a fix for prosilica plugin (startup race condition where `rosnode_` might still be NULL). +* Added explanation of new dependency in gazebo_ros_pkgs +* switch Prosilica camera from type depth to regular camera (as depth data were not used). +* migrating prosilica plugin from pr2_gazebo_plugins +* Removed tbb because it was a temporary dependency for a Gazebo bug +* SDF.hh --> sdf.hh +* Added PCL to package.xml + +2.1.5 (2013-07-18) +------------------ +* Include instead of + The sdformat package recently changed the name of an sdf header + file from SDF.hh to SDFImpl.hh; this change will use the lower-case + header file which should work with old and new versions of sdformat + or gazebo. + +2.1.4 (2013-07-14) +------------------ + +2.1.3 (2013-07-13) +------------------ +* temporarily add tbb as a work around for `#74 `_ + +2.1.2 (2013-07-12) +------------------ +* Fixed compatibility with new PCL 1.7.0 +* Tweak to make SDFConfig.cmake +* Re-enabled dynamic reconfigure for camera utils - had been removed for Atlas +* Cleaned up CMakeLists.txt for all gazebo_ros_pkgs +* Removed SVN references +* 2.1.1 + +2.1.1 (2013-07-10 19:11) +------------------------ +* Small deprecated warning +* Fixed errors and deprecation warnings from Gazebo 1.9 and the sdformat split +* Source code formatting. +* Merge pull request `#59 `_ from ros-simulation/CMake_Tweak + Added dependency to prevent missing msg header, cleaned up CMakeLists +* export diff drive and skid steer for other catkin packages +* install diff_drive and skid_steer plugins +* Added dependency to prevent missing msg header, cleaned up CMakeLists +* Added ability to switch off publishing TF. + +2.1.0 (2013-06-27) +------------------ +* gazebo_plugins: always use gazebo/ path prefix in include directives +* gazebo_plugins: call Advertise() directly after initialization has + completed in gazebo_ros_openni_kinect and gazebo_ros_depth_camera + plugins, as the sensor will never be activated otherwise +* Merge pull request `#41 `_ from ZdenekM/hydro-devel + Added skid steering plugin (modified diff drive plugin). +* Merge pull request `#35 `_ from meyerj/fix_include_directory_installation_target + Header files of packages gazebo_ros and gazebo_plugins are installed to the wrong location +* Rotation fixed. +* Skid steering drive plugin. +* gazebo_plugins: added missing initialization of `GazeboRosDepthCamera::advertised_` +* gazebo_plugins: fixed depth and openni kinect camera plugin segfaults +* gazebo_plugins: terminate the service thread properly on destruction of a PubMutliQueue object without shuting down ros +* gazebo_plugins/gazebo_ros: fixed install directories for include files and gazebo scripts +* fix for terminating the `service_thread_` in PubQueue.h +* added differential drive plugin to gazebo plugins + +2.0.2 (2013-06-20) +------------------ +* Added Gazebo dependency + +2.0.1 (2013-06-19) +------------------ +* Incremented version to 2.0.1 +* Fixed circular dependency, removed deprecated pkgs since its a stand alone pkg +* Check camera util is initialized before publishing - fix from Atlas + +2.0.0 (2013-06-18) +------------------ +* Changed version to 2.0.0 based on gazebo_simulator being 1.0.0 +* Updated package.xml files for ros.org documentation purposes +* Combined updateSDFModelPose and updateSDFName, added ability to spawn SDFs from model database, updates SDF version to lastest in parts of code, updated the tests +* Created tests for various spawning methods +* Added debug info to shutdown +* Fixed gazebo includes to be in format +* Cleaned up file, addded debug info +* Merge branch 'groovy-devel' into plugin_updates +* Merged changes from Atlas ROS plugins, cleaned up headers +* Merged changes from Atlas ROS plugins, cleaned up headers +* fix curved laser issue +* Combining Atlas code with old gazebo_plugins +* Combining Atlas code with old gazebo_plugins +* Small fixes per ffurrer's code review +* Added the robot namespace to the tf prefix. + The tf_prefix param is published under the robot namespace and not the + robotnamespace/camera node which makes it non-local we have to use the + robot namespace to get it otherwise it is empty. +* findreplace ConnectWorldUpdateStart ConnectWorldUpdateBegin +* Fixed deprecated function calls in gazebo_plugins +* Deprecated warnings fixes +* Removed the two plugin tests that are deprecated +* Removed abandoned plugin tests +* All packages building in Groovy/Catkin +* Imported from bitbucket.org diff --git a/gazebo_ros_pkgs/gazebo_plugins/CMakeLists.txt b/gazebo_ros_pkgs/gazebo_plugins/CMakeLists.txt new file mode 100755 index 0000000..5ed3b31 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/CMakeLists.txt @@ -0,0 +1,415 @@ +cmake_minimum_required(VERSION 2.8.3) +project(gazebo_plugins) + +option(ENABLE_DISPLAY_TESTS "Enable the building of tests that requires a display" OFF) + +find_package(catkin REQUIRED COMPONENTS + gazebo_dev + message_generation + gazebo_msgs + roscpp + rospy + nodelet + angles + std_srvs + geometry_msgs + sensor_msgs + nav_msgs + urdf + tf + tf2_ros + dynamic_reconfigure + rosgraph_msgs + trajectory_msgs + image_transport + rosconsole + cv_bridge + polled_camera + diagnostic_updater + camera_info_manager + std_msgs +) + +include (FindPkgConfig) +if (PKG_CONFIG_FOUND) + pkg_check_modules(XML libxml-2.0) + pkg_check_modules(OGRE OGRE) + pkg_check_modules(OGRE-Terrain OGRE-Terrain) + pkg_check_modules(OGRE-Paging OGRE-Paging) +else() + message(FATAL_ERROR "pkg-config is required; please install it") +endif() + +find_package(Boost REQUIRED COMPONENTS thread) + +execute_process(COMMAND + pkg-config --variable=plugindir OGRE + OUTPUT_VARIABLE OGRE_PLUGIN_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +catkin_python_setup() + +generate_dynamic_reconfigure_options( + cfg/CameraSynchronizer.cfg + cfg/GazeboRosCamera.cfg + cfg/GazeboRosOpenniKinect.cfg + cfg/Hokuyo.cfg +) + +include_directories(include + ${Boost_INCLUDE_DIRS} + ${catkin_INCLUDE_DIRS} + ${OGRE_INCLUDE_DIRS} + ${OGRE-Terrain_INCLUDE_DIRS} + ${OGRE-Paging_INCLUDE_DIRS} +) + +link_directories( + ${catkin_LIBRARY_DIRS} + ${OGRE_LIBRARY_DIRS} + ${OGRE-Terrain_LIBRARY_DIRS} + ${OGRE-Paging_LIBRARY_DIRS} +) + +if (NOT GAZEBO_VERSION VERSION_LESS 6.0) + catkin_package( INCLUDE_DIRS include LIBRARIES gazebo_ros_elevator) +endif() + +if (NOT GAZEBO_VERSION VERSION_LESS 7.3) + catkin_package(INCLUDE_DIRS include LIBRARIES gazebo_ros_harness) +endif() + +catkin_package( + INCLUDE_DIRS include + LIBRARIES + vision_reconfigure + gazebo_ros_utils + gazebo_ros_camera_utils + gazebo_ros_camera + gazebo_ros_triggered_camera + gazebo_ros_multicamera + gazebo_ros_triggered_multicamera + gazebo_ros_depth_camera + gazebo_ros_openni_kinect + gazebo_ros_gpu_laser + gazebo_ros_laser + gazebo_ros_block_laser + gazebo_ros_p3d + gazebo_ros_imu + gazebo_ros_imu_sensor + gazebo_ros_f3d + gazebo_ros_ft_sensor + gazebo_ros_bumper + gazebo_ros_template + gazebo_ros_projector + gazebo_ros_prosilica + gazebo_ros_force + gazebo_ros_joint_trajectory + gazebo_ros_joint_state_publisher + gazebo_ros_joint_pose_trajectory + gazebo_ros_diff_drive + gazebo_ros_tricycle_drive + gazebo_ros_skid_steer_drive + gazebo_ros_video + gazebo_ros_planar_move + gazebo_ros_range + gazebo_ros_vacuum_gripper + + CATKIN_DEPENDS + message_runtime + gazebo_msgs + roscpp + rospy + nodelet + angles + std_srvs + geometry_msgs + sensor_msgs + nav_msgs + urdf + tf + tf2_ros + dynamic_reconfigure + rosgraph_msgs + trajectory_msgs + image_transport + rosconsole + camera_info_manager + std_msgs +) +add_dependencies(${PROJECT_NAME}_gencfg ${catkin_EXPORTED_TARGETS}) + +## Executables +add_executable(hokuyo_node src/hokuyo_node.cpp) +add_dependencies(hokuyo_node ${PROJECT_NAME}_gencfg) +target_link_libraries(hokuyo_node + ${catkin_LIBRARIES} +) + +add_library(gazebo_ros_utils src/gazebo_ros_utils.cpp) +target_link_libraries(gazebo_ros_utils ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +add_library(vision_reconfigure src/vision_reconfigure.cpp) +add_dependencies(vision_reconfigure ${PROJECT_NAME}_gencfg) +target_link_libraries(vision_reconfigure ${catkin_LIBRARIES}) + +add_executable(camera_synchronizer src/camera_synchronizer.cpp) +add_dependencies(camera_synchronizer ${PROJECT_NAME}_gencfg) +target_link_libraries(camera_synchronizer vision_reconfigure ${catkin_LIBRARIES}) + +add_executable(pub_joint_trajectory_test test/pub_joint_trajectory_test.cpp) +target_link_libraries(pub_joint_trajectory_test ${catkin_LIBRARIES} ${Boost_LIBRARIES}) +add_dependencies(pub_joint_trajectory_test ${catkin_EXPORTED_TARGETS}) # don't build until gazebo_msgs is done + +add_definitions(-fPIC) # what is this for? + +## Plugins +add_library(gazebo_ros_camera_utils src/gazebo_ros_camera_utils.cpp) +add_dependencies(gazebo_ros_camera_utils ${PROJECT_NAME}_gencfg) +target_link_libraries(gazebo_ros_camera_utils ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +add_library(MultiCameraPlugin src/MultiCameraPlugin.cpp) +target_link_libraries(MultiCameraPlugin ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +add_library(gazebo_ros_camera src/gazebo_ros_camera.cpp) +add_dependencies(gazebo_ros_camera ${PROJECT_NAME}_gencfg) +target_link_libraries(gazebo_ros_camera gazebo_ros_camera_utils CameraPlugin ${catkin_LIBRARIES}) + +add_library(gazebo_ros_triggered_camera src/gazebo_ros_triggered_camera.cpp) +add_dependencies(gazebo_ros_triggered_camera ${PROJECT_NAME}_gencfg) +target_link_libraries(gazebo_ros_triggered_camera gazebo_ros_camera_utils ${GAZEBO_LIBRARIES} CameraPlugin ${catkin_LIBRARIES}) + + +if (NOT GAZEBO_VERSION VERSION_LESS 6.0) + add_library(gazebo_ros_elevator src/gazebo_ros_elevator.cpp) + add_dependencies(gazebo_ros_elevator ${PROJECT_NAME}_gencfg) + target_link_libraries(gazebo_ros_elevator ElevatorPlugin ${catkin_LIBRARIES}) +endif() + +add_library(gazebo_ros_multicamera src/gazebo_ros_multicamera.cpp) +add_dependencies(gazebo_ros_multicamera ${PROJECT_NAME}_gencfg) +target_link_libraries(gazebo_ros_multicamera gazebo_ros_camera_utils MultiCameraPlugin ${catkin_LIBRARIES}) + +add_library(gazebo_ros_triggered_multicamera src/gazebo_ros_triggered_multicamera.cpp) +add_dependencies(gazebo_ros_triggered_multicamera ${PROJECT_NAME}_gencfg) +target_link_libraries(gazebo_ros_triggered_multicamera gazebo_ros_camera_utils gazebo_ros_triggered_camera ${GAZEBO_LIBRARIES} MultiCameraPlugin ${catkin_LIBRARIES}) + +add_library(gazebo_ros_depth_camera src/gazebo_ros_depth_camera.cpp) +add_dependencies(gazebo_ros_depth_camera ${PROJECT_NAME}_gencfg) +target_link_libraries(gazebo_ros_depth_camera gazebo_ros_camera_utils DepthCameraPlugin ${catkin_LIBRARIES}) + +add_library(gazebo_ros_openni_kinect src/gazebo_ros_openni_kinect.cpp) +add_dependencies(gazebo_ros_openni_kinect ${PROJECT_NAME}_gencfg) +target_link_libraries(gazebo_ros_openni_kinect gazebo_ros_camera_utils DepthCameraPlugin ${catkin_LIBRARIES}) + +add_library(gazebo_ros_gpu_laser src/gazebo_ros_gpu_laser.cpp) +target_link_libraries(gazebo_ros_gpu_laser ${catkin_LIBRARIES} GpuRayPlugin) + +if (NOT GAZEBO_VERSION VERSION_LESS 7.3) + add_library(gazebo_ros_harness src/gazebo_ros_harness.cpp) + add_dependencies(gazebo_ros_harness ${catkin_EXPORTED_TARGETS}) + target_link_libraries(gazebo_ros_harness + ${Boost_LIBRARIES} HarnessPlugin ${catkin_LIBRARIES}) +endif() + +add_library(gazebo_ros_laser src/gazebo_ros_laser.cpp) +target_link_libraries(gazebo_ros_laser RayPlugin ${catkin_LIBRARIES}) + +add_library(gazebo_ros_block_laser src/gazebo_ros_block_laser.cpp) +target_link_libraries(gazebo_ros_block_laser RayPlugin ${catkin_LIBRARIES}) + +add_library(gazebo_ros_p3d src/gazebo_ros_p3d.cpp) +target_link_libraries(gazebo_ros_p3d ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +add_library(gazebo_ros_imu src/gazebo_ros_imu.cpp) +target_link_libraries(gazebo_ros_imu ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +add_library(gazebo_ros_imu_sensor src/gazebo_ros_imu_sensor.cpp) +target_link_libraries(gazebo_ros_imu_sensor ${GAZEBO_LIBRARIES} ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +add_library(gazebo_ros_f3d src/gazebo_ros_f3d.cpp) +target_link_libraries(gazebo_ros_f3d ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +add_library(gazebo_ros_bumper src/gazebo_ros_bumper.cpp) +add_dependencies(gazebo_ros_bumper ${catkin_EXPORTED_TARGETS}) +target_link_libraries(gazebo_ros_bumper ${Boost_LIBRARIES} ContactPlugin ${catkin_LIBRARIES}) + +add_library(gazebo_ros_projector src/gazebo_ros_projector.cpp) +target_link_libraries(gazebo_ros_projector ${Boost_LIBRARIES} ${catkin_LIBRARIES}) + +add_library(gazebo_ros_prosilica src/gazebo_ros_prosilica.cpp) +add_dependencies(gazebo_ros_prosilica ${PROJECT_NAME}_gencfg) +target_link_libraries(gazebo_ros_prosilica gazebo_ros_camera_utils CameraPlugin ${catkin_LIBRARIES}) + +add_library(gazebo_ros_force src/gazebo_ros_force.cpp) +target_link_libraries(gazebo_ros_force ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +add_library(gazebo_ros_joint_trajectory src/gazebo_ros_joint_trajectory.cpp) +add_dependencies(gazebo_ros_joint_trajectory ${catkin_EXPORTED_TARGETS}) +target_link_libraries(gazebo_ros_joint_trajectory ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + + +add_library(gazebo_ros_joint_state_publisher src/gazebo_ros_joint_state_publisher.cpp) +set_target_properties(gazebo_ros_joint_state_publisher PROPERTIES LINK_FLAGS "${ld_flags}") +set_target_properties(gazebo_ros_joint_state_publisher PROPERTIES COMPILE_FLAGS "${cxx_flags}") +add_dependencies(gazebo_ros_joint_state_publisher ${catkin_EXPORTED_TARGETS}) +target_link_libraries(gazebo_ros_joint_state_publisher ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +add_library(gazebo_ros_joint_pose_trajectory src/gazebo_ros_joint_pose_trajectory.cpp) +add_dependencies(gazebo_ros_joint_pose_trajectory ${catkin_EXPORTED_TARGETS}) +target_link_libraries(gazebo_ros_joint_pose_trajectory ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +add_library(gazebo_ros_diff_drive src/gazebo_ros_diff_drive.cpp) +target_link_libraries(gazebo_ros_diff_drive gazebo_ros_utils ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +add_library(gazebo_ros_tricycle_drive src/gazebo_ros_tricycle_drive.cpp) +target_link_libraries(gazebo_ros_tricycle_drive gazebo_ros_utils ${Boost_LIBRARIES} ${catkin_LIBRARIES}) + +add_library(gazebo_ros_skid_steer_drive src/gazebo_ros_skid_steer_drive.cpp) +target_link_libraries(gazebo_ros_skid_steer_drive ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +add_library(gazebo_ros_video src/gazebo_ros_video.cpp) +target_link_libraries(gazebo_ros_video ${catkin_LIBRARIES} ${Boost_LIBRARIES} ${OGRE_LIBRARIES}) + +add_library(gazebo_ros_planar_move src/gazebo_ros_planar_move.cpp) +target_link_libraries(gazebo_ros_planar_move ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +add_library(gazebo_ros_hand_of_god src/gazebo_ros_hand_of_god.cpp) +set_target_properties(gazebo_ros_hand_of_god PROPERTIES LINK_FLAGS "${ld_flags}") +set_target_properties(gazebo_ros_hand_of_god PROPERTIES COMPILE_FLAGS "${cxx_flags}") +target_link_libraries(gazebo_ros_hand_of_god ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +add_library(gazebo_ros_ft_sensor src/gazebo_ros_ft_sensor.cpp) +target_link_libraries(gazebo_ros_ft_sensor ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +add_library(gazebo_ros_range src/gazebo_ros_range.cpp) +target_link_libraries(gazebo_ros_range ${catkin_LIBRARIES} ${Boost_LIBRARIES} RayPlugin) + +add_library(gazebo_ros_vacuum_gripper src/gazebo_ros_vacuum_gripper.cpp) +target_link_libraries(gazebo_ros_vacuum_gripper ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +## +## Add your new plugin here +## + +## Template +add_library(gazebo_ros_template src/gazebo_ros_template.cpp) +target_link_libraries(gazebo_ros_template ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +install(TARGETS + hokuyo_node + vision_reconfigure + camera_synchronizer + gazebo_ros_utils + gazebo_ros_camera_utils + gazebo_ros_camera + gazebo_ros_multicamera + MultiCameraPlugin + gazebo_ros_depth_camera + gazebo_ros_openni_kinect + gazebo_ros_openni_kinect + gazebo_ros_laser + gazebo_ros_block_laser + gazebo_ros_p3d + gazebo_ros_imu + gazebo_ros_imu_sensor + gazebo_ros_f3d + gazebo_ros_ft_sensor + gazebo_ros_bumper + gazebo_ros_hand_of_god + gazebo_ros_template + gazebo_ros_projector + gazebo_ros_prosilica + gazebo_ros_force + gazebo_ros_joint_trajectory + gazebo_ros_joint_state_publisher + gazebo_ros_joint_pose_trajectory + gazebo_ros_diff_drive + gazebo_ros_tricycle_drive + gazebo_ros_skid_steer_drive + gazebo_ros_video + gazebo_ros_planar_move + gazebo_ros_vacuum_gripper + pub_joint_trajectory_test + gazebo_ros_gpu_laser + gazebo_ros_range + DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + ) + +if (NOT GAZEBO_VERSION VERSION_LESS 6.0) + install(TARGETS gazebo_ros_elevator + DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + ) +endif() + +if (NOT GAZEBO_VERSION VERSION_LESS 7.3) + install(TARGETS gazebo_ros_harness + DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + ) +endif() + +install(DIRECTORY include/ + DESTINATION ${CATKIN_GLOBAL_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" +) + +install(PROGRAMS scripts/set_wrench.py scripts/set_pose.py scripts/gazebo_model + DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} + ) + +install(DIRECTORY Media + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} + ) + +install(DIRECTORY test + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} + ) + +# Tests +# These need to be run with -j1 flag because gazebo can't be run +# in parallel. +if (CATKIN_ENABLE_TESTING) + find_package(rostest REQUIRED) + + add_rostest_gtest(set_model_state-test + test/set_model_state_test/set_model_state_test.test + test/set_model_state_test/set_model_state_test.cpp) + target_link_libraries(set_model_state-test ${catkin_LIBRARIES}) + + add_rostest(test/range/range_plugin.test) + + if (ENABLE_DISPLAY_TESTS) + add_rostest_gtest(depth_camera-test + test/camera/depth_camera.test + test/camera/depth_camera.cpp) + target_link_libraries(depth_camera-test ${catkin_LIBRARIES}) + add_rostest_gtest(multicamera-test + test/camera/multicamera.test + test/camera/multicamera.cpp) + target_link_libraries(multicamera-test ${catkin_LIBRARIES}) + add_rostest_gtest(camera-test + test/camera/camera.test + test/camera/camera.cpp) + target_link_libraries(camera-test ${catkin_LIBRARIES}) + add_rostest_gtest(camera16bit-test + test/camera/camera16bit.test + test/camera/camera16bit.cpp) + target_link_libraries(camera16bit-test ${catkin_LIBRARIES}) + add_rostest_gtest(distortion_barrel_test + test/camera/distortion_barrel.test + test/camera/distortion_barrel.cpp) + target_link_libraries(distortion_barrel_test ${catkin_LIBRARIES}) + add_rostest_gtest(distortion_pincushion_test + test/camera/distortion_pincushion.test + test/camera/distortion_pincushion.cpp) + target_link_libraries(distortion_pincushion_test ${catkin_LIBRARIES}) + add_rostest_gtest(triggered-camera-test + test/camera/triggered_camera.test + test/camera/triggered_camera.cpp) + target_link_libraries(triggered-camera-test ${catkin_LIBRARIES}) + endif() +endif() diff --git a/gazebo_ros_pkgs/gazebo_plugins/Media/models/chair/doc.kml b/gazebo_ros_pkgs/gazebo_plugins/Media/models/chair/doc.kml new file mode 100755 index 0000000..d539086 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/Media/models/chair/doc.kml @@ -0,0 +1,58 @@ + + + + Chair + Google SketchUp 7.0.8657]]> + SketchUp +1 + +320.223 +64.7271 +40.01698901172049 +-105.2829857471169 +2.891488298910991 +1.320883614486943 + + +Tour + + +1 + +320.223 +64.7271 +40.01698901172049 +-105.2829857471169 +2.891488298910991 +1.320883614486943 + + + + + Model + + + + relativeToGround + + -105.283000000000 + 40.017000000000 + 0.000000000000 + + + 0 + 0 + 0 + + + 1.0 + 1.0 + 1.0 + + + models/Chair.dae + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/Media/models/chair/images/texture0.jpg b/gazebo_ros_pkgs/gazebo_plugins/Media/models/chair/images/texture0.jpg new file mode 100755 index 0000000000000000000000000000000000000000..716f434d562e97ca7af88d2622211dbd0e200606 GIT binary patch literal 2449 zcmbW1e^3kmZI19AtqhxB&I4@+)P4@-8PG4-TE z0>SQaYRrm1IIci0*Ld#kDP~HiX^sRt!xSSIG&3}J8>EqDoCFmmPR3aAN3B!4B>ged zzuG>3Jb%3J^StwZzRxq?$Dcj^0;G{vn-w4k_%0s*2~>j2v~-xBnh6)fY<=dk{1RjS ziWT|R)obt)y84CZsA@;;i%s62zPRl*SFL0BTg|V%e#qzdZQdFB)$t?mc#rxHFFb%U-v40u%}|jBD*bsA?=hcfG6)Uh$BWYDj(gkv(Th@Y6n?L>m%7DhOn4)(!faJkVf$J z4H;6N3}9sp95WU|9l)9Sa0ulw$uKg|Fz*-oqr%Zaqe_RJ6}6mBks`Z@K^W<5_-x2U z1)Q{t(_tX)HFx&*z~Rs~o1L$5pfcsPrl2~Fp4b{g<5g2UU~k$lADMS~G|<)6?f@mH zXu$63zyVEv5s$?3#t9eS;9pvRfqD{P_eFloATZn$ zycPhdd2s~52xZn{FdGLE%7P;HYP{Wn1S+eB3{e!y$`0u=hH~2Cb{^D@;CQpG2IWhY z4%}i~9z*X*;)&TF0*E)QWj6#xy@{Lw@Q7`1w%G%K!~`z&5q(?s`S(5xw#TidR5jZ7 z83>#=oP8H6p3 zZGxkCv(;_uuGSQExoy#`kVaJ6cr8rlYvKX*Q#+h;Q`bX>X|kz@_+GtvRoM;Y-lHj8 zM}%g%rM|8^6Y5wVL1#n@*f;o8=KRDn#kGrS&uuz-URp`J`p{!z=fy6{W9PRTv*554 z1Te?a?o?O1zlp#09oOPkNVd1q;Jz*(oN`{4PO4H{{j zcv&1o)7xmiy!M1Y2QLZF*#cU_#Hy54ESA=6BNcr1rj2x0!9+zsP-#)lfxy>qHDV&~ zltEVbtQgLcit_jp1)Ix!d*0Qv@qReu%5L0qD!{_nn~OSAEgRO1Ubso`|D@jS(1MfK zVi)S(JCi%@K*X?qUUCeJ-R6~a4B?$_J8$Bxoy|x5DtmdTBA1Ekr8#BriQ$O?1}VZ6 z6B(_c_=ZV`%55n$gv#v;?gCt0bX?|=bxx|=$|l!iQQ#>01CuAu@StKrD5t})fu=48 zwI!h%7JB&((}3|1Z{FoDmu}Vcl1vUJNRzdb?ePclUIMfTU2;avD!8wa*e);sbjesj zSDZK1lv|*STimOdlnxUiX!6spE{BQ>pX}_wo2y%M?A0k*lF5C`ZX=(La49*=O$#u> z;A|gEB-z;@8;K`ZPJ5=jL3#e9;q!;_o?5gg_hLb3lh@wWA`zoIm(%enZb|$7@IyLv zK5{^DlV1)XE%B-=7C^*hzg!215S_h+1ofD3OjC4)cvv|V(604N_44Xf%mf_H^(WUH zuP>PkINNoOqBc4$7{437KBNz+Zi}}SQ`YPghvD$klLtJTO+3!xFi+r1>yQ-HAZ*N? z94(E#B91^bgHT)&3kAxj{5&WQR4`v#F{F5+&{znvM1nFeG7BD=(`^YCl$~aP7`!KV zf-=GgeFRq$qABx!flnYbQF!3UWL*Wyu1?WQHyHgHfj61Q#$h9j_ zIDqesboP1$iqyx)|PAFR@aM^7#eOHP) zykWSPaGTG;NKl~(keGzh_oVeAzqJs$tFD+6;I+BvIw%rchk>A~H4}!7)C201A!OHb qnXhdRIR6^Ud&G>7tT_BsZUp!vLHer0Q2e$1=#KT_8PAHxm;MemGt&$J literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_plugins/Media/models/chair/images/texture1.jpg b/gazebo_ros_pkgs/gazebo_plugins/Media/models/chair/images/texture1.jpg new file mode 100755 index 0000000000000000000000000000000000000000..2ac91cb78fb996941b945fddf9ec87e162087d71 GIT binary patch literal 644 zcmex=>Qk2+&~3e z1sIqZnVFebm|0m_Sb(Z)f$|J2f~-P{hK_8)fr;!&g(60c6BlwQJ8e8D8g%i4ig8j= z6DOCLxP+vXs+zinrk07RnYo3fm9vYho4bdnS8zyZSa?KaRB}pcT6#uiR&hybS$Rce zRdY*gTYE=m*QCi)rcRqaW9F9X@jO*zpr5PhGlv z + + + + Google SketchUp 7.0.8657 + + 2008-11-26T21:19:56Z + 2008-11-26T21:19:56Z + + Z_UP + + + + ../images/texture0.jpg + + + ../images/texture1.jpg + + + + + + + + + + + + + + + + + + + material_0_1_0-image + + + + + material_0_1_0-image-surface + + + + + + 0.000000 0.000000 0.000000 1 + + + 0.000000 0.000000 0.000000 1 + + + + + + 1 1 1 1 + + + 0.000000 + + + + + + 1 + + + + + + + + + material_1_2_0-image + + + + + material_1_2_0-image-surface + + + + + + 0.000000 0.000000 0.000000 1 + + + 0.000000 0.000000 0.000000 1 + + + + + + 1 1 1 1 + + + 0.000000 + + + + + + 1 + + + + + + + + + + 0.000000 0.000000 0.000000 1 + + + 0.000000 0.000000 0.000000 1 + + + 0.086275 0.086275 0.086275 1 + + + 1 1 1 1 + + + 0.000000 + + + + + + 1 + + + + + + + + + + 6.631565 14.812500 17.125000 8.187500 0.000000 17.625000 8.187500 0.000000 17.125000 6.631565 14.812500 17.625000 -8.187500 0.000000 17.125000 5.166495 14.812500 17.125000 5.166495 14.812500 17.625000 -8.187500 0.000000 17.625000 -6.631565 14.812500 17.125000 -5.166495 14.812500 17.125000 -5.166495 16.250000 17.625000 -6.631565 14.812500 17.625000 -6.554290 14.812500 17.125000 5.166495 16.250000 17.125000 -5.166495 14.812500 17.625000 5.166495 16.250000 17.625000 -5.166495 16.250000 17.125000 + + + + + + + + + + 0.994528 0.104467 0.000000 -0.000000 -1.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 1.000000 -0.994528 0.104467 -0.000000 1.000000 0.000000 0.000000 -1.000000 -0.000000 0.000000 + + + + + + + + + + 0.823959 0.000000 -0.106916 0.046143 -0.106916 0.000000 0.823959 0.046143 1.023438 0.046143 0.000000 0.000000 1.023438 0.000000 -1.364583 0.000000 -1.112833 0.627648 -1.234922 0.627648 -0.926192 0.000000 -0.834625 0.046143 -0.926192 0.046143 0.834625 1.366974 0.926192 1.366974 0.000000 0.046143 -0.129661 0.627648 -0.251750 0.627648 -0.834625 0.000000 0.188813 1.499634 0.097246 1.366974 -0.930875 0.046143 -0.136101 0.627648 -0.930875 0.000000 -1.112833 0.688559 1.015625 0.000000 0.925781 0.046143 0.925781 0.000000 0.188813 1.366974 0.834625 1.499634 -0.097246 0.046143 -0.102076 0.000000 -0.097246 0.000000 -0.188813 0.000000 -0.251750 0.688559 1.015625 0.046143 -1.015625 0.046143 -0.925781 0.000000 -0.925781 0.046143 -0.188813 0.046143 -1.015625 0.000000 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 1 0 1 0 0 0 3 0 3 1 1 4 4 1 5 2 1 6 0 3 10 6 3 11 3 3 12 6 4 13 1 4 6 3 4 14 4 1 5 1 1 4 7 1 15 6 3 11 0 3 10 5 3 18 10 4 19 1 4 6 6 4 13 1 4 6 11 4 20 7 4 5 11 5 21 4 5 5 7 5 15 4 5 5 11 5 21 8 5 23 13 6 25 6 6 26 5 6 27 14 4 28 1 4 6 10 4 19 15 4 29 10 4 19 6 4 13 11 4 20 1 4 6 14 4 28 11 3 30 12 3 31 8 3 32 12 3 31 11 3 30 9 3 33 6 6 26 13 6 25 15 6 35 10 7 36 9 7 37 14 7 38 13 3 18 10 3 39 15 3 11 9 3 33 11 3 30 14 3 39 9 7 37 10 7 36 16 7 40 10 3 39 13 3 18 16 3 33

+
+ + + + +

2 2 7 5 2 8 0 2 9 8 2 16 2 2 7 4 2 5 2 2 7 9 2 17 5 2 8 2 2 7 8 2 16 12 2 22 2 2 7 12 2 22 9 2 17 5 2 8 9 2 17 13 2 24 13 2 24 9 2 17 16 2 34

+
+
+
+ + + + -5.386791 15.288982 4.125000 -6.852535 1.500000 2.937500 -5.386791 15.288982 2.937500 -6.852535 1.500000 4.125000 -6.199291 15.288982 2.937500 -6.199291 15.288982 4.125000 -7.665035 1.500000 2.937500 -7.665035 1.500000 4.125000 + + + + + + + + + + 0.994398 -0.105703 0.000000 0.000000 0.000000 -1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 1.000000 -0.994398 0.105703 0.000000 + + + + + + + + + + -0.074219 1.265389 0.000000 -0.014298 -0.000000 1.265389 -0.074219 -0.014298 0.091609 -0.000000 0.050781 1.272518 0.000000 1.272518 0.050781 -0.000000 -0.000000 0.109589 -0.000000 -0.000000 -0.050781 1.272518 -0.091609 -0.000000 0.142390 0.000000 0.091609 0.109589 0.091609 0.000000 0.142390 -0.000000 0.050781 0.109589 -0.142390 -0.000000 0.142390 0.109589 0.074219 -0.022224 -0.000000 1.257464 -0.000000 -0.022224 0.074219 1.257464 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 1 0 1 0 0 0 3 0 3 1 1 4 4 1 5 2 1 6 4 2 7 0 2 8 2 2 9 5 3 10 3 3 11 0 3 6 6 2 12 3 2 13 1 2 14 4 1 5 1 1 4 6 1 15 0 2 8 4 2 7 5 2 16 3 3 11 5 3 10 7 3 17 3 2 13 6 2 12 7 2 18 7 4 19 4 4 20 6 4 21 4 4 20 7 4 19 5 4 22

+
+
+
+ + + + -5.420971 14.924370 17.125000 -6.847958 1.500000 15.125000 -5.420971 14.924370 15.125000 -6.847958 1.500000 17.125000 -6.238048 14.924370 15.125000 -7.665035 1.500000 17.125000 -7.665035 1.500000 15.125000 -6.238048 14.924370 17.125000 + + + + + + + + + + 0.994398 -0.105703 0.000000 0.000000 0.000000 -1.000000 -0.000000 1.000000 -0.000000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 -0.994398 0.105703 -0.000000 + + + + + + + + + + -0.125000 1.231930 0.000000 -0.013920 0.000000 1.231930 -0.125000 -0.013920 0.089187 0.000000 0.051067 1.238870 0.000000 1.238870 0.051067 -0.000000 -0.000000 0.184570 -0.000000 -0.000000 -0.140254 0.000000 -0.089187 0.000000 0.140254 0.000000 0.089187 0.184570 0.089187 0.000000 0.140254 0.000000 0.051067 0.184570 -0.051067 1.238870 0.140254 0.184570 0.125000 -0.021890 0.000000 1.223959 0.000000 -0.021890 0.125000 1.223959 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 1 0 1 0 0 0 3 0 3 1 1 4 4 1 5 2 1 6 4 2 7 0 2 8 2 2 9 0 3 6 5 3 10 3 3 11 6 4 12 3 4 13 1 4 14 4 1 5 1 1 4 6 1 15 0 2 8 4 2 7 7 2 16 5 3 10 0 3 6 7 3 17 3 4 13 6 4 12 5 4 18 5 5 19 4 5 20 6 5 21 4 5 20 5 5 19 7 5 22

+
+
+
+ + + + -7.677584 0.843750 16.074436 -7.677584 0.843750 16.175564 -7.677584 0.937500 16.027561 -7.771334 0.843750 16.074436 -7.677584 0.937500 16.222439 -7.771334 0.843750 16.175564 -7.677584 1.031250 16.074436 -7.771334 0.937500 16.222439 -7.771334 0.937500 16.027561 -7.771334 0.828260 16.314210 -7.677584 1.031250 16.175564 -7.771334 1.031250 16.175564 -7.771334 0.880953 15.913964 -7.771334 0.880953 16.336036 -7.771334 0.828260 15.935790 -7.771334 1.031250 16.074436 -7.771334 0.937500 16.343480 -7.771334 0.937500 15.906520 -7.771334 0.783011 16.279489 -7.771334 0.994047 15.913964 -7.771334 0.994047 16.336036 -7.771334 0.783011 15.970511 -7.771334 1.046740 15.935790 -7.771334 1.046740 16.314210 -7.771334 0.748290 16.234240 -7.771334 0.748290 16.015760 -7.771334 1.091989 15.970511 -7.771334 0.726464 16.181547 -7.771334 1.091989 16.279489 -7.771334 0.726464 16.068453 -7.771334 1.126710 16.015760 -7.771334 0.719020 16.125000 -7.771334 1.126710 16.234240 -7.771334 1.148536 16.068453 -7.771334 1.148536 16.181547 -7.771334 1.155980 16.125000 + + + + + + + + + + -1.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.447214 0.894427 0.000000 0.447214 -0.894427 0.000000 -0.447214 0.894427 -0.000000 -0.447214 -0.894427 0.000000 -1.000000 0.000000 + + + + + + + + + + 0.156250 0.199436 0.156250 0.300564 0.250000 0.152561 0.199436 -0.093750 0.199436 0.000000 0.300564 -0.093750 0.250000 0.347439 -0.050564 -0.093750 -0.155379 -0.093750 -0.050564 0.000000 0.300564 0.000000 0.343750 0.199436 0.378986 -0.093750 0.274170 -0.093750 0.378986 0.000000 -0.155379 0.000000 0.274170 0.000000 0.140760 0.439210 -0.291834 -0.093750 -0.396650 -0.093750 -0.291834 0.000000 0.343750 0.300564 0.068228 0.000000 0.173043 0.000000 0.068228 -0.093750 0.193453 0.038964 0.193453 0.461036 0.140760 0.060790 -0.396650 0.000000 -0.300564 -0.093750 -0.300564 0.000000 -0.199436 -0.093750 0.173043 -0.093750 0.250000 0.468480 0.250000 0.031520 0.095511 0.404489 0.306547 0.038964 -0.199436 0.000000 0.306547 0.461036 0.095511 0.095511 0.359240 0.060790 0.359240 0.439210 0.060790 0.359240 0.060790 0.140760 0.404489 0.095511 0.038964 0.306547 0.404489 0.404489 0.038964 0.193453 0.439210 0.140760 0.031520 0.250000 0.439210 0.359240 0.461036 0.193453 0.461036 0.306547 0.468480 0.250000 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 0 1 3 3 1 4 1 1 5 4 0 6 2 0 2 1 0 1 0 2 7 2 2 8 3 2 9 5 1 10 1 1 5 3 1 4 6 0 11 2 0 2 4 0 6 4 3 12 1 3 13 7 3 14 8 2 15 3 2 9 2 2 8 5 3 16 7 3 14 1 3 13 3 0 0 9 0 17 5 0 1 2 4 18 6 4 19 8 4 20 10 0 21 6 0 11 4 0 6 7 5 22 11 5 23 4 5 24 8 0 2 12 0 25 3 0 0 7 0 6 5 0 1 13 0 26 3 0 0 14 0 27 9 0 17 13 0 26 5 0 1 9 0 17 15 4 28 8 4 20 6 4 19 10 6 29 11 6 30 6 6 31 10 5 32 4 5 24 11 5 23 11 0 21 7 0 6 16 0 33 17 0 34 12 0 25 8 0 2 12 0 25 14 0 27 3 0 0 16 0 33 7 0 6 13 0 26 9 0 17 14 0 27 18 0 35 15 0 11 19 0 36 8 0 2 15 6 37 6 6 31 11 6 30 20 0 38 11 0 21 16 0 33 19 0 36 17 0 34 8 0 2 14 0 27 21 0 39 18 0 35 22 0 40 19 0 36 15 0 11 11 0 21 22 0 40 15 0 11 23 0 41 11 0 21 20 0 38 18 0 35 21 0 39 24 0 42 22 0 40 11 0 21 23 0 41 21 0 39 25 0 43 24 0 42 26 0 44 22 0 40 23 0 41 24 0 42 25 0 43 27 0 45 28 0 46 26 0 44 23 0 41 25 0 43 29 0 47 27 0 45 30 0 48 26 0 44 28 0 46 31 0 49 27 0 45 29 0 47 32 0 50 30 0 48 28 0 46 33 0 51 30 0 48 32 0 50 34 0 52 33 0 51 32 0 50 35 0 53 33 0 51 34 0 52

+
+
+
+ + + + -6.708834 1.437500 0.000000 -7.708834 0.437500 0.000000 -7.708834 1.437500 0.000000 -6.708834 0.437500 0.000000 -7.771334 1.500000 0.125000 -6.646334 1.500000 0.125000 -6.646334 0.375000 0.125000 -7.771334 0.375000 0.125000 -7.771334 0.719020 16.125000 -7.771334 1.500000 17.125000 -6.646334 0.375000 17.125000 -7.771334 0.726464 16.068453 -7.771334 0.375000 17.125000 -6.646334 1.500000 17.125000 -7.771334 1.155980 16.125000 -7.771334 0.748290 16.015760 -7.771334 0.726464 16.181547 -7.771334 1.148536 16.068453 -7.771334 1.148536 16.181547 -7.771334 0.783011 15.970511 -7.771334 0.748290 16.234240 -7.771334 1.126710 16.015760 -7.771334 1.126710 16.234240 -7.771334 0.783011 16.279489 -7.771334 0.828260 15.935790 -7.771334 1.091989 15.970511 -7.771334 1.091989 16.279489 -7.771334 0.828260 16.314210 -7.771334 0.880953 15.913964 -7.771334 1.046740 15.935790 -7.771334 1.046740 16.314210 -7.771334 0.880953 16.336036 -7.771334 0.937500 15.906520 -7.771334 0.994047 15.913964 -7.771334 0.994047 16.336036 -7.771334 0.937500 16.343480 + + + + + + + + + + 0.000000 0.000000 -1.000000 -0.894427 0.000000 -0.447214 0.000000 0.894427 -0.447214 0.894427 0.000000 -0.447214 0.000000 -0.894427 -0.447214 -1.000000 0.000000 0.000000 0.000000 1.000000 -0.000000 1.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 1.000000 + + + + + + + + + + -0.066406 0.098053 -0.003906 0.005768 -0.003906 0.098053 -0.066406 0.005768 -0.003906 -0.002579 -0.070313 0.010318 -0.066406 -0.002579 0.000000 0.056748 -0.066406 0.043851 -0.003906 0.043851 0.070313 0.056748 0.003906 0.043851 0.066406 0.043851 0.070313 0.010318 0.003906 -0.002579 0.066406 -0.002579 0.000000 0.010318 -0.070313 0.056748 -0.021501 1.488098 -0.070313 0.011536 0.000000 0.011536 0.000000 1.580383 -0.070312 0.011536 0.000000 0.011536 0.070313 0.011536 0.000000 1.580383 0.070313 1.580383 -0.021967 1.482880 -0.070312 1.580383 -0.048811 1.488098 -0.070313 1.580383 -0.023331 1.478017 -0.021967 1.493317 0.000000 0.103821 0.070313 0.000000 0.070313 0.103821 -0.048346 1.482880 -0.048346 1.493317 0.000000 0.000000 -0.025501 1.473841 -0.023331 1.498179 -0.046982 1.478017 -0.046982 1.498179 -0.025501 1.502355 -0.028329 1.470637 -0.044812 1.473841 -0.044812 1.502355 -0.028329 1.505559 -0.031622 1.468623 -0.041984 1.470637 -0.041984 1.505559 -0.031622 1.507574 -0.035156 1.467936 -0.038690 1.468623 -0.038690 1.507574 -0.035156 1.508261 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 1 0 1 0 0 0 3 0 3 1 1 4 4 1 5 2 1 6 4 2 7 0 2 8 2 2 9 5 3 10 3 3 11 0 3 12 6 4 13 1 4 14 3 4 15 4 1 5 1 1 4 7 1 16 0 2 8 4 2 7 5 2 17 3 3 11 5 3 10 6 3 7 1 4 14 6 4 13 7 4 16 8 5 18 4 5 19 7 5 20 9 6 21 5 6 22 4 6 23 5 7 24 10 7 25 6 7 20 10 8 26 7 8 20 6 8 24 4 5 19 8 5 18 11 5 27 12 5 25 8 5 18 7 5 20 5 6 22 9 6 21 13 6 28 4 5 19 14 5 29 9 5 30 10 7 25 5 7 24 13 7 26 7 8 20 10 8 26 12 8 25 4 5 19 11 5 27 15 5 31 8 5 18 12 5 25 16 5 32 9 9 33 10 9 34 13 9 35 4 5 19 17 5 36 14 5 29 18 5 37 9 5 30 14 5 29 10 9 34 9 9 33 12 9 38 4 5 19 15 5 31 19 5 39 16 5 32 12 5 25 20 5 40 4 5 19 21 5 41 17 5 36 22 5 42 9 5 30 18 5 37 23 5 43 12 5 25 9 5 30 4 5 19 19 5 39 24 5 44 20 5 40 12 5 25 23 5 43 4 5 19 25 5 45 21 5 41 26 5 46 9 5 30 22 5 42 23 5 43 9 5 30 27 5 47 4 5 19 24 5 44 28 5 48 4 5 19 29 5 49 25 5 45 30 5 50 9 5 30 26 5 46 27 5 47 9 5 30 31 5 51 4 5 19 28 5 48 32 5 52 4 5 19 33 5 53 29 5 49 34 5 54 9 5 30 30 5 50 31 5 51 9 5 30 35 5 55 4 5 19 32 5 52 33 5 53 35 5 55 9 5 30 34 5 54

+
+
+
+ + + + -6.197745 18.159422 34.379686 -6.197745 18.159422 34.480813 -6.197745 18.253172 34.332811 -6.291495 18.159422 34.379686 -6.197745 18.253172 34.527688 -6.291495 18.159422 34.480813 -6.197745 18.346922 34.379686 -6.291495 18.253172 34.527688 -6.291495 18.253172 34.332811 -6.291495 18.143932 34.619459 -6.197745 18.346922 34.480813 -6.291495 18.346922 34.480813 -6.291495 18.196625 34.219214 -6.291495 18.196625 34.641286 -6.291495 18.143932 34.241040 -6.291495 18.346922 34.379686 -6.291495 18.253172 34.648730 -6.291495 18.253172 34.211769 -6.291495 18.098683 34.584739 -6.291495 18.309719 34.219214 -6.291495 18.309719 34.641286 -6.291495 18.098683 34.275761 -6.291495 18.362412 34.241040 -6.291495 18.362412 34.619459 -6.291495 18.063962 34.539490 -6.291495 18.063962 34.321010 -6.291495 18.407661 34.275761 -6.291495 18.042136 34.486797 -6.291495 18.407661 34.584739 -6.291495 18.042136 34.373703 -6.291495 18.442381 34.321010 -6.291495 18.034692 34.430250 -6.291495 18.442381 34.539490 -6.291495 18.464208 34.373703 -6.291495 18.464208 34.486797 -6.291495 18.471652 34.430250 + + + + + + + + + + -1.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.447214 0.894427 0.000000 0.447214 -0.894427 0.000000 -0.447214 0.894427 -0.000000 -0.447214 -0.894427 0.000000 -1.000000 0.000000 + + + + + + + + + + 0.156250 0.199436 0.156250 0.300564 0.250000 0.152561 0.199436 -0.093750 0.199436 0.000000 0.300564 -0.093750 0.250000 0.347439 -0.050564 -0.093750 -0.155379 -0.093750 -0.050564 0.000000 0.300564 0.000000 0.343750 0.199436 0.378986 -0.093750 0.274170 -0.093750 0.378986 0.000000 -0.155379 0.000000 0.274170 0.000000 0.140760 0.439210 -0.291834 -0.093750 -0.396650 -0.093750 -0.291834 0.000000 0.343750 0.300564 0.068228 0.000000 0.173043 0.000000 0.068228 -0.093750 0.193453 0.038964 0.193453 0.461036 0.140760 0.060790 -0.396650 0.000000 -0.300564 -0.093750 -0.300564 0.000000 -0.199436 -0.093750 0.173043 -0.093750 0.250000 0.468480 0.250000 0.031520 0.095511 0.404489 0.306547 0.038964 -0.199436 0.000000 0.306547 0.461036 0.095511 0.095511 0.359240 0.060790 0.359240 0.439210 0.060790 0.359240 0.060790 0.140760 0.404489 0.095511 0.038964 0.306547 0.404489 0.404489 0.038964 0.193453 0.439210 0.140760 0.031520 0.250000 0.439210 0.359240 0.461036 0.193453 0.461036 0.306547 0.468480 0.250000 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 0 1 3 3 1 4 1 1 5 4 0 6 2 0 2 1 0 1 0 2 7 2 2 8 3 2 9 5 1 10 1 1 5 3 1 4 6 0 11 2 0 2 4 0 6 4 3 12 1 3 13 7 3 14 8 2 15 3 2 9 2 2 8 5 3 16 7 3 14 1 3 13 3 0 0 9 0 17 5 0 1 2 4 18 6 4 19 8 4 20 10 0 21 6 0 11 4 0 6 7 5 22 11 5 23 4 5 24 8 0 2 12 0 25 3 0 0 7 0 6 5 0 1 13 0 26 3 0 0 14 0 27 9 0 17 13 0 26 5 0 1 9 0 17 15 4 28 8 4 20 6 4 19 10 6 29 11 6 30 6 6 31 10 5 32 4 5 24 11 5 23 11 0 21 7 0 6 16 0 33 17 0 34 12 0 25 8 0 2 12 0 25 14 0 27 3 0 0 16 0 33 7 0 6 13 0 26 9 0 17 14 0 27 18 0 35 15 0 11 19 0 36 8 0 2 15 6 37 6 6 31 11 6 30 20 0 38 11 0 21 16 0 33 19 0 36 17 0 34 8 0 2 14 0 27 21 0 39 18 0 35 22 0 40 19 0 36 15 0 11 11 0 21 22 0 40 15 0 11 23 0 41 11 0 21 20 0 38 18 0 35 21 0 39 24 0 42 22 0 40 11 0 21 23 0 41 21 0 39 25 0 43 24 0 42 26 0 44 22 0 40 23 0 41 24 0 42 25 0 43 27 0 45 28 0 46 26 0 44 23 0 41 25 0 43 29 0 47 27 0 45 30 0 48 26 0 44 28 0 46 31 0 49 27 0 45 29 0 47 32 0 50 30 0 48 28 0 46 33 0 51 30 0 48 32 0 50 34 0 52 33 0 51 32 0 50 35 0 53 33 0 51 34 0 52

+
+
+
+ + + + -6.197745 15.525999 16.074436 -6.197745 15.525999 16.175564 -6.197745 15.619749 16.027561 -6.291495 15.525999 16.074436 -6.197745 15.619749 16.222439 -6.291495 15.525999 16.175564 -6.197745 15.713499 16.074436 -6.291495 15.619749 16.222439 -6.291495 15.619749 16.027561 -6.291495 15.510509 16.314210 -6.197745 15.713499 16.175564 -6.291495 15.713499 16.175564 -6.291495 15.563202 15.913964 -6.291495 15.563202 16.336036 -6.291495 15.510509 15.935790 -6.291495 15.713499 16.074436 -6.291495 15.619749 16.343480 -6.291495 15.619749 15.906520 -6.291495 15.465260 16.279489 -6.291495 15.676296 15.913964 -6.291495 15.676296 16.336036 -6.291495 15.465260 15.970511 -6.291495 15.728989 15.935790 -6.291495 15.728989 16.314210 -6.291495 15.430540 16.234240 -6.291495 15.430540 16.015760 -6.291495 15.774238 15.970511 -6.291495 15.408713 16.181547 -6.291495 15.774238 16.279489 -6.291495 15.408713 16.068453 -6.291495 15.808959 16.015760 -6.291495 15.401269 16.125000 -6.291495 15.808959 16.234240 -6.291495 15.830785 16.068453 -6.291495 15.830785 16.181547 -6.291495 15.838230 16.125000 + + + + + + + + + + -1.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.447214 0.894427 0.000000 0.447214 -0.894427 0.000000 -0.447214 0.894427 -0.000000 -0.447214 -0.894427 0.000000 -1.000000 0.000000 + + + + + + + + + + 0.156250 0.199436 0.156250 0.300564 0.250000 0.152561 0.199436 -0.093750 0.199436 0.000000 0.300564 -0.093750 0.250000 0.347439 -0.050564 -0.093750 -0.155379 -0.093750 -0.050564 0.000000 0.300564 0.000000 0.343750 0.199436 0.378986 -0.093750 0.274170 -0.093750 0.378986 0.000000 -0.155379 0.000000 0.274170 0.000000 0.140760 0.439210 -0.291834 -0.093750 -0.396650 -0.093750 -0.291834 0.000000 0.343750 0.300564 0.068228 0.000000 0.173043 0.000000 0.068228 -0.093750 0.193453 0.038964 0.193453 0.461036 0.140760 0.060790 -0.396650 0.000000 -0.300564 -0.093750 -0.300564 0.000000 -0.199436 -0.093750 0.173043 -0.093750 0.250000 0.468480 0.250000 0.031520 0.095511 0.404489 0.306547 0.038964 -0.199436 0.000000 0.306547 0.461036 0.095511 0.095511 0.359240 0.060790 0.359240 0.439210 0.060790 0.359240 0.060790 0.140760 0.404489 0.095511 0.038964 0.306547 0.404489 0.404489 0.038964 0.193453 0.439210 0.140760 0.031520 0.250000 0.439210 0.359240 0.461036 0.193453 0.461036 0.306547 0.468480 0.250000 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 0 1 3 3 1 4 1 1 5 4 0 6 2 0 2 1 0 1 0 2 7 2 2 8 3 2 9 5 1 10 1 1 5 3 1 4 6 0 11 2 0 2 4 0 6 4 3 12 1 3 13 7 3 14 8 2 15 3 2 9 2 2 8 5 3 16 7 3 14 1 3 13 3 0 0 9 0 17 5 0 1 2 4 18 6 4 19 8 4 20 10 0 21 6 0 11 4 0 6 7 5 22 11 5 23 4 5 24 8 0 2 12 0 25 3 0 0 7 0 6 5 0 1 13 0 26 3 0 0 14 0 27 9 0 17 13 0 26 5 0 1 9 0 17 15 4 28 8 4 20 6 4 19 10 6 29 11 6 30 6 6 31 10 5 32 4 5 24 11 5 23 11 0 21 7 0 6 16 0 33 17 0 34 12 0 25 8 0 2 12 0 25 14 0 27 3 0 0 16 0 33 7 0 6 13 0 26 9 0 17 14 0 27 18 0 35 15 0 11 19 0 36 8 0 2 15 6 37 6 6 31 11 6 30 20 0 38 11 0 21 16 0 33 19 0 36 17 0 34 8 0 2 14 0 27 21 0 39 18 0 35 22 0 40 19 0 36 15 0 11 11 0 21 22 0 40 15 0 11 23 0 41 11 0 21 20 0 38 18 0 35 21 0 39 24 0 42 22 0 40 11 0 21 23 0 41 21 0 39 25 0 43 24 0 42 26 0 44 22 0 40 23 0 41 24 0 42 25 0 43 27 0 45 28 0 46 26 0 44 23 0 41 25 0 43 29 0 47 27 0 45 30 0 48 26 0 44 28 0 46 31 0 49 27 0 45 29 0 47 32 0 50 30 0 48 28 0 46 33 0 51 30 0 48 32 0 50 34 0 52 33 0 51 32 0 50 35 0 53 33 0 51 34 0 52

+
+
+
+ + + + -5.228995 15.484069 0.000000 -5.166495 16.546569 0.125000 -5.166495 15.421569 0.125000 -5.228995 16.484069 0.000000 -5.166495 16.546569 17.625000 -6.228995 15.484069 0.000000 -6.291495 16.546569 0.125000 -5.166495 14.924370 17.625000 -6.291495 16.546569 17.625000 -6.291495 15.421569 0.125000 -6.228995 16.484069 0.000000 -5.166495 14.924370 15.125000 -5.166495 17.883552 35.380091 -6.291495 18.993245 35.195142 -6.291495 15.838230 16.125000 -6.291495 14.924370 15.125000 -5.166495 18.993245 35.195142 -6.291495 14.924370 17.625000 -6.291495 18.442381 34.321010 -6.291495 15.430540 16.015760 -6.291495 15.830785 16.068453 -6.291495 17.883552 35.380091 -5.228995 17.962441 35.493621 -6.228995 18.948835 35.329222 -6.291495 18.407661 34.275761 -6.291495 18.464208 34.373703 -6.291495 15.401269 16.125000 -6.291495 15.408713 16.068453 -6.291495 15.465260 15.970511 -6.291495 15.808959 16.015760 -6.291495 15.830785 16.181547 -6.291495 18.042136 34.373703 -5.228995 18.948835 35.329222 -6.228995 17.962441 35.493621 -6.291495 18.362412 34.241040 -6.291495 18.471652 34.430250 -6.291495 15.510509 15.935790 -6.291495 15.774238 15.970511 -6.291495 15.808959 16.234240 -6.291495 18.034692 34.430250 -6.291495 18.063962 34.321010 -6.291495 18.143932 34.619459 -6.291495 18.309719 34.219214 -6.291495 18.464208 34.486797 -6.291495 15.408713 16.181547 -6.291495 15.563202 15.913964 -6.291495 15.728989 15.935790 -6.291495 15.774238 16.279489 -6.291495 18.042136 34.486797 -6.291495 18.098683 34.275761 -6.291495 18.098683 34.584739 -6.291495 18.196625 34.641286 -6.291495 18.253172 34.211769 -6.291495 18.442381 34.539490 -6.291495 15.430540 16.234240 -6.291495 15.619749 15.906520 -6.291495 15.676296 15.913964 -6.291495 15.728989 16.314210 -6.291495 18.063962 34.539490 -6.291495 18.143932 34.241040 -6.291495 18.253172 34.648730 -6.291495 18.196625 34.219214 -6.291495 18.407661 34.584739 -6.291495 15.465260 16.279489 -6.291495 15.676296 16.336036 -6.291495 18.309719 34.641286 -6.291495 18.362412 34.619459 -6.291495 15.510509 16.314210 -6.291495 15.619749 16.343480 -6.291495 15.563202 16.336036 + + + + + + + + + + 0.894427 0.000000 -0.447214 1.000000 -0.000000 -0.000000 0.000000 -0.894427 -0.447214 0.000000 0.000000 -1.000000 0.000000 0.894427 -0.447214 0.000000 1.000000 0.000000 -0.000000 0.990443 -0.137921 0.000000 -0.999451 -0.033128 -0.894427 0.000000 -0.447214 -1.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 -0.986394 0.164399 0.000000 0.164399 0.986394 0.894363 0.073543 0.441255 0.000000 0.949285 0.314418 0.000000 -0.821203 0.570636 -0.894363 0.073543 0.441255 0.000000 0.164399 0.986394 + + + + + + + + + + 0.034981 0.043851 0.101387 0.056748 0.031075 0.056748 0.097481 0.043851 0.101387 1.626526 0.031075 0.011536 0.101387 0.011536 0.070313 -0.010202 0.003906 -0.023099 0.066406 -0.023099 -0.003906 0.051652 -0.066406 0.143937 -0.066406 0.051652 -0.066406 0.064371 0.000000 0.077268 -0.070313 0.077268 0.000000 1.626526 -0.070313 0.011536 0.000000 1.626526 -0.070313 1.626526 0.000000 -0.010202 -0.003906 0.143937 -0.003906 0.064371 0.000000 0.011536 0.000000 1.395813 0.184949 3.265057 -0.000000 3.268738 -0.070313 1.631629 -0.000000 1.631629 0.070313 1.395047 0.000000 0.010009 0.070313 0.010009 -0.101387 0.010318 -0.034981 -0.002579 -0.031075 0.010318 -0.097481 -0.002579 -0.101387 0.011536 -0.057116 1.488098 -0.101387 1.626526 0.070313 1.626526 0.000000 1.395813 0.070313 1.395813 0.254305 3.247989 0.070313 3.265528 -0.000000 1.604395 0.070313 1.604395 -0.070313 3.268738 -0.219876 3.167320 -0.254305 3.247989 0.000000 1.395047 -0.031075 0.011536 -0.031636 1.478017 -0.056651 1.482880 -0.184949 3.265057 0.000000 0.163578 -0.070313 0.267399 -0.070313 0.163578 0.247687 2.855450 0.183799 2.886145 0.178564 2.874469 0.000000 3.265528 -0.003906 2.978238 -0.070313 2.965204 0.000000 2.965204 -0.217706 3.163144 -0.221240 3.172183 -0.029806 1.488098 -0.030271 1.482880 -0.033806 1.473841 -0.055287 1.478017 -0.056651 1.493317 -0.194860 3.172183 0.000000 0.267399 0.245241 2.869238 0.066406 2.849868 0.000000 2.837110 0.070313 2.837110 -0.066406 2.978238 -0.253449 2.901107 -0.189561 2.931802 -0.251003 2.914895 -0.214878 3.159940 -0.221705 3.177401 -0.036634 1.470637 -0.053117 1.473841 -0.055287 1.498179 -0.194395 3.177401 -0.196225 3.167320 -0.201223 3.194862 -0.184327 2.920127 -0.003906 0.169655 -0.066406 0.261940 -0.066406 0.169655 0.003906 2.849868 -0.003906 0.261940 -0.211584 3.157926 -0.221240 3.182619 -0.030271 1.493317 -0.039927 1.468623 -0.050289 1.470637 -0.053117 1.502355 -0.194860 3.182619 -0.198395 3.163144 -0.198395 3.191658 -0.204516 3.196876 -0.208050 3.157238 -0.219876 3.187482 -0.031636 1.498179 -0.043461 1.467936 -0.046995 1.468623 -0.050289 1.505559 -0.196225 3.187482 -0.201223 3.159940 -0.208050 3.197563 -0.204516 3.157926 -0.217706 3.191658 -0.033806 1.502355 -0.046995 1.507574 -0.211584 3.196876 -0.214878 3.194862 -0.036634 1.505559 -0.043461 1.508261 -0.039927 1.507574 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 1 0 1 0 0 0 3 0 3 4 1 4 2 1 5 1 1 6 2 2 7 5 2 8 0 2 9 5 3 10 3 3 11 0 3 12 3 4 13 6 4 14 1 4 15 7 1 16 2 1 5 4 1 4 1 5 17 8 5 18 4 5 19 5 2 8 2 2 7 9 2 20 3 3 11 5 3 10 10 3 21 6 4 14 3 4 13 10 4 22 8 5 18 1 5 17 6 5 23 2 1 5 7 1 16 11 1 24 7 1 16 4 1 4 12 1 25 13 6 26 4 6 27 8 6 28 11 7 29 9 7 30 2 7 31 6 8 32 5 8 33 9 8 34 5 8 33 6 8 32 10 8 35 6 9 36 14 9 37 8 9 38 7 10 39 15 10 40 11 10 41 12 1 25 4 1 4 16 1 42 12 11 43 17 11 44 7 11 45 4 6 27 13 6 26 16 6 46 8 9 38 18 9 47 13 9 48 9 7 30 11 7 29 15 7 49 9 9 50 19 9 51 6 9 36 6 9 36 20 9 52 14 9 37 14 9 37 21 9 53 8 9 38 15 10 40 7 10 39 17 10 18 13 12 54 12 12 55 16 12 56 16 13 57 22 13 58 12 13 59 17 11 44 12 11 43 21 11 60 23 14 61 16 14 62 13 14 63 8 9 38 24 9 64 18 9 47 13 9 48 18 9 47 25 9 65 26 9 66 9 9 50 15 9 40 9 9 50 27 9 67 19 9 51 6 9 36 19 9 51 28 9 68 6 9 36 29 9 69 20 9 52 30 9 70 21 9 53 14 9 37 8 9 38 21 9 53 31 9 71 21 9 53 15 9 40 17 9 18 12 12 55 13 12 54 21 12 72 22 13 58 16 13 57 32 13 73 22 15 74 21 15 75 12 15 76 16 14 62 23 14 61 32 14 77 13 16 78 33 16 79 23 16 80 8 9 38 34 9 81 24 9 64 13 9 48 25 9 65 35 9 82 9 9 50 26 9 66 27 9 67 15 9 40 21 9 53 26 9 66 6 9 36 28 9 68 36 9 83 6 9 36 37 9 84 29 9 69 38 9 85 21 9 53 30 9 70 31 9 71 21 9 53 39 9 86 8 9 38 31 9 71 40 9 87 41 9 88 21 9 53 13 9 48 33 16 79 13 16 78 21 16 89 23 17 90 22 17 91 32 17 92 21 15 75 22 15 74 33 15 93 22 17 91 23 17 90 33 17 94 8 9 38 42 9 95 34 9 81 43 9 96 13 9 48 35 9 82 26 9 66 21 9 53 44 9 97 6 9 36 36 9 83 45 9 98 6 9 36 46 9 99 37 9 84 47 9 100 21 9 53 38 9 85 21 9 53 48 9 101 39 9 86 8 9 38 40 9 87 49 9 102 50 9 103 21 9 53 41 9 88 41 9 88 13 9 48 51 9 104 8 9 38 52 9 105 42 9 95 53 9 106 13 9 48 43 9 96 44 9 97 21 9 53 54 9 107 6 9 36 45 9 98 55 9 108 6 9 36 56 9 109 46 9 99 57 9 110 21 9 53 47 9 100 48 9 101 21 9 53 58 9 111 8 9 38 49 9 102 59 9 112 58 9 111 21 9 53 50 9 103 51 9 104 13 9 48 60 9 113 8 9 38 61 9 114 52 9 105 62 9 115 13 9 48 53 9 106 54 9 107 21 9 53 63 9 116 6 9 36 55 9 108 56 9 109 64 9 117 21 9 53 57 9 110 8 9 38 59 9 112 61 9 114 60 9 113 13 9 48 65 9 118 66 9 119 13 9 48 62 9 115 63 9 116 21 9 53 67 9 120 68 9 121 21 9 53 64 9 117 65 9 118 13 9 48 66 9 119 67 9 120 21 9 53 69 9 122 69 9 122 21 9 53 68 9 121

+
+
+
+ + + + 5.386791 15.288982 2.937500 6.852535 1.500000 2.937500 5.386791 15.288982 4.125000 6.199291 15.288982 2.937500 6.852535 1.500000 4.125000 7.665035 1.500000 2.937500 6.199291 15.288982 4.125000 7.665035 1.500000 4.125000 + + + + + + + + + + -0.994398 -0.105703 0.000000 0.000000 0.000000 -1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 1.000000 0.994398 0.105703 0.000000 + + + + + + + + + + -0.000000 1.265389 0.000000 -0.014298 -0.074219 1.265389 0.000000 1.272518 0.050781 1.272518 0.091609 -0.000000 -0.074219 -0.014298 -0.000000 -0.000000 -0.000000 0.109589 0.050781 -0.000000 0.142390 -0.000000 -0.091609 -0.000000 -0.050781 1.272518 0.091609 0.000000 0.091609 0.109589 0.142390 0.000000 0.050781 0.109589 -0.000000 -0.022224 -0.000000 1.257464 0.074219 -0.022224 -0.142390 -0.000000 0.142390 0.109589 0.074219 1.257464 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 0 1 3 3 1 4 1 1 5 4 0 6 2 0 2 1 0 1 0 2 7 2 2 8 3 2 9 5 1 10 1 1 5 3 1 4 2 3 3 4 3 11 6 3 12 1 2 13 4 2 14 5 2 15 6 2 16 3 2 9 2 2 8 5 4 17 3 4 18 7 4 19 7 3 20 6 3 12 4 3 11 7 2 21 5 2 15 4 2 14 6 4 22 7 4 19 3 4 18

+
+
+
+ + + + 5.420971 14.924370 15.125000 6.847958 1.500000 15.125000 5.420971 14.924370 17.125000 6.238048 14.924370 15.125000 6.847958 1.500000 17.125000 7.665035 1.500000 15.125000 7.665035 1.500000 17.125000 6.238048 14.924370 17.125000 + + + + + + + + + + -0.994398 -0.105703 0.000000 0.000000 0.000000 -1.000000 0.000000 1.000000 -0.000000 0.000000 0.000000 1.000000 -0.000000 1.000000 0.000000 0.994398 0.105703 -0.000000 + + + + + + + + + + 0.000000 1.231930 0.000000 -0.013920 -0.125000 1.231930 0.000000 1.238870 0.051067 1.238870 0.089187 0.000000 -0.125000 -0.013920 -0.000000 -0.000000 -0.000000 0.184570 0.051067 -0.000000 0.140254 0.000000 -0.089187 0.000000 -0.140254 0.000000 0.089187 0.000000 0.089187 0.184570 0.140254 0.000000 0.051067 0.184570 0.000000 -0.021890 0.000000 1.223959 0.125000 -0.021890 0.140254 0.184570 -0.051067 1.238870 0.125000 1.223959 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 0 1 3 3 1 4 1 1 5 4 0 6 2 0 2 1 0 1 0 2 7 2 2 8 3 2 9 5 1 10 1 1 5 3 1 4 4 3 11 6 3 12 2 3 3 1 4 13 4 4 14 5 4 15 7 2 16 3 2 9 2 2 8 5 5 17 3 5 18 6 5 19 6 4 20 5 4 15 4 4 14 7 3 21 2 3 3 6 3 12 7 5 22 6 5 19 3 5 18

+
+
+
+ + + + 7.677584 0.937500 16.027561 7.677584 0.843750 16.175564 7.677584 0.843750 16.074436 7.677584 0.937500 16.222439 7.771334 0.843750 16.074436 7.677584 1.031250 16.074436 7.771334 0.937500 16.222439 7.771334 0.843750 16.175564 7.771334 0.937500 16.027561 7.677584 1.031250 16.175564 7.771334 1.031250 16.175564 7.771334 0.828260 16.314210 7.771334 0.880953 15.913964 7.771334 1.031250 16.074436 7.771334 0.880953 16.336036 7.771334 0.937500 16.343480 7.771334 0.828260 15.935790 7.771334 0.937500 15.906520 7.771334 0.994047 15.913964 7.771334 0.994047 16.336036 7.771334 0.783011 16.279489 7.771334 1.046740 15.935790 7.771334 1.046740 16.314210 7.771334 0.783011 15.970511 7.771334 0.748290 16.234240 7.771334 1.091989 15.970511 7.771334 0.748290 16.015760 7.771334 1.091989 16.279489 7.771334 0.726464 16.181547 7.771334 1.126710 16.015760 7.771334 0.726464 16.068453 7.771334 1.126710 16.234240 7.771334 0.719020 16.125000 7.771334 1.148536 16.068453 7.771334 1.148536 16.181547 7.771334 1.155980 16.125000 + + + + + + + + + + 1.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.447214 0.894427 0.000000 0.447214 -0.894427 0.000000 -0.447214 0.894427 0.000000 -0.447214 -0.894427 0.000000 -1.000000 0.000000 + + + + + + + + + + 0.250000 0.152561 0.156250 0.300564 0.156250 0.199436 0.250000 0.347439 0.300564 -0.093750 0.199436 0.000000 0.199436 -0.093750 -0.050564 0.000000 -0.155379 -0.093750 -0.050564 -0.093750 0.343750 0.199436 0.378986 0.000000 0.274170 -0.093750 0.378986 -0.093750 0.300564 0.000000 -0.155379 0.000000 -0.291834 0.000000 -0.396650 -0.093750 -0.291834 -0.093750 0.343750 0.300564 0.274170 0.000000 0.068228 -0.093750 0.173043 0.000000 0.068228 0.000000 0.140760 0.439210 0.193453 0.038964 -0.396650 0.000000 -0.199436 -0.093750 -0.300564 0.000000 -0.300564 -0.093750 0.173043 -0.093750 0.193453 0.461036 0.250000 0.468480 0.140760 0.060790 0.250000 0.031520 0.306547 0.038964 -0.199436 0.000000 0.306547 0.461036 0.095511 0.404489 0.359240 0.060790 0.359240 0.439210 0.095511 0.095511 0.060790 0.359240 0.404489 0.095511 0.060790 0.140760 0.404489 0.404489 0.038964 0.306547 0.439210 0.140760 0.038964 0.193453 0.439210 0.359240 0.031520 0.250000 0.461036 0.193453 0.461036 0.306547 0.468480 0.250000 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 1 0 1 0 0 0 3 0 3 1 1 4 4 1 5 2 1 6 4 2 7 0 2 8 2 2 9 3 0 3 0 0 0 5 0 10 6 3 11 1 3 12 3 3 13 4 1 5 1 1 4 7 1 14 0 2 8 4 2 7 8 2 15 8 4 16 5 4 17 0 4 18 3 0 3 5 0 10 9 0 19 1 3 12 6 3 11 7 3 20 3 5 21 10 5 22 6 5 23 7 0 1 11 0 24 4 0 2 4 0 2 12 0 25 8 0 0 5 4 17 8 4 16 13 4 26 5 6 27 10 6 28 9 6 29 10 5 22 3 5 21 9 5 30 14 0 31 7 0 1 6 0 3 15 0 32 6 0 3 10 0 19 11 0 24 7 0 1 14 0 31 11 0 24 16 0 33 4 0 2 4 0 2 16 0 33 12 0 25 8 0 0 12 0 25 17 0 34 8 0 0 18 0 35 13 0 10 10 6 28 5 6 27 13 6 36 14 0 31 6 0 3 15 0 32 15 0 32 10 0 19 19 0 37 20 0 38 16 0 33 11 0 24 8 0 0 17 0 34 18 0 35 13 0 10 18 0 35 21 0 39 13 0 10 21 0 39 10 0 19 19 0 37 10 0 19 22 0 40 20 0 38 23 0 41 16 0 33 22 0 40 10 0 19 21 0 39 24 0 42 23 0 41 20 0 38 22 0 40 21 0 39 25 0 43 24 0 42 26 0 44 23 0 41 22 0 40 25 0 43 27 0 45 28 0 46 26 0 44 24 0 42 27 0 45 25 0 43 29 0 47 28 0 46 30 0 48 26 0 44 27 0 45 29 0 47 31 0 49 30 0 48 28 0 46 32 0 50 31 0 49 29 0 47 33 0 51 31 0 49 33 0 51 34 0 52 34 0 52 33 0 51 35 0 53

+
+
+
+ + + + 7.708834 1.437500 0.000000 7.708834 0.437500 0.000000 6.708834 1.437500 0.000000 7.771334 1.500000 0.125000 6.708834 0.437500 0.000000 7.771334 0.375000 0.125000 6.646334 1.500000 0.125000 6.646334 0.375000 0.125000 7.771334 0.719020 16.125000 7.771334 1.500000 17.125000 6.646334 0.375000 17.125000 7.771334 0.726464 16.068453 7.771334 0.375000 17.125000 6.646334 1.500000 17.125000 7.771334 1.155980 16.125000 7.771334 0.748290 16.015760 7.771334 0.726464 16.181547 7.771334 1.148536 16.181547 7.771334 1.148536 16.068453 7.771334 0.783011 15.970511 7.771334 0.748290 16.234240 7.771334 1.126710 16.234240 7.771334 1.126710 16.015760 7.771334 0.783011 16.279489 7.771334 0.828260 15.935790 7.771334 1.091989 16.279489 7.771334 1.091989 15.970511 7.771334 0.828260 16.314210 7.771334 0.880953 15.913964 7.771334 1.046740 16.314210 7.771334 1.046740 15.935790 7.771334 0.880953 16.336036 7.771334 0.937500 15.906520 7.771334 0.994047 16.336036 7.771334 0.994047 15.913964 7.771334 0.937500 16.343480 + + + + + + + + + + 0.000000 0.000000 -1.000000 0.894427 0.000000 -0.447214 0.000000 0.894427 -0.447214 -0.894427 0.000000 -0.447214 -0.000000 -0.894427 -0.447214 1.000000 0.000000 0.000000 -0.000000 1.000000 -0.000000 0.000000 -1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 + + + + + + + + + + -0.003906 0.098053 -0.003906 0.005768 -0.066406 0.098053 -0.066406 -0.002579 -0.070313 0.010318 -0.003906 -0.002579 -0.066406 0.005768 -0.003906 0.043851 -0.066406 0.043851 0.000000 0.056748 0.000000 0.010318 0.066406 0.043851 0.003906 0.043851 0.070313 0.056748 0.066406 -0.002579 0.003906 -0.002579 0.070313 0.010318 -0.070313 0.056748 0.000000 0.011536 -0.070313 0.011536 -0.021501 1.488098 0.000000 0.011536 -0.070312 0.011536 0.000000 1.580383 0.070313 0.011536 0.070313 1.580383 -0.021967 1.482880 0.000000 1.580383 -0.070312 1.580383 -0.070313 1.580383 -0.048811 1.488098 -0.023331 1.478017 -0.021967 1.493317 0.070313 0.103821 0.070313 0.000000 0.000000 0.103821 -0.048346 1.493317 -0.048346 1.482880 0.000000 0.000000 -0.025501 1.473841 -0.023331 1.498179 -0.046982 1.498179 -0.046982 1.478017 -0.025501 1.502355 -0.028329 1.470637 -0.044812 1.502355 -0.044812 1.473841 -0.028329 1.505559 -0.031622 1.468623 -0.041984 1.505559 -0.041984 1.470637 -0.031622 1.507574 -0.035156 1.467936 -0.038690 1.507574 -0.038690 1.468623 -0.035156 1.508261 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 0 1 3 3 1 4 1 1 5 4 0 6 2 0 2 1 0 1 0 2 7 2 2 8 3 2 9 5 1 10 1 1 5 3 1 4 2 3 11 4 3 12 6 3 13 4 4 14 1 4 15 7 4 16 6 2 17 3 2 9 2 2 8 5 4 10 7 4 16 1 4 15 5 5 18 3 5 19 8 5 20 7 3 9 6 3 13 4 3 12 3 6 21 6 6 22 9 6 23 7 7 24 5 7 18 10 7 25 11 5 26 8 5 20 3 5 19 5 5 18 8 5 20 12 5 27 7 8 18 10 8 27 6 8 24 13 6 28 9 6 23 6 6 22 9 5 29 14 5 30 3 5 19 12 7 27 10 7 25 5 7 18 15 5 31 11 5 26 3 5 19 16 5 32 12 5 27 8 5 20 13 8 25 6 8 24 10 8 27 13 9 33 10 9 34 9 9 35 14 5 30 9 5 29 17 5 36 14 5 30 18 5 37 3 5 19 12 9 38 9 9 35 10 9 34 19 5 39 15 5 31 3 5 19 20 5 40 12 5 27 16 5 32 17 5 36 9 5 29 21 5 41 18 5 37 22 5 42 3 5 19 9 5 29 12 5 27 23 5 43 24 5 44 19 5 39 3 5 19 23 5 43 12 5 27 20 5 40 21 5 41 9 5 29 25 5 45 22 5 42 26 5 46 3 5 19 27 5 47 9 5 29 23 5 43 28 5 48 24 5 44 3 5 19 25 5 45 9 5 29 29 5 49 26 5 46 30 5 50 3 5 19 31 5 51 9 5 29 27 5 47 32 5 52 28 5 48 3 5 19 29 5 49 9 5 29 33 5 53 30 5 50 34 5 54 3 5 19 35 5 55 9 5 29 31 5 51 34 5 54 32 5 52 3 5 19 33 5 53 9 5 29 35 5 55

+
+
+
+ + + + 6.197745 18.253172 34.332811 6.197745 18.159422 34.480813 6.197745 18.159422 34.379686 6.197745 18.253172 34.527688 6.291495 18.159422 34.379686 6.197745 18.346922 34.379686 6.291495 18.253172 34.527688 6.291495 18.159422 34.480813 6.291495 18.253172 34.332811 6.197745 18.346922 34.480813 6.291495 18.346922 34.480813 6.291495 18.143932 34.619459 6.291495 18.196625 34.219214 6.291495 18.346922 34.379686 6.291495 18.196625 34.641286 6.291495 18.253172 34.648730 6.291495 18.143932 34.241040 6.291495 18.253172 34.211769 6.291495 18.309719 34.219214 6.291495 18.309719 34.641286 6.291495 18.098683 34.584739 6.291495 18.362412 34.241040 6.291495 18.362412 34.619459 6.291495 18.098683 34.275761 6.291495 18.063962 34.539490 6.291495 18.407661 34.275761 6.291495 18.063962 34.321010 6.291495 18.407661 34.584739 6.291495 18.042136 34.486797 6.291495 18.442381 34.321010 6.291495 18.042136 34.373703 6.291495 18.442381 34.539490 6.291495 18.034692 34.430250 6.291495 18.464208 34.373703 6.291495 18.464208 34.486797 6.291495 18.471652 34.430250 + + + + + + + + + + 1.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.447214 0.894427 0.000000 0.447214 -0.894427 0.000000 -0.447214 0.894427 0.000000 -0.447214 -0.894427 0.000000 -1.000000 0.000000 + + + + + + + + + + 0.250000 0.152561 0.156250 0.300564 0.156250 0.199436 0.250000 0.347439 0.300564 -0.093750 0.199436 0.000000 0.199436 -0.093750 -0.050564 0.000000 -0.155379 -0.093750 -0.050564 -0.093750 0.343750 0.199436 0.378986 0.000000 0.274170 -0.093750 0.378986 -0.093750 0.300564 0.000000 -0.155379 0.000000 -0.291834 0.000000 -0.396650 -0.093750 -0.291834 -0.093750 0.343750 0.300564 0.274170 0.000000 0.068228 -0.093750 0.173043 0.000000 0.068228 0.000000 0.140760 0.439210 0.193453 0.038964 -0.396650 0.000000 -0.199436 -0.093750 -0.300564 0.000000 -0.300564 -0.093750 0.173043 -0.093750 0.193453 0.461036 0.250000 0.468480 0.140760 0.060790 0.250000 0.031520 0.306547 0.038964 -0.199436 0.000000 0.306547 0.461036 0.095511 0.404489 0.359240 0.060790 0.359240 0.439210 0.095511 0.095511 0.060790 0.359240 0.404489 0.095511 0.060790 0.140760 0.404489 0.404489 0.038964 0.306547 0.439210 0.140760 0.038964 0.193453 0.439210 0.359240 0.031520 0.250000 0.461036 0.193453 0.461036 0.306547 0.468480 0.250000 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 1 0 1 0 0 0 3 0 3 1 1 4 4 1 5 2 1 6 4 2 7 0 2 8 2 2 9 3 0 3 0 0 0 5 0 10 6 3 11 1 3 12 3 3 13 4 1 5 1 1 4 7 1 14 0 2 8 4 2 7 8 2 15 8 4 16 5 4 17 0 4 18 3 0 3 5 0 10 9 0 19 1 3 12 6 3 11 7 3 20 3 5 21 10 5 22 6 5 23 7 0 1 11 0 24 4 0 2 4 0 2 12 0 25 8 0 0 5 4 17 8 4 16 13 4 26 5 6 27 10 6 28 9 6 29 10 5 22 3 5 21 9 5 30 14 0 31 7 0 1 6 0 3 15 0 32 6 0 3 10 0 19 11 0 24 7 0 1 14 0 31 11 0 24 16 0 33 4 0 2 4 0 2 16 0 33 12 0 25 8 0 0 12 0 25 17 0 34 8 0 0 18 0 35 13 0 10 10 6 28 5 6 27 13 6 36 14 0 31 6 0 3 15 0 32 15 0 32 10 0 19 19 0 37 20 0 38 16 0 33 11 0 24 8 0 0 17 0 34 18 0 35 13 0 10 18 0 35 21 0 39 13 0 10 21 0 39 10 0 19 19 0 37 10 0 19 22 0 40 20 0 38 23 0 41 16 0 33 22 0 40 10 0 19 21 0 39 24 0 42 23 0 41 20 0 38 22 0 40 21 0 39 25 0 43 24 0 42 26 0 44 23 0 41 22 0 40 25 0 43 27 0 45 28 0 46 26 0 44 24 0 42 27 0 45 25 0 43 29 0 47 28 0 46 30 0 48 26 0 44 27 0 45 29 0 47 31 0 49 30 0 48 28 0 46 32 0 50 31 0 49 29 0 47 33 0 51 31 0 49 33 0 51 34 0 52 34 0 52 33 0 51 35 0 53

+
+
+
+ + + + 6.197745 15.619749 16.027561 6.197745 15.525999 16.175564 6.197745 15.525999 16.074436 6.197745 15.619749 16.222439 6.291495 15.525999 16.074436 6.197745 15.713499 16.074436 6.291495 15.619749 16.222439 6.291495 15.525999 16.175564 6.291495 15.619749 16.027561 6.197745 15.713499 16.175564 6.291495 15.713499 16.175564 6.291495 15.510509 16.314210 6.291495 15.563202 15.913964 6.291495 15.713499 16.074436 6.291495 15.563202 16.336036 6.291495 15.619749 16.343480 6.291495 15.510509 15.935790 6.291495 15.619749 15.906520 6.291495 15.676296 15.913964 6.291495 15.676296 16.336036 6.291495 15.465260 16.279489 6.291495 15.728989 15.935790 6.291495 15.728989 16.314210 6.291495 15.465260 15.970511 6.291495 15.430540 16.234240 6.291495 15.774238 15.970511 6.291495 15.430540 16.015760 6.291495 15.774238 16.279489 6.291495 15.408713 16.181547 6.291495 15.808959 16.015760 6.291495 15.408713 16.068453 6.291495 15.808959 16.234240 6.291495 15.401269 16.125000 6.291495 15.830785 16.068453 6.291495 15.830785 16.181547 6.291495 15.838230 16.125000 + + + + + + + + + + 1.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.447214 0.894427 0.000000 0.447214 -0.894427 0.000000 -0.447214 0.894427 0.000000 -0.447214 -0.894427 0.000000 -1.000000 0.000000 + + + + + + + + + + 0.250000 0.152561 0.156250 0.300564 0.156250 0.199436 0.250000 0.347439 0.300564 -0.093750 0.199436 0.000000 0.199436 -0.093750 -0.050564 0.000000 -0.155379 -0.093750 -0.050564 -0.093750 0.343750 0.199436 0.378986 0.000000 0.274170 -0.093750 0.378986 -0.093750 0.300564 0.000000 -0.155379 0.000000 -0.291834 0.000000 -0.396650 -0.093750 -0.291834 -0.093750 0.343750 0.300564 0.274170 0.000000 0.068228 -0.093750 0.173043 0.000000 0.068228 0.000000 0.140760 0.439210 0.193453 0.038964 -0.396650 0.000000 -0.199436 -0.093750 -0.300564 0.000000 -0.300564 -0.093750 0.173043 -0.093750 0.193453 0.461036 0.250000 0.468480 0.140760 0.060790 0.250000 0.031520 0.306547 0.038964 -0.199436 0.000000 0.306547 0.461036 0.095511 0.404489 0.359240 0.060790 0.359240 0.439210 0.095511 0.095511 0.060790 0.359240 0.404489 0.095511 0.060790 0.140760 0.404489 0.404489 0.038964 0.306547 0.439210 0.140760 0.038964 0.193453 0.439210 0.359240 0.031520 0.250000 0.461036 0.193453 0.461036 0.306547 0.468480 0.250000 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 1 0 1 0 0 0 3 0 3 1 1 4 4 1 5 2 1 6 4 2 7 0 2 8 2 2 9 3 0 3 0 0 0 5 0 10 6 3 11 1 3 12 3 3 13 4 1 5 1 1 4 7 1 14 0 2 8 4 2 7 8 2 15 8 4 16 5 4 17 0 4 18 3 0 3 5 0 10 9 0 19 1 3 12 6 3 11 7 3 20 3 5 21 10 5 22 6 5 23 7 0 1 11 0 24 4 0 2 4 0 2 12 0 25 8 0 0 5 4 17 8 4 16 13 4 26 5 6 27 10 6 28 9 6 29 10 5 22 3 5 21 9 5 30 14 0 31 7 0 1 6 0 3 15 0 32 6 0 3 10 0 19 11 0 24 7 0 1 14 0 31 11 0 24 16 0 33 4 0 2 4 0 2 16 0 33 12 0 25 8 0 0 12 0 25 17 0 34 8 0 0 18 0 35 13 0 10 10 6 28 5 6 27 13 6 36 14 0 31 6 0 3 15 0 32 15 0 32 10 0 19 19 0 37 20 0 38 16 0 33 11 0 24 8 0 0 17 0 34 18 0 35 13 0 10 18 0 35 21 0 39 13 0 10 21 0 39 10 0 19 19 0 37 10 0 19 22 0 40 20 0 38 23 0 41 16 0 33 22 0 40 10 0 19 21 0 39 24 0 42 23 0 41 20 0 38 22 0 40 21 0 39 25 0 43 24 0 42 26 0 44 23 0 41 22 0 40 25 0 43 27 0 45 28 0 46 26 0 44 24 0 42 27 0 45 25 0 43 29 0 47 28 0 46 30 0 48 26 0 44 27 0 45 29 0 47 31 0 49 30 0 48 28 0 46 32 0 50 31 0 49 29 0 47 33 0 51 31 0 49 33 0 51 34 0 52 34 0 52 33 0 51 35 0 53

+
+
+
+ + + + 5.166495 15.421569 0.125000 5.166495 16.546569 0.125000 5.228995 15.484069 0.000000 5.166495 16.546569 17.625000 5.228995 16.484069 0.000000 6.228995 15.484069 0.000000 5.166495 14.924370 17.625000 6.291495 16.546569 17.625000 6.291495 16.546569 0.125000 6.291495 15.421569 0.125000 5.166495 14.924370 15.125000 5.166495 17.883552 35.380091 6.291495 18.993245 35.195142 6.228995 16.484069 0.000000 6.291495 14.924370 15.125000 5.166495 18.993245 35.195142 6.291495 14.924370 17.625000 6.291495 18.442381 34.321010 6.291495 15.838230 16.125000 6.291495 15.430540 16.015760 5.228995 17.962441 35.493621 6.291495 17.883552 35.380091 6.228995 18.948835 35.329222 6.291495 18.464208 34.373703 6.291495 18.407661 34.275761 6.291495 15.830785 16.068453 6.291495 15.401269 16.125000 6.291495 15.465260 15.970511 6.291495 15.408713 16.068453 5.228995 18.948835 35.329222 6.228995 17.962441 35.493621 6.291495 18.471652 34.430250 6.291495 18.362412 34.241040 6.291495 18.042136 34.373703 6.291495 15.830785 16.181547 6.291495 15.808959 16.015760 6.291495 15.510509 15.935790 6.291495 18.143932 34.619459 6.291495 18.464208 34.486797 6.291495 18.309719 34.219214 6.291495 18.034692 34.430250 6.291495 18.063962 34.321010 6.291495 15.808959 16.234240 6.291495 15.774238 15.970511 6.291495 15.408713 16.181547 6.291495 15.563202 15.913964 6.291495 18.098683 34.584739 6.291495 18.196625 34.641286 6.291495 18.442381 34.539490 6.291495 18.253172 34.211769 6.291495 18.042136 34.486797 6.291495 18.098683 34.275761 6.291495 15.774238 16.279489 6.291495 15.728989 15.935790 6.291495 15.430540 16.234240 6.291495 15.619749 15.906520 6.291495 18.063962 34.539490 6.291495 18.253172 34.648730 6.291495 18.407661 34.584739 6.291495 18.196625 34.219214 6.291495 18.143932 34.241040 6.291495 15.728989 16.314210 6.291495 15.676296 15.913964 6.291495 15.465260 16.279489 6.291495 18.309719 34.641286 6.291495 18.362412 34.619459 6.291495 15.676296 16.336036 6.291495 15.510509 16.314210 6.291495 15.619749 16.343480 6.291495 15.563202 16.336036 + + + + + + + + + + -0.894427 0.000000 -0.447214 -1.000000 -0.000000 -0.000000 -0.000000 -0.894427 -0.447214 0.000000 1.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.894427 -0.447214 0.000000 0.990443 -0.137921 -0.000000 -0.999451 -0.033128 0.894427 0.000000 -0.447214 0.000000 -1.000000 0.000000 -0.000000 -0.986394 0.164399 1.000000 0.000000 0.000000 0.000000 0.164399 0.986394 -0.894363 0.073543 0.441255 0.000000 0.949285 0.314418 -0.000000 -0.821203 0.570636 0.894363 0.073543 0.441255 0.000000 0.164399 0.986394 + + + + + + + + + + 0.031075 0.056748 0.101387 0.056748 0.034981 0.043851 0.101387 0.011536 0.031075 0.011536 0.101387 1.626526 0.097481 0.043851 0.066406 -0.023099 0.003906 -0.023099 0.070313 -0.010202 0.000000 1.626526 -0.070313 1.626526 0.000000 1.626526 -0.070313 0.011536 -0.066406 0.051652 -0.066406 0.143937 -0.003906 0.051652 -0.070313 0.077268 0.000000 0.077268 -0.066406 0.064371 0.000000 -0.010202 0.000000 1.395813 0.184949 3.265057 -0.000000 1.631629 -0.070313 1.631629 -0.000000 3.268738 0.000000 0.011536 -0.003906 0.143937 -0.003906 0.064371 0.070313 0.010009 0.000000 0.010009 0.070313 1.395047 -0.031075 0.010318 -0.034981 -0.002579 -0.101387 0.010318 0.070313 1.395813 0.000000 1.395813 0.070313 1.626526 0.254305 3.247989 0.070313 1.604395 -0.000000 1.604395 0.070313 3.265528 -0.070313 3.268738 -0.254305 3.247989 -0.219876 3.167320 -0.101387 1.626526 -0.057116 1.488098 -0.101387 0.011536 -0.097481 -0.002579 0.000000 1.395047 -0.031636 1.478017 -0.031075 0.011536 -0.070313 0.163578 -0.070313 0.267399 0.000000 0.163578 0.178564 2.874469 0.183799 2.886145 0.247687 2.855450 0.000000 3.265528 0.000000 2.965204 -0.070313 2.965204 -0.003906 2.978238 -0.221240 3.172183 -0.217706 3.163144 -0.184949 3.265057 -0.056651 1.482880 -0.029806 1.488098 -0.033806 1.473841 -0.030271 1.482880 0.000000 0.267399 0.070313 2.837110 0.000000 2.837110 0.066406 2.849868 0.245241 2.869238 -0.066406 2.978238 -0.251003 2.914895 -0.189561 2.931802 -0.253449 2.901107 -0.221705 3.177401 -0.214878 3.159940 -0.194860 3.172183 -0.056651 1.493317 -0.055287 1.478017 -0.036634 1.470637 -0.201223 3.194862 -0.184327 2.920127 0.003906 2.849868 -0.066406 0.169655 -0.066406 0.261940 -0.003906 0.169655 -0.003906 0.261940 -0.221240 3.182619 -0.211584 3.157926 -0.194395 3.177401 -0.196225 3.167320 -0.055287 1.498179 -0.053117 1.473841 -0.030271 1.493317 -0.039927 1.468623 -0.198395 3.191658 -0.204516 3.196876 -0.219876 3.187482 -0.208050 3.157238 -0.194860 3.182619 -0.198395 3.163144 -0.053117 1.502355 -0.050289 1.470637 -0.031636 1.498179 -0.043461 1.467936 -0.196225 3.187482 -0.208050 3.197563 -0.217706 3.191658 -0.204516 3.157926 -0.201223 3.159940 -0.050289 1.505559 -0.046995 1.468623 -0.033806 1.502355 -0.211584 3.196876 -0.214878 3.194862 -0.046995 1.507574 -0.036634 1.505559 -0.043461 1.508261 -0.039927 1.507574 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 1 1 3 0 1 4 3 1 5 4 0 6 2 0 2 1 0 1 2 2 7 5 2 8 0 2 9 3 1 5 0 1 4 6 1 10 3 3 11 7 3 12 1 3 13 2 4 14 4 4 15 5 4 16 1 5 17 8 5 18 4 5 19 9 2 20 0 2 9 5 2 8 10 1 21 6 1 10 0 1 4 11 1 22 3 1 5 6 1 10 7 6 23 3 6 24 12 6 25 8 3 26 1 3 13 7 3 12 13 4 27 5 4 16 4 4 15 13 5 28 4 5 19 8 5 18 0 7 29 9 7 30 10 7 31 9 8 32 5 8 33 8 8 34 10 9 35 14 9 36 6 9 37 15 1 38 3 1 5 11 1 22 6 10 39 16 10 40 11 10 41 15 6 42 12 6 25 3 6 24 12 11 43 17 11 44 7 11 45 7 11 45 18 11 46 8 11 47 13 8 48 8 8 34 5 8 33 14 7 49 10 7 31 9 7 30 8 11 47 19 11 50 9 11 51 16 9 12 6 9 37 14 9 36 15 12 52 11 12 53 12 12 54 11 13 55 20 13 56 15 13 57 21 10 58 11 10 41 16 10 40 12 14 59 15 14 60 22 14 61 23 11 62 17 11 44 12 11 43 17 11 44 24 11 63 7 11 45 7 11 45 21 11 64 18 11 46 18 11 46 25 11 65 8 11 47 14 11 36 9 11 51 26 11 66 27 11 67 19 11 50 8 11 47 19 11 50 28 11 68 9 11 51 16 11 12 14 11 36 21 11 64 21 12 69 12 12 54 11 12 53 11 15 70 21 15 71 20 15 72 29 13 73 15 13 57 20 13 56 29 14 74 22 14 61 15 14 60 22 16 75 30 16 76 12 16 77 31 11 78 23 11 62 12 11 43 24 11 63 32 11 79 7 11 45 33 11 80 21 11 64 7 11 45 18 11 46 21 11 64 34 11 81 25 11 65 35 11 82 8 11 47 28 11 68 26 11 66 9 11 51 26 11 66 21 11 64 14 11 36 36 11 83 27 11 67 8 11 47 12 11 43 21 11 64 37 11 84 21 16 85 12 16 77 30 16 76 30 15 86 20 15 72 21 15 71 29 17 87 20 17 88 22 17 89 30 17 90 22 17 89 20 17 88 31 11 78 12 11 43 38 11 91 32 11 79 39 11 92 7 11 45 40 11 93 21 11 64 33 11 80 41 11 94 33 11 80 7 11 45 34 11 81 21 11 64 42 11 95 35 11 82 43 11 96 8 11 47 44 11 97 21 11 64 26 11 66 45 11 98 36 11 83 8 11 47 37 11 84 21 11 64 46 11 99 47 11 100 12 11 43 37 11 84 38 11 91 12 11 43 48 11 101 39 11 92 49 11 102 7 11 45 40 11 93 50 11 103 21 11 64 51 11 104 41 11 94 7 11 45 42 11 95 21 11 64 52 11 105 43 11 96 53 11 106 8 11 47 54 11 107 21 11 64 44 11 97 55 11 108 45 11 98 8 11 47 46 11 99 21 11 64 56 11 109 57 11 110 12 11 43 47 11 100 48 11 101 12 11 43 58 11 111 49 11 102 59 11 112 7 11 45 56 11 109 21 11 64 50 11 103 60 11 113 51 11 104 7 11 45 52 11 105 21 11 64 61 11 114 53 11 106 62 11 115 8 11 47 63 11 116 21 11 64 54 11 107 62 11 115 55 11 108 8 11 47 64 11 117 12 11 43 57 11 110 58 11 111 12 11 43 65 11 118 59 11 112 60 11 113 7 11 45 61 11 114 21 11 64 66 11 119 67 11 120 21 11 64 63 11 116 65 11 118 12 11 43 64 11 117 66 11 119 21 11 64 68 11 121 69 11 122 21 11 64 67 11 120 68 11 121 21 11 64 69 11 122

+
+
+
+ + + + 6.646334 0.531250 17.125000 -6.646334 0.531250 15.125000 6.646334 0.531250 15.125000 -6.646334 0.531250 17.125000 6.646334 1.343750 15.125000 -6.646334 1.343750 17.125000 -6.646334 1.343750 15.125000 6.646334 1.343750 17.125000 + + + + + + + + + + 0.000000 -1.000000 0.000000 0.000000 0.000000 -1.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 -1.000000 0.000000 0.000000 0.000000 1.000000 0.000000 + + + + + + + + + + 0.830792 0.184570 0.000000 0.000000 0.830792 0.000000 0.000000 0.184570 -0.830792 0.074982 -0.830792 0.000000 0.050781 0.000000 0.000000 0.074982 -0.050781 0.184570 0.050781 0.184570 0.830792 0.074982 -0.050781 0.000000 -0.830792 0.184570 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 1 0 1 0 0 0 3 0 3 1 1 1 4 1 4 2 1 5 4 2 6 0 2 3 2 2 1 0 3 2 5 3 7 3 3 1 5 4 8 1 4 1 3 4 3 4 1 4 1 1 1 6 1 7 0 2 3 4 2 6 7 2 9 5 3 7 0 3 2 7 3 10 1 4 1 5 4 8 6 4 11 5 5 3 4 5 5 6 5 1 4 5 5 5 5 3 7 5 12

+
+
+
+ + + + 5.166495 16.000000 15.125000 5.166495 15.250000 17.125000 5.166495 15.250000 15.125000 5.166495 16.000000 17.125000 -5.166495 15.250000 15.125000 -5.166495 16.000000 17.125000 -5.166495 15.250000 17.125000 -5.166495 16.000000 15.125000 + + + + + + + + + + 1.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 1.000000 -1.000000 0.000000 0.000000 + + + + + + + + + + 0.046875 0.000000 0.000000 0.184570 0.000000 0.000000 0.046875 0.184570 0.645812 0.184570 0.645812 0.000000 -0.645812 0.069214 -0.645812 0.000000 -0.645812 0.184570 0.000000 0.069214 0.645812 0.069214 -0.046875 0.184570 -0.046875 0.000000 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 1 0 1 0 0 0 3 0 3 1 1 4 4 1 2 2 1 5 4 2 2 0 2 6 2 2 7 0 3 7 5 3 1 3 3 8 5 4 9 1 4 5 3 4 10 4 1 2 1 1 4 6 1 1 0 2 6 4 2 2 7 2 9 5 3 1 0 3 7 7 3 2 1 4 5 5 4 9 6 4 2 5 5 11 4 5 2 6 5 1 4 5 2 5 5 11 7 5 12

+
+
+
+ + + + 0.500000 16.873192 23.288377 -0.500000 16.379995 23.370576 -0.500000 16.873192 23.288377 0.500000 16.379995 23.370576 -0.500000 18.025013 33.240684 -0.500000 18.518210 33.158485 0.500000 18.025013 33.240684 0.500000 18.518210 33.158485 + + + + + + + + + + 0.000000 -0.164399 -0.986394 -1.000000 0.000000 0.000000 0.000000 0.986394 -0.164399 1.000000 0.000000 0.000000 0.000000 -0.986394 0.164399 0.000000 0.164399 0.986394 + + + + + + + + + + 0.062500 -0.044895 0.000000 0.001247 0.000000 -0.044895 0.062500 0.001247 -0.102814 0.918450 -0.030825 0.000000 0.000000 0.007586 0.000000 0.930911 -0.062500 0.007483 0.000000 0.007483 0.030825 0.000000 0.102814 0.918450 0.062500 0.930911 0.062500 0.007483 -0.133638 0.910864 0.000000 0.930911 -0.062500 0.930911 0.133638 0.910864 -0.062500 0.001247 0.000000 -0.044895 0.000000 0.001247 -0.062500 -0.044895 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 1 0 1 0 0 0 3 0 3 4 1 4 2 1 5 1 1 6 5 2 7 0 2 8 2 2 9 0 3 10 6 3 11 3 3 6 6 4 12 1 4 9 3 4 13 2 1 5 4 1 4 5 1 14 1 4 9 6 4 12 4 4 15 0 2 8 5 2 7 7 2 16 6 3 11 0 3 10 7 3 17 6 5 18 5 5 19 4 5 20 5 5 19 6 5 18 7 5 21

+
+
+
+ + + + 5.166495 16.821817 22.029697 -5.166495 16.020372 22.163271 -5.166495 16.821817 22.029697 5.166495 16.020372 22.163271 -5.166495 16.225871 23.396264 -5.166495 17.027316 23.262690 5.166495 16.225871 23.396264 5.166495 17.027316 23.262690 + + + + + + + + + + 0.000000 -0.164399 -0.986394 -1.000000 0.000000 0.000000 0.000000 0.986394 -0.164399 1.000000 0.000000 0.000000 0.000000 -0.986394 0.164399 -0.000000 0.164399 0.986394 + + + + + + + + + + 0.645812 -0.072955 0.000000 0.002027 0.000000 -0.072955 0.645812 0.002027 -0.012844 0.126114 -0.050090 0.000000 0.000000 0.012327 0.000000 0.127516 -0.645812 0.012159 0.000000 0.012159 0.050090 -0.000000 0.012844 0.126114 -0.000000 0.012327 0.645812 0.127516 0.000000 0.012159 0.645812 0.012159 -0.062934 0.113787 -0.645812 0.127516 0.062934 0.113787 -0.645812 0.002027 -0.000000 -0.072955 -0.000000 0.002027 -0.645812 -0.072955 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 1 0 1 0 0 0 3 0 3 4 1 4 2 1 5 1 1 6 5 2 7 0 2 8 2 2 9 0 3 10 6 3 11 3 3 12 6 4 13 1 4 14 3 4 15 2 1 5 4 1 4 5 1 16 1 4 14 6 4 13 4 4 7 0 2 8 5 2 7 7 2 17 6 3 11 0 3 10 7 3 18 6 5 19 5 5 20 4 5 21 5 5 20 6 5 19 7 5 22

+
+
+
+ + + + -1.750000 16.873192 23.288377 -2.750000 16.379995 23.370576 -2.750000 16.873192 23.288377 -1.750000 16.379995 23.370576 -2.750000 18.025013 33.240684 -2.750000 18.518210 33.158485 -1.750000 18.025013 33.240684 -1.750000 18.518210 33.158485 + + + + + + + + + + 0.000000 -0.164399 -0.986394 -1.000000 0.000000 0.000000 0.000000 0.986394 -0.164399 1.000000 0.000000 0.000000 0.000000 -0.986394 0.164399 0.000000 0.164399 0.986394 + + + + + + + + + + 0.062500 -0.044895 0.000000 0.001247 0.000000 -0.044895 0.062500 0.001247 -0.102814 0.918450 -0.030825 0.000000 0.000000 0.007586 0.000000 0.930911 -0.062500 0.007483 0.000000 0.007483 0.030825 0.000000 0.102814 0.918450 0.062500 0.930911 0.062500 0.007483 -0.133638 0.910864 0.000000 0.930911 -0.062500 0.930911 0.133638 0.910864 -0.062500 0.001247 0.000000 -0.044895 0.000000 0.001247 -0.062500 -0.044895 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 1 0 1 0 0 0 3 0 3 4 1 4 2 1 5 1 1 6 5 2 7 0 2 8 2 2 9 0 3 10 6 3 11 3 3 6 6 4 12 1 4 9 3 4 13 2 1 5 4 1 4 5 1 14 1 4 9 6 4 12 4 4 15 0 2 8 5 2 7 7 2 16 6 3 11 0 3 10 7 3 17 6 5 18 5 5 19 4 5 20 5 5 19 6 5 18 7 5 21

+
+
+
+ + + + 2.750000 16.873192 23.288377 1.750000 16.379995 23.370576 1.750000 16.873192 23.288377 2.750000 16.379995 23.370576 1.750000 18.025013 33.240684 1.750000 18.518210 33.158485 2.750000 18.025013 33.240684 2.750000 18.518210 33.158485 + + + + + + + + + + 0.000000 -0.164399 -0.986394 -1.000000 0.000000 0.000000 0.000000 0.986394 -0.164399 1.000000 0.000000 0.000000 0.000000 -0.986394 0.164399 0.000000 0.164399 0.986394 + + + + + + + + + + 0.062500 -0.044895 0.000000 0.001247 0.000000 -0.044895 0.062500 0.001247 -0.102814 0.918450 -0.030825 0.000000 0.000000 0.007586 0.000000 0.930911 -0.062500 0.007483 0.000000 0.007483 0.030825 0.000000 0.102814 0.918450 0.062500 0.930911 0.062500 0.007483 -0.133638 0.910864 0.000000 0.930911 -0.062500 0.930911 0.133638 0.910864 -0.062500 0.001247 0.000000 -0.044895 0.000000 0.001247 -0.062500 -0.044895 + + + + + + + + + + + + + + +

0 0 0 1 0 1 2 0 2 1 0 1 0 0 0 3 0 3 4 1 4 2 1 5 1 1 6 5 2 7 0 2 8 2 2 9 0 3 10 6 3 11 3 3 6 6 4 12 1 4 9 3 4 13 2 1 5 4 1 4 5 1 14 1 4 9 6 4 12 4 4 15 0 2 8 5 2 7 7 2 16 6 3 11 0 3 10 7 3 17 6 5 18 5 5 19 4 5 20 5 5 19 6 5 18 7 5 21

+
+
+
+ + + + -1.748303 18.945036 35.112942 -0.868987 18.638695 33.140154 -1.737748 18.617688 33.140154 -0.874265 18.966170 35.112942 -1.713998 17.881157 33.263454 -2.621887 18.909818 35.112942 -1.724553 18.208504 35.236242 0.000000 18.645698 33.140154 -0.857110 17.901876 33.263454 -2.570440 17.846630 33.263454 -2.606057 18.582683 33.140154 -2.586270 18.173765 35.236242 -0.862389 18.229351 35.236242 0.000000 18.973216 35.112942 -3.494789 18.860526 35.112942 -3.447315 18.125142 35.236242 0.868987 18.638695 33.140154 0.000000 17.908783 33.263454 0.000000 18.236301 35.236242 -3.426215 17.798305 33.263454 -3.473690 18.533688 33.140154 0.874265 18.966170 35.112942 0.857110 17.901876 33.263454 -4.366784 18.797172 35.112942 -4.307464 18.062649 35.236242 -4.281100 17.736194 33.263454 0.862389 18.229351 35.236242 1.737748 18.617688 33.140154 1.713998 17.881157 33.263454 -4.340420 18.470717 33.140154 1.724553 18.208504 35.236242 1.748303 18.945036 35.112942 -5.166495 18.726097 35.112942 -5.137502 17.660080 33.263454 2.606057 18.582683 33.140154 2.570440 17.846630 33.263454 2.586270 18.173765 35.236242 -5.166495 18.397299 33.140154 -5.166495 17.986301 35.236242 2.621887 18.909818 35.112942 -5.166495 17.986301 33.208654 3.473690 18.533688 33.140154 3.426215 17.798305 33.263454 3.447315 18.125142 35.236242 3.494789 18.860526 35.112942 4.340420 18.470717 33.140154 4.281100 17.736194 33.263454 4.307464 18.062649 35.236242 4.366784 18.797172 35.112942 5.166495 18.397299 33.140154 5.137502 17.660080 33.263454 5.166495 17.986301 35.236242 5.166495 18.726097 35.112942 5.166495 17.986301 33.208654 + + + + + + + + + + -0.031793 0.985985 -0.163776 -0.015899 0.986369 -0.163776 0.002660 -0.165003 -0.986290 0.005318 -0.164938 -0.986290 -0.047680 0.985345 -0.163776 -0.005318 0.164938 0.986290 -0.002660 0.165003 0.986290 0.000000 0.986498 -0.163776 0.007976 -0.164831 -0.986290 -0.007976 0.164831 0.986290 -0.000000 -0.165024 -0.986290 0.015899 -0.986369 0.163776 0.031793 -0.985985 0.163776 0.047680 -0.985345 0.163776 -0.063553 0.984448 -0.163776 -0.010631 0.164681 0.986290 0.000000 0.165024 0.986290 0.015899 0.986369 -0.163776 -0.000000 -0.986498 0.163776 0.010631 -0.164681 -0.986290 0.063553 -0.984448 0.163776 -0.002660 -0.165003 -0.986290 -0.079411 0.983296 -0.163776 -0.013284 0.164489 0.986290 0.079411 -0.983296 0.163776 0.002660 0.165003 0.986290 0.031793 0.985985 -0.163776 -0.005318 -0.164938 -0.986290 -0.015899 -0.986369 0.163776 0.013284 -0.164489 -0.986290 0.005318 0.164938 0.986290 -0.031793 -0.985985 0.163776 -0.087332 0.982625 -0.163771 -0.014610 0.164381 0.986289 0.087332 -0.982625 0.163771 0.047680 0.985345 -0.163776 -0.007976 -0.164831 -0.986290 -0.047680 -0.985345 0.163776 0.014610 -0.164381 -0.986289 0.007976 0.164831 0.986290 -1.000000 0.000000 0.000000 -0.996074 -0.088527 -0.000000 0.063553 0.984448 -0.163776 -0.010631 -0.164681 -0.986290 -0.063553 -0.984448 0.163776 0.010631 0.164681 0.986290 0.079411 0.983296 -0.163776 -0.013284 -0.164489 -0.986290 -0.079411 -0.983296 0.163776 0.013284 0.164489 0.986290 0.087332 0.982625 -0.163771 -0.014610 -0.164381 -0.986289 -0.087332 -0.982625 0.163771 0.014610 0.164381 0.986289 1.000000 0.000000 -0.000000 0.996074 -0.088527 -0.000000 + + + + + + + + + + -0.219592 0.197743 -0.274070 0.013192 -0.219757 0.013192 -0.274235 0.197743 0.274070 -0.079448 0.220128 -0.010499 0.219757 -0.079448 -0.220608 0.012334 -0.166129 0.196885 -0.220772 0.196885 -0.219963 -0.010263 -0.274235 -0.079213 -0.219592 -0.079213 -0.272991 0.198809 -0.327469 0.014259 -0.273155 0.014259 0.273699 -0.010499 0.166665 -0.005331 0.220608 -0.074280 0.220236 -0.005331 -0.166294 0.012334 -0.166500 -0.005095 -0.220772 -0.074045 -0.166129 -0.074045 -0.273864 -0.010263 -0.220401 -0.005095 -0.327634 0.198809 0.327469 -0.085871 0.273527 -0.016921 0.273155 -0.085871 0.273864 0.197831 0.220128 0.013280 0.273699 0.013280 0.166294 -0.074280 0.220401 0.196973 0.166665 0.012422 0.220236 0.012422 -0.167095 0.011684 -0.112616 0.196235 -0.167259 0.196235 -0.167259 -0.070132 -0.112987 -0.001183 -0.166888 -0.001183 0.219963 0.197831 -0.273362 -0.016686 -0.327634 -0.085635 -0.272991 -0.085635 0.166500 0.196973 -0.326311 0.200084 -0.380790 0.015533 -0.326476 0.015533 0.327098 -0.016921 0.273527 0.014347 0.327263 0.198897 0.273362 0.198897 0.113152 -0.001418 0.167095 -0.070368 0.166723 -0.001418 -0.112781 0.011684 -0.112616 -0.070132 0.113152 0.011772 0.166888 0.196323 0.112987 0.196323 -0.327263 -0.016686 0.166723 0.011772 -0.380954 0.200084 0.380418 -0.024596 0.326476 -0.093545 0.380790 -0.093545 0.326847 -0.024596 0.327098 0.014347 0.112781 -0.070368 -0.113545 0.011243 -0.059067 0.195794 -0.113710 0.195794 -0.113710 -0.067476 -0.059438 0.001474 -0.113339 0.001474 0.113339 0.195882 0.059603 0.011331 0.113174 0.011331 -0.380583 -0.024360 -0.326311 -0.093310 -0.326682 -0.024360 -0.380954 -0.093310 -0.379540 0.201566 -0.434018 0.017015 -0.379705 0.017015 0.379705 -0.102470 0.433647 -0.033521 0.380076 -0.033521 0.380583 0.200172 0.326847 0.015621 0.380418 0.015621 0.326682 0.200172 0.059603 0.001238 0.113545 -0.067711 0.113174 0.001238 -0.059232 0.011243 -0.059067 -0.067476 0.059438 0.195882 -0.433812 -0.033285 -0.379540 -0.102235 -0.379911 -0.033285 -0.434183 0.201566 0.434018 -0.102470 0.433812 0.201654 0.380076 0.017103 0.433647 0.017103 0.379911 0.201654 0.059232 -0.067711 -0.059973 0.011011 -0.009959 0.195562 -0.060138 0.195562 -0.009959 -0.066077 -0.059767 0.002873 -0.060138 -0.066077 0.059767 0.195650 0.005866 0.011099 0.059602 0.011099 -0.434183 -0.102235 -0.432663 0.203255 -0.487141 0.018704 -0.432828 0.018704 0.432828 -0.112644 0.486770 -0.043694 0.433199 -0.043694 0.433199 0.018792 0.486935 0.203343 0.433034 0.203343 0.005866 0.002637 0.059973 -0.066312 0.059602 0.002637 -0.008140 0.011011 -0.005866 0.002873 0.005866 0.195650 -0.486935 -0.043459 -0.432663 -0.112408 -0.433034 -0.043459 -0.487306 0.203255 0.487141 -0.112644 0.486770 0.018792 0.005866 -0.028007 0.008140 -0.066312 -0.020389 0.006321 -0.066626 0.182059 -0.046076 0.000000 -0.020389 0.193438 -0.019948 0.006321 0.000521 0.011379 -0.019948 0.193438 -0.487306 -0.112408 -0.485667 0.205151 -0.540145 0.020600 -0.485832 0.020600 0.485832 -0.124062 0.539774 -0.055113 0.486203 -0.055113 0.486203 0.020688 0.539939 0.205239 0.486038 0.205239 -0.539939 -0.054877 -0.485667 -0.123827 -0.486038 -0.054877 -0.540310 0.205151 0.540145 -0.124062 0.539774 0.020688 -0.540310 -0.123827 -0.538537 0.207253 -0.593015 0.022703 -0.538702 0.022703 0.538702 -0.136724 0.592644 -0.067774 0.539073 -0.067774 0.539073 0.022791 0.592809 0.207341 0.538908 0.207341 -0.592809 -0.067539 -0.538537 -0.136488 -0.538908 -0.067539 -0.593180 0.207253 0.593015 -0.136724 0.592644 0.022791 -0.593180 -0.136488 -0.591260 0.209562 -0.643258 0.025011 -0.591425 0.025011 0.591425 -0.150624 0.645532 -0.081675 0.591796 -0.081675 0.591796 0.025099 0.645532 0.209650 0.591631 0.209650 -0.645532 -0.081439 -0.591260 -0.150389 -0.591631 -0.081439 -0.641439 0.209562 0.643258 -0.150624 0.645532 0.025099 -0.641439 -0.150389 0.066626 0.182059 0.020389 0.006321 0.046076 0.000000 0.645532 -0.112319 0.077842 0.006321 0.077842 0.193438 0.057373 0.011379 0.020389 0.193438 + + + + + + + + + + + + + + +

0 0 0 1 1 1 2 0 2 1 1 1 0 0 0 3 1 3 1 2 4 4 3 5 2 3 6 2 0 7 5 4 8 0 0 9 6 5 10 3 6 11 0 5 12 3 1 13 7 7 14 1 1 15 4 3 5 1 2 4 8 2 16 9 8 17 2 3 18 4 3 19 5 4 8 2 0 7 10 4 20 11 9 21 0 5 22 5 9 23 3 6 11 6 5 10 12 6 24 0 5 22 11 9 21 6 5 25 7 7 14 3 1 13 13 7 26 7 10 27 8 2 28 1 2 29 12 11 30 4 12 31 8 11 32 2 3 18 9 8 17 10 8 33 6 12 34 9 13 35 4 12 36 10 4 37 14 14 38 5 4 39 5 9 40 15 15 41 11 9 42 4 12 31 12 11 30 6 12 43 12 6 44 13 16 45 3 6 46 9 13 35 6 12 34 11 13 47 13 7 48 16 17 49 7 7 50 8 2 28 7 10 27 17 10 51 8 11 52 18 18 53 12 11 54 19 19 55 10 8 56 9 8 57 14 14 38 10 4 37 20 14 58 15 15 41 5 9 40 14 15 59 19 20 60 11 13 61 15 20 62 13 16 45 12 6 44 18 16 63 11 13 61 19 20 60 9 13 64 16 17 49 13 7 48 21 17 65 22 21 66 7 10 67 16 21 68 7 10 67 22 21 66 17 10 69 18 18 53 8 11 52 17 18 70 10 8 56 19 19 55 20 19 71 20 14 72 23 22 73 14 14 74 14 15 75 24 23 76 15 15 77 15 20 78 25 24 79 19 20 80 26 25 81 13 16 82 18 16 83 13 16 82 26 25 81 21 25 84 21 17 85 27 26 86 16 17 87 16 21 88 28 27 89 22 21 90 26 28 91 17 18 92 22 28 93 17 18 92 26 28 91 18 18 94 25 29 95 20 19 96 19 19 97 23 22 73 20 14 72 29 22 98 24 23 76 14 15 75 23 23 99 25 24 79 15 20 78 24 24 100 30 30 101 21 25 102 26 25 103 27 26 86 21 17 85 31 26 104 28 27 89 16 21 88 27 27 105 30 31 106 22 28 107 28 31 108 22 28 107 30 31 106 26 28 109 20 19 96 25 29 95 29 29 110 29 22 111 32 32 112 23 22 113 32 33 114 24 23 115 23 23 116 24 24 117 33 34 118 25 24 119 21 25 102 30 30 101 31 30 120 31 26 121 34 35 122 27 26 123 27 27 124 35 36 125 28 27 126 28 31 127 36 37 128 30 31 129 33 38 130 29 29 131 25 29 132 32 32 112 29 22 111 37 32 133 24 23 115 32 33 114 38 33 134 33 34 118 24 24 117 38 34 135 36 39 136 31 30 137 30 30 138 34 35 122 31 26 121 39 35 139 35 36 125 27 27 124 34 36 140 36 37 128 28 31 127 35 37 141 40 38 142 29 29 131 33 38 130 29 29 131 40 38 142 37 38 143 40 40 144 32 40 145 37 40 146 32 40 145 40 40 144 38 40 147 40 41 148 33 41 149 38 41 150 31 30 137 36 39 136 39 39 151 39 35 152 41 42 153 34 35 154 34 36 155 42 43 156 35 36 157 35 37 158 43 44 159 36 37 160 43 45 161 39 39 162 36 39 163 41 42 153 39 35 152 44 42 164 42 43 156 34 36 155 41 43 165 43 44 159 35 37 158 42 44 166 39 39 162 43 45 161 44 45 167 44 42 168 45 46 169 41 42 170 41 43 171 46 47 172 42 43 173 42 44 174 47 48 175 43 44 176 47 49 177 44 45 178 43 45 179 45 46 169 44 42 168 48 46 180 46 47 172 41 43 171 45 47 181 47 48 175 42 44 174 46 48 182 44 45 178 47 49 177 48 49 183 48 46 184 49 50 185 45 46 186 45 47 187 50 51 188 46 47 189 46 48 190 51 52 191 47 48 192 51 53 193 48 49 194 47 49 195 49 50 185 48 46 184 52 50 196 50 51 188 45 47 187 49 51 197 51 52 191 46 48 190 50 52 198 48 49 194 51 53 193 52 53 199 52 54 200 53 54 201 49 54 202 50 51 188 49 51 197 53 51 203 53 55 204 51 55 205 50 55 206 53 54 201 52 54 200 51 54 207

+
+
+
+
+ + + + + + 40.000000 + 30.000000 + 1.000000 + 1000.000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.768539 -0.273151 0.578564 47.734226 + 0.639803 0.328112 -0.694978 -48.167746 + -0.000000 0.904285 0.426929 52.003292 + 0.000000 0.000000 0.000000 1.000000 + + + + + + + + +
diff --git a/gazebo_ros_pkgs/gazebo_plugins/Media/models/chair/models/Chair.stl b/gazebo_ros_pkgs/gazebo_plugins/Media/models/chair/models/Chair.stl new file mode 100755 index 0000000000000000000000000000000000000000..1db2443c45261e330ad4c2ab597e380dc413f217 GIT binary patch literal 40584 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 <../images/texture0.jpg> +<../images/texture1.jpg> <../images/texture1.jpg> diff --git a/gazebo_ros_pkgs/gazebo_plugins/cfg/CameraSynchronizer.cfg b/gazebo_ros_pkgs/gazebo_plugins/cfg/CameraSynchronizer.cfg new file mode 100755 index 0000000..da4fae6 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/cfg/CameraSynchronizer.cfg @@ -0,0 +1,92 @@ +#! /usr/bin/env python +#* +#* Copyright (c) 2009, Willow Garage, Inc. +#* All rights reserved. +#* +#* Redistribution and use in source and binary forms, with or without +#* modification, are permitted provided that the following conditions +#* are met: +#* +#* * Redistributions of source code must retain the above copyright +#* notice, this list of conditions and the following disclaimer. +#* * Redistributions in binary form must reproduce the above +#* copyright notice, this list of conditions and the following +#* disclaimer in the documentation and/or other materials provided +#* with the distribution. +#* * Neither the name of the Willow Garage nor the names of its +#* contributors may be used to endorse or promote products derived +#* from this software without specific prior written permission. +#* +#* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +#* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +#* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +#* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +#* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +#* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +#* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +#* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +#* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +#* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +#* POSSIBILITY OF SUCH DAMAGE. +#*********************************************************** + +# Author: Blaise Gassend + +# WGE100 camera configuration + +PACKAGE='gazebo_plugins' +#import roslib; roslib.load_manifest(PACKAGE) + +#from dynamic_reconfigure.parameter_generator import * +#from gazebo_plugins.levels import * # Get the levels +from dynamic_reconfigure.parameter_generator_catkin import * + +#copy from levels.py. Leaving levels.py in gazebo_plugins/src results in compile error. +lvl_narrow = 1 +lvl_wide = 2 +lvl_forearm_r = 4 +lvl_forearm_l = 8 +lvl_projector = 16 +lvl_stereo = lvl_wide | lvl_narrow +lvl_all = lvl_stereo | lvl_forearm_r | lvl_forearm_l | lvl_projector + +gen = ParameterGenerator() + +p_off = gen.const("ProjectorOff", int_t, 1, "The projector is always off.") +p_auto = gen.const("ProjectorAuto", int_t, 2, "The projector is on if one of the cameras is using it.") +p_on = gen.const("ProjectorOn", int_t, 3, "The projector is always on.") +projector_mode_enum = gen.enum([ p_off, p_auto, p_on ], "The projectors operating mode.") + +t_int = gen.const("InternalTrigger", int_t, 1, "The camera does not use the trigger input.") +t_ign = gen.const("IgnoreProjector", int_t, 2, "The cameras frequency can be set independently of the projector frequency. There is no deterministic phase relation between projector firing and camera triggering.") +t_proj = gen.const("WithProjector", int_t, 3, "The camera always exposes while the projector is on.") +t_noproj = gen.const("WithoutProjector", int_t, 4, "The camera always exposes while the projector is off.") +t_alt = gen.const("AlternateProjector", int_t, 5, "The camera alternates between frames with and without the projector.") +wide_trig_mode_enum = gen.enum([ t_ign, t_proj, t_noproj ], "The triggering mode for the wide camera.") +narrow_trig_mode_enum = gen.enum([ t_ign, t_proj, t_noproj, t_alt ], "The triggering mode for the narrow camera.") +forearm_trig_mode_enum = gen.enum([ t_int, t_ign, t_proj, t_noproj ], "The triggering mode for a forearm camera.") + +# Name Type Reconf level Description Default Min Max +gen.add("projector_rate", double_t, lvl_all, "Projector pulse frequency in Hz.", 60.0, 40.0, 120.0) +gen.add("projector_pulse_length", double_t, lvl_all, "Length of the projector pulses in s. At high currents the hardware may limit the pulse length.", 0.002, 0.001,0.002) +gen.add("projector_pulse_shift", double_t, lvl_all, "How far off-center the intermediate projector pulses are. Zero is on-center, one is touching the following pulse.", 0.0, 0.0, 1.0) +gen.add("projector_mode", int_t, lvl_all, "Indicates whether the projector should be off, on when in use or on all the time.", 2, 1, 3, edit_method = projector_mode_enum) +gen.add("prosilica_projector_inhibit", bool_t, lvl_projector, "Indicates if the projector should turn off when the prosilica camera is exposing.", False) + +gen.add("stereo_rate", double_t, lvl_stereo, "Indicates the frame rate for both stereo cameras in Hz. (Gets rounded to suitable divisors of projector_rate.)", 30.0, 1.0, 60.0) + +gen.add("wide_stereo_trig_mode", int_t, lvl_stereo, "Indicates the triggering mode of the wide stereo camera.", 4, 2, 4, edit_method = wide_trig_mode_enum) +gen.add("narrow_stereo_trig_mode", int_t, lvl_stereo, "Indicates the triggering mode of the narrow stereo camera.", 4, 2, 5, edit_method = narrow_trig_mode_enum) + +gen.add("forearm_r_rate", double_t, lvl_forearm_r, "Indicates the frame rate for the right forearm camera in Hz. (Gets rounded to suitable divisors of projector_rate.)", 30.0, 1.0, 60.0) +gen.add("forearm_r_trig_mode", int_t, lvl_forearm_r, "Indicates the triggering mode of the right forearm camera.", 1, 1, 4, edit_method = forearm_trig_mode_enum) + +gen.add("forearm_l_rate", double_t, lvl_forearm_l, "Indicates the frame rate for the left forearm camera in Hz. (Gets rounded to suitable divisors of projector_rate.)", 30.0, 1.0, 60.0) +gen.add("forearm_l_trig_mode", int_t, lvl_forearm_l, "Indicates the triggering mode of the left forearm camera.", 1, 1, 4, edit_method = forearm_trig_mode_enum) + +gen.add("projector_tweak", double_t, lvl_all, "Adds a time shift in seconds to the projector timing. Useful for debugging but not in normal use.", 0, -0.1, 0.1) + +gen.add("camera_reset", bool_t, lvl_all, "Does a hard reset of all the cameras using a long pulse on the trigger line. This parameter resets itself to false after 3 to 4 seconds.", False) + +exit(gen.generate(PACKAGE, "camera_synchronizer", "CameraSynchronizer")) diff --git a/gazebo_ros_pkgs/gazebo_plugins/cfg/GazeboRosCamera.cfg b/gazebo_ros_pkgs/gazebo_plugins/cfg/GazeboRosCamera.cfg new file mode 100755 index 0000000..49ef799 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/cfg/GazeboRosCamera.cfg @@ -0,0 +1,13 @@ +#!/usr/bin/env python + +PKG = 'gazebo_plugins' +#import roslib; roslib.load_manifest(PKG) + +from dynamic_reconfigure.msg import SensorLevels +#from dynamic_reconfigure.parameter_generator import * +from dynamic_reconfigure.parameter_generator_catkin import * +gen = ParameterGenerator() +gen.add("imager_rate", double_t, SensorLevels.RECONFIGURE_CLOSE, \ + "Sets the frame rate of the imager. In externally triggered mode this must be more than trig_rate", 2, 1, 50) + +exit(gen.generate(PKG, "gazebo_ros_camera", "GazeboRosCamera")) diff --git a/gazebo_ros_pkgs/gazebo_plugins/cfg/GazeboRosOpenniKinect.cfg b/gazebo_ros_pkgs/gazebo_plugins/cfg/GazeboRosOpenniKinect.cfg new file mode 100755 index 0000000..3555ae9 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/cfg/GazeboRosOpenniKinect.cfg @@ -0,0 +1,13 @@ +#!/usr/bin/env python + +PKG = 'gazebo_plugins' +#import roslib; roslib.load_manifest(PKG) + +from dynamic_reconfigure.msg import SensorLevels +#from dynamic_reconfigure.parameter_generator import * +from dynamic_reconfigure.parameter_generator_catkin import * +gen = ParameterGenerator() +gen.add("imager_rate", double_t, SensorLevels.RECONFIGURE_CLOSE, \ + "Sets the frame rate of the imager. In externally triggered mode this must be more than trig_rate", 2, 1, 50) + +exit(gen.generate(PKG, "gazebo_ros_openni_kinect", "GazeboRosOpenniKinect")) diff --git a/gazebo_ros_pkgs/gazebo_plugins/cfg/Hokuyo.cfg b/gazebo_ros_pkgs/gazebo_plugins/cfg/Hokuyo.cfg new file mode 100755 index 0000000..07375d0 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/cfg/Hokuyo.cfg @@ -0,0 +1,58 @@ +#! /usr/bin/env python +#* All rights reserved. +#* +#* Redistribution and use in source and binary forms, with or without +#* modification, are permitted provided that the following conditions +#* are met: +#* +#* * Redistributions of source code must retain the above copyright +#* notice, this list of conditions and the following disclaimer. +#* * Redistributions in binary form must reproduce the above +#* copyright notice, this list of conditions and the following +#* disclaimer in the documentation and/or other materials provided +#* with the distribution. +#* * Neither the name of the Willow Garage nor the names of its +#* contributors may be used to endorse or promote products derived +#* from this software without specific prior written permission. +#* +#* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +#* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +#* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +#* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +#* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +#* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +#* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +#* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +#* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +#* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +#* POSSIBILITY OF SUCH DAMAGE. +#*********************************************************** + +# Author: Blaise Gassend + +# Forearm camera configuration + +PACKAGE='gazebo_plugins' +#import roslib; roslib.load_manifest(PACKAGE) + +from math import pi + +from dynamic_reconfigure.msg import SensorLevels +#from dynamic_reconfigure.parameter_generator import * +from dynamic_reconfigure.parameter_generator_catkin import * + +gen = ParameterGenerator() +# Name Type Reconfiguration level Description Default Min Max +gen.add("min_ang", double_t, SensorLevels.RECONFIGURE_STOP, "The angle of the first range measurement. The unit depends on ~ang_radians.", -pi/2, -pi, pi) +gen.add("max_ang", double_t, SensorLevels.RECONFIGURE_STOP, "The angle of the first range measurement. The unit depends on ~ang_radians.", pi/2, -pi, pi) +gen.add("intensity", bool_t, SensorLevels.RECONFIGURE_STOP, "Whether or not the hokuyo returns intensity values.", False) +gen.add("cluster", int_t, SensorLevels.RECONFIGURE_STOP, "The number of adjacent range measurements to cluster into a single reading", 1, 0, 99) +gen.add("skip", int_t, SensorLevels.RECONFIGURE_STOP, "The number of scans to skip between each measured scan", 0, 0, 9) +gen.add("port", str_t, SensorLevels.RECONFIGURE_CLOSE, "The serial port where the hokuyo device can be found", "/dev/ttyACM0") +gen.add("calibrate_time", bool_t, SensorLevels.RECONFIGURE_CLOSE, "Whether the node should calibrate the hokuyo's time offset", True) +gen.add("frame_id", str_t, SensorLevels.RECONFIGURE_RUNNING, "The frame in which laser scans will be returned", "laser") +gen.add("time_offset", double_t, SensorLevels.RECONFIGURE_RUNNING, "An offet to add to the timestamp before publication of a scan", 0, -0.25, 0.25) +gen.add("allow_unsafe_settings",bool_t, SensorLevels.RECONFIGURE_CLOSE, "Turn this on if you wish to use the UTM-30LX with an unsafe angular range. Turning this option on may cause occasional crashes or bad data. This option is a tempory workaround that will hopefully be removed in an upcoming driver version.", False) + +exit(gen.generate(PACKAGE, "hokuyo_node", "Hokuyo")) diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/MultiCameraPlugin.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/MultiCameraPlugin.h new file mode 100755 index 0000000..b3092d0 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/MultiCameraPlugin.h @@ -0,0 +1,56 @@ +/* + * Copyright 2012 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +#ifndef _GAZEBO_MULTI_CAMERA_PLUGIN_HH_ +#define _GAZEBO_MULTI_CAMERA_PLUGIN_HH_ + +#include +#include + +#include +#include +#include +#include + +namespace gazebo +{ + class MultiCameraPlugin : public SensorPlugin + { + public: MultiCameraPlugin(); + + /// \brief Destructor + public: virtual ~MultiCameraPlugin(); + + public: virtual void Load(sensors::SensorPtr _sensor, sdf::ElementPtr _sdf); + + public: virtual void OnNewFrameLeft(const unsigned char *_image, + unsigned int _width, unsigned int _height, + unsigned int _depth, const std::string &_format); + public: virtual void OnNewFrameRight(const unsigned char *_image, + unsigned int _width, unsigned int _height, + unsigned int _depth, const std::string &_format); + + protected: sensors::MultiCameraSensorPtr parentSensor; + + protected: std::vector width, height, depth; + protected: std::vector format; + + protected: std::vector camera; + + private: std::vector newFrameConnection; + }; +} +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/PubQueue.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/PubQueue.h new file mode 100755 index 0000000..1f8f3b2 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/PubQueue.h @@ -0,0 +1,195 @@ +/* + * Copyright 2012 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef ROS_PUBQUEUE_H +#define ROS_PUBQUEUE_H + +#include +#include +#include +#include +#include + +#include + + +/// \brief Container for a (ROS publisher, outgoing message) pair. +/// We'll have queues of these. Templated on a ROS message type. +template +class PubMessagePair +{ + public: + /// \brief The outgoing message. + T msg_; + /// \brief The publisher to use to publish the message. + ros::Publisher pub_; + PubMessagePair(T& msg, ros::Publisher& pub) : + msg_(msg), pub_(pub) {} +}; + +/// \brief A queue of outgoing messages. Instead of calling publish() directly, +/// you can push() messages here to defer ROS serialization and locking. +/// Templated on a ROS message type. +template +class PubQueue +{ + public: + typedef boost::shared_ptr > > > QueuePtr; + typedef boost::shared_ptr > Ptr; + + private: + /// \brief Our queue of outgoing messages. + QueuePtr queue_; + /// \brief Mutex to control access to the queue. + boost::shared_ptr queue_lock_; + /// \brief Function that will be called when a new message is pushed on. + boost::function notify_func_; + + public: + PubQueue(QueuePtr queue, + boost::shared_ptr queue_lock, + boost::function notify_func) : + queue_(queue), queue_lock_(queue_lock), notify_func_(notify_func) {} + ~PubQueue() {} + + /// \brief Push a new message onto the queue. + /// \param[in] msg The outgoing message + /// \param[in] pub The ROS publisher to use to publish the message + void push(T& msg, ros::Publisher& pub) + { + boost::shared_ptr > el(new PubMessagePair(msg, pub)); + boost::mutex::scoped_lock lock(*queue_lock_); + queue_->push_back(el); + notify_func_(); + } + + /// \brief Pop all waiting messages off the queue. + /// \param[out] els Place to store the popped messages + void pop(std::vector > >& els) + { + boost::mutex::scoped_lock lock(*queue_lock_); + while(!queue_->empty()) + { + els.push_back(queue_->front()); + queue_->pop_front(); + } + } +}; + +/// \brief A collection of PubQueue objects, potentially of different types. +/// This class is the programmer's interface to this queuing system. +class PubMultiQueue +{ + private: + /// \brief List of functions to be called to service our queues. + std::list > service_funcs_; + /// \brief Mutex to lock access to service_funcs_ + boost::mutex service_funcs_lock_; + /// \brief If started, the thread that will call the service functions + boost::thread service_thread_; + /// \brief Boolean flag to shutdown the service thread if PubMultiQueue is destructed + bool service_thread_running_; + /// \brief Condition variable used to block and resume service_thread_ + boost::condition_variable service_cond_var_; + /// \brief Mutex to accompany service_cond_var_ + boost::mutex service_cond_var_lock_; + + /// \brief Service a given queue by popping outgoing message off it and + /// publishing them. + template + void serviceFunc(boost::shared_ptr > pq) + { + std::vector > > els; + pq->pop(els); + for(typename std::vector > >::iterator it = els.begin(); + it != els.end(); + ++it) + { + (*it)->pub_.publish((*it)->msg_); + } + } + + public: + PubMultiQueue() {} + ~PubMultiQueue() + { + if(service_thread_.joinable()) + { + service_thread_running_ = false; + notifyServiceThread(); + service_thread_.join(); + } + } + + /// \brief Add a new queue. Call this once for each published topic (or at + /// least each type of publish message). + /// \return Pointer to the newly created queue, good for calling push() on. + template + boost::shared_ptr > addPub() + { + typename PubQueue::QueuePtr queue(new std::deque > >); + boost::shared_ptr queue_lock(new boost::mutex); + boost::shared_ptr > pq(new PubQueue(queue, queue_lock, boost::bind(&PubMultiQueue::notifyServiceThread, this))); + boost::function f = boost::bind(&PubMultiQueue::serviceFunc, this, pq); + { + boost::mutex::scoped_lock lock(service_funcs_lock_); + service_funcs_.push_back(f); + } + return pq; + } + + /// \brief Service each queue one time. + void spinOnce() + { + boost::mutex::scoped_lock lock(service_funcs_lock_); + for(std::list >::iterator it = service_funcs_.begin(); + it != service_funcs_.end(); + ++it) + { + (*it)(); + } + } + + /// \brief Service all queues indefinitely, waiting on a condition variable + /// in between cycles. + void spin() + { + while(ros::ok() && service_thread_running_) + { + boost::unique_lock lock(service_cond_var_lock_); + service_cond_var_.wait(lock); + spinOnce(); + } + } + + /// \brief Start a thread to call spin(). + void startServiceThread() + { + service_thread_running_ = true; + service_thread_ = boost::thread(boost::bind(&PubMultiQueue::spin, this)); + } + + /// \brief Wake up the queue serive thread (e.g., after having pushed a + /// message onto one of the queues). + void notifyServiceThread() + { + service_cond_var_.notify_one(); + } +}; + +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_block_laser.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_block_laser.h new file mode 100755 index 0000000..e46cb2e --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_block_laser.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2012-2014 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + * Desc: ros laser controller. + * Author: Nathan Koenig + * Date: 01 Feb 2007 + */ + +#ifndef GAZEBO_ROS_BLOCK_LASER_HH +#define GAZEBO_ROS_BLOCK_LASER_HH + +// Custom Callback Queue +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +namespace gazebo +{ + + class GazeboRosBlockLaser : public RayPlugin + { + /// \brief Constructor + /// \param parent The parent entity, must be a Model or a Sensor + public: GazeboRosBlockLaser(); + + /// \brief Destructor + public: ~GazeboRosBlockLaser(); + + /// \brief Load the plugin + /// \param take in SDF root element + public: void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf); + + /// \brief Update the controller + protected: virtual void OnNewLaserScans(); + + /// \brief Put laser data to the ROS topic + private: void PutLaserData(common::Time &_updateTime); + + private: common::Time last_update_time_; + + /// \brief Keep track of number of connctions + private: int laser_connect_count_; + private: void LaserConnect(); + private: void LaserDisconnect(); + + // Pointer to the model + private: physics::WorldPtr world_; + /// \brief The parent sensor + private: sensors::SensorPtr parent_sensor_; + private: sensors::RaySensorPtr parent_ray_sensor_; + + /// \brief pointer to ros node + private: ros::NodeHandle* rosnode_; + private: ros::Publisher pub_; + + /// \brief ros message + private: sensor_msgs::PointCloud cloud_msg_; + + /// \brief topic name + private: std::string topic_name_; + + /// \brief frame transform name, should match link name + private: std::string frame_name_; + + /// \brief Gaussian noise + private: double gaussian_noise_; + + /// \brief Gaussian noise generator + private: double GaussianKernel(double mu,double sigma); + + /// \brief A mutex to lock access to fields that are used in message callbacks + private: boost::mutex lock; + + /// \brief hack to mimic hokuyo intensity cutoff of 100 + //private: ParamT *hokuyoMinIntensityP; + private: double hokuyo_min_intensity_; + + /// update rate of this sensor + private: double update_rate_; + + /// \brief for setting ROS name space + private: std::string robot_namespace_; + + // Custom Callback Queue + private: ros::CallbackQueue laser_queue_; + private: void LaserQueueThread(); + private: boost::thread callback_laser_queue_thread_; + + // subscribe to world stats + private: transport::NodePtr node_; + private: common::Time sim_time_; + public: void OnStats( const boost::shared_ptr &_msg); + + }; + +} + +#endif + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_bumper.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_bumper.h new file mode 100755 index 0000000..35a2b26 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_bumper.h @@ -0,0 +1,93 @@ +/* + * Copyright 2012 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#ifndef GAZEBO_ROS_BUMPER_HH +#define GAZEBO_ROS_BUMPER_HH + +#include + +#include +#include +#include + +#include + +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace gazebo +{ + /// \brief A Bumper controller + class GazeboRosBumper : public SensorPlugin + { + /// Constructor + public: GazeboRosBumper(); + + /// Destructor + public: ~GazeboRosBumper(); + + /// \brief Load the plugin + /// \param take in SDF root element + public: void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf); + + /// Update the controller + private: void OnContact(); + + /// \brief pointer to ros node + private: ros::NodeHandle* rosnode_; + private: ros::Publisher contact_pub_; + + private: sensors::ContactSensorPtr parentSensor; + + /// \brief set topic name of broadcast + private: std::string bumper_topic_name_; + + private: std::string frame_name_; + + /// \brief broadcast some string for now. + private: gazebo_msgs::ContactsState contact_state_msg_; + + /// \brief for setting ROS name space + private: std::string robot_namespace_; + + private: ros::CallbackQueue contact_queue_; + private: void ContactQueueThread(); + private: boost::thread callback_queue_thread_; + + // Pointer to the update event connection + private: event::ConnectionPtr update_connection_; + }; +} + +#endif + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_camera.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_camera.h new file mode 100755 index 0000000..33f41b8 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_camera.h @@ -0,0 +1,54 @@ +/* + * Copyright 2012 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + * Desc: A dynamic controller plugin that publishes ROS image_raw + * camera_info topic for generic camera sensor. +*/ + +#ifndef GAZEBO_ROS_CAMERA_HH +#define GAZEBO_ROS_CAMERA_HH + +#include + +// library for processing camera data for gazebo / ros conversions +#include + +#include + +namespace gazebo +{ + class GazeboRosCamera : public CameraPlugin, GazeboRosCameraUtils + { + /// \brief Constructor + /// \param parent The parent entity, must be a Model or a Sensor + public: GazeboRosCamera(); + + /// \brief Destructor + public: ~GazeboRosCamera(); + + /// \brief Load the plugin + /// \param take in SDF root element + public: void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf); + + /// \brief Update the controller + protected: virtual void OnNewFrame(const unsigned char *_image, + unsigned int _width, unsigned int _height, + unsigned int _depth, const std::string &_format); + }; +} +#endif + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_camera_utils.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_camera_utils.h new file mode 100755 index 0000000..2125f40 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_camera_utils.h @@ -0,0 +1,230 @@ +/* + * Copyright 2012 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#ifndef GAZEBO_ROS_CAMERA_UTILS_HH +#define GAZEBO_ROS_CAMERA_UTILS_HH + +#include +// boost stuff +#include +#include + +// ros stuff +#include +#include +#include + +// ros messages stuff +#include +#include +#include +#include +#include +#include +#include + +// dynamic reconfigure stuff +#include +#include + +// Gazebo +#include +#include +#include +#include +#include +#include +#include + +namespace gazebo +{ + class GazeboRosMultiCamera; + class GazeboRosTriggeredMultiCamera; + class GazeboRosCameraUtils + { + /// \brief Constructor + /// \param parent The parent entity, must be a Model or a Sensor + public: GazeboRosCameraUtils(); + + /// \brief Destructor + public: ~GazeboRosCameraUtils(); + + /// \brief Load the plugin. + /// \param[in] _parent Take in SDF root element. + /// \param[in] _sdf SDF values. + /// \param[in] _camera_name_suffix required before calling LoadThread + public: void Load(sensors::SensorPtr _parent, + sdf::ElementPtr _sdf, + const std::string &_camera_name_suffix = ""); + + /// \brief Load the plugin. + /// \param[in] _parent Take in SDF root element. + /// \param[in] _sdf SDF values. + /// \param[in] _camera_name_suffix Suffix of the camera name. + /// \param[in] _hack_baseline Multiple camera baseline. + public: void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf, + const std::string &_camera_name_suffix, + double _hack_baseline); + + public: event::ConnectionPtr OnLoad(const boost::function&); + + private: void Init(); + + /// \brief Put camera data to the ROS topic + protected: void PutCameraData(const unsigned char *_src); + protected: void PutCameraData(const unsigned char *_src, + common::Time &last_update_time); + + /// \brief Keep track of number of image connections + protected: boost::shared_ptr image_connect_count_; + /// \brief A mutex to lock access to image_connect_count_ + protected: boost::shared_ptr image_connect_count_lock_; + protected: void ImageConnect(); + protected: void ImageDisconnect(); + + /// \brief Keep track when we activate this camera through ros + /// subscription, was it already active? resume state when + /// unsubscribed. + protected: boost::shared_ptr was_active_; + + /// \brief: Camera modification functions + private: void SetHFOV(const std_msgs::Float64::ConstPtr& hfov); + private: void SetUpdateRate(const std_msgs::Float64::ConstPtr& update_rate); + + /// \brief A pointer to the ROS node. + /// A node will be instantiated if it does not exist. + protected: ros::NodeHandle* rosnode_; + protected: image_transport::Publisher image_pub_; + private: image_transport::ImageTransport* itnode_; + + /// \brief ROS image message + protected: sensor_msgs::Image image_msg_; + + /// \brief for setting ROS name space + private: std::string robot_namespace_; + + /// \brief ROS camera name + private: std::string camera_name_; + + /// \brief tf prefix + private: std::string tf_prefix_; + + /// \brief ROS image topic name + protected: std::string image_topic_name_; + + /// \brief Publish CameraInfo to the ROS topic + protected: void PublishCameraInfo(ros::Publisher camera_info_publisher); + protected: void PublishCameraInfo(common::Time &last_update_time); + protected: void PublishCameraInfo(); + /// \brief Keep track of number of connctions for CameraInfo + private: void InfoConnect(); + private: void InfoDisconnect(); + /// \brief camera info + protected: ros::Publisher camera_info_pub_; + protected: std::string camera_info_topic_name_; + protected: common::Time last_info_update_time_; + + /// \brief ROS frame transform name to use in the image message header. + /// This should typically match the link name the sensor is attached. + protected: std::string frame_name_; + /// update rate of this sensor + protected: double update_rate_; + protected: double update_period_; + protected: common::Time last_update_time_; + + protected: double cx_prime_; + protected: double cx_; + protected: double cy_; + protected: double focal_length_; + protected: double hack_baseline_; + protected: double distortion_k1_; + protected: double distortion_k2_; + protected: double distortion_k3_; + protected: double distortion_t1_; + protected: double distortion_t2_; + + protected: bool border_crop_; + + protected: boost::shared_ptr camera_info_manager_; + + + /// \brief A mutex to lock access to fields + /// that are used in ROS message callbacks + protected: boost::mutex lock_; + + /// \brief size of image buffer + protected: std::string type_; + protected: int skip_; + + private: ros::Subscriber cameraHFOVSubscriber_; + private: ros::Subscriber cameraUpdateRateSubscriber_; + + // Time last published, refrain from publish unless new image has + // been rendered + // Allow dynamic reconfiguration of camera params + dynamic_reconfigure::Server + *dyn_srv_; + void configCallback(gazebo_plugins::GazeboRosCameraConfig &config, + uint32_t level); + + protected: ros::CallbackQueue camera_queue_; + protected: void CameraQueueThread(); + protected: boost::thread callback_queue_thread_; + + + // copied from CameraPlugin + protected: unsigned int width_, height_, depth_; + protected: std::string format_; + + protected: sensors::SensorPtr parentSensor_; + protected: rendering::CameraPtr camera_; + + // Pointer to the world + protected: physics::WorldPtr world_; + + private: event::ConnectionPtr newFrameConnection_; + + protected: common::Time sensor_update_time_; + + // maintain for one more release for backwards compatibility + protected: physics::WorldPtr world; + + // deferred load in case ros is blocking + private: sdf::ElementPtr sdf; + private: void LoadThread(); + private: boost::thread deferred_load_thread_; + private: event::EventT load_event_; + + // make a trigger function that the child classes can override + // and a function that returns bool to indicate whether the trigger + // should be used + protected: virtual void TriggerCamera(); + protected: virtual bool CanTriggerCamera(); + private: void TriggerCameraInternal(const std_msgs::Empty::ConstPtr &dummy); + private: ros::Subscriber trigger_subscriber_; + + /// \brief ROS trigger topic name + protected: std::string trigger_topic_name_; + + /// \brief True if camera util is initialized + protected: bool initialized_; + + friend class GazeboRosMultiCamera; + friend class GazeboRosTriggeredMultiCamera; + }; +} +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_depth_camera.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_depth_camera.h new file mode 100755 index 0000000..28c2ad8 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_depth_camera.h @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2012-2014 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + * Desc: A dynamic controller plugin that publishes ROS image_raw camera_info topic for generic camera sensor. + * Author: John Hsu + * Date: 24 Sept 2008 + */ + +#ifndef GAZEBO_ROS_DEPTH_CAMERA_HH +#define GAZEBO_ROS_DEPTH_CAMERA_HH + +// ros stuff +#include +#include +#include + +// ros messages stuff +#include +#include +#include +#include +#include +#include + +// gazebo stuff +#include +#include +#include +#include +#include +#include +#include + +// dynamic reconfigure stuff +#include +#include + +// boost stuff +#include + +// camera stuff +#include + +namespace gazebo +{ + class GazeboRosDepthCamera : public DepthCameraPlugin, GazeboRosCameraUtils + { + /// \brief Constructor + /// \param parent The parent entity, must be a Model or a Sensor + public: GazeboRosDepthCamera(); + + /// \brief Destructor + public: ~GazeboRosDepthCamera(); + + /// \brief Load the plugin + /// \param take in SDF root element + public: virtual void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf); + + /// \brief Advertise point cloud and depth image + public: virtual void Advertise(); + + /// \brief Update the controller + protected: virtual void OnNewDepthFrame(const float *_image, + unsigned int _width, unsigned int _height, + unsigned int _depth, const std::string &_format); + + /// \brief Update the controller + protected: virtual void OnNewRGBPointCloud(const float *_pcd, + unsigned int _width, unsigned int _height, + unsigned int _depth, const std::string &_format); + + /// \brief Update the controller + protected: virtual void OnNewImageFrame(const unsigned char *_image, + unsigned int _width, unsigned int _height, + unsigned int _depth, const std::string &_format); + + /// \brief Put camera data to the ROS topic + private: void FillPointdCloud(const float *_src); + + /// \brief push depth image data into ros topic + private: void FillDepthImage(const float *_src); + + /// \brief Keep track of number of connctions for point clouds + private: int point_cloud_connect_count_; + private: void PointCloudConnect(); + private: void PointCloudDisconnect(); + + /// \brief Keep track of number of connctions for point clouds + private: int depth_image_connect_count_; + private: void DepthImageConnect(); + private: void DepthImageDisconnect(); + private: common::Time last_depth_image_camera_info_update_time_; + + private: bool FillPointCloudHelper(sensor_msgs::PointCloud2 &point_cloud_msg, + uint32_t rows_arg, uint32_t cols_arg, + uint32_t step_arg, void* data_arg); + + private: bool FillDepthImageHelper( sensor_msgs::Image& image_msg, + uint32_t rows_arg, uint32_t cols_arg, + uint32_t step_arg, void* data_arg); + + /// \brief A pointer to the ROS node. A node will be instantiated if it does not exist. + private: ros::Publisher point_cloud_pub_; + private: ros::Publisher depth_image_pub_; + + /// \brief PointCloud2 point cloud message + private: sensor_msgs::PointCloud2 point_cloud_msg_; + private: sensor_msgs::Image depth_image_msg_; + + private: double point_cloud_cutoff_; + + /// \brief ROS image topic name + private: std::string point_cloud_topic_name_; + + private: void InfoConnect(); + private: void InfoDisconnect(); + + using GazeboRosCameraUtils::PublishCameraInfo; + protected: virtual void PublishCameraInfo(); + + /// \brief image where each pixel contains the depth information + private: std::string depth_image_topic_name_; + private: std::string depth_image_camera_info_topic_name_; + private: int depth_info_connect_count_; + private: void DepthInfoConnect(); + private: void DepthInfoDisconnect(); + + // overload with our own + private: common::Time depth_sensor_update_time_; + protected: ros::Publisher depth_image_camera_info_pub_; + + private: event::ConnectionPtr load_connection_; + }; + +} +#endif + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_diff_drive.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_diff_drive.h new file mode 100755 index 0000000..8615f31 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_diff_drive.h @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2010, Daniel Hewlett, Antons Rebguns + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY Antons Rebguns ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Antons Rebguns BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **/ + +/* + * \file gazebo_ros_diff_drive.h + * + * \brief A differential drive plugin for gazebo. Based on the diffdrive plugin + * developed for the erratic robot (see copyright notice above). The original + * plugin can be found in the ROS package gazebo_erratic_plugins. + * + * \author Piyush Khandelwal (piyushk@gmail.com) + * + * $ Id: 06/21/2013 11:23:40 AM piyushk $ + */ + +#ifndef DIFFDRIVE_PLUGIN_HH +#define DIFFDRIVE_PLUGIN_HH + +#include + +// Gazebo +#include +#include +#include + +// ROS +#include +#include +#include +#include +#include +#include +#include + +// Custom Callback Queue +#include +#include + +// Boost +#include +#include + +namespace gazebo { + + class Joint; + class Entity; + + class GazeboRosDiffDrive : public ModelPlugin { + + enum OdomSource + { + ENCODER = 0, + WORLD = 1, + }; + public: + GazeboRosDiffDrive(); + ~GazeboRosDiffDrive(); + void Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf); + void Reset(); + + protected: + virtual void UpdateChild(); + virtual void FiniChild(); + + private: + void publishOdometry(double step_time); + void getWheelVelocities(); + void publishWheelTF(); /// publishes the wheel tf's + void publishWheelJointState(); + void UpdateOdometryEncoder(); + + + GazeboRosPtr gazebo_ros_; + physics::ModelPtr parent; + event::ConnectionPtr update_connection_; + + double wheel_separation_; + double wheel_diameter_; + double wheel_torque; + double wheel_speed_[2]; + double wheel_accel; + double wheel_speed_instr_[2]; + + std::vector joints_; + + // ROS STUFF + ros::Publisher odometry_publisher_; + ros::Subscriber cmd_vel_subscriber_; + boost::shared_ptr transform_broadcaster_; + sensor_msgs::JointState joint_state_; + ros::Publisher joint_state_publisher_; + nav_msgs::Odometry odom_; + std::string tf_prefix_; + + boost::mutex lock; + + std::string robot_namespace_; + std::string command_topic_; + std::string odometry_topic_; + std::string odometry_frame_; + std::string robot_base_frame_; + bool publish_tf_; + bool legacy_mode_; + // Custom Callback Queue + ros::CallbackQueue queue_; + boost::thread callback_queue_thread_; + void QueueThread(); + + // DiffDrive stuff + void cmdVelCallback(const geometry_msgs::Twist::ConstPtr& cmd_msg); + + double x_; + double rot_; + bool alive_; + + // Update Rate + double update_rate_; + double update_period_; + common::Time last_update_time_; + + OdomSource odom_source_; + geometry_msgs::Pose2D pose_encoder_; + common::Time last_odom_update_; + + // Flags + bool publishWheelTF_; + bool publishWheelJointState_; + + }; + +} + +#endif + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_elevator.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_elevator.h new file mode 100755 index 0000000..14d7743 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_elevator.h @@ -0,0 +1,71 @@ +/* + * Copyright 2015 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#ifndef _GAZEBO_ROS_PLUGINS_ELEVATOR_PLUGIN_H_ +#define _GAZEBO_ROS_PLUGINS_ELEVATOR_PLUGIN_H_ + +#include + +// Gazebo +#include + +// ROS +#include +#include +#include +#include + +namespace gazebo +{ + /// \brief ROS implementation of the Elevator plugin + class GazeboRosElevator : public ElevatorPlugin + { + /// \brief Constructor + public: GazeboRosElevator(); + + /// \brief Destructor + public: virtual ~GazeboRosElevator(); + + /// \brief Load the plugin. + /// \param[in] _model Pointer to the Model + /// \param[in] _sdf Pointer to the SDF element of the plugin. + public: void Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf); + + /// \brief Receives messages on the elevator's topic. + /// \param[in] _msg The string message that contains a command. + public: void OnElevator(const std_msgs::String::ConstPtr &_msg); + + /// \brief Queu to handle callbacks. + private: void QueueThread(); + + /// \brief for setting ROS name space + private: std::string robotNamespace_; + + /// \brief ros node handle + private: ros::NodeHandle *rosnode_; + + /// \brief Subscribes to a topic that controls the elevator. + private: ros::Subscriber elevatorSub_; + + /// \brief Custom Callback Queue + private: ros::CallbackQueue queue_; + + // \brief Custom Callback Queue thread + private: boost::thread callbackQueueThread_; + }; +} +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_f3d.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_f3d.h new file mode 100755 index 0000000..5e6cf22 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_f3d.h @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2012-2014 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + * Desc: 3D Applied Force Feedback Interface + * Author: John Hsu + * Date: 24 Sept 2008 + */ + +#ifndef GAZEBO_ROS_F3D_HH +#define GAZEBO_ROS_F3D_HH + +// Custom Callback Queue +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace gazebo +{ + +/// \brief GazeboRosF3D controller +/// This is a controller that simulates a 6 dof force sensor +class GazeboRosF3D : public ModelPlugin +{ + /// \brief Constructor + /// \param parent The parent entity must be a Model + public: GazeboRosF3D(); + + /// \brief Destructor + public: virtual ~GazeboRosF3D(); + + /// \brief Load the controller + public: void Load( physics::ModelPtr _parent, sdf::ElementPtr _sdf ); + + /// \brief Update the controller + protected: virtual void UpdateChild(); + + private: physics::WorldPtr world_; + + /// \brief A pointer to the Gazebo Body + private: physics::LinkPtr link_; + + + /// \brief A pointer to the ROS node. A node will be instantiated if it does not exist. + private: ros::NodeHandle* rosnode_; + private: ros::Publisher pub_; + + /// \brief ROS WrenchStamped message + private: geometry_msgs::WrenchStamped wrench_msg_; + + /// \brief store bodyname + private: std::string link_name_; + + /// \brief ROS WrenchStamped topic name + private: std::string topic_name_; + + /// \brief ROS frame transform name to use in the image message header. + /// This should be simply map since the returned info is in Gazebo Global Frame. + private: std::string frame_name_; + + /// \brief for setting ROS name space + private: std::string robot_namespace_; + + /// \brief A mutex to lock access to fields that are used in message callbacks + private: boost::mutex lock_; + + /// \brief: keep track of number of connections + private: int f3d_connect_count_; + private: void F3DConnect(); + private: void F3DDisconnect(); + + // Custom Callback Queue + private: ros::CallbackQueue queue_; + private: void QueueThread(); + private: boost::thread callback_queue_thread_; + + // Pointer to the update event connection + private: event::ConnectionPtr update_connection_; + +}; + +/** \} */ +/// @} + + +} + +#endif + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_force.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_force.h new file mode 100755 index 0000000..1091bfa --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_force.h @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2012-2014 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + * Desc: A dynamic controller plugin that performs generic force interface. + * Author: John Hsu + * Date: 24 Sept 2008 + */ + +#ifndef GAZEBO_ROS_FORCE_HH +#define GAZEBO_ROS_FORCE_HH + +#include + +// Custom Callback Queue +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + + +namespace gazebo +{ +/// @addtogroup gazebo_dynamic_plugins Gazebo ROS Dynamic Plugins +/// @{ +/** \defgroup GazeboRosForce Plugin XML Reference and Example + + \brief Ros Force Plugin. + + This is a Plugin that collects data from a ROS topic and applies wrench to a body accordingly. + + Example Usage: + \verbatim + + + box_body + box_force + + + \endverbatim + +\{ +*/ + +/** + . + +*/ + +class GazeboRosForce : public ModelPlugin +{ + /// \brief Constructor + public: GazeboRosForce(); + + /// \brief Destructor + public: virtual ~GazeboRosForce(); + + // Documentation inherited + protected: void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf); + + // Documentation inherited + protected: virtual void UpdateChild(); + + /// \brief call back when a Wrench message is published + /// \param[in] _msg The Incoming ROS message representing the new force to exert. + private: void UpdateObjectForce(const geometry_msgs::Wrench::ConstPtr& _msg); + + /// \brief The custom callback queue thread function. + private: void QueueThread(); + + /// \brief A pointer to the gazebo world. + private: physics::WorldPtr world_; + + /// \brief A pointer to the Link, where force is applied + private: physics::LinkPtr link_; + + /// \brief A pointer to the ROS node. A node will be instantiated if it does not exist. + private: ros::NodeHandle* rosnode_; + private: ros::Subscriber sub_; + + /// \brief A mutex to lock access to fields that are used in ROS message callbacks + private: boost::mutex lock_; + + /// \brief ROS Wrench topic name inputs + private: std::string topic_name_; + /// \brief The Link this plugin is attached to, and will exert forces on. + private: std::string link_name_; + + /// \brief for setting ROS name space + private: std::string robot_namespace_; + + // Custom Callback Queue + private: ros::CallbackQueue queue_; + /// \brief Thead object for the running callback Thread. + private: boost::thread callback_queue_thread_; + /// \brief Container for the wrench force that this plugin exerts on the body. + private: geometry_msgs::Wrench wrench_msg_; + + // Pointer to the update event connection + private: event::ConnectionPtr update_connection_; +}; +/** \} */ +/// @} +} +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_ft_sensor.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_ft_sensor.h new file mode 100755 index 0000000..e8f2191 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_ft_sensor.h @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2012-2014 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + * Desc: Force Torque Sensor Plugin + * Author: Francisco Suarez-Ruiz + * Date: 5 June 2014 + */ + +#ifndef GAZEBO_ROS_FT_HH +#define GAZEBO_ROS_FT_HH + +// Custom Callback Queue +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace gazebo +{ +/// @addtogroup gazebo_dynamic_plugins Gazebo ROS Dynamic Plugins +/// @{ +/** \defgroup GazeboRosFTSensor Plugin XML Reference and Example + +\brief Ros Gazebo Ros Force/Torque Sensor Plugin. +This is a model plugin which broadcasts geometry_msgs/WrenchStamped messages +with measured force and torque on a specified joint. +The wrench is reported in the joint CHILD link frame and the measure direction +is child-to-parent link. + +Example Usage: + +\verbatim + + +true + + + + +100.0 +ft_sensor_topic +JOINT_NAME + + +\endverbatim +\{ +*/ + + +/// \brief GazeboRosFT controller +/// This is a controller that simulates a 6 dof force sensor +class GazeboRosFT : public ModelPlugin +{ + /// \brief Constructor + /// \param parent The parent entity must be a Model + public: GazeboRosFT(); + + /// \brief Destructor + public: virtual ~GazeboRosFT(); + + /// \brief Load the controller + public: void Load( physics::ModelPtr _parent, sdf::ElementPtr _sdf ); + + /// \brief Update the controller + protected: virtual void UpdateChild(); + + /// \brief Gaussian noise + private: double gaussian_noise_; + private: unsigned int seed; + /// \brief Gaussian noise generator + private: double GaussianKernel(double mu, double sigma); + + /// \brief A pointer to the Gazebo joint + private: physics::JointPtr joint_; + + /// \brief A pointer to the Gazebo parent link + private: physics::LinkPtr parent_link_; + + /// \brief A pointer to the Gazebo child link + private: physics::LinkPtr child_link_; + + /// \brief A pointer to the Gazebo model + private: physics::ModelPtr model_; + + /// \brief A pointer to the Gazebo world + private: physics::WorldPtr world_; + + /// \brief A pointer to the ROS node. A node will be instantiated if it does not exist. + private: ros::NodeHandle* rosnode_; + private: ros::Publisher pub_; + + /// \brief ROS WrenchStamped message + private: geometry_msgs::WrenchStamped wrench_msg_; + + /// \brief store bodyname + private: std::string joint_name_; + + /// \brief ROS WrenchStamped topic name + private: std::string topic_name_; + + /// \brief ROS frame transform name to use in the image message header. + /// FIXME: extract link name directly? + private: std::string frame_name_; + + /// \brief for setting ROS name space + private: std::string robot_namespace_; + + /// \brief A mutex to lock access to fields that are used in message callbacks + private: boost::mutex lock_; + + /// \brief save last_time + private: common::Time last_time_; + + // rate control + private: double update_rate_; + + /// \brief: keep track of number of connections + private: int ft_connect_count_; + private: void FTConnect(); + private: void FTDisconnect(); + + // Custom Callback Queue + private: ros::CallbackQueue queue_; + private: void QueueThread(); + private: boost::thread callback_queue_thread_; + + // Pointer to the update event connection + private: event::ConnectionPtr update_connection_; + +}; + +/** \} */ +/// @} + + +} + +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_gpu_laser.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_gpu_laser.h new file mode 100755 index 0000000..ddd2a79 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_gpu_laser.h @@ -0,0 +1,99 @@ +/* + * Copyright 2012 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#ifndef GAZEBO_ROS_LASER_HH +#define GAZEBO_ROS_LASER_HH + +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +namespace gazebo +{ + class GazeboRosLaser : public GpuRayPlugin + { + /// \brief Constructor + public: GazeboRosLaser(); + + /// \brief Destructor + public: ~GazeboRosLaser(); + + /// \brief Load the plugin + /// \param take in SDF root element + public: void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf); + + /// \brief Keep track of number of connctions + private: int laser_connect_count_; + private: void LaserConnect(); + private: void LaserDisconnect(); + + // Pointer to the model + private: std::string world_name_; + private: physics::WorldPtr world_; + /// \brief The parent sensor + private: sensors::GpuRaySensorPtr parent_ray_sensor_; + + /// \brief pointer to ros node + private: ros::NodeHandle* rosnode_; + private: ros::Publisher pub_; + private: PubQueue::Ptr pub_queue_; + + /// \brief topic name + private: std::string topic_name_; + + /// \brief frame transform name, should match link name + private: std::string frame_name_; + + /// \brief tf prefix + private: std::string tf_prefix_; + + /// \brief for setting ROS name space + private: std::string robot_namespace_; + + // deferred load in case ros is blocking + private: sdf::ElementPtr sdf; + private: void LoadThread(); + private: boost::thread deferred_load_thread_; + private: unsigned int seed; + + private: gazebo::transport::NodePtr gazebo_node_; + private: gazebo::transport::SubscriberPtr laser_scan_sub_; + private: void OnScan(ConstLaserScanStampedPtr &_msg); + + /// \brief prevents blocking + private: PubMultiQueue pmq; + }; +} +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_hand_of_god.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_hand_of_god.h new file mode 100755 index 0000000..4773b80 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_hand_of_god.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2012-2014 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + * Desc: 3D position interface. + * Author: Sachin Chitta and John Hsu + * Date: 10 June 2008 + */ + +#ifndef GAZEBO_ROS_TEMPLATE_HH +#define GAZEBO_ROS_TEMPLATE_HH + +#include + +#include +#include +#include +#include +#include + +#include +#include + +namespace gazebo +{ + + class GazeboRosHandOfGod : public ModelPlugin + { + /// \brief Constructor + public: GazeboRosHandOfGod(); + + /// \brief Destructor + public: virtual ~GazeboRosHandOfGod(); + + /// \brief Load the controller + public: void Load( physics::ModelPtr _parent, sdf::ElementPtr _sdf ); + + /// \brief Update the controller + protected: virtual void GazeboUpdate(); + + /// Pointer to the update event connection + private: event::ConnectionPtr update_connection_; + boost::shared_ptr tf_buffer_; + boost::shared_ptr tf_listener_; + boost::shared_ptr tf_broadcaster_; + physics::ModelPtr model_; + physics::LinkPtr floating_link_; + std::string link_name_; + std::string robot_namespace_; + std::string frame_id_; + double kl_, ka_; + double cl_, ca_; + }; + +} + +#endif + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_harness.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_harness.h new file mode 100755 index 0000000..17e0aa4 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_harness.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2016 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +#ifndef GAZEBO_ROS_HARNESS_H +#define GAZEBO_ROS_HARNESS_H + +// Custom Callback Queue +#include +#include + +#include +#include +#include + +#include + +namespace gazebo +{ +/// \brief See the Gazebo documentation about the HarnessPlugin. This ROS +/// wrapper exposes two topics: +/// +/// 1. //harness/velocity +/// - Message Type: std_msgs::Float32 +/// - Purpose: Set target winch velocity +/// +/// 2. //harness/detach +/// - Message Type: std_msgs::Bool +/// - Purpose: Detach the joint. +class GazeboRosHarness : public HarnessPlugin +{ + /// \brief Constructor + public: GazeboRosHarness(); + + /// \brief Destructor + public: virtual ~GazeboRosHarness(); + + /// \brief Load the plugin + public: virtual void Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf); + + /// \brief Receive winch velocity control messages. + /// \param[in] msg Float message that is the target winch velocity. + private: virtual void OnVelocity(const std_msgs::Float32::ConstPtr &msg); + + /// \brief Receive detach messages + /// \param[in] msg Boolean detach message. Detach joints if data is + /// true. + private: virtual void OnDetach(const std_msgs::Bool::ConstPtr &msg); + + /// \brief Custom callback queue thread + private: void QueueThread(); + + /// \brief pointer to ros node + private: ros::NodeHandle *rosnode_; + + /// \brief Subscriber to velocity control messages. + private: ros::Subscriber velocitySub_; + + /// \brief Subscriber to detach control messages. + private: ros::Subscriber detachSub_; + + /// \brief for setting ROS name space + private: std::string robotNamespace_; + private: ros::CallbackQueue queue_; + private: boost::thread callbackQueueThread_; +}; +} +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_imu.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_imu.h new file mode 100755 index 0000000..6fa5065 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_imu.h @@ -0,0 +1,130 @@ +/* + * Copyright 2012 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +#ifndef GAZEBO_ROS_IMU_HH +#define GAZEBO_ROS_IMU_HH + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +namespace gazebo +{ + class GazeboRosIMU : public ModelPlugin + { + /// \brief Constructor + public: GazeboRosIMU(); + + /// \brief Destructor + public: virtual ~GazeboRosIMU(); + + /// \brief Load the controller + /// \param node XML config node + public: void Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf); + + /// \brief Update the controller + protected: virtual void UpdateChild(); + + /// \brief The parent World + private: physics::WorldPtr world_; + + /// \brief The link referred to by this plugin + private: physics::LinkPtr link; + + /// \brief pointer to ros node + private: ros::NodeHandle* rosnode_; + private: ros::Publisher pub_; + private: PubQueue::Ptr pub_Queue; + + /// \brief ros message + private: sensor_msgs::Imu imu_msg_; + + /// \brief store link name + private: std::string link_name_; + + /// \brief store frame name + private: std::string frame_name_; + + /// \brief topic name + private: std::string topic_name_; + + /// \brief allow specifying constant xyz and rpy offsets + private: ignition::math::Pose3d offset_; + + /// \brief A mutex to lock access to fields + /// that are used in message callbacks + private: boost::mutex lock_; + + /// \brief save last_time + private: common::Time last_time_; + private: ignition::math::Vector3d last_vpos_; + private: ignition::math::Vector3d last_veul_; + private: ignition::math::Vector3d apos_; + private: ignition::math::Vector3d aeul_; + + // rate control + private: double update_rate_; + + /// \brief: keep initial pose to offset orientation in imu message + private: ignition::math::Pose3d initial_pose_; + + /// \brief Gaussian noise + private: double gaussian_noise_; + + /// \brief Gaussian noise generator + private: double GaussianKernel(double mu, double sigma); + + /// \brief for setting ROS name space + private: std::string robot_namespace_; + + /// \brief call back when using service + private: bool ServiceCallback(std_srvs::Empty::Request &req, + std_srvs::Empty::Response &res); + + private: ros::ServiceServer srv_; + private: std::string service_name_; + + private: ros::CallbackQueue imu_queue_; + private: void IMUQueueThread(); + private: boost::thread callback_queue_thread_; + + // Pointer to the update event connection + private: event::ConnectionPtr update_connection_; + + // deferred load in case ros is blocking + private: sdf::ElementPtr sdf; + private: void LoadThread(); + private: boost::thread deferred_load_thread_; + private: unsigned int seed; + + // ros publish multi queue, prevents publish() blocking + private: PubMultiQueue pmq; + }; +} +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_imu_sensor.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_imu_sensor.h new file mode 100755 index 0000000..15fa563 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_imu_sensor.h @@ -0,0 +1,107 @@ +/* Copyright [2015] [Alessandro Settimi] + * + * email: ale.settimi@gmail.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License.*/ + +#ifndef GAZEBO_ROS_IMU_SENSOR_H +#define GAZEBO_ROS_IMU_SENSOR_H + +#include +#include +#include +#include +#include +#include +#include + +namespace gazebo +{ + namespace sensors + { + class ImuSensor; + } + /** + @anchor GazeboRosImuSensor + \ref GazeboRosImuSensor is a plugin to simulate an Inertial Motion Unit sensor, the main differences from \ref GazeboRosIMU are: + - inheritance from SensorPlugin instead of ModelPlugin, + - measurements are given by gazebo ImuSensor instead of being computed by the ros plugin, + - gravity is included in inertial measurements. + */ + /** @brief Gazebo Ros imu sensor plugin. */ + class GazeboRosImuSensor : public SensorPlugin + { + public: + /// \brief Constructor. + GazeboRosImuSensor(); + /// \brief Destructor. + virtual ~GazeboRosImuSensor(); + /// \brief Load the sensor. + /// \param sensor_ pointer to the sensor. + /// \param sdf_ pointer to the sdf config file. + virtual void Load(sensors::SensorPtr sensor_, sdf::ElementPtr sdf_); + + protected: + /// \brief Update the sensor. + virtual void UpdateChild(const gazebo::common::UpdateInfo &/*_info*/); + + private: + /// \brief Load the parameters from the sdf file. + bool LoadParameters(); + /// \brief Gaussian noise generator. + /// \param mu offset value. + /// \param sigma scaling value. + double GuassianKernel(double mu, double sigma); + + /// \brief Ros NodeHandle pointer. + ros::NodeHandle* node; + /// \brief Ros Publisher for imu data. + ros::Publisher imu_data_publisher; + /// \brief Ros IMU message. + sensor_msgs::Imu imu_msg; + + /// \brief last time on which the data was published. + common::Time last_time; + /// \brief Pointer to the update event connection. + gazebo::event::ConnectionPtr connection; + /// \brief Pointer to the sensor. + sensors::ImuSensor* sensor; + /// \brief Pointer to the sdf config file. + sdf::ElementPtr sdf; + /// \brief Orientation data from the sensor. + ignition::math::Quaterniond orientation; + /// \brief Linear acceleration data from the sensor. + ignition::math::Vector3d accelerometer_data; + /// \brief Angular velocity data from the sensor. + ignition::math::Vector3d gyroscope_data; + + /// \brief Seed for the Gaussian noise generator. + unsigned int seed; + + //loaded parameters + /// \brief The data is published on the topic named: /robot_namespace/topic_name. + std::string robot_namespace; + /// \brief The data is published on the topic named: /robot_namespace/topic_name. + std::string topic_name; + /// \brief Name of the link of the IMU. + std::string body_name; + /// \brief Sensor update rate. + double update_rate; + /// \brief Gaussian noise. + double gaussian_noise; + /// \brief Offset parameter, position part is unused. + ignition::math::Pose3d offset; + }; +} + +#endif //GAZEBO_ROS_IMU_SENSOR_H diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_joint_pose_trajectory.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_joint_pose_trajectory.h new file mode 100755 index 0000000..bc9651f --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_joint_pose_trajectory.h @@ -0,0 +1,133 @@ +/* + * Copyright 2012 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +// ************************************************************* +// DEPRECATED +// This class has been renamed to gazebo_ros_joint_pose_trajectory +// ************************************************************* + +#ifndef GAZEBO_ROS_JOINT_TRAJECTORY_PLUGIN_HH +#define GAZEBO_ROS_JOINT_TRAJECTORY_PLUGIN_HH + +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#undef ENABLE_SERVICE +#ifdef ENABLE_SERVICE +#include +#endif + +#include +#include +#include +#include +#include + +namespace gazebo +{ + class GazeboRosJointPoseTrajectory : public ModelPlugin // replaced with GazeboROSJointPoseTrajectory + { + /// \brief Constructor + public: GazeboRosJointPoseTrajectory(); + + /// \brief Destructor + public: virtual ~GazeboRosJointPoseTrajectory(); + + /// \brief Load the controller + public: void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf); + + /// \brief Update the controller + private: void SetTrajectory( + const trajectory_msgs::JointTrajectory::ConstPtr& trajectory); +#ifdef ENABLE_SERVICE + private: bool SetTrajectory( + const gazebo_msgs::SetJointTrajectory::Request& req, + const gazebo_msgs::SetJointTrajectory::Response& res); +#endif + private: void UpdateStates(); + + private: physics::WorldPtr world_; + private: physics::ModelPtr model_; + + /// \brief pose should be set relative to this link (default to "world") + private: physics::LinkPtr reference_link_; + private: std::string reference_link_name_; + + /// \brief pointer to ros node + private: ros::NodeHandle* rosnode_; + private: ros::Subscriber sub_; + private: ros::ServiceServer srv_; + private: bool has_trajectory_; + + /// \brief ros message + private: trajectory_msgs::JointTrajectory trajectory_msg_; + private: bool set_model_pose_; + private: geometry_msgs::Pose model_pose_; + + /// \brief topic name + private: std::string topic_name_; + private: std::string service_name_; + + /// \brief A mutex to lock access to fields that are + /// used in message callbacks + private: boost::mutex update_mutex; + + /// \brief save last_time + private: common::Time last_time_; + + // trajectory time control + private: common::Time trajectory_start; + private: unsigned int trajectory_index; + + // rate control + private: double update_rate_; + private: bool disable_physics_updates_; + private: bool physics_engine_enabled_; + + /// \brief for setting ROS name space + private: std::string robot_namespace_; + + private: ros::CallbackQueue queue_; + private: void QueueThread(); + private: boost::thread callback_queue_thread_; + + private: std::vector joints_; + private: std::vector points_; + + // Pointer to the update event connection + private: event::ConnectionPtr update_connection_; + + private: trajectory_msgs::JointTrajectory joint_trajectory_; + + // deferred load in case ros is blocking + private: sdf::ElementPtr sdf; + private: void LoadThread(); + private: boost::thread deferred_load_thread_; + }; +} +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_joint_state_publisher.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_joint_state_publisher.h new file mode 100755 index 0000000..2799910 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_joint_state_publisher.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2013, Markus Bader + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY Antons Rebguns ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Antons Rebguns BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **/ + + +#ifndef JOINT_STATE_PUBLISHER_PLUGIN_HH +#define JOINT_STATE_PUBLISHER_PLUGIN_HH + +#include +#include +#include +#include +#include + +// ROS +#include +#include +#include + +// Usage in URDF: +// +// +// /pioneer2dx +// chassis_swivel_joint, swivel_wheel_joint, left_hub_joint, right_hub_joint +// 100.0 +// true +// +// + + + +namespace gazebo { +class GazeboRosJointStatePublisher : public ModelPlugin { +public: + GazeboRosJointStatePublisher(); + ~GazeboRosJointStatePublisher(); + void Load ( physics::ModelPtr _parent, sdf::ElementPtr _sdf ); + void OnUpdate ( const common::UpdateInfo & _info ); + void publishJointStates(); + // Pointer to the model +private: + event::ConnectionPtr updateConnection; + physics::WorldPtr world_; + physics::ModelPtr parent_; + std::vector joints_; + + // ROS STUFF + boost::shared_ptr rosnode_; + sensor_msgs::JointState joint_state_; + ros::Publisher joint_state_publisher_; + std::string tf_prefix_; + std::string robot_namespace_; + std::vector joint_names_; + + // Update Rate + double update_rate_; + double update_period_; + common::Time last_update_time_; + +}; + +// Register this plugin with the simulator +GZ_REGISTER_MODEL_PLUGIN ( GazeboRosJointStatePublisher ) +} + +#endif //JOINT_STATE_PUBLISHER_PLUGIN_HH + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_joint_trajectory.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_joint_trajectory.h new file mode 100755 index 0000000..e9286e1 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_joint_trajectory.h @@ -0,0 +1,133 @@ +/* + * Copyright 2012 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +// ************************************************************* +// DEPRECATED +// This class has been renamed to gazebo_ros_joint_pose_trajectory +// ************************************************************* + +#ifndef GAZEBO_ROS_JOINT_TRAJECTORY_PLUGIN_HH +#define GAZEBO_ROS_JOINT_TRAJECTORY_PLUGIN_HH + +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#undef ENABLE_SERVICE +#ifdef ENABLE_SERVICE +#include +#endif + +#include +#include +#include +#include +#include + +namespace gazebo +{ + class GazeboRosJointTrajectory : public ModelPlugin // replaced with GazeboROSJointPoseTrajectory + { + /// \brief Constructor + public: GazeboRosJointTrajectory(); + + /// \brief Destructor + public: virtual ~GazeboRosJointTrajectory(); + + /// \brief Load the controller + public: void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf); + + /// \brief Update the controller + private: void SetTrajectory( + const trajectory_msgs::JointTrajectory::ConstPtr& trajectory); +#ifdef ENABLE_SERVICE + private: bool SetTrajectory( + const gazebo_msgs::SetJointTrajectory::Request& req, + const gazebo_msgs::SetJointTrajectory::Response& res); +#endif + private: void UpdateStates(); + + private: physics::WorldPtr world_; + private: physics::ModelPtr model_; + + /// \brief pose should be set relative to this link (default to "world") + private: physics::LinkPtr reference_link_; + private: std::string reference_link_name_; + + /// \brief pointer to ros node + private: ros::NodeHandle* rosnode_; + private: ros::Subscriber sub_; + private: ros::ServiceServer srv_; + private: bool has_trajectory_; + + /// \brief ros message + private: trajectory_msgs::JointTrajectory trajectory_msg_; + private: bool set_model_pose_; + private: geometry_msgs::Pose model_pose_; + + /// \brief topic name + private: std::string topic_name_; + private: std::string service_name_; + + /// \brief A mutex to lock access to fields that are + /// used in message callbacks + private: boost::mutex update_mutex; + + /// \brief save last_time + private: common::Time last_time_; + + // trajectory time control + private: common::Time trajectory_start; + private: unsigned int trajectory_index; + + // rate control + private: double update_rate_; + private: bool disable_physics_updates_; + private: bool physics_engine_enabled_; + + /// \brief for setting ROS name space + private: std::string robot_namespace_; + + private: ros::CallbackQueue queue_; + private: void QueueThread(); + private: boost::thread callback_queue_thread_; + + private: std::vector joints_; + private: std::vector points_; + + // Pointer to the update event connection + private: event::ConnectionPtr update_connection_; + + private: trajectory_msgs::JointTrajectory joint_trajectory_; + + // deferred load in case ros is blocking + private: sdf::ElementPtr sdf; + private: void LoadThread(); + private: boost::thread deferred_load_thread_; + }; +} +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_laser.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_laser.h new file mode 100755 index 0000000..d536f2d --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_laser.h @@ -0,0 +1,100 @@ +/* + * Copyright 2012 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#ifndef GAZEBO_ROS_LASER_HH +#define GAZEBO_ROS_LASER_HH + +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace gazebo +{ + class GazeboRosLaser : public RayPlugin + { + /// \brief Constructor + public: GazeboRosLaser(); + + /// \brief Destructor + public: ~GazeboRosLaser(); + + /// \brief Load the plugin + /// \param take in SDF root element + public: void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf); + + /// \brief Keep track of number of connctions + private: int laser_connect_count_; + private: void LaserConnect(); + private: void LaserDisconnect(); + + // Pointer to the model + GazeboRosPtr gazebo_ros_; + private: std::string world_name_; + private: physics::WorldPtr world_; + /// \brief The parent sensor + private: sensors::RaySensorPtr parent_ray_sensor_; + + /// \brief pointer to ros node + private: ros::NodeHandle* rosnode_; + private: ros::Publisher pub_; + private: PubQueue::Ptr pub_queue_; + + /// \brief topic name + private: std::string topic_name_; + + /// \brief frame transform name, should match link name + private: std::string frame_name_; + + /// \brief tf prefix + private: std::string tf_prefix_; + + /// \brief for setting ROS name space + private: std::string robot_namespace_; + + // deferred load in case ros is blocking + private: sdf::ElementPtr sdf; + private: void LoadThread(); + private: boost::thread deferred_load_thread_; + private: unsigned int seed; + + private: gazebo::transport::NodePtr gazebo_node_; + private: gazebo::transport::SubscriberPtr laser_scan_sub_; + private: void OnScan(ConstLaserScanStampedPtr &_msg); + + /// \brief prevents blocking + private: PubMultiQueue pmq; + }; +} +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_multicamera.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_multicamera.h new file mode 100755 index 0000000..aa99705 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_multicamera.h @@ -0,0 +1,65 @@ +/* + * Copyright 2012 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#ifndef GAZEBO_ROS_MULTICAMERA_HH +#define GAZEBO_ROS_MULTICAMERA_HH + +#include +#include + +// library for processing camera data for gazebo / ros conversions +#include +#include + +namespace gazebo +{ + class GazeboRosMultiCamera : public MultiCameraPlugin + { + /// \brief Constructor + /// \param parent The parent entity, must be a Model or a Sensor + public: GazeboRosMultiCamera(); + + /// \brief Destructor + public: ~GazeboRosMultiCamera(); + + /// \brief Load the plugin + /// \param take in SDF root element + public: void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf); + + std::vector utils; + + protected: void OnNewFrame(const unsigned char *_image, + GazeboRosCameraUtils* util); + /// \brief Update the controller + /// FIXME: switch to function vectors + protected: virtual void OnNewFrameLeft(const unsigned char *_image, + unsigned int _width, unsigned int _height, + unsigned int _depth, const std::string &_format); + protected: virtual void OnNewFrameRight(const unsigned char *_image, + unsigned int _width, unsigned int _height, + unsigned int _depth, const std::string &_format); + + /// Bookkeeping flags that will be passed into the underlying + /// GazeboRosCameraUtils objects to let them share state about the parent + /// sensor. + private: boost::shared_ptr image_connect_count_; + private: boost::shared_ptr image_connect_count_lock_; + private: boost::shared_ptr was_active_; + }; +} +#endif + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_openni_kinect.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_openni_kinect.h new file mode 100755 index 0000000..850c40d --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_openni_kinect.h @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2012-2014 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + * Desc: A dynamic controller plugin that publishes ROS image_raw camera_info topic for generic camera sensor. + * Author: John Hsu + * Date: 24 Sept 2008 + */ + +#ifndef GAZEBO_ROS_OPENNI_KINECT_HH +#define GAZEBO_ROS_OPENNI_KINECT_HH + +// ros stuff +#include +#include +#include + +// ros messages stuff +#include +#include +#include +#include +#include +#include + +// gazebo stuff +#include +#include +#include +#include +#include +#include +#include + +// dynamic reconfigure stuff +#include +#include + +// boost stuff +#include + +// camera stuff +#include + +namespace gazebo +{ + class GazeboRosOpenniKinect : public DepthCameraPlugin, GazeboRosCameraUtils + { + /// \brief Constructor + /// \param parent The parent entity, must be a Model or a Sensor + public: GazeboRosOpenniKinect(); + + /// \brief Destructor + public: ~GazeboRosOpenniKinect(); + + /// \brief Load the plugin + /// \param take in SDF root element + public: virtual void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf); + + /// \brief Advertise point cloud and depth image + public: virtual void Advertise(); + + /// \brief Update the controller + protected: virtual void OnNewDepthFrame(const float *_image, + unsigned int _width, unsigned int _height, + unsigned int _depth, const std::string &_format); + + /// \brief Update the controller + protected: virtual void OnNewImageFrame(const unsigned char *_image, + unsigned int _width, unsigned int _height, + unsigned int _depth, const std::string &_format); + + /// \brief push point cloud data into ros topic + private: void FillPointdCloud(const float *_src); + + /// \brief push depth image data into ros topic + private: void FillDepthImage(const float *_src); + + /// \brief Keep track of number of connctions for point clouds + private: int point_cloud_connect_count_; + private: void PointCloudConnect(); + private: void PointCloudDisconnect(); + + /// \brief Keep track of number of connctions for point clouds + private: int depth_image_connect_count_; + private: void DepthImageConnect(); + private: void DepthImageDisconnect(); + + private: bool FillPointCloudHelper(sensor_msgs::PointCloud2 &point_cloud_msg, + uint32_t rows_arg, uint32_t cols_arg, + uint32_t step_arg, void* data_arg); + + private: bool FillDepthImageHelper( sensor_msgs::Image& image_msg, + uint32_t height, uint32_t width, + uint32_t step, void* data_arg); + + /// \brief A pointer to the ROS node. A node will be instantiated if it does not exist. + private: ros::Publisher point_cloud_pub_; + private: ros::Publisher depth_image_pub_; + + /// \brief PointCloud2 point cloud message + private: sensor_msgs::PointCloud2 point_cloud_msg_; + private: sensor_msgs::Image depth_image_msg_; + + /// \brief Minimum range of the point cloud + private: double point_cloud_cutoff_; + /// \brief Maximum range of the point cloud + private: double point_cloud_cutoff_max_; + + /// \brief ROS image topic name + private: std::string point_cloud_topic_name_; + + + /// \brief image where each pixel contains the depth data + private: std::string depth_image_topic_name_; + private: common::Time depth_sensor_update_time_; + + // overload with our own + private: std::string depth_image_camera_info_topic_name_; + private: int depth_info_connect_count_; + private: void DepthInfoConnect(); + private: void DepthInfoDisconnect(); + private: common::Time last_depth_image_camera_info_update_time_; + protected: ros::Publisher depth_image_camera_info_pub_; + + using GazeboRosCameraUtils::PublishCameraInfo; + protected: virtual void PublishCameraInfo(); + + private: event::ConnectionPtr load_connection_; + }; + +} +#endif + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_p3d.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_p3d.h new file mode 100755 index 0000000..c8216a4 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_p3d.h @@ -0,0 +1,133 @@ +/* + * Copyright 2012 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + * Desc: 3D position interface for ground truth. + * Author: Sachin Chitta and John Hsu + * Date: 1 June 2008 + */ + +#ifndef GAZEBO_ROS_P3D_HH +#define GAZEBO_ROS_P3D_HH + +#include + +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include + +namespace gazebo +{ + class GazeboRosP3D : public ModelPlugin + { + /// \brief Constructor + public: GazeboRosP3D(); + + /// \brief Destructor + public: virtual ~GazeboRosP3D(); + + /// \brief Load the controller + public: void Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf); + + /// \brief Update the controller + protected: virtual void UpdateChild(); + + private: physics::WorldPtr world_; + private: physics::ModelPtr model_; + + /// \brief The parent Model + private: physics::LinkPtr link_; + + /// \brief The body of the frame to display pose, twist + private: physics::LinkPtr reference_link_; + + + /// \brief pointer to ros node + private: ros::NodeHandle* rosnode_; + private: ros::Publisher pub_; + private: PubQueue::Ptr pub_Queue; + + /// \brief ros message + private: nav_msgs::Odometry pose_msg_; + + /// \brief store bodyname + private: std::string link_name_; + + /// \brief topic name + private: std::string topic_name_; + + /// \brief frame transform name, should match link name + /// FIXME: extract link name directly? + private: std::string frame_name_; + private: std::string tf_frame_name_; + + /// \brief allow specifying constant xyz and rpy offsets + private: ignition::math::Pose3d offset_; + + /// \brief mutex to lock access to fields used in message callbacks + private: boost::mutex lock; + + /// \brief save last_time + private: common::Time last_time_; + private: ignition::math::Vector3d last_vpos_; + private: ignition::math::Vector3d last_veul_; + private: ignition::math::Vector3d apos_; + private: ignition::math::Vector3d aeul_; + private: ignition::math::Vector3d last_frame_vpos_; + private: ignition::math::Vector3d last_frame_veul_; + private: ignition::math::Vector3d frame_apos_; + private: ignition::math::Vector3d frame_aeul_; + + // rate control + private: double update_rate_; + + /// \brief Gaussian noise + private: double gaussian_noise_; + + /// \brief Gaussian noise generator + private: double GaussianKernel(double mu, double sigma); + + /// \brief for setting ROS name space + private: std::string robot_namespace_; + + private: ros::CallbackQueue p3d_queue_; + private: void P3DQueueThread(); + private: boost::thread callback_queue_thread_; + + // Pointer to the update event connection + private: event::ConnectionPtr update_connection_; + + private: unsigned int seed; + + // ros publish multi queue, prevents publish() blocking + private: PubMultiQueue pmq; + }; +} +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_planar_move.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_planar_move.h new file mode 100755 index 0000000..d399443 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_planar_move.h @@ -0,0 +1,99 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + * Desc: Simple model controller that uses a twist message to move a robot on + * the xy plane. + * Author: Piyush Khandelwal + * Date: 29 July 2013 + */ + +#ifndef GAZEBO_ROS_PLANAR_MOVE_HH +#define GAZEBO_ROS_PLANAR_MOVE_HH + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace gazebo { + + class GazeboRosPlanarMove : public ModelPlugin { + + public: + GazeboRosPlanarMove(); + ~GazeboRosPlanarMove(); + void Load(physics::ModelPtr parent, sdf::ElementPtr sdf); + + protected: + virtual void UpdateChild(); + virtual void FiniChild(); + + private: + void publishOdometry(double step_time); + + physics::ModelPtr parent_; + event::ConnectionPtr update_connection_; + + boost::shared_ptr rosnode_; + ros::Publisher odometry_pub_; + ros::Subscriber vel_sub_; + boost::shared_ptr transform_broadcaster_; + nav_msgs::Odometry odom_; + std::string tf_prefix_; + + boost::mutex lock; + + std::string robot_namespace_; + std::string command_topic_; + std::string odometry_topic_; + std::string odometry_frame_; + std::string robot_base_frame_; + double odometry_rate_; + + // Custom Callback Queue + ros::CallbackQueue queue_; + boost::thread callback_queue_thread_; + void QueueThread(); + + // command velocity callback + void cmdVelCallback(const geometry_msgs::Twist::ConstPtr& cmd_msg); + + double x_; + double y_; + double rot_; + bool alive_; + common::Time last_odom_publish_time_; + ignition::math::Pose3d last_odom_pose_; + + }; + +} + +#endif /* end of include guard: GAZEBO_ROS_PLANAR_MOVE_HH */ diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_projector.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_projector.h new file mode 100755 index 0000000..5d72dce --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_projector.h @@ -0,0 +1,127 @@ +/* + * Desc: A dynamic controller plugin that controls texture projection. + * Author: Jared Duke + * Date: 17 June 2010 + * SVN: $Id$ + */ +#ifndef GAZEBO_ROS_PROJECTOR_HH +#define GAZEBO_ROS_PROJECTOR_HH + +// Custom Callback Queue +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +namespace Ogre +{ + class PlaneBoundedVolumeListSceneQuery; + class Frustum; + class Pass; + class SceneNode; +} + +namespace gazebo +{ + +/// @addtogroup gazebo_dynamic_plugins Gazebo ROS Dynamic Plugins +/// @{ +/** \defgroup GazeboRosProjector Plugin XML Reference and Example + + \brief Ros Texture Projector Controller. + + This is a controller that controls texture projection into the world from a given body. + + Example Usage: + \verbatim + + + ... + + true + 15.0 + stereo_projection_pattern_alpha.png + stereo_projection_pattern_filter.png + projector_controller/image + projector_controller/projector + 0.785398163 + 0.1 + 10 + + + + + \endverbatim + +\{ +*/ + +class GazeboRosProjector : public ModelPlugin +{ + /// \brief Constructor + /// \param parent The parent entity, must be a Model + public: GazeboRosProjector(); + + /// \brief Destructor + public: virtual ~GazeboRosProjector(); + + /// \brief Load the controller + /// \param node XML config node + protected: virtual void Load( physics::ModelPtr _parent, sdf::ElementPtr _sdf ); + + /// \brief pointer to the world + private: physics::WorldPtr world_; + + /// \brief Callback when a texture is published + private: void LoadImage(const std_msgs::String::ConstPtr& imageMsg); + + /// \brief Callbakc when a projector toggle is published + private: void ToggleProjector(const std_msgs::Int32::ConstPtr& projectorMsg); + + /// \brief A pointer to the ROS node. A node will be instantiated if it does not exist. + private: ros::NodeHandle* rosnode_; + private: ros::Subscriber imageSubscriber_; + private: ros::Subscriber projectorSubscriber_; + + /// \brief ROS texture topic name + private: std::string texture_topic_name_; + + /// \brief ROS projector topic name + private: std::string projector_topic_name_; + + /// \brief For setting ROS name space + private: std::string robot_namespace_; + + // Custom Callback Queue + private: ros::CallbackQueue queue_; + private: void QueueThread(); + private: boost::thread callback_queue_thread_; + + private: event::ConnectionPtr add_model_event_; + + private: transport::NodePtr node_; + private: transport::PublisherPtr projector_pub_; +}; + +/** \} */ +/// @} + +} +#endif + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_prosilica.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_prosilica.h new file mode 100755 index 0000000..498898d --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_prosilica.h @@ -0,0 +1,104 @@ +/* + * Copyright 2012 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#ifndef GAZEBO_ROS_PROSILICA_CAMERA_HH +#define GAZEBO_ROS_PROSILICA_CAMERA_HH + +#include + +// library for processing camera data for gazebo / ros conversions +#include +#include + +// ros +#include + +// image components +#include +// used by polled_camera +#include + +// prosilica components +// Stuff in image_common +#include +#include // do: sudo apt-get install ros-hydro-polled-camera +#include + +namespace gazebo +{ + +class GazeboRosProsilica : public CameraPlugin, GazeboRosCameraUtils +{ + /// \brief Constructor + /// \param parent The parent entity, must be a Model or a Sensor + public: GazeboRosProsilica(); + + /// \brief Destructor + public: virtual ~GazeboRosProsilica(); + + /// \brief Load the controller + /// \param node XML config node + public: void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf); + + /// \brief does nothing for now + private: static void mouse_cb(int event, int x, int y, int flags, void* param) { }; + + /// \brief image_transport + private: polled_camera::PublicationServer poll_srv_; // Handles requests in polled mode + + private: std::string mode_; + + private: std::string mode_param_name; +/* + /// \brief Service call to publish images, cam info + private: bool camInfoService(prosilica_camera::CameraInfo::Request &req, + prosilica_camera::CameraInfo::Response &res); + private: bool triggeredGrab(prosilica_camera::PolledImage::Request &req, + prosilica_camera::PolledImage::Response &res); +*/ + + private: void pollCallback(polled_camera::GetPolledImage::Request& req, + polled_camera::GetPolledImage::Response& rsp, + sensor_msgs::Image& image, sensor_msgs::CameraInfo& info); + + /// \brief ros message + /// \brief construct raw stereo message + private: sensor_msgs::Image *roiImageMsg; + private: sensor_msgs::CameraInfo *roiCameraInfoMsg; + + /// \brief ROS image topic name + private: std::string pollServiceName; + + private: void Advertise(); + private: event::ConnectionPtr load_connection_; + + // subscribe to world stats + //private: transport::NodePtr node; + //private: transport::SubscriberPtr statsSub; + //private: common::Time simTime; + //public: void OnStats( const boost::shared_ptr &_msg); + + /// \brief Update the controller + protected: virtual void OnNewImageFrame(const unsigned char *_image, + unsigned int _width, unsigned int _height, + unsigned int _depth, const std::string &_format); + +}; + +} +#endif + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_range.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_range.h new file mode 100755 index 0000000..4d43eae --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_range.h @@ -0,0 +1,145 @@ +/* + * Software License Agreement (Modified BSD License) + * + * Copyright (c) 2013, PAL Robotics, S.L. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of PAL Robotics, S.L. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** \author Jose Capriles. */ + +#ifndef GAZEBO_ROS_RANGE_H +#define GAZEBO_ROS_RANGE_H + + +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace gazebo +{ + +class GazeboRosRange : public RayPlugin +{ + + /// \brief Constructor + public: GazeboRosRange(); + + /// \brief Destructor + public: ~GazeboRosRange(); + + /// \brief Load the plugin + /// \param take in SDF root element + public: void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf); + + /// \brief Update the controller + protected: virtual void OnNewLaserScans(); + + /// \brief Put range data to the ROS topic + private: void PutRangeData(common::Time &_updateTime); + + /// \brief Keep track of number of connctions + private: int range_connect_count_; + private: void RangeConnect(); + private: void RangeDisconnect(); + + // Pointer to the model + private: physics::WorldPtr world_; + /// \brief The parent sensor + private: sensors::SensorPtr parent_sensor_; + private: sensors::RaySensorPtr parent_ray_sensor_; + + /// \brief pointer to ros node + private: ros::NodeHandle* rosnode_; + private: ros::Publisher pub_; + + /// \brief ros message + private: sensor_msgs::Range range_msg_; + + /// \brief topic name + private: std::string topic_name_; + + /// \brief frame transform name, should match link name + private: std::string frame_name_; + + /// \brief radiation type : ultrasound or infrared + private: std::string radiation_; + + /// \brief sensor field of view + private: double fov_; + /// \brief Gaussian noise + private: double gaussian_noise_; + + /// \brief Gaussian noise generator + private: double GaussianKernel(double mu, double sigma); + + /// \brief mutex to lock access to fields that are used in message callbacks + private: boost::mutex lock_; + + /// \brief hack to mimic hokuyo intensity cutoff of 100 + private: double hokuyo_min_intensity_; + + /// update rate of this sensor + private: double update_rate_; + private: double update_period_; + private: common::Time last_update_time_; + + /// \brief for setting ROS name space + private: std::string robot_namespace_; + + private: ros::CallbackQueue range_queue_; + private: void RangeQueueThread(); + private: boost::thread callback_queue_thread_; + + // deferred load in case ros is blocking + private: sdf::ElementPtr sdf; + private: void LoadThread(); + private: boost::thread deferred_load_thread_; + private: unsigned int seed; +}; +} +#endif // GAZEBO_ROS_RANGE_H diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_skid_steer_drive.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_skid_steer_drive.h new file mode 100755 index 0000000..451c5d9 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_skid_steer_drive.h @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2010, Daniel Hewlett, Antons Rebguns + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY Antons Rebguns ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Antons Rebguns BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **/ + +/* + * \file gazebo_ros_skid_steer_drive.h + * + * \brief A skid steering drive plugin. Inspired by gazebo_ros_diff_drive and SkidSteerDrivePlugin + * + * \author Zdenek Materna (imaterna@fit.vutbr.cz) + * + * $ Id: 06/25/2013 11:23:40 AM materna $ + */ + +#ifndef GAZEBO_ROS_SKID_STEER_DRIVE_H_ +#define GAZEBO_ROS_SKID_STEER_DRIVE_H_ + +#include + +#include +#include + +// ROS +#include +#include +#include +#include +#include +#include + +// Custom Callback Queue +#include +#include + +// Boost +#include +#include + +namespace gazebo { + + class Joint; + class Entity; + + class GazeboRosSkidSteerDrive : public ModelPlugin { + + public: + GazeboRosSkidSteerDrive(); + ~GazeboRosSkidSteerDrive(); + void Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf); + + protected: + virtual void UpdateChild(); + virtual void FiniChild(); + + private: + void publishOdometry(double step_time); + void getWheelVelocities(); + + physics::WorldPtr world; + physics::ModelPtr parent; + event::ConnectionPtr update_connection_; + + std::string left_front_joint_name_; + std::string right_front_joint_name_; + std::string left_rear_joint_name_; + std::string right_rear_joint_name_; + + double wheel_separation_; + double wheel_diameter_; + double torque; + double wheel_speed_[4]; + + physics::JointPtr joints[4]; + + // ROS STUFF + ros::NodeHandle* rosnode_; + ros::Publisher odometry_publisher_; + ros::Subscriber cmd_vel_subscriber_; + tf::TransformBroadcaster *transform_broadcaster_; + nav_msgs::Odometry odom_; + std::string tf_prefix_; + bool broadcast_tf_; + + boost::mutex lock; + + std::string robot_namespace_; + std::string command_topic_; + std::string odometry_topic_; + std::string odometry_frame_; + std::string robot_base_frame_; + + // Custom Callback Queue + ros::CallbackQueue queue_; + boost::thread callback_queue_thread_; + void QueueThread(); + + // DiffDrive stuff + void cmdVelCallback(const geometry_msgs::Twist::ConstPtr& cmd_msg); + + double x_; + double rot_; + bool alive_; + + // Update Rate + double update_rate_; + double update_period_; + common::Time last_update_time_; + + double covariance_x_; + double covariance_y_; + double covariance_yaw_; + + }; + +} + + +#endif /* GAZEBO_ROS_SKID_STEER_DRIVE_H_ */ diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_template.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_template.h new file mode 100755 index 0000000..4e1f185 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_template.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2012-2014 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + * Desc: 3D position interface. + * Author: Sachin Chitta and John Hsu + * Date: 10 June 2008 + */ + +#ifndef GAZEBO_ROS_TEMPLATE_HH +#define GAZEBO_ROS_TEMPLATE_HH + +#include + +#include +#include +#include +#include +#include + +namespace gazebo +{ + + class GazeboRosTemplate : public ModelPlugin + { + /// \brief Constructor + public: GazeboRosTemplate(); + + /// \brief Destructor + public: virtual ~GazeboRosTemplate(); + + /// \brief Load the controller + public: void Load( physics::ModelPtr _parent, sdf::ElementPtr _sdf ); + + /// \brief Update the controller + protected: virtual void UpdateChild(); + + }; + +} + +#endif + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_tricycle_drive.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_tricycle_drive.h new file mode 100755 index 0000000..b6c7ee3 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_tricycle_drive.h @@ -0,0 +1,170 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2013, Markus Bader + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +/** + * \file gazebo_ros_tricycle_drive.cpp + * \brief A tricycle drive plugin for gazebo. + * \author Markus Bader + * \date 22th of June 2014 + */ + +#ifndef TRICYCLE_DRIVE_PLUGIN_HH +#define TRICYCLE_DRIVE_PLUGIN_HH + +#include + +// Gazebo +#include + +// ROS +#include +#include +#include +#include +#include +#include +#include +#include + +// Custom Callback Queue +#include +#include + +// Boost +#include +#include + +namespace gazebo { + +class Joint; +class Entity; + + +class GazeboRosTricycleDrive : public ModelPlugin { + + class TricycleDriveCmd { + public: + TricycleDriveCmd():speed(0), angle(0) {}; + double speed; + double angle; + }; + + enum OdomSource + { + ENCODER = 0, + WORLD = 1, + }; +public: + GazeboRosTricycleDrive(); + ~GazeboRosTricycleDrive(); + void Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf); + +protected: + virtual void UpdateChild(); + virtual void FiniChild(); + +private: + GazeboRosPtr gazebo_ros_; + physics::ModelPtr parent; + void publishOdometry(double step_time); + void publishWheelTF(); /// publishes the wheel tf's + void publishWheelJointState(); + void motorController(double target_speed, double target_angle, double dt); + + event::ConnectionPtr update_connection_; + + physics::JointPtr joint_steering_; + physics::JointPtr joint_wheel_actuated_; + physics::JointPtr joint_wheel_encoder_left_; + physics::JointPtr joint_wheel_encoder_right_; + + double diameter_encoder_wheel_; + double diameter_actuated_wheel_; + double wheel_acceleration_; + double wheel_deceleration_; + double wheel_speed_tolerance_; + double steering_angle_tolerance_; + double steering_speed_; + double separation_encoder_wheel_; + + OdomSource odom_source_; + double wheel_torque_; + + std::string robot_namespace_; + std::string command_topic_; + std::string odometry_topic_; + std::string odometry_frame_; + std::string robot_base_frame_; + + // ROS STUFF + ros::Publisher odometry_publisher_; + ros::Subscriber cmd_vel_subscriber_; + boost::shared_ptr transform_broadcaster_; + sensor_msgs::JointState joint_state_; + ros::Publisher joint_state_publisher_; + nav_msgs::Odometry odom_; + + boost::mutex lock; + + + // Custom Callback Queue + ros::CallbackQueue queue_; + boost::thread callback_queue_thread_; + void QueueThread(); + + // DiffDrive stuff + void cmdVelCallback(const geometry_msgs::Twist::ConstPtr& cmd_msg); + + /// updates the relative robot pose based on the wheel encoders + void UpdateOdometryEncoder(); + + TricycleDriveCmd cmd_; + bool alive_; + geometry_msgs::Pose2D pose_encoder_; + common::Time last_odom_update_; + + // Update Rate + double update_rate_; + double update_period_; + common::Time last_actuator_update_; + + // Flags + bool publishWheelTF_; + bool publishWheelJointState_; + +}; + +} + +#endif + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_triggered_camera.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_triggered_camera.h new file mode 100755 index 0000000..b99debb --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_triggered_camera.h @@ -0,0 +1,77 @@ +/* + * Copyright 2017 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#ifndef GAZEBO_ROS_TRIGGERED_CAMERA_HH +#define GAZEBO_ROS_TRIGGERED_CAMERA_HH + +#include +#include + +// library for processing camera data for gazebo / ros conversions +#include + +#include + +namespace gazebo +{ + class GazeboRosTriggeredMultiCamera; + class GazeboRosTriggeredCamera : public CameraPlugin, GazeboRosCameraUtils + { + /// \brief Constructor + /// \param parent The parent entity, must be a Model or a Sensor + public: GazeboRosTriggeredCamera(); + + /// \brief Destructor + public: ~GazeboRosTriggeredCamera(); + + /// \brief Load the plugin + /// \param take in SDF root element + public: void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf); + + /// \brief Load the plugin. + /// \param[in] _parent Take in SDF root element. + /// \param[in] _sdf SDF values. + /// \param[in] _camera_name_suffix Suffix of the camera name. + /// \param[in] _hack_baseline Multiple camera baseline. + public: void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf, + const std::string &_camera_name_suffix, + double _hack_baseline); + + /// \brief Update the controller + protected: virtual void OnNewFrame(const unsigned char *_image, + unsigned int _width, unsigned int _height, + unsigned int _depth, const std::string &_format); + + protected: virtual void TriggerCamera(); + + protected: virtual bool CanTriggerCamera(); + + protected: event::ConnectionPtr preRenderConnection_; + + public: void SetCameraEnabled(const bool _enabled); + + protected: void PreRender(); + + protected: int triggered = 0; + + protected: std::mutex mutex; + + friend class GazeboRosTriggeredMultiCamera; + }; +} +#endif + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_triggered_multicamera.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_triggered_multicamera.h new file mode 100755 index 0000000..44769cf --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_triggered_multicamera.h @@ -0,0 +1,67 @@ +/* + * Copyright 2017 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#ifndef GAZEBO_ROS_TRIGGERED_MULTICAMERA_HH +#define GAZEBO_ROS_TRIGGERED_MULTICAMERA_HH + +#include +#include + +// library for processing camera data for gazebo / ros conversions +#include +#include + +namespace gazebo +{ + class GazeboRosTriggeredMultiCamera : public MultiCameraPlugin + { + /// \brief Constructor + /// \param parent The parent entity, must be a Model or a Sensor + public: GazeboRosTriggeredMultiCamera(); + + /// \brief Destructor + public: ~GazeboRosTriggeredMultiCamera(); + + /// \brief Load the plugin + /// \param take in SDF root element + public: void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf); + + std::vector triggered_cameras; + + /// \brief Update the controller + /// FIXME: switch to function vectors + protected: virtual void OnNewFrameLeft(const unsigned char *_image, + unsigned int _width, unsigned int _height, + unsigned int _depth, const std::string &_format); + protected: virtual void OnNewFrameRight(const unsigned char *_image, + unsigned int _width, unsigned int _height, + unsigned int _depth, const std::string &_format); + + /// Bookkeeping flags that will be passed into the underlying + /// GazeboRosCameraUtils objects to let them share state about the parent + /// sensor. + private: boost::shared_ptr image_connect_count_; + private: boost::shared_ptr image_connect_count_lock_; + private: boost::shared_ptr was_active_; + + protected: event::ConnectionPtr preRenderConnection_; + protected: void SetCameraEnabled(const bool _enabled); + protected: void PreRender(); + }; +} +#endif + diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_utils.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_utils.h new file mode 100755 index 0000000..ed51a72 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_utils.h @@ -0,0 +1,293 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2013, Markus Bader + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +#ifndef GAZEBO_ROS_UTILS_H +#define GAZEBO_ROS_UTILS_H +#include +#include + +#include +#include +#include +#include +#include + +#ifndef GAZEBO_SENSORS_USING_DYNAMIC_POINTER_CAST +#define GAZEBO_SENSORS_USING_DYNAMIC_POINTER_CAST using std::dynamic_pointer_cast +#endif + +namespace gazebo +{ + +/** +* Accessing model name like suggested by nkoenig at http://answers.gazebosim.org/question/4878/multiple-robots-with-ros-plugins-sensor-plugin-vs/ +* @param parent +* @return accessing model name +**/ +inline std::string GetModelName ( const sensors::SensorPtr &parent ) +{ + std::string modelName; + std::vector values; + std::string scopedName = parent->ScopedName(); + boost::replace_all ( scopedName, "::", "," ); + boost::split ( values, scopedName, boost::is_any_of ( "," ) ); + if ( values.size() < 2 ) { + modelName = ""; + } else { + modelName = values[1]; + } + return modelName; +} + +/** +* @brief Reads the name space tag of a sensor plugin +* @param parent +* @param sdf +* @param pInfo +* @return node namespace +**/ +inline std::string GetRobotNamespace ( const sensors::SensorPtr &parent, const sdf::ElementPtr &sdf, const char *pInfo = NULL ) +{ + std::string name_space; + std::stringstream ss; + if ( sdf->HasElement ( "robotNamespace" ) ) { + name_space = sdf->Get ( "robotNamespace" ); + if ( name_space.empty() ) { + ss << "The 'robotNamespace' param was empty"; + name_space = GetModelName ( parent ); + } else { + ss << "Using the 'robotNamespace' param: '" << name_space << "'"; + } + } else { + ss << "The 'robotNamespace' param did not exit"; + } + if ( pInfo != NULL ) { + ROS_INFO_NAMED("utils", "%s Plugin: %s" , pInfo, ss.str().c_str() ); + } + return name_space; +} + +/** + * Gazebo ros helper class + * The class simplifies the parameter and rosnode handling + * @author Markus Bader + **/ +class GazeboRos +{ +private: + sdf::ElementPtr sdf_; /// sdf to read + std::string plugin_; /// name of the plugin class + std::string namespace_; /// name of the launched node + boost::shared_ptr rosnode_; /// rosnode + std::string tf_prefix_; /// prefix for the ros tf plublisher if not set it uses the namespace_ + std::string info_text; /// info text for log messages to identify the node + /** + * Reads the common plugin parameters used by the constructor + **/ + void readCommonParameter (); +public: + /** + * Constructor + * @param _parent models parent + * @param _sdf sdf to read + * @param _name of the plugin class + **/ + GazeboRos ( physics::ModelPtr &_parent, sdf::ElementPtr _sdf, const std::string &_plugin ) + : sdf_ ( _sdf ), plugin_ ( _plugin ) { + namespace_ = _parent->GetName (); + if ( !sdf_->HasElement ( "robotNamespace" ) ) { + ROS_INFO_NAMED("utils", "%s missing , defaults is %s", plugin_.c_str(), namespace_.c_str() ); + } else { + namespace_ = sdf_->GetElement ( "robotNamespace" )->Get(); + if ( namespace_.empty() ) { + namespace_ = _parent->GetName(); + } + } + if ( !namespace_.empty() ) + this->namespace_ += "/"; + rosnode_ = boost::shared_ptr ( new ros::NodeHandle ( namespace_ ) ); + info_text = plugin_ + "(ns = " + namespace_ + ")"; + readCommonParameter (); + } + /** + * Constructor + * @param _parent sensor parent + * @param _sdf sdf to read + * @param _name of the plugin class + **/ + GazeboRos ( sensors::SensorPtr _parent, sdf::ElementPtr _sdf, const std::string &_plugin ) + : sdf_ ( _sdf ), plugin_ ( _plugin ) { + + std::stringstream ss; + if ( sdf_->HasElement ( "robotNamespace" ) ) { + namespace_ = sdf_->Get ( "robotNamespace" ); + if ( namespace_.empty() ) { + ss << "the 'robotNamespace' param was empty"; + namespace_ = GetModelName ( _parent ); + } else { + ss << "Using the 'robotNamespace' param: '" << namespace_ << "'"; + } + } else { + ss << "the 'robotNamespace' param did not exit"; + } + info_text = plugin_ + "(ns = " + namespace_ + ")"; + ROS_INFO_NAMED("utils", "%s: %s" , info_text.c_str(), ss.str().c_str() ); + readCommonParameter (); + } + + /** + * Returns info text used for log messages + * @return class name and node name as string + **/ + const char* info() const; + /** + * returns the initialized created within the constuctor + * @return rosnode + **/ + boost::shared_ptr& node();; + /** + * returns the initialized within the constuctor + * @return rosnode + **/ + const boost::shared_ptr& node() const; + /** + * resolves a tf frame name by adding the tf_prefix initialized within the constuctor + * @param _name + * @retun resolved tf name + **/ + std::string resolveTF ( const std::string &_name ); + + /** + * reads the follwoing _tag_name paramer or sets a _default value + * @param _value + * @param _tag_name + * @param _default + * @retun sdf tag value + **/ + void getParameterBoolean ( bool &_value, const char *_tag_name, const bool &_default ); + /** + * reads the follwoing _tag_name paramer + * @param _value + * @param _tag_name + * @retun sdf tag value + **/ + void getParameterBoolean ( bool &_value, const char *_tag_name ); + /** + * retuns a JointPtr based on an sdf tag_name entry + * @param _value + * @param _tag_name + * @param _joint_default_name + * @retun JointPtr + **/ + physics::JointPtr getJoint ( physics::ModelPtr &_parent, const char *_tag_name, const std::string &_joint_default_name ); + /** + * checks if the ros not is initialized + * @retun JointPtr + **/ + void isInitialized(); + + + /** + * reads the follwoing _tag_name paramer or sets a _default value + * @param _value + * @param _tag_name + * @param _default + * @retun sdf tag value + **/ + template + void getParameter ( T &_value, const char *_tag_name, const T &_default ) { + _value = _default; + if ( !sdf_->HasElement ( _tag_name ) ) { + ROS_WARN_NAMED("utils", "%s: missing <%s> default is %s", info(), _tag_name, boost::lexical_cast ( _default ).c_str() ); + } else { + this->getParameter ( _value, _tag_name ); + } + } + /** + * reads the follwoing _tag_name paramer + * @param _value + * @param _tag_name + * @param _default + * @retun sdf tag value + **/ + template + void getParameter ( T &_value, const char *_tag_name ) { + if ( sdf_->HasElement ( _tag_name ) ) { + _value = sdf_->GetElement ( _tag_name )->Get(); + } + ROS_DEBUG_NAMED("utils", "%s: <%s> = %s", info(), _tag_name, boost::lexical_cast ( _value ).c_str() ); + + } + + /** + * reads the following _tag_name paramer and compares the value with an _options map keys and retuns the corresponding value. + * @param _value + * @param _tag_name + * @param _default + * @retun sdf tag value + **/ + template + void getParameter ( T &_value, const char *_tag_name, const std::map &_options, const T &_default ) { + _value = _default; + if ( !sdf_->HasElement ( _tag_name ) ) { + ROS_WARN_NAMED("utils", "%s: missing <%s> default is %s", info(), _tag_name, boost::lexical_cast ( _default ).c_str() ); + } else { + this->getParameter ( _value, _tag_name, _options ); + } + } + /** + * reads the following _tag_name paramer and compares the value with an _options map keys and retuns the corresponding value. + * @param _value + * @param _tag_name + * @param _default + * @retun sdf tag value + **/ + template + void getParameter ( T &_value, const char *_tag_name, const std::map &_options ) { + typename std::map::const_iterator it; + if ( sdf_->HasElement ( _tag_name ) ) { + std::string value = sdf_->GetElement ( _tag_name )->Get(); + it = _options.find ( value ); + if ( it == _options.end() ) { + ROS_WARN_NAMED("utils", "%s: <%s> no matching key to %s", info(), _tag_name, value.c_str() ); + } else { + _value = it->second; + } + } + ROS_DEBUG_NAMED("utils", "%s: <%s> = %s := %s", info(), _tag_name, ( it == _options.end() ?"default":it->first.c_str() ), boost::lexical_cast ( _value ).c_str() ); + } +}; + +typedef boost::shared_ptr GazeboRosPtr; +} +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_vacuum_gripper.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_vacuum_gripper.h new file mode 100755 index 0000000..b9e6a09 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_vacuum_gripper.h @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2015-2016 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + Desc: GazeboVacuumGripper plugin for manipulating objects in Gazebo + * Author: Kentaro Wada + * Date: 7 Dec 2015 + */ + +#ifndef GAZEBO_ROS_VACUUM_GRIPPER_HH +#define GAZEBO_ROS_VACUUM_GRIPPER_HH + +#include + +// Custom Callback Queue +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + + +namespace gazebo +{ +/// @addtogroup gazebo_dynamic_plugins Gazebo ROS Dynamic Plugins +/// @{ +/** \defgroup GazeboRosVacuumGripper Plugin XML Reference and Example + + \brief Ros Vacuum Gripper Plugin. + + This is a Plugin that collects data from a ROS topic and applies wrench to a body accordingly. + + Example Usage: + - left_end_effector will be the power point + - revolute type joint is necessary (fixed joint disappears on gazebo and plugin can't find the joint and link) + \verbatim + + 0 + + + + + + + + + + + + + + + + + + + + + + + + /robot/left_vacuum_gripper + left_end_effector + grasping + + + \endverbatim + + +\{ +*/ + + +class GazeboRosVacuumGripper : public ModelPlugin +{ + /// \brief Constructor + public: GazeboRosVacuumGripper(); + + /// \brief Destructor + public: virtual ~GazeboRosVacuumGripper(); + + // Documentation inherited + protected: void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf); + + // Documentation inherited + protected: virtual void UpdateChild(); + + /// \brief The custom callback queue thread function. + private: void QueueThread(); + + private: bool OnServiceCallback(std_srvs::Empty::Request &req, + std_srvs::Empty::Response &res); + private: bool OffServiceCallback(std_srvs::Empty::Request &req, + std_srvs::Empty::Response &res); + + private: bool status_; + + private: physics::ModelPtr parent_; + + /// \brief A pointer to the gazebo world. + private: physics::WorldPtr world_; + + /// \brief A pointer to the Link, where force is applied + private: physics::LinkPtr link_; + + /// \brief A pointer to the ROS node. A node will be instantiated if it does not exist. + private: ros::NodeHandle* rosnode_; + + /// \brief A mutex to lock access to fields that are used in ROS message callbacks + private: boost::mutex lock_; + private: ros::Publisher pub_; + private: ros::ServiceServer srv1_; + private: ros::ServiceServer srv2_; + + /// \brief ROS Wrench topic name inputs + private: std::string topic_name_; + private: std::string service_name_; + /// \brief The Link this plugin is attached to, and will exert forces on. + private: std::string link_name_; + + /// \brief for setting ROS name space + private: std::string robot_namespace_; + + // Custom Callback Queue + private: ros::CallbackQueue queue_; + /// \brief Thead object for the running callback Thread. + private: boost::thread callback_queue_thread_; + + // Pointer to the update event connection + private: event::ConnectionPtr update_connection_; + + /// \brief: keep track of number of connections + private: int connect_count_; + private: void Connect(); + private: void Disconnect(); +}; +/** \} */ +/// @} +} +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_video.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_video.h new file mode 100755 index 0000000..1bacd57 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_video.h @@ -0,0 +1,100 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + * Desc: Video plugin for displaying ROS image topics on Ogre textures + * Author: Piyush Khandelwal + * Date: 26 July 2013 + */ + +#ifndef GAZEBO_ROS_VIDEO_H +#define GAZEBO_ROS_VIDEO_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace gazebo +{ + + class VideoVisual : public rendering::Visual + { + public: + VideoVisual( + const std::string &name, rendering::VisualPtr parent, + int height, int width); + virtual ~VideoVisual(); + void render(const cv::Mat& image); + private: + Ogre::TexturePtr texture_; + int height_; + int width_; + }; + + class GazeboRosVideo : public VisualPlugin + { + public: + + GazeboRosVideo(); + virtual ~GazeboRosVideo(); + + void Load(rendering::VisualPtr parent, sdf::ElementPtr sdf); + void processImage(const sensor_msgs::ImageConstPtr &msg); + + protected: + + virtual void UpdateChild(); + + // Pointer to the model + rendering::VisualPtr model_; + // Pointer to the update event connection + event::ConnectionPtr update_connection_; + + boost::shared_ptr video_visual_; + + cv_bridge::CvImagePtr image_; + boost::mutex m_image_; + bool new_image_available_; + + /// \brief A pointer to the ROS node. A node will be instantiated if it does not exist. + ros::NodeHandle* rosnode_; + + // ROS Stuff + ros::Subscriber camera_subscriber_; + std::string robot_namespace_; + std::string topic_name_; + + ros::CallbackQueue queue_; + boost::thread callback_queue_thread_; + void QueueThread(); + + }; + +} + +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/vision_reconfigure.h b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/vision_reconfigure.h new file mode 100755 index 0000000..dceadda --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/vision_reconfigure.h @@ -0,0 +1,70 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2009-2010, Willow Garage, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of the Willow Garage nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*********************************************************************/ + +#ifndef VISION_RECONFIGURE_HH +#define VISION_RECONFIGURE_HH + +#include +#include +#include +#include +#include +#include + +#include + +class VisionReconfigure +{ + public: + VisionReconfigure(); + + ~VisionReconfigure(); + + void ReconfigureCallback(gazebo_plugins::CameraSynchronizerConfig &config, uint32_t level); + void QueueThread(); + void spinOnce(); + void spin(double spin_frequency); + + private: + ros::NodeHandle nh_; + ros::Publisher pub_projector_; + ros::Publisher pub_header_; + dynamic_reconfigure::Server srv_; + std_msgs::Int32 projector_msg_; + ros::CallbackQueue queue_; + boost::thread callback_queue_thread_; + +}; + +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/package.xml b/gazebo_ros_pkgs/gazebo_plugins/package.xml new file mode 100755 index 0000000..d0e1d98 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/package.xml @@ -0,0 +1,55 @@ + + + gazebo_plugins + 2.5.15 + + Robot-independent Gazebo plugins for sensors, motors and dynamic reconfigurable components. + + + Jose Luis Rivero + + BSD, Apache 2.0 + + http://gazebosim.org/tutorials?cat=connect_ros + https://github.com/ros-simulation/gazebo_ros_pkgs/issues + https://github.com/ros-simulation/gazebo_ros_pkgs + + John Hsu + + catkin + + gazebo_dev + + gazebo_dev + + gazebo_msgs + geometry_msgs + sensor_msgs + trajectory_msgs + std_srvs + roscpp + rospy + nodelet + angles + nav_msgs + urdf + tf + tf2_ros + dynamic_reconfigure + rosgraph_msgs + image_transport + rosconsole + message_generation + message_runtime + cv_bridge + polled_camera + diagnostic_updater + camera_info_manager + std_msgs + + rostest + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/scripts/gazebo_model b/gazebo_ros_pkgs/gazebo_plugins/scripts/gazebo_model new file mode 100755 index 0000000..5f3382f --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/scripts/gazebo_model @@ -0,0 +1,68 @@ +#!/usr/bin/env python +# +# testing, do not use +# +# Provides quick access to the services exposed by gazebo_ros_factory plugin + +import roslib, time +roslib.load_manifest('gazebo_plugins') + +import rospy, sys +import string + +from gazebo_plugins import gazebo_plugins_interface +from gazebo_plugins.msg import GazeboModel +from geometry_msgs.msg import Pose, Point, Quaternion + +def usage(): + print '''Commands: + load [param|file] [urdf|gazebo] - Load model + delete - Deletes the model named + ''' + sys.exit(1) + +if __name__ == "__main__": + if len(sys.argv) < 13: + print usage() + + if sys.argv[1] == 'load': + if sys.argv[2] == 'param': + print "loading from parameter" + elif sys.argv[2] == 'file': + print "loading from file" + else: + print "invalid syntax, first argument has to be either param or file" + print usage() + + if sys.argv[3] == 'urdf': + print "loading urdf" + elif sys.argv[3] == 'gazebo': + print "loading gazebo model" + else: + print "invalid syntax, xml type has to be either urdf or gazebo" + print usage() + + param_name = sys.argv[4] + model_name = sys.argv[5] + lx = float(sys.argv[6]) + ly = float(sys.argv[7]) + lz = float(sys.argv[8]) + + #FIXME: rotation ignored for now + ax = float(sys.argv[9]) + ay = float(sys.argv[10]) + az = float(sys.argv[11]) + + namespace = sys.argv[12] + + model_msg = GazeboModel(model_name,param_name,GazeboModel.URDF_PARAM_NAME,namespace,Pose(Point(lx,ly,lz),Quaternion())) + success = gazebo_plugins_interface.load_model(model_msg) + print "spawning success",success + + elif sys.argv[1] == 'delete': + print "not implemented yet" + + else: + print "unknown command: ",sys.argv[1] + print usage() + diff --git a/gazebo_ros_pkgs/gazebo_plugins/scripts/set_pose.py b/gazebo_ros_pkgs/gazebo_plugins/scripts/set_pose.py new file mode 100755 index 0000000..eb5fb16 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/scripts/set_pose.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python +# Software License Agreement (BSD License) +# +# Copyright (c) 2008, Willow Garage, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of the Willow Garage nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +## Gazebo send position topic or calls set pose service for ros_sim_iface consumption + +PKG = 'gazebo_plugins' +NAME = 'set_pose' + +import math +import roslib +roslib.load_manifest(PKG) + +import sys, unittest +import os, os.path, threading, time +import rospy, rostest + +from gazebo_plugins.srv import SetPose + +from std_msgs.msg import String +from geometry_msgs.msg import Pose,Quaternion,Point, PoseStamped, PoseWithCovariance, TwistWithCovariance, Twist, Vector3 +from nav_msgs.msg import Odometry +import tf.transformations as tft +from numpy import float64 + +COV = [float64(0),float64(0),float64(0),float64(0),float64(0),float64(0), \ + float64(0),float64(0),float64(0),float64(0),float64(0),float64(0), \ + float64(0),float64(0),float64(0),float64(0),float64(0),float64(0), \ + float64(0),float64(0),float64(0),float64(0),float64(0),float64(0), \ + float64(0),float64(0),float64(0),float64(0),float64(0),float64(0), \ + float64(0),float64(0),float64(0),float64(0),float64(0),float64(0) ] + + +def normalize_angle_positive(angle): + return math.fmod(math.fmod(angle, 2*math.pi) + 2*math.pi, 2*math.pi) + +def normalize_angle(angle): + anorm = normalize_angle_positive(angle) + if anorm > math.pi: + anorm -= 2*math.pi + return anorm + +def shortest_angular_distance(angle_from, angle_to): + angle_diff = normalize_angle_positive(angle_to) - normalize_angle_positive(angle_from) + if angle_diff > math.pi: + angle_diff = -(2*math.pi - angle_diff) + return normalize_angle(angle_diff) + +class SimIfaceControl(): + def __init__(self): + self.update_rate=10 + self.timeout=1 + self.target_p = [0,0,0] # position + self.target_q = [0,0,0] # quaternion + self.target_e = [0,0,0] # euler pose + self.wait_topic_initialized = False + self.frame_id = "world" + self.service_name = "set_pose_service" + self.topic_name = "set_pose_topic" + self.use_topic = False; + self.use_service = False; + self.wait_topic_name = "clock" + self.wait_for_topic = False; + + rospy.init_node(NAME, anonymous=True) + + def setPoseService(self,pose_msg): + print "waiting for service to set pose" + rospy.wait_for_service(self.service_name); + try: + set_pose = rospy.ServiceProxy(self.service_name, SetPose) + resp1 = set_pose(pose_msg) + return resp1.success + except rospy.ServiceException, e: + print "service call failed: %s"%e + + def waitTopicInput(self,p3d): + #self.p3d_p = [p3d.pose.pose.position.x, p3d.pose.pose.position.y, p3d.pose.pose.position.z] + #self.p3d_q = [p3d.pose.pose.orientation.x, p3d.pose.pose.orientation.y, p3d.pose.pose.orientation.z, p3d.pose.pose.orientation.w] + #self.p3d_e = tft.euler_from_quaternion(self.p3d_q) + self.wait_topic_initialized = True + + def setPose(self): + # get goal from commandline + for i in range(0,len(sys.argv)): + if sys.argv[i] == '-update_rate': + if len(sys.argv) > i+1: + self.update_rate = float(sys.argv[i+1]) + if sys.argv[i] == '-timeout': + if len(sys.argv) > i+1: + self.timeout = float(sys.argv[i+1]) + if sys.argv[i] == '-x': + if len(sys.argv) > i+1: + self.target_p[0] = float(sys.argv[i+1]) + if sys.argv[i] == '-y': + if len(sys.argv) > i+1: + self.target_p[1] = float(sys.argv[i+1]) + if sys.argv[i] == '-z': + if len(sys.argv) > i+1: + self.target_p[2] = float(sys.argv[i+1]) + if sys.argv[i] == '-R': + if len(sys.argv) > i+1: + self.target_e[0] = float(sys.argv[i+1]) + if sys.argv[i] == '-P': + if len(sys.argv) > i+1: + self.target_e[1] = float(sys.argv[i+1]) + if sys.argv[i] == '-Y': + if len(sys.argv) > i+1: + self.target_e[2] = float(sys.argv[i+1]) + if sys.argv[i] == '-f': + if len(sys.argv) > i+1: + self.frame_id = sys.argv[i+1] + if sys.argv[i] == '-s': + if len(sys.argv) > i+1: + self.service_name = sys.argv[i+1] + self.use_service = True; + if sys.argv[i] == '-t': + if len(sys.argv) > i+1: + self.topic_name = sys.argv[i+1] + self.use_topic = True; + if sys.argv[i] == '-p': + if len(sys.argv) > i+1: + self.wait_topic_name = sys.argv[i+1] + self.wait_for_topic = True; + + # setup rospy + self.pub_set_pose_topic = rospy.Publisher(self.topic_name, Odometry) + rospy.Subscriber(self.wait_topic_name, rospy.AnyMsg, self.waitTopicInput) + + # wait for topic if user requests + if self.wait_for_topic: + while not self.wait_topic_initialized: + time.sleep(0.1) + + # compoose goal message + h = rospy.Header() + h.stamp = rospy.get_rostime() + h.frame_id = self.frame_id + p = Point(self.target_p[0],self.target_p[1],self.target_p[2]) + tmpq = tft.quaternion_from_euler(self.target_e[0],self.target_e[1],self.target_e[2]) + q = Quaternion(tmpq[0],tmpq[1],tmpq[2],tmpq[3]) + pose = Pose(p,q) + pwc = PoseWithCovariance(pose,COV) + twc = TwistWithCovariance(Twist(Vector3(),Vector3()),COV) + child_frame_id = "" # what should this be? + target_pose = Odometry(h,child_frame_id,pwc,twc) + + if self.use_service: + success = self.setPoseService(target_pose) + + # publish topic if specified + if self.use_topic: + timeout_t = time.time() + self.timeout + while not rospy.is_shutdown() and time.time() < timeout_t: + # publish target pose + self.pub_set_pose_topic.publish(target_pose) + + if self.update_rate > 0: + time.sleep(1.0/self.update_rate) + else: + time.sleep(0.001) + +def print_usage(exit_code = 0): + print '''Commands: + -update_rate - update rate, default to 10 Hz + -timeout - test timeout in seconds. default to 1 seconds + -x + -y + -z + -R + -P + -Y + -f target frame_id + -s set pose service name + -t set pose topic name + -p wait for this ros topic to be published first +''' + +if __name__ == '__main__': + #print usage if not arguments + if len(sys.argv) == 1: + print_usage() + else: + sic = SimIfaceControl() + sic.setPose() + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/scripts/set_wrench.py b/gazebo_ros_pkgs/gazebo_plugins/scripts/set_wrench.py new file mode 100755 index 0000000..7eef8cc --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/scripts/set_wrench.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python +# Software License Agreement (BSD License) +# +# Copyright (c) 2008, Willow Garage, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of the Willow Garage nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +## Gazebo send wrench topic for gazebo_ros_force consumption + +PKG = 'gazebo_plugins' +NAME = 'set_wrench' + +import math +import roslib +roslib.load_manifest(PKG) + +import sys, unittest +import os, os.path, threading, time +import rospy, rostest + +from geometry_msgs.msg import Wrench, Vector3 +import tf.transformations as tft +from numpy import float64 + +class SimIfaceControl(): + def __init__(self): + self.update_rate=10 + self.target_l = [0,0,0] # linear + self.target_e = [0,0,0] # angular + self.topic_name = "set_wrench_topic" + self.timeout=1 + rospy.init_node(NAME, anonymous=True) + + def setWrench(self): + # get goal from commandline + for i in range(0,len(sys.argv)): + if sys.argv[i] == '-update_rate': + if len(sys.argv) > i+1: + self.update_rate = float(sys.argv[i+1]) + if sys.argv[i] == '-timeout': + if len(sys.argv) > i+1: + self.timeout = float(sys.argv[i+1]) + if sys.argv[i] == '-x': + if len(sys.argv) > i+1: + self.target_l[0] = float(sys.argv[i+1]) + if sys.argv[i] == '-y': + if len(sys.argv) > i+1: + self.target_l[1] = float(sys.argv[i+1]) + if sys.argv[i] == '-z': + if len(sys.argv) > i+1: + self.target_l[2] = float(sys.argv[i+1]) + if sys.argv[i] == '-R': + if len(sys.argv) > i+1: + self.target_e[0] = float(sys.argv[i+1]) + if sys.argv[i] == '-P': + if len(sys.argv) > i+1: + self.target_e[1] = float(sys.argv[i+1]) + if sys.argv[i] == '-Y': + if len(sys.argv) > i+1: + self.target_e[2] = float(sys.argv[i+1]) + if sys.argv[i] == '-t': + if len(sys.argv) > i+1: + self.topic_name = sys.argv[i+1] + + # setup rospy + self.pub_set_wrench_topic = rospy.Publisher(self.topic_name, Wrench) + + # compoose goal message + w = Wrench(Vector3(self.target_l[0],self.target_l[1],self.target_l[2]),Vector3(self.target_e[0],self.target_e[1],self.target_e[2])) + + # publish topic if specified + timeout_t = time.time() + self.timeout + while not rospy.is_shutdown() and time.time() < timeout_t: + # publish target wrench + self.pub_set_wrench_topic.publish(w) + + if self.update_rate > 0: + time.sleep(1.0/self.update_rate) + else: + time.sleep(0.001) + +def print_usage(exit_code = 0): + print '''Commands: + -update_rate - update rate, default to 10 Hz + -timeout - test timeout in seconds. default to 1 seconds + -x + -y + -z + -R + -P + -Y + -t set wrench topic name +''' + +if __name__ == '__main__': + #print usage if not arguments + if len(sys.argv) == 1: + print_usage() + else: + sic = SimIfaceControl() + sic.setWrench() + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/scripts/test_range.py b/gazebo_ros_pkgs/gazebo_plugins/scripts/test_range.py new file mode 100755 index 0000000..95de332 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/scripts/test_range.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +import rospy +from sensor_msgs.msg import Range + +import unittest + +class TestRangePlugin(unittest.TestCase): + + def test_max_range(self): + msg = rospy.wait_for_message('/sonar2', Range) + self.assertAlmostEqual(msg.range, msg.max_range) + + def test_inside_range(self): + msg = rospy.wait_for_message('/sonar', Range) + self.assertTrue(msg.range < 0.25 and msg.range > 0.22) + +if __name__ == '__main__': + import rostest + PKG_NAME = 'gazebo_plugins' + TEST_NAME = PKG_NAME + 'range_test' + rospy.init_node(TEST_NAME) + rostest.rosrun(PKG_NAME, TEST_NAME, TestRangePlugin) diff --git a/gazebo_ros_pkgs/gazebo_plugins/setup.py b/gazebo_ros_pkgs/gazebo_plugins/setup.py new file mode 100755 index 0000000..2bb982c --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/setup.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +from distutils.core import setup +from catkin_pkg.python_setup import generate_distutils_setup + +d = generate_distutils_setup() +d['packages'] = ['gazebo_plugins'] +d['package_dir'] = {'':'src'} + +setup(**d) diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/MultiCameraPlugin.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/MultiCameraPlugin.cpp new file mode 100755 index 0000000..457d7cc --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/MultiCameraPlugin.cpp @@ -0,0 +1,118 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +#include +#include +#include +#include + +using namespace gazebo; +GZ_REGISTER_SENSOR_PLUGIN(MultiCameraPlugin) + +///////////////////////////////////////////////// +MultiCameraPlugin::MultiCameraPlugin() : SensorPlugin() +{ +} + +///////////////////////////////////////////////// +MultiCameraPlugin::~MultiCameraPlugin() +{ + this->parentSensor.reset(); + this->camera.clear(); +} + +///////////////////////////////////////////////// +void MultiCameraPlugin::Load(sensors::SensorPtr _sensor, + sdf::ElementPtr /*_sdf*/) +{ + if (!_sensor) + gzerr << "Invalid sensor pointer.\n"; + + GAZEBO_SENSORS_USING_DYNAMIC_POINTER_CAST; + this->parentSensor = + dynamic_pointer_cast(_sensor); + + if (!this->parentSensor) + { + gzerr << "MultiCameraPlugin requires a CameraSensor.\n"; + if (dynamic_pointer_cast(_sensor)) + gzmsg << "It is a depth camera sensor\n"; + if (dynamic_pointer_cast(_sensor)) + gzmsg << "It is a camera sensor\n"; + } + + if (!this->parentSensor) + { + gzerr << "MultiCameraPlugin not attached to a camera sensor\n"; + return; + } + + for (unsigned int i = 0; i < this->parentSensor->CameraCount(); ++i) + { + this->camera.push_back(this->parentSensor->Camera(i)); + + // save camera attributes + this->width.push_back(this->camera[i]->ImageWidth()); + this->height.push_back(this->camera[i]->ImageHeight()); + this->depth.push_back(this->camera[i]->ImageDepth()); + this->format.push_back(this->camera[i]->ImageFormat()); + + std::string cameraName = this->parentSensor->Camera(i)->Name(); + // gzdbg << "camera(" << i << ") name [" << cameraName << "]\n"; + + // FIXME: hardcoded 2 camera support only + if (cameraName.find("left") != std::string::npos) + { + this->newFrameConnection.push_back(this->camera[i]->ConnectNewImageFrame( + boost::bind(&MultiCameraPlugin::OnNewFrameLeft, + this, _1, _2, _3, _4, _5))); + } + else if (cameraName.find("right") != std::string::npos) + { + this->newFrameConnection.push_back(this->camera[i]->ConnectNewImageFrame( + boost::bind(&MultiCameraPlugin::OnNewFrameRight, + this, _1, _2, _3, _4, _5))); + } + } + + this->parentSensor->SetActive(true); +} + +///////////////////////////////////////////////// +void MultiCameraPlugin::OnNewFrameLeft(const unsigned char * /*_image*/, + unsigned int /*_width*/, + unsigned int /*_height*/, + unsigned int /*_depth*/, + const std::string &/*_format*/) +{ + /*rendering::Camera::SaveFrame(_image, this->width, + this->height, this->depth, this->format, + "/tmp/camera/me.jpg"); + */ +} + +///////////////////////////////////////////////// +void MultiCameraPlugin::OnNewFrameRight(const unsigned char * /*_image*/, + unsigned int /*_width*/, + unsigned int /*_height*/, + unsigned int /*_depth*/, + const std::string &/*_format*/) +{ + /*rendering::Camera::SaveFrame(_image, this->width, + this->height, this->depth, this->format, + "/tmp/camera/me.jpg"); + */ +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/camera_synchronizer.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/camera_synchronizer.cpp new file mode 100755 index 0000000..c6feba0 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/camera_synchronizer.cpp @@ -0,0 +1,48 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2009-2010, Willow Garage, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of the Willow Garage nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*********************************************************************/ + +#include + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "camera_synchronizer"); + + VisionReconfigure vr; + + double spin_frequency = 100.0; + ROS_INFO_NAMED("camera_synchronizer", "Starting to spin camera_synchronizer at %f Hz...",spin_frequency); + vr.spin(spin_frequency); + + return 0; +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_plugins/__init__.py b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_plugins/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_plugins/gazebo_plugins_interface.py b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_plugins/gazebo_plugins_interface.py new file mode 100755 index 0000000..cf83203 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_plugins/gazebo_plugins_interface.py @@ -0,0 +1,26 @@ +#! /usr/bin/env python +# Wrappers around the services provided by gazebo_ros_factory plugin + +import roslib; roslib.load_manifest('gazebo_plugins') + +import sys + +import rospy +from gazebo_plugins.msg import GazeboModel +from gazebo_plugins.srv import SpawnModel +from gazebo_plugins.srv import DeleteModel +from geometry_msgs.msg import Pose, Point, Quaternion + +def load_model(model_msg): + print "waiting for service spawn_model" + rospy.wait_for_service('spawn_model') + try: + spawn_model= rospy.ServiceProxy('spawn_model', SpawnModel) + resp1 = spawn_model(model_msg) + return resp1.success + except rospy.ServiceException, e: + print "Service call failed: %s"%e + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_block_laser.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_block_laser.cpp new file mode 100755 index 0000000..b330e01 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_block_laser.cpp @@ -0,0 +1,414 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + * Desc: Ros Block Laser controller. + * Author: Nathan Koenig + * Date: 01 Feb 2007 + */ + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#define EPSILON_DIFF 0.000001 + +namespace gazebo +{ +// Register this plugin with the simulator +GZ_REGISTER_SENSOR_PLUGIN(GazeboRosBlockLaser) + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosBlockLaser::GazeboRosBlockLaser() +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosBlockLaser::~GazeboRosBlockLaser() +{ + //////////////////////////////////////////////////////////////////////////////// + // Finalize the controller / Custom Callback Queue + this->laser_queue_.clear(); + this->laser_queue_.disable(); + this->rosnode_->shutdown(); + this->callback_laser_queue_thread_.join(); + + delete this->rosnode_; +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosBlockLaser::Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf) +{ + // load plugin + RayPlugin::Load(_parent, _sdf); + + // Get then name of the parent sensor + this->parent_sensor_ = _parent; + + // Get the world name. + std::string worldName = _parent->WorldName(); + this->world_ = physics::get_world(worldName); + +#if GAZEBO_MAJOR_VERSION >= 8 + last_update_time_ = this->world_->SimTime(); +#else + last_update_time_ = this->world_->GetSimTime(); +#endif + + this->node_ = transport::NodePtr(new transport::Node()); + this->node_->Init(worldName); + + GAZEBO_SENSORS_USING_DYNAMIC_POINTER_CAST; + this->parent_ray_sensor_ = dynamic_pointer_cast(this->parent_sensor_); + + if (!this->parent_ray_sensor_) + gzthrow("GazeboRosBlockLaser controller requires a Ray Sensor as its parent"); + + this->robot_namespace_ = ""; + if (_sdf->HasElement("robotNamespace")) + this->robot_namespace_ = _sdf->GetElement("robotNamespace")->Get() + "/"; + + if (!_sdf->HasElement("frameName")) + { + ROS_INFO_NAMED("block_laser", "Block laser plugin missing , defaults to /world"); + this->frame_name_ = "/world"; + } + else + this->frame_name_ = _sdf->GetElement("frameName")->Get(); + + if (!_sdf->HasElement("topicName")) + { + ROS_INFO_NAMED("block_laser", "Block laser plugin missing , defaults to /world"); + this->topic_name_ = "/world"; + } + else + this->topic_name_ = _sdf->GetElement("topicName")->Get(); + + if (!_sdf->HasElement("gaussianNoise")) + { + ROS_INFO_NAMED("block_laser", "Block laser plugin missing , defaults to 0.0"); + this->gaussian_noise_ = 0; + } + else + this->gaussian_noise_ = _sdf->GetElement("gaussianNoise")->Get(); + + if (!_sdf->HasElement("hokuyoMinIntensity")) + { + ROS_INFO_NAMED("block_laser", "Block laser plugin missing , defaults to 101"); + this->hokuyo_min_intensity_ = 101; + } + else + this->hokuyo_min_intensity_ = _sdf->GetElement("hokuyoMinIntensity")->Get(); + + ROS_DEBUG_NAMED("block_laser", "gazebo_ros_laser plugin should set minimum intensity to %f due to cutoff in hokuyo filters." , this->hokuyo_min_intensity_); + + if (!_sdf->HasElement("updateRate")) + { + ROS_INFO_NAMED("block_laser", "Block laser plugin missing , defaults to 0"); + this->update_rate_ = 0; + } + else + this->update_rate_ = _sdf->GetElement("updateRate")->Get(); + // FIXME: update the update_rate_ + + + this->laser_connect_count_ = 0; + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("block_laser", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + this->rosnode_ = new ros::NodeHandle(this->robot_namespace_); + + // resolve tf prefix + std::string prefix; + this->rosnode_->getParam(std::string("tf_prefix"), prefix); + this->frame_name_ = tf::resolve(prefix, this->frame_name_); + + // set size of cloud message, starts at 0!! FIXME: not necessary + this->cloud_msg_.points.clear(); + this->cloud_msg_.channels.clear(); + this->cloud_msg_.channels.push_back(sensor_msgs::ChannelFloat32()); + + if (this->topic_name_ != "") + { + // Custom Callback Queue + ros::AdvertiseOptions ao = ros::AdvertiseOptions::create( + this->topic_name_,1, + boost::bind( &GazeboRosBlockLaser::LaserConnect,this), + boost::bind( &GazeboRosBlockLaser::LaserDisconnect,this), ros::VoidPtr(), &this->laser_queue_); + this->pub_ = this->rosnode_->advertise(ao); + } + + + // Initialize the controller + + // sensor generation off by default + this->parent_ray_sensor_->SetActive(false); + // start custom queue for laser + this->callback_laser_queue_thread_ = boost::thread( boost::bind( &GazeboRosBlockLaser::LaserQueueThread,this ) ); + +} + +//////////////////////////////////////////////////////////////////////////////// +// Increment count +void GazeboRosBlockLaser::LaserConnect() +{ + this->laser_connect_count_++; + this->parent_ray_sensor_->SetActive(true); +} +//////////////////////////////////////////////////////////////////////////////// +// Decrement count +void GazeboRosBlockLaser::LaserDisconnect() +{ + this->laser_connect_count_--; + + if (this->laser_connect_count_ == 0) + this->parent_ray_sensor_->SetActive(false); +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosBlockLaser::OnNewLaserScans() +{ + if (this->topic_name_ != "") + { + common::Time sensor_update_time = this->parent_sensor_->LastUpdateTime(); + if (sensor_update_time < last_update_time_) + { + ROS_WARN_NAMED("block_laser", "Negative sensor update time difference detected."); + last_update_time_ = sensor_update_time; + } + + if (last_update_time_ < sensor_update_time) + { + this->PutLaserData(sensor_update_time); + last_update_time_ = sensor_update_time; + } + } + else + { + ROS_INFO_NAMED("block_laser", "gazebo_ros_block_laser topic name not set"); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Put laser data to the interface +void GazeboRosBlockLaser::PutLaserData(common::Time &_updateTime) +{ + int i, hja, hjb; + int j, vja, vjb; + double vb, hb; + int j1, j2, j3, j4; // four corners indices + double r1, r2, r3, r4, r; // four corner values + interpolated range + double intensity; + + this->parent_ray_sensor_->SetActive(false); + + auto maxAngle = this->parent_ray_sensor_->AngleMax(); + auto minAngle = this->parent_ray_sensor_->AngleMin(); + + double maxRange = this->parent_ray_sensor_->RangeMax(); + double minRange = this->parent_ray_sensor_->RangeMin(); + int rayCount = this->parent_ray_sensor_->RayCount(); + int rangeCount = this->parent_ray_sensor_->RangeCount(); + + int verticalRayCount = this->parent_ray_sensor_->VerticalRayCount(); + int verticalRangeCount = this->parent_ray_sensor_->VerticalRangeCount(); + auto verticalMaxAngle = this->parent_ray_sensor_->VerticalAngleMax(); + auto verticalMinAngle = this->parent_ray_sensor_->VerticalAngleMin(); + + double yDiff = maxAngle.Radian() - minAngle.Radian(); + double pDiff = verticalMaxAngle.Radian() - verticalMinAngle.Radian(); + + + // set size of cloud message everytime! + //int r_size = rangeCount * verticalRangeCount; + this->cloud_msg_.points.clear(); + this->cloud_msg_.channels.clear(); + this->cloud_msg_.channels.push_back(sensor_msgs::ChannelFloat32()); + + /***************************************************************/ + /* */ + /* point scan from laser */ + /* */ + /***************************************************************/ + boost::mutex::scoped_lock sclock(this->lock); + // Add Frame Name + this->cloud_msg_.header.frame_id = this->frame_name_; + this->cloud_msg_.header.stamp.sec = _updateTime.sec; + this->cloud_msg_.header.stamp.nsec = _updateTime.nsec; + + for (j = 0; j= 0 && vja < verticalRayCount); + assert(vjb >= 0 && vjb < verticalRayCount); + + for (i = 0; i= 0 && hja < rayCount); + assert(hjb >= 0 && hjb < rayCount); + + // indices of 4 corners + j1 = hja + vja * rayCount; + j2 = hjb + vja * rayCount; + j3 = hja + vjb * rayCount; + j4 = hjb + vjb * rayCount; + // range readings of 4 corners + r1 = std::min(this->parent_ray_sensor_->LaserShape()->GetRange(j1) , maxRange-minRange); + r2 = std::min(this->parent_ray_sensor_->LaserShape()->GetRange(j2) , maxRange-minRange); + r3 = std::min(this->parent_ray_sensor_->LaserShape()->GetRange(j3) , maxRange-minRange); + r4 = std::min(this->parent_ray_sensor_->LaserShape()->GetRange(j4) , maxRange-minRange); + + // Range is linear interpolation if values are close, + // and min if they are very different + r = (1-vb)*((1 - hb) * r1 + hb * r2) + + vb *((1 - hb) * r3 + hb * r4); + + // Intensity is averaged + intensity = 0.25*(this->parent_ray_sensor_->LaserShape()->GetRetro(j1) + + this->parent_ray_sensor_->LaserShape()->GetRetro(j2) + + this->parent_ray_sensor_->LaserShape()->GetRetro(j3) + + this->parent_ray_sensor_->LaserShape()->GetRetro(j4)); + + // std::cout << " block debug " + // << " ij("<cloud_msg_.points.push_back(point); + } + else + { + geometry_msgs::Point32 point; + //pAngle is rotated by yAngle: + point.x = r * cos(pAngle) * cos(yAngle) + this->GaussianKernel(0,this->gaussian_noise_); + point.y = r * cos(pAngle) * sin(yAngle) + this->GaussianKernel(0,this->gaussian_noise_); + point.z = r * sin(pAngle) + this->GaussianKernel(0,this->gaussian_noise_); + this->cloud_msg_.points.push_back(point); + } // only 1 channel + + this->cloud_msg_.channels[0].values.push_back(intensity + this->GaussianKernel(0,this->gaussian_noise_)) ; + } + } + this->parent_ray_sensor_->SetActive(true); + + // send data out via ros message + this->pub_.publish(this->cloud_msg_); + + + +} + + +////////////////////////////////////////////////////////////////////////////// +// Utility for adding noise +double GazeboRosBlockLaser::GaussianKernel(double mu,double sigma) +{ + // using Box-Muller transform to generate two independent standard normally disbributed normal variables + // see wikipedia + double U = (double)rand()/(double)RAND_MAX; // normalized uniform random variable + double V = (double)rand()/(double)RAND_MAX; // normalized uniform random variable + double X = sqrt(-2.0 * ::log(U)) * cos( 2.0*M_PI * V); + //double Y = sqrt(-2.0 * ::log(U)) * sin( 2.0*M_PI * V); // the other indep. normal variable + // we'll just use X + // scale to our mu and sigma + X = sigma * X + mu; + return X; +} + +// Custom Callback Queue +//////////////////////////////////////////////////////////////////////////////// +// custom callback queue thread +void GazeboRosBlockLaser::LaserQueueThread() +{ + static const double timeout = 0.01; + + while (this->rosnode_->ok()) + { + this->laser_queue_.callAvailable(ros::WallDuration(timeout)); + } +} + +void GazeboRosBlockLaser::OnStats( const boost::shared_ptr &_msg) +{ + this->sim_time_ = msgs::Convert( _msg->sim_time() ); + + ignition::math::Pose3d pose; + pose.Pos().X() = 0.5*sin(0.01*this->sim_time_.Double()); + gzdbg << "plugin simTime [" << this->sim_time_.Double() << "] update pose [" << pose.Pos().X() << "]\n"; +} + + +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_bumper.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_bumper.cpp new file mode 100755 index 0000000..2c5ba04 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_bumper.cpp @@ -0,0 +1,330 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + * Desc: Bumper controller + * Author: Nate Koenig + * Date: 09 Sept. 2008 + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +namespace gazebo +{ +// Register this plugin with the simulator +GZ_REGISTER_SENSOR_PLUGIN(GazeboRosBumper) + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosBumper::GazeboRosBumper() : SensorPlugin() +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosBumper::~GazeboRosBumper() +{ + this->rosnode_->shutdown(); + this->callback_queue_thread_.join(); + + delete this->rosnode_; +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosBumper::Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf) +{ + GAZEBO_SENSORS_USING_DYNAMIC_POINTER_CAST; + this->parentSensor = dynamic_pointer_cast(_parent); + if (!this->parentSensor) + { + ROS_ERROR_NAMED("bumper", "Contact sensor parent is not of type ContactSensor"); + return; + } + + this->robot_namespace_ = ""; + if (_sdf->HasElement("robotNamespace")) + this->robot_namespace_ = + _sdf->GetElement("robotNamespace")->Get() + "/"; + + // "publishing contact/collisions to this topic name: " + // << this->bumper_topic_name_ << std::endl; + this->bumper_topic_name_ = "bumper_states"; + if (_sdf->HasElement("bumperTopicName")) + this->bumper_topic_name_ = + _sdf->GetElement("bumperTopicName")->Get(); + + // "transform contact/collisions pose, forces to this body (link) name: " + // << this->frame_name_ << std::endl; + if (!_sdf->HasElement("frameName")) + { + ROS_INFO_NAMED("bumper", "bumper plugin missing , defaults to world"); + this->frame_name_ = "world"; + } + else + this->frame_name_ = _sdf->GetElement("frameName")->Get(); + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("bumper", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + this->rosnode_ = new ros::NodeHandle(this->robot_namespace_); + + // resolve tf prefix + std::string prefix; + this->rosnode_->getParam(std::string("tf_prefix"), prefix); + this->frame_name_ = tf::resolve(prefix, this->frame_name_); + + this->contact_pub_ = this->rosnode_->advertise( + std::string(this->bumper_topic_name_), 1); + + // Initialize + // start custom queue for contact bumper + this->callback_queue_thread_ = boost::thread( + boost::bind(&GazeboRosBumper::ContactQueueThread, this)); + + // Listen to the update event. This event is broadcast every + // simulation iteration. + this->update_connection_ = this->parentSensor->ConnectUpdated( + boost::bind(&GazeboRosBumper::OnContact, this)); + + // Make sure the parent sensor is active. + this->parentSensor->SetActive(true); +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosBumper::OnContact() +{ + if (this->contact_pub_.getNumSubscribers() <= 0) + return; + + msgs::Contacts contacts; + contacts = this->parentSensor->Contacts(); + /// \TODO: need a time for each Contact in i-loop, they may differ + this->contact_state_msg_.header.frame_id = this->frame_name_; + this->contact_state_msg_.header.stamp = ros::Time(contacts.time().sec(), + contacts.time().nsec()); + +/* + /// \TODO: get frame_name_ transforms from tf or gazebo + /// and rotate results to local frame. for now, results are reported in world frame. + + // if frameName specified is "world", "/map" or "map" report back + // inertial values in the gazebo world + physics::LinkPtr myFrame; + if (myFrame == NULL && this->frame_name_ != "world" && + this->frame_name_ != "/map" && this->frame_name_ != "map") + { + // lock in case a model is being spawned + boost::recursive_mutex::scoped_lock lock( + *Simulator::Instance()->GetMRMutex()); + // look through all models in the world, search for body + // name that matches frameName + physics::Model_V all_models = World::Instance()->Models(); + for (physics::Model_V::iterator iter = all_models.begin(); + iter != all_models.end(); iter++) + { + if (*iter) myFrame = + boost::dynamic_pointer_cast((*iter)->GetLink(this->frame_name_)); + if (myFrame) break; + } + + // not found + if (!myFrame) + { + ROS_INFO_NAMED("bumper", "gazebo_ros_bumper plugin: frameName: %s does not exist" + " yet, will not publish\n",this->frame_name_.c_str()); + return; + } + } +*/ + // get reference frame (body(link)) pose and subtract from it to get + // relative force, torque, position and normal vectors + ignition::math::Pose3d pose, frame_pose; + ignition::math::Quaterniond rot, frame_rot; + ignition::math::Vector3d pos, frame_pos; + /* + if (myFrame) + { + frame_pose = myFrame->WorldPose(); //-this->myBody->GetCoMPose(); + frame_pos = frame_pose.Pos(); + frame_rot = frame_pose.Rot(); + } + else + */ + { + // no specific frames specified, use identity pose, keeping + // relative frame at inertial origin + frame_pos = ignition::math::Vector3d(0, 0, 0); + frame_rot = ignition::math::Quaterniond(1, 0, 0, 0); // gazebo u,x,y,z == identity + frame_pose = ignition::math::Pose3d(frame_pos, frame_rot); + } + + + + // set contact states size + this->contact_state_msg_.states.clear(); + + // GetContacts returns all contacts on the collision body + unsigned int contactsPacketSize = contacts.contact_size(); + for (unsigned int i = 0; i < contactsPacketSize; ++i) + { + + // For each collision contact + // Create a ContactState + gazebo_msgs::ContactState state; + /// \TODO: + gazebo::msgs::Contact contact = contacts.contact(i); + + state.collision1_name = contact.collision1(); + state.collision2_name = contact.collision2(); + std::ostringstream stream; + stream << "Debug: i:(" << i << "/" << contactsPacketSize + << ") my geom:" << state.collision1_name + << " other geom:" << state.collision2_name + << " time:" << ros::Time(contact.time().sec(), contact.time().nsec()) + << std::endl; + state.info = stream.str(); + + state.wrenches.clear(); + state.contact_positions.clear(); + state.contact_normals.clear(); + state.depths.clear(); + + // sum up all wrenches for each DOF + geometry_msgs::Wrench total_wrench; + total_wrench.force.x = 0; + total_wrench.force.y = 0; + total_wrench.force.z = 0; + total_wrench.torque.x = 0; + total_wrench.torque.y = 0; + total_wrench.torque.z = 0; + + unsigned int contactGroupSize = contact.position_size(); + for (unsigned int j = 0; j < contactGroupSize; ++j) + { + // loop through individual contacts between collision1 and collision2 + // gzerr << j << " Position:" + // << contact.position(j).x() << " " + // << contact.position(j).y() << " " + // << contact.position(j).z() << "\n"; + // gzerr << " Normal:" + // << contact.normal(j).x() << " " + // << contact.normal(j).y() << " " + // << contact.normal(j).z() << "\n"; + // gzerr << " Depth:" << contact.depth(j) << "\n"; + + // Get force, torque and rotate into user specified frame. + // frame_rot is identity if world is used (default for now) + ignition::math::Vector3d force = frame_rot.RotateVectorReverse(ignition::math::Vector3d( + contact.wrench(j).body_1_wrench().force().x(), + contact.wrench(j).body_1_wrench().force().y(), + contact.wrench(j).body_1_wrench().force().z())); + ignition::math::Vector3d torque = frame_rot.RotateVectorReverse(ignition::math::Vector3d( + contact.wrench(j).body_1_wrench().torque().x(), + contact.wrench(j).body_1_wrench().torque().y(), + contact.wrench(j).body_1_wrench().torque().z())); + + // set wrenches + geometry_msgs::Wrench wrench; + wrench.force.x = force.X(); + wrench.force.y = force.Y(); + wrench.force.z = force.Z(); + wrench.torque.x = torque.X(); + wrench.torque.y = torque.Y(); + wrench.torque.z = torque.Z(); + state.wrenches.push_back(wrench); + + total_wrench.force.x += wrench.force.x; + total_wrench.force.y += wrench.force.y; + total_wrench.force.z += wrench.force.z; + total_wrench.torque.x += wrench.torque.x; + total_wrench.torque.y += wrench.torque.y; + total_wrench.torque.z += wrench.torque.z; + + // transform contact positions into relative frame + // set contact positions + ignition::math::Vector3d position = frame_rot.RotateVectorReverse( + ignition::math::Vector3d(contact.position(j).x(), + contact.position(j).y(), + contact.position(j).z()) - frame_pos); + geometry_msgs::Vector3 contact_position; + contact_position.x = position.X(); + contact_position.y = position.Y(); + contact_position.z = position.Z(); + state.contact_positions.push_back(contact_position); + + // rotate normal into user specified frame. + // frame_rot is identity if world is used. + ignition::math::Vector3d normal = frame_rot.RotateVectorReverse( + ignition::math::Vector3d(contact.normal(j).x(), + contact.normal(j).y(), + contact.normal(j).z())); + // set contact normals + geometry_msgs::Vector3 contact_normal; + contact_normal.x = normal.X(); + contact_normal.y = normal.Y(); + contact_normal.z = normal.Z(); + state.contact_normals.push_back(contact_normal); + + // set contact depth, interpenetration + state.depths.push_back(contact.depth(j)); + } + + state.total_wrench = total_wrench; + this->contact_state_msg_.states.push_back(state); + } + + this->contact_pub_.publish(this->contact_state_msg_); +} + + +//////////////////////////////////////////////////////////////////////////////// +// Put laser data to the interface +void GazeboRosBumper::ContactQueueThread() +{ + static const double timeout = 0.01; + + while (this->rosnode_->ok()) + { + this->contact_queue_.callAvailable(ros::WallDuration(timeout)); + } +} +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_camera.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_camera.cpp new file mode 100755 index 0000000..8a59a12 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_camera.cpp @@ -0,0 +1,113 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + @mainpage + Desc: GazeboRosCamera plugin for simulating cameras in Gazebo + Author: John Hsu + Date: 24 Sept 2008 +*/ + +#include "gazebo_plugins/gazebo_ros_camera.h" + +#include + +#include +#include +#include + +namespace gazebo +{ +// Register this plugin with the simulator +GZ_REGISTER_SENSOR_PLUGIN(GazeboRosCamera) + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosCamera::GazeboRosCamera() +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosCamera::~GazeboRosCamera() +{ + ROS_DEBUG_STREAM_NAMED("camera","Unloaded"); +} + +void GazeboRosCamera::Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf) +{ + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("camera", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + CameraPlugin::Load(_parent, _sdf); + // copying from CameraPlugin into GazeboRosCameraUtils + this->parentSensor_ = this->parentSensor; + this->width_ = this->width; + this->height_ = this->height; + this->depth_ = this->depth; + this->format_ = this->format; + this->camera_ = this->camera; + + GazeboRosCameraUtils::Load(_parent, _sdf); +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosCamera::OnNewFrame(const unsigned char *_image, + unsigned int _width, unsigned int _height, unsigned int _depth, + const std::string &_format) +{ + common::Time sensor_update_time = this->parentSensor_->LastMeasurementTime(); + + if (!this->parentSensor->IsActive()) + { + if ((*this->image_connect_count_) > 0) + // do this first so there's chance for sensor to run once after activated + this->parentSensor->SetActive(true); + } + else + { + if ((*this->image_connect_count_) > 0) + { + if (sensor_update_time < this->last_update_time_) + { + ROS_WARN_NAMED("camera", "Negative sensor update time difference detected."); + this->last_update_time_ = sensor_update_time; + } + + // OnNewFrame is triggered at the gazebo sensor + // while there is also a plugin that can throttle the + // rate down further (but then why not reduce the sensor rate? + // what is the use case?). + // Setting the to zero will make this plugin + // update at the gazebo sensor , update_period_ will be + // zero and the conditional always will be true. + if (sensor_update_time - this->last_update_time_ >= this->update_period_) + { + this->PutCameraData(_image, sensor_update_time); + this->PublishCameraInfo(sensor_update_time); + this->last_update_time_ = sensor_update_time; + } + } + } +} +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_camera_utils.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_camera_utils.cpp new file mode 100755 index 0000000..ae744b4 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_camera_utils.cpp @@ -0,0 +1,686 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gazebo_plugins/gazebo_ros_camera_utils.h" + +namespace gazebo +{ +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosCameraUtils::GazeboRosCameraUtils() +{ + this->last_update_time_ = common::Time(0); + this->last_info_update_time_ = common::Time(0); + this->height_ = 0; + this->width_ = 0; + this->skip_ = 0; + this->format_ = ""; + this->initialized_ = false; +} + +void GazeboRosCameraUtils::configCallback( + gazebo_plugins::GazeboRosCameraConfig &config, uint32_t level) +{ + if (this->initialized_) + { + ROS_INFO_NAMED("camera_utils", "Reconfigure request for the gazebo ros camera_: %s. New rate: %.2f", + this->camera_name_.c_str(), config.imager_rate); + this->parentSensor_->SetUpdateRate(config.imager_rate); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosCameraUtils::~GazeboRosCameraUtils() +{ + this->parentSensor_->SetActive(false); + this->rosnode_->shutdown(); + this->camera_queue_.clear(); + this->camera_queue_.disable(); + this->callback_queue_thread_.join(); + delete this->rosnode_; +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosCameraUtils::Load(sensors::SensorPtr _parent, + sdf::ElementPtr _sdf, + const std::string &_camera_name_suffix, + double _hack_baseline) +{ + // default Load: + // provide _camera_name_suffix to prevent LoadThread() creating the ros::NodeHandle with + //an incomplete this->camera_name_ namespace. There was a race condition when the _camera_name_suffix + //was appended in this function. + this->Load(_parent, _sdf, _camera_name_suffix); + + // overwrite hack baseline if specified at load + // example usage in gazebo_ros_multicamera + this->hack_baseline_ = _hack_baseline; +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosCameraUtils::Load(sensors::SensorPtr _parent, + sdf::ElementPtr _sdf, + const std::string &_camera_name_suffix) +{ + // Get the world name. + std::string world_name = _parent->WorldName(); + + // Get the world_ + this->world_ = physics::get_world(world_name); + + // save pointers + this->sdf = _sdf; + + // maintain for one more release for backwards compatibility with + // pr2_gazebo_plugins + this->world = this->world_; + + std::stringstream ss; + this->robot_namespace_ = GetRobotNamespace(_parent, _sdf, "Camera"); + + this->image_topic_name_ = "image_raw"; + if (this->sdf->HasElement("imageTopicName")) + this->image_topic_name_ = this->sdf->Get("imageTopicName"); + + this->trigger_topic_name_ = "image_trigger"; + if (this->sdf->HasElement("triggerTopicName")) + this->trigger_topic_name_ = this->sdf->Get("triggerTopicName"); + + this->camera_info_topic_name_ = "camera_info"; + if (this->sdf->HasElement("cameraInfoTopicName")) + this->camera_info_topic_name_ = + this->sdf->Get("cameraInfoTopicName"); + + if (!this->sdf->HasElement("cameraName")) + ROS_DEBUG_NAMED("camera_utils", "Camera plugin missing , default to empty"); + else + this->camera_name_ = this->sdf->Get("cameraName"); + + // overwrite camera suffix + // example usage in gazebo_ros_multicamera + this->camera_name_ += _camera_name_suffix; + + if (!this->sdf->HasElement("frameName")) + ROS_DEBUG_NAMED("camera_utils", "Camera plugin missing , defaults to /world"); + else + this->frame_name_ = this->sdf->Get("frameName"); + + if (!this->sdf->HasElement("updateRate")) + { + ROS_DEBUG_NAMED("camera_utils", "Camera plugin missing , defaults to unlimited (0)."); + this->update_rate_ = 0; + } + else + this->update_rate_ = this->sdf->Get("updateRate"); + + if (!this->sdf->HasElement("CxPrime")) + { + ROS_DEBUG_NAMED("camera_utils", "Camera plugin missing , defaults to 0"); + this->cx_prime_ = 0; + } + else + this->cx_prime_ = this->sdf->Get("CxPrime"); + + if (!this->sdf->HasElement("Cx")) + { + ROS_DEBUG_NAMED("camera_utils", "Camera plugin missing , defaults to 0"); + this->cx_= 0; + } + else + this->cx_ = this->sdf->Get("Cx"); + + if (!this->sdf->HasElement("Cy")) + { + ROS_DEBUG_NAMED("camera_utils", "Camera plugin missing , defaults to 0"); + this->cy_= 0; + } + else + this->cy_ = this->sdf->Get("Cy"); + + if (!this->sdf->HasElement("focalLength")) + { + ROS_DEBUG_NAMED("camera_utils", "Camera plugin missing , defaults to 0"); + this->focal_length_= 0; + } + else + this->focal_length_ = this->sdf->Get("focalLength"); + + if (!this->sdf->HasElement("hackBaseline")) + { + ROS_DEBUG_NAMED("camera_utils", "Camera plugin missing , defaults to 0"); + this->hack_baseline_= 0; + } + else + this->hack_baseline_ = this->sdf->Get("hackBaseline"); + + if (!this->sdf->HasElement("distortionK1")) + { + ROS_DEBUG_NAMED("camera_utils", "Camera plugin missing , defaults to 0"); + this->distortion_k1_= 0; + } + else + this->distortion_k1_ = this->sdf->Get("distortionK1"); + + if (!this->sdf->HasElement("distortionK2")) + { + ROS_DEBUG_NAMED("camera_utils", "Camera plugin missing , defaults to 0"); + this->distortion_k2_= 0; + } + else + this->distortion_k2_ = this->sdf->Get("distortionK2"); + + if (!this->sdf->HasElement("distortionK3")) + { + ROS_DEBUG_NAMED("camera_utils", "Camera plugin missing , defaults to 0"); + this->distortion_k3_= 0; + } + else + this->distortion_k3_ = this->sdf->Get("distortionK3"); + + if (!this->sdf->HasElement("distortionT1")) + { + ROS_DEBUG_NAMED("camera_utils", "Camera plugin missing , defaults to 0"); + this->distortion_t1_= 0; + } + else + this->distortion_t1_ = this->sdf->Get("distortionT1"); + + if (!this->sdf->HasElement("distortionT2")) + { + ROS_DEBUG_NAMED("camera_utils", "Camera plugin missing , defaults to 0"); + this->distortion_t2_= 0; + } + else + this->distortion_t2_ = this->sdf->Get("distortionT2"); + + if (!this->sdf->HasElement("borderCrop")) + { + ROS_DEBUG_NAMED("camera_utils", "Camera plugin missing , defaults to true"); + this->border_crop_ = true; + } + else + this->border_crop_ = this->sdf->Get("borderCrop"); + + // initialize shared_ptr members + if (!this->image_connect_count_) this->image_connect_count_ = boost::shared_ptr(new int(0)); + if (!this->image_connect_count_lock_) this->image_connect_count_lock_ = boost::shared_ptr(new boost::mutex); + if (!this->was_active_) this->was_active_ = boost::shared_ptr(new bool(false)); + + // ros callback queue for processing subscription + this->deferred_load_thread_ = boost::thread( + boost::bind(&GazeboRosCameraUtils::LoadThread, this)); +} + +event::ConnectionPtr GazeboRosCameraUtils::OnLoad(const boost::function& load_function) +{ + return load_event_.Connect(load_function); +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosCameraUtils::LoadThread() +{ + // Exit if no ROS + if (!ros::isInitialized()) + { + gzerr << "Not loading plugin since ROS hasn't been " + << "properly initialized. Try starting gazebo with ros plugin:\n" + << " gazebo -s libgazebo_ros_api_plugin.so\n"; + return; + } + + // Sensor generation off by default. Must do this before advertising the + // associated ROS topics. + this->parentSensor_->SetActive(false); + + this->rosnode_ = new ros::NodeHandle(this->robot_namespace_ + "/" + this->camera_name_); + + // initialize camera_info_manager + this->camera_info_manager_.reset(new camera_info_manager::CameraInfoManager( + *this->rosnode_, this->camera_name_)); + + this->itnode_ = new image_transport::ImageTransport(*this->rosnode_); + + // resolve tf prefix + this->tf_prefix_ = tf::getPrefixParam(*this->rosnode_); + if(this->tf_prefix_.empty()) { + this->tf_prefix_ = this->robot_namespace_; + boost::trim_right_if(this->tf_prefix_,boost::is_any_of("/")); + } + this->frame_name_ = tf::resolve(this->tf_prefix_, this->frame_name_); + + ROS_INFO_NAMED("camera_utils", "Camera Plugin (ns = %s) , set to \"%s\"", + this->robot_namespace_.c_str(), this->tf_prefix_.c_str()); + + + if (!this->camera_name_.empty()) + { + dyn_srv_ = + new dynamic_reconfigure::Server + (*this->rosnode_); + dynamic_reconfigure::Server + ::CallbackType f = + boost::bind(&GazeboRosCameraUtils::configCallback, this, _1, _2); + dyn_srv_->setCallback(f); + } + else + { + ROS_WARN_NAMED("camera_utils", "dynamic reconfigure is not enabled for this image topic [%s]" + " becuase is not specified", + this->image_topic_name_.c_str()); + } + + this->image_pub_ = this->itnode_->advertise( + this->image_topic_name_, 2, + boost::bind(&GazeboRosCameraUtils::ImageConnect, this), + boost::bind(&GazeboRosCameraUtils::ImageDisconnect, this), + ros::VoidPtr(), true); + + // camera info publish rate will be synchronized to image sensor + // publish rates. + // If someone connects to camera_info, sensor will be activated + // and camera_info will be published alongside image_raw with the + // same timestamps. This incurrs additional computational cost when + // there are subscribers to camera_info, but better mimics behavior + // of image_pipeline. + ros::AdvertiseOptions cio = + ros::AdvertiseOptions::create( + this->camera_info_topic_name_, 2, + boost::bind(&GazeboRosCameraUtils::ImageConnect, this), + boost::bind(&GazeboRosCameraUtils::ImageDisconnect, this), + ros::VoidPtr(), &this->camera_queue_); + this->camera_info_pub_ = this->rosnode_->advertise(cio); + + /* disabling fov and rate setting for each camera + ros::SubscribeOptions zoom_so = + ros::SubscribeOptions::create( + "set_hfov", 1, + boost::bind(&GazeboRosCameraUtils::SetHFOV, this, _1), + ros::VoidPtr(), &this->camera_queue_); + this->cameraHFOVSubscriber_ = this->rosnode_->subscribe(zoom_so); + + ros::SubscribeOptions rate_so = + ros::SubscribeOptions::create( + "set_update_rate", 1, + boost::bind(&GazeboRosCameraUtils::SetUpdateRate, this, _1), + ros::VoidPtr(), &this->camera_queue_); + this->cameraUpdateRateSubscriber_ = this->rosnode_->subscribe(rate_so); + */ + + if (this->CanTriggerCamera()) + { + ros::SubscribeOptions trigger_so = + ros::SubscribeOptions::create( + this->trigger_topic_name_, 1, + boost::bind(&GazeboRosCameraUtils::TriggerCameraInternal, this, _1), + ros::VoidPtr(), &this->camera_queue_); + this->trigger_subscriber_ = this->rosnode_->subscribe(trigger_so); + } + + this->Init(); +} + +void GazeboRosCameraUtils::TriggerCamera() +{ +} + +bool GazeboRosCameraUtils::CanTriggerCamera() +{ + return false; +} + +void GazeboRosCameraUtils::TriggerCameraInternal( + const std_msgs::Empty::ConstPtr &dummy) +{ + TriggerCamera(); +} + +//////////////////////////////////////////////////////////////////////////////// +// Set Horizontal Field of View +void GazeboRosCameraUtils::SetHFOV(const std_msgs::Float64::ConstPtr& hfov) +{ + this->camera_->SetHFOV(ignition::math::Angle(hfov->data)); +} + +//////////////////////////////////////////////////////////////////////////////// +// Set Update Rate +void GazeboRosCameraUtils::SetUpdateRate( + const std_msgs::Float64::ConstPtr& update_rate) +{ + this->parentSensor_->SetUpdateRate(update_rate->data); +} + +//////////////////////////////////////////////////////////////////////////////// +// Increment count +void GazeboRosCameraUtils::ImageConnect() +{ + boost::mutex::scoped_lock lock(*this->image_connect_count_lock_); + + // upon first connection, remember if camera was active. + if ((*this->image_connect_count_) == 0) + *this->was_active_ = this->parentSensor_->IsActive(); + + (*this->image_connect_count_)++; + + this->parentSensor_->SetActive(true); +} +//////////////////////////////////////////////////////////////////////////////// +// Decrement count +void GazeboRosCameraUtils::ImageDisconnect() +{ + boost::mutex::scoped_lock lock(*this->image_connect_count_lock_); + + (*this->image_connect_count_)--; + + // if there are no more subscribers, but camera was active to begin with, + // leave it active. Use case: this could be a multicamera, where + // each camera shares the same parentSensor_. + if ((*this->image_connect_count_) <= 0 && !*this->was_active_) + this->parentSensor_->SetActive(false); +} + +//////////////////////////////////////////////////////////////////////////////// +// Initialize the controller +void GazeboRosCameraUtils::Init() +{ + // prepare to throttle this plugin at the same rate + // ideally, we should invoke a plugin update when the sensor updates, + // have to think about how to do that properly later + if (this->update_rate_ > 0.0) + this->update_period_ = 1.0/this->update_rate_; + else + this->update_period_ = 0.0; + + // set buffer size + if (this->format_ == "L8" || this->format_ == "L_INT8") + { + this->type_ = sensor_msgs::image_encodings::MONO8; + this->skip_ = 1; + } + else if (this->format_ == "L16" || this->format_ == "L_INT16") + { + this->type_ = sensor_msgs::image_encodings::MONO16; + this->skip_ = 2; + } + else if (this->format_ == "R8G8B8" || this->format_ == "RGB_INT8") + { + this->type_ = sensor_msgs::image_encodings::RGB8; + this->skip_ = 3; + } + else if (this->format_ == "B8G8R8" || this->format_ == "BGR_INT8") + { + this->type_ = sensor_msgs::image_encodings::BGR8; + this->skip_ = 3; + } + else if (this->format_ == "R16G16B16" || this->format_ == "RGB_INT16") + { + this->type_ = sensor_msgs::image_encodings::RGB16; + this->skip_ = 6; + } + else if (this->format_ == "BAYER_RGGB8") + { + ROS_INFO_NAMED("camera_utils", "bayer simulation maybe computationally expensive."); + this->type_ = sensor_msgs::image_encodings::BAYER_RGGB8; + this->skip_ = 1; + } + else if (this->format_ == "BAYER_BGGR8") + { + ROS_INFO_NAMED("camera_utils", "bayer simulation maybe computationally expensive."); + this->type_ = sensor_msgs::image_encodings::BAYER_BGGR8; + this->skip_ = 1; + } + else if (this->format_ == "BAYER_GBRG8") + { + ROS_INFO_NAMED("camera_utils", "bayer simulation maybe computationally expensive."); + this->type_ = sensor_msgs::image_encodings::BAYER_GBRG8; + this->skip_ = 1; + } + else if (this->format_ == "BAYER_GRBG8") + { + ROS_INFO_NAMED("camera_utils", "bayer simulation maybe computationally expensive."); + this->type_ = sensor_msgs::image_encodings::BAYER_GRBG8; + this->skip_ = 1; + } + else + { + ROS_ERROR_NAMED("camera_utils", "Unsupported Gazebo ImageFormat\n"); + this->type_ = sensor_msgs::image_encodings::BGR8; + this->skip_ = 3; + } + + /// Compute camera_ parameters if set to 0 + if (this->cx_prime_ == 0) + this->cx_prime_ = (static_cast(this->width_) + 1.0) /2.0; + if (this->cx_ == 0) + this->cx_ = (static_cast(this->width_) + 1.0) /2.0; + if (this->cy_ == 0) + this->cy_ = (static_cast(this->height_) + 1.0) /2.0; + + + double hfov = this->camera_->HFOV().Radian(); + double computed_focal_length = + (static_cast(this->width_)) / + (2.0 * tan(hfov / 2.0)); + + if (this->focal_length_ == 0) + { + this->focal_length_ = computed_focal_length; + } + else + { + // check against float precision + if (!ignition::math::equal(this->focal_length_, computed_focal_length)) + { + ROS_WARN_NAMED("camera_utils", "The [%f] you have provided for camera_ [%s]" + " is inconsistent with specified image_width [%d] and" + " HFOV [%f]. Please double check to see that" + " focal_length = width_ / (2.0 * tan(HFOV/2.0))," + " the explected focal_lengtth value is [%f]," + " please update your camera_ model description accordingly.", + this->focal_length_, this->parentSensor_->Name().c_str(), + this->width_, hfov, + computed_focal_length); + } + } + + // fill CameraInfo + sensor_msgs::CameraInfo camera_info_msg; + + camera_info_msg.header.frame_id = this->frame_name_; + + camera_info_msg.height = this->height_; + camera_info_msg.width = this->width_; + // distortion +#if ROS_VERSION_MINIMUM(1, 3, 0) + camera_info_msg.distortion_model = "plumb_bob"; + camera_info_msg.D.resize(5); +#endif + // Allow the user to disable automatic cropping (used to remove barrel + // distortion black border. The crop can be useful, but also skewes + // the lens distortion, making the supplied k and t values incorrect. + if(this->camera_->LensDistortion()) + { + this->camera_->LensDistortion()->SetCrop(this->border_crop_); + } + + // D = {k1, k2, t1, t2, k3}, as specified in: + // - sensor_msgs/CameraInfo: http://docs.ros.org/api/sensor_msgs/html/msg/CameraInfo.html + // - OpenCV: http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html + camera_info_msg.D[0] = this->distortion_k1_; + camera_info_msg.D[1] = this->distortion_k2_; + camera_info_msg.D[2] = this->distortion_t1_; + camera_info_msg.D[3] = this->distortion_t2_; + camera_info_msg.D[4] = this->distortion_k3_; + // original camera_ matrix + camera_info_msg.K[0] = this->focal_length_; + camera_info_msg.K[1] = 0.0; + camera_info_msg.K[2] = this->cx_; + camera_info_msg.K[3] = 0.0; + camera_info_msg.K[4] = this->focal_length_; + camera_info_msg.K[5] = this->cy_; + camera_info_msg.K[6] = 0.0; + camera_info_msg.K[7] = 0.0; + camera_info_msg.K[8] = 1.0; + // rectification + camera_info_msg.R[0] = 1.0; + camera_info_msg.R[1] = 0.0; + camera_info_msg.R[2] = 0.0; + camera_info_msg.R[3] = 0.0; + camera_info_msg.R[4] = 1.0; + camera_info_msg.R[5] = 0.0; + camera_info_msg.R[6] = 0.0; + camera_info_msg.R[7] = 0.0; + camera_info_msg.R[8] = 1.0; + // camera_ projection matrix (same as camera_ matrix due + // to lack of distortion/rectification) (is this generated?) + camera_info_msg.P[0] = this->focal_length_; + camera_info_msg.P[1] = 0.0; + camera_info_msg.P[2] = this->cx_; + camera_info_msg.P[3] = -this->focal_length_ * this->hack_baseline_; + camera_info_msg.P[4] = 0.0; + camera_info_msg.P[5] = this->focal_length_; + camera_info_msg.P[6] = this->cy_; + camera_info_msg.P[7] = 0.0; + camera_info_msg.P[8] = 0.0; + camera_info_msg.P[9] = 0.0; + camera_info_msg.P[10] = 1.0; + camera_info_msg.P[11] = 0.0; + + this->camera_info_manager_->setCameraInfo(camera_info_msg); + + // start custom queue for camera_ + this->callback_queue_thread_ = boost::thread( + boost::bind(&GazeboRosCameraUtils::CameraQueueThread, this)); + + load_event_(); + this->initialized_ = true; +} + +//////////////////////////////////////////////////////////////////////////////// +// Put camera_ data to the interface +void GazeboRosCameraUtils::PutCameraData(const unsigned char *_src, + common::Time &last_update_time) +{ + this->sensor_update_time_ = last_update_time; + this->PutCameraData(_src); +} + +void GazeboRosCameraUtils::PutCameraData(const unsigned char *_src) +{ + if (!this->initialized_ || this->height_ <=0 || this->width_ <=0) + return; + + /// don't bother if there are no subscribers + if ((*this->image_connect_count_) > 0) + { + boost::mutex::scoped_lock lock(this->lock_); + + // copy data into image + this->image_msg_.header.frame_id = this->frame_name_; + this->image_msg_.header.stamp.sec = this->sensor_update_time_.sec; + this->image_msg_.header.stamp.nsec = this->sensor_update_time_.nsec; + + // copy from src to image_msg_ + fillImage(this->image_msg_, this->type_, this->height_, this->width_, + this->skip_*this->width_, reinterpret_cast(_src)); + + // publish to ros + this->image_pub_.publish(this->image_msg_); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Put camera_ data to the interface +void GazeboRosCameraUtils::PublishCameraInfo(common::Time &last_update_time) +{ + if (!this->initialized_ || this->height_ <=0 || this->width_ <=0) + return; + + this->sensor_update_time_ = last_update_time; + this->PublishCameraInfo(); +} + +void GazeboRosCameraUtils::PublishCameraInfo() +{ + if (!this->initialized_ || this->height_ <=0 || this->width_ <=0) + return; + + if (this->camera_info_pub_.getNumSubscribers() > 0) + { + this->sensor_update_time_ = this->parentSensor_->LastMeasurementTime(); + if (this->sensor_update_time_ - this->last_info_update_time_ >= this->update_period_) + { + this->PublishCameraInfo(this->camera_info_pub_); + this->last_info_update_time_ = this->sensor_update_time_; + } + } +} + +void GazeboRosCameraUtils::PublishCameraInfo( + ros::Publisher camera_info_publisher) +{ + sensor_msgs::CameraInfo camera_info_msg = camera_info_manager_->getCameraInfo(); + + camera_info_msg.header.stamp.sec = this->sensor_update_time_.sec; + camera_info_msg.header.stamp.nsec = this->sensor_update_time_.nsec; + + camera_info_publisher.publish(camera_info_msg); +} + + +//////////////////////////////////////////////////////////////////////////////// +// Put camera_ data to the interface +void GazeboRosCameraUtils::CameraQueueThread() +{ + static const double timeout = 0.001; + + while (this->rosnode_->ok()) + { + /// take care of callback queue + this->camera_queue_.callAvailable(ros::WallDuration(timeout)); + } +} +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_depth_camera.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_depth_camera.cpp new file mode 100755 index 0000000..54dc539 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_depth_camera.cpp @@ -0,0 +1,536 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + Desc: GazeboRosDepthCamera plugin for simulating cameras in Gazebo + Author: John Hsu + Date: 24 Sept 2008 + */ + +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include + +#include + +namespace gazebo +{ +// Register this plugin with the simulator +GZ_REGISTER_SENSOR_PLUGIN(GazeboRosDepthCamera) + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosDepthCamera::GazeboRosDepthCamera() +{ + this->point_cloud_connect_count_ = 0; + this->depth_info_connect_count_ = 0; + this->last_depth_image_camera_info_update_time_ = common::Time(0); +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosDepthCamera::~GazeboRosDepthCamera() +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosDepthCamera::Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf) +{ + DepthCameraPlugin::Load(_parent, _sdf); + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("depth_camera", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + // copying from DepthCameraPlugin into GazeboRosCameraUtils + this->parentSensor_ = this->parentSensor; + this->width_ = this->width; + this->height_ = this->height; + this->depth_ = this->depth; + this->format_ = this->format; + this->camera_ = this->depthCamera; + + // using a different default + if (!_sdf->HasElement("imageTopicName")) + this->image_topic_name_ = "ir/image_raw"; + if (!_sdf->HasElement("cameraInfoTopicName")) + this->camera_info_topic_name_ = "ir/camera_info"; + + // point cloud stuff + if (!_sdf->HasElement("pointCloudTopicName")) + this->point_cloud_topic_name_ = "points"; + else + this->point_cloud_topic_name_ = _sdf->GetElement("pointCloudTopicName")->Get(); + + // depth image stuff + if (!_sdf->HasElement("depthImageTopicName")) + this->depth_image_topic_name_ = "depth/image_raw"; + else + this->depth_image_topic_name_ = _sdf->GetElement("depthImageTopicName")->Get(); + + if (!_sdf->HasElement("depthImageCameraInfoTopicName")) + this->depth_image_camera_info_topic_name_ = "depth/camera_info"; + else + this->depth_image_camera_info_topic_name_ = _sdf->GetElement("depthImageCameraInfoTopicName")->Get(); + + if (!_sdf->HasElement("pointCloudCutoff")) + this->point_cloud_cutoff_ = 0.4; + else + this->point_cloud_cutoff_ = _sdf->GetElement("pointCloudCutoff")->Get(); + + load_connection_ = GazeboRosCameraUtils::OnLoad(boost::bind(&GazeboRosDepthCamera::Advertise, this)); + GazeboRosCameraUtils::Load(_parent, _sdf); +} + +void GazeboRosDepthCamera::Advertise() +{ + ros::AdvertiseOptions point_cloud_ao = + ros::AdvertiseOptions::create( + this->point_cloud_topic_name_,1, + boost::bind( &GazeboRosDepthCamera::PointCloudConnect,this), + boost::bind( &GazeboRosDepthCamera::PointCloudDisconnect,this), + ros::VoidPtr(), &this->camera_queue_); + this->point_cloud_pub_ = this->rosnode_->advertise(point_cloud_ao); + + ros::AdvertiseOptions depth_image_ao = + ros::AdvertiseOptions::create< sensor_msgs::Image >( + this->depth_image_topic_name_,1, + boost::bind( &GazeboRosDepthCamera::DepthImageConnect,this), + boost::bind( &GazeboRosDepthCamera::DepthImageDisconnect,this), + ros::VoidPtr(), &this->camera_queue_); + this->depth_image_pub_ = this->rosnode_->advertise(depth_image_ao); + + ros::AdvertiseOptions depth_image_camera_info_ao = + ros::AdvertiseOptions::create( + this->depth_image_camera_info_topic_name_,1, + boost::bind( &GazeboRosDepthCamera::DepthInfoConnect,this), + boost::bind( &GazeboRosDepthCamera::DepthInfoDisconnect,this), + ros::VoidPtr(), &this->camera_queue_); + this->depth_image_camera_info_pub_ = this->rosnode_->advertise(depth_image_camera_info_ao); +} + + +//////////////////////////////////////////////////////////////////////////////// +// Increment count +void GazeboRosDepthCamera::PointCloudConnect() +{ + this->point_cloud_connect_count_++; + (*this->image_connect_count_)++; + this->parentSensor->SetActive(true); +} +//////////////////////////////////////////////////////////////////////////////// +// Decrement count +void GazeboRosDepthCamera::PointCloudDisconnect() +{ + this->point_cloud_connect_count_--; + (*this->image_connect_count_)--; + if (this->point_cloud_connect_count_ <= 0) + this->parentSensor->SetActive(false); +} + +//////////////////////////////////////////////////////////////////////////////// +// Increment count +void GazeboRosDepthCamera::DepthImageConnect() +{ + this->depth_image_connect_count_++; + this->parentSensor->SetActive(true); +} +//////////////////////////////////////////////////////////////////////////////// +// Decrement count +void GazeboRosDepthCamera::DepthImageDisconnect() +{ + this->depth_image_connect_count_--; +} + +//////////////////////////////////////////////////////////////////////////////// +// Increment count +void GazeboRosDepthCamera::DepthInfoConnect() +{ + this->depth_info_connect_count_++; +} +//////////////////////////////////////////////////////////////////////////////// +// Decrement count +void GazeboRosDepthCamera::DepthInfoDisconnect() +{ + this->depth_info_connect_count_--; +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosDepthCamera::OnNewDepthFrame(const float *_image, + unsigned int _width, unsigned int _height, unsigned int _depth, + const std::string &_format) +{ + if (!this->initialized_ || this->height_ <=0 || this->width_ <=0) + return; + + this->depth_sensor_update_time_ = this->parentSensor->LastMeasurementTime(); + + if (this->parentSensor->IsActive()) + { + if (this->point_cloud_connect_count_ <= 0 && + this->depth_image_connect_count_ <= 0 && + (*this->image_connect_count_) <= 0) + { + this->parentSensor->SetActive(false); + } + else + { + if (this->point_cloud_connect_count_ > 0) + this->FillPointdCloud(_image); + + if (this->depth_image_connect_count_ > 0) + this->FillDepthImage(_image); + } + } + else + { + if (this->point_cloud_connect_count_ > 0 || + this->depth_image_connect_count_ <= 0) + // do this first so there's chance for sensor to run 1 frame after activate + this->parentSensor->SetActive(true); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosDepthCamera::OnNewRGBPointCloud(const float *_pcd, + unsigned int _width, unsigned int _height, unsigned int _depth, + const std::string &_format) +{ + if (!this->initialized_ || this->height_ <=0 || this->width_ <=0) + return; + + this->depth_sensor_update_time_ = this->parentSensor->LastMeasurementTime(); + + if (!this->parentSensor->IsActive()) + { + if (this->point_cloud_connect_count_ > 0) + // do this first so there's chance for sensor to run 1 frame after activate + this->parentSensor->SetActive(true); + } + else + { + if (this->point_cloud_connect_count_ > 0) + { + this->lock_.lock(); + this->point_cloud_msg_.header.frame_id = this->frame_name_; + this->point_cloud_msg_.header.stamp.sec = this->depth_sensor_update_time_.sec; + this->point_cloud_msg_.header.stamp.nsec = this->depth_sensor_update_time_.nsec; + this->point_cloud_msg_.width = this->width; + this->point_cloud_msg_.height = this->height; + this->point_cloud_msg_.row_step = this->point_cloud_msg_.point_step * this->width; + + sensor_msgs::PointCloud2Modifier pcd_modifier(point_cloud_msg_); + pcd_modifier.setPointCloud2FieldsByString(2, "xyz", "rgb"); + pcd_modifier.resize(_width*_height); + + point_cloud_msg_.is_dense = true; + + sensor_msgs::PointCloud2Iterator iter_x(point_cloud_msg_, "x"); + sensor_msgs::PointCloud2Iterator iter_y(point_cloud_msg_, "y"); + sensor_msgs::PointCloud2Iterator iter_z(point_cloud_msg_, "z"); + sensor_msgs::PointCloud2Iterator iter_rgb(point_cloud_msg_, "rgb"); + + for (unsigned int i = 0; i < _width; i++) + { + for (unsigned int j = 0; j < _height; j++, ++iter_x, ++iter_y, ++iter_z, ++iter_rgb) + { + unsigned int index = (j * _width) + i; + *iter_x = _pcd[4 * index]; + *iter_y = _pcd[4 * index + 1]; + *iter_z = _pcd[4 * index + 2]; + *iter_rgb = _pcd[4 * index + 3]; + if (i == _width /2 && j == _height / 2) + { + uint32_t rgb = *reinterpret_cast(&(*iter_rgb)); + uint8_t r = (rgb >> 16) & 0x0000ff; + uint8_t g = (rgb >> 8) & 0x0000ff; + uint8_t b = (rgb) & 0x0000ff; + std::cerr << (int)r << " " << (int)g << " " << (int)b << "\n"; + } + } + } + + this->point_cloud_pub_.publish(this->point_cloud_msg_); + this->lock_.unlock(); + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosDepthCamera::OnNewImageFrame(const unsigned char *_image, + unsigned int _width, unsigned int _height, unsigned int _depth, + const std::string &_format) +{ + if (!this->initialized_ || this->height_ <=0 || this->width_ <=0) + return; + + //ROS_ERROR_NAMED("depth_camera", "camera_ new frame %s %s",this->parentSensor_->GetName().c_str(),this->frame_name_.c_str()); + this->sensor_update_time_ = this->parentSensor->LastMeasurementTime(); + + if (!this->parentSensor->IsActive()) + { + if ((*this->image_connect_count_) > 0) + // do this first so there's chance for sensor to run 1 frame after activate + this->parentSensor->SetActive(true); + } + else + { + if ((*this->image_connect_count_) > 0) + { + this->PutCameraData(_image); + // TODO(lucasw) publish camera info with depth image + // this->PublishCameraInfo(sensor_update_time); + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Put camera data to the interface +void GazeboRosDepthCamera::FillPointdCloud(const float *_src) +{ + this->lock_.lock(); + + this->point_cloud_msg_.header.frame_id = this->frame_name_; + this->point_cloud_msg_.header.stamp.sec = this->depth_sensor_update_time_.sec; + this->point_cloud_msg_.header.stamp.nsec = this->depth_sensor_update_time_.nsec; + this->point_cloud_msg_.width = this->width; + this->point_cloud_msg_.height = this->height; + this->point_cloud_msg_.row_step = this->point_cloud_msg_.point_step * this->width; + + ///copy from depth to point cloud message + FillPointCloudHelper(this->point_cloud_msg_, + this->height, + this->width, + this->skip_, + (void*)_src ); + + this->point_cloud_pub_.publish(this->point_cloud_msg_); + + this->lock_.unlock(); +} + +//////////////////////////////////////////////////////////////////////////////// +// Put depth image data to the interface +void GazeboRosDepthCamera::FillDepthImage(const float *_src) +{ + this->lock_.lock(); + // copy data into image + this->depth_image_msg_.header.frame_id = this->frame_name_; + this->depth_image_msg_.header.stamp.sec = this->depth_sensor_update_time_.sec; + this->depth_image_msg_.header.stamp.nsec = this->depth_sensor_update_time_.nsec; + + ///copy from depth to depth image message + FillDepthImageHelper(this->depth_image_msg_, + this->height, + this->width, + this->skip_, + (void*)_src ); + + this->depth_image_pub_.publish(this->depth_image_msg_); + + this->lock_.unlock(); +} + + +// Fill depth information +bool GazeboRosDepthCamera::FillPointCloudHelper( + sensor_msgs::PointCloud2 &point_cloud_msg, + uint32_t rows_arg, uint32_t cols_arg, + uint32_t step_arg, void* data_arg) +{ + sensor_msgs::PointCloud2Modifier pcd_modifier(point_cloud_msg); + pcd_modifier.setPointCloud2FieldsByString(2, "xyz", "rgb"); + pcd_modifier.resize(rows_arg*cols_arg); + + sensor_msgs::PointCloud2Iterator iter_x(point_cloud_msg_, "x"); + sensor_msgs::PointCloud2Iterator iter_y(point_cloud_msg_, "y"); + sensor_msgs::PointCloud2Iterator iter_z(point_cloud_msg_, "z"); + sensor_msgs::PointCloud2Iterator iter_rgb(point_cloud_msg_, "rgb"); + + point_cloud_msg.is_dense = true; + + float* toCopyFrom = (float*)data_arg; + int index = 0; + + double hfov = this->parentSensor->DepthCamera()->HFOV().Radian(); + double fl = ((double)this->width) / (2.0 *tan(hfov/2.0)); + + // convert depth to point cloud + for (uint32_t j=0; j1) pAngle = atan2( (double)j - 0.5*(double)(rows_arg-1), fl); + else pAngle = 0.0; + + for (uint32_t i=0; i1) yAngle = atan2( (double)i - 0.5*(double)(cols_arg-1), fl); + else yAngle = 0.0; + + double depth = toCopyFrom[index++]; + + // in optical frame + // hardcoded rotation rpy(-M_PI/2, 0, -M_PI/2) is built-in + // to urdf, where the *_optical_frame should have above relative + // rotation from the physical camera *_frame + *iter_x = depth * tan(yAngle); + *iter_y = depth * tan(pAngle); + if(depth > this->point_cloud_cutoff_) + { + *iter_z = depth; + } + else //point in the unseeable range + { + *iter_x = *iter_y = *iter_z = std::numeric_limits::quiet_NaN (); + point_cloud_msg.is_dense = false; + } + + // put image color data for each point + uint8_t* image_src = (uint8_t*)(&(this->image_msg_.data[0])); + if (this->image_msg_.data.size() == rows_arg*cols_arg*3) + { + // color + iter_rgb[0] = image_src[i*3+j*cols_arg*3+0]; + iter_rgb[1] = image_src[i*3+j*cols_arg*3+1]; + iter_rgb[2] = image_src[i*3+j*cols_arg*3+2]; + } + else if (this->image_msg_.data.size() == rows_arg*cols_arg) + { + // mono (or bayer? @todo; fix for bayer) + iter_rgb[0] = image_src[i+j*cols_arg]; + iter_rgb[1] = image_src[i+j*cols_arg]; + iter_rgb[2] = image_src[i+j*cols_arg]; + } + else + { + // no image + iter_rgb[0] = 0; + iter_rgb[1] = 0; + iter_rgb[2] = 0; + } + } + } + + return true; +} + +// Fill depth information +bool GazeboRosDepthCamera::FillDepthImageHelper( + sensor_msgs::Image& image_msg, + uint32_t rows_arg, uint32_t cols_arg, + uint32_t step_arg, void* data_arg) +{ + image_msg.encoding = sensor_msgs::image_encodings::TYPE_32FC1; + image_msg.height = rows_arg; + image_msg.width = cols_arg; + image_msg.step = sizeof(float) * cols_arg; + image_msg.data.resize(rows_arg * cols_arg * sizeof(float)); + image_msg.is_bigendian = 0; + + const float bad_point = std::numeric_limits::quiet_NaN(); + + float* dest = (float*)(&(image_msg.data[0])); + float* toCopyFrom = (float*)data_arg; + int index = 0; + + // convert depth to point cloud + for (uint32_t j = 0; j < rows_arg; j++) + { + for (uint32_t i = 0; i < cols_arg; i++) + { + float depth = toCopyFrom[index++]; + + if (depth > this->point_cloud_cutoff_) + { + dest[i + j * cols_arg] = depth; + } + else //point in the unseeable range + { + dest[i + j * cols_arg] = bad_point; + } + } + } + return true; +} + +void GazeboRosDepthCamera::PublishCameraInfo() +{ + ROS_DEBUG_NAMED("depth_camera", "publishing default camera info, then depth camera info"); + GazeboRosCameraUtils::PublishCameraInfo(); + + if (this->depth_info_connect_count_ > 0) + { + common::Time sensor_update_time = this->parentSensor_->LastMeasurementTime(); + + this->sensor_update_time_ = sensor_update_time; + if (sensor_update_time - this->last_depth_image_camera_info_update_time_ >= this->update_period_) + { + this->PublishCameraInfo(this->depth_image_camera_info_pub_); // , sensor_update_time); + this->last_depth_image_camera_info_update_time_ = sensor_update_time; + } + } +} + +//@todo: publish disparity similar to openni_camera_deprecated/src/nodelets/openni_nodelet.cpp. +/* +#include +pub_disparity_ = comm_nh.advertise ("depth/disparity", 5, subscriberChanged2, subscriberChanged2); + +void GazeboRosDepthCamera::PublishDisparityImage(const DepthImage& depth, ros::Time time) +{ + stereo_msgs::DisparityImagePtr disp_msg = boost::make_shared (); + disp_msg->header.stamp = time; + disp_msg->header.frame_id = device_->isDepthRegistered () ? rgb_frame_id_ : depth_frame_id_; + disp_msg->image.header = disp_msg->header; + disp_msg->image.encoding = sensor_msgs::image_encodings::TYPE_32FC1; + disp_msg->image.height = depth_height_; + disp_msg->image.width = depth_width_; + disp_msg->image.step = disp_msg->image.width * sizeof (float); + disp_msg->image.data.resize (disp_msg->image.height * disp_msg->image.step); + disp_msg->T = depth.getBaseline (); + disp_msg->f = depth.getFocalLength () * depth_width_ / depth.getWidth (); + + /// @todo Compute these values from DepthGenerator::GetDeviceMaxDepth() and the like + disp_msg->min_disparity = 0.0; + disp_msg->max_disparity = disp_msg->T * disp_msg->f / 0.3; + disp_msg->delta_d = 0.125; + + depth.fillDisparityImage (depth_width_, depth_height_, reinterpret_cast(&disp_msg->image.data[0]), disp_msg->image.step); + + pub_disparity_.publish (disp_msg); +} +*/ + + +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_diff_drive.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_diff_drive.cpp new file mode 100755 index 0000000..f9e9e27 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_diff_drive.cpp @@ -0,0 +1,493 @@ +/* + Copyright (c) 2010, Daniel Hewlett, Antons Rebguns + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY Antons Rebguns ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL Antons Rebguns BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +/* + * \file gazebo_ros_diff_drive.cpp + * + * \brief A differential drive plugin for gazebo. Based on the diffdrive plugin + * developed for the erratic robot (see copyright notice above). The original + * plugin can be found in the ROS package gazebo_erratic_plugins. + * + * \author Piyush Khandelwal (piyushk@gmail.com) + * + * $ Id: 06/21/2013 11:23:40 AM piyushk $ + */ + + +/* + * + * The support of acceleration limit was added by + * \author George Todoran + * \author Markus Bader + * \date 22th of May 2014 + */ + +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include + +namespace gazebo +{ + +enum { + RIGHT, + LEFT, +}; + +GazeboRosDiffDrive::GazeboRosDiffDrive() {} + +// Destructor +GazeboRosDiffDrive::~GazeboRosDiffDrive() {} + +// Load the controller +void GazeboRosDiffDrive::Load ( physics::ModelPtr _parent, sdf::ElementPtr _sdf ) +{ + + this->parent = _parent; + gazebo_ros_ = GazeboRosPtr ( new GazeboRos ( _parent, _sdf, "DiffDrive" ) ); + // Make sure the ROS node for Gazebo has already been initialized + gazebo_ros_->isInitialized(); + + gazebo_ros_->getParameter ( command_topic_, "commandTopic", "cmd_vel" ); + gazebo_ros_->getParameter ( odometry_topic_, "odometryTopic", "odom" ); + gazebo_ros_->getParameter ( odometry_frame_, "odometryFrame", "odom" ); + gazebo_ros_->getParameter ( robot_base_frame_, "robotBaseFrame", "base_footprint" ); + gazebo_ros_->getParameterBoolean ( publishWheelTF_, "publishWheelTF", false ); + gazebo_ros_->getParameterBoolean ( publishWheelJointState_, "publishWheelJointState", false ); + gazebo_ros_->getParameterBoolean ( legacy_mode_, "legacyMode", true ); + + if (!_sdf->HasElement("legacyMode")) + { + ROS_ERROR_NAMED("diff_drive", "GazeboRosDiffDrive Plugin missing , defaults to true\n" + "This setting assumes you have a old package, where the right and left wheel are changed to fix a former code issue\n" + "To get rid of this error just set to false if you just created a new package.\n" + "To fix an old package you have to exchange left wheel by the right wheel.\n" + "If you do not want to fix this issue in an old package or your z axis points down instead of the ROS standard defined in REP 103\n" + "just set to true.\n" + ); + } + + gazebo_ros_->getParameter ( wheel_separation_, "wheelSeparation", 0.34 ); + gazebo_ros_->getParameter ( wheel_diameter_, "wheelDiameter", 0.15 ); + gazebo_ros_->getParameter ( wheel_accel, "wheelAcceleration", 0.0 ); + gazebo_ros_->getParameter ( wheel_torque, "wheelTorque", 5.0 ); + gazebo_ros_->getParameter ( update_rate_, "updateRate", 100.0 ); + std::map odomOptions; + odomOptions["encoder"] = ENCODER; + odomOptions["world"] = WORLD; + gazebo_ros_->getParameter ( odom_source_, "odometrySource", odomOptions, WORLD ); + + + joints_.resize ( 2 ); + joints_[LEFT] = gazebo_ros_->getJoint ( parent, "leftJoint", "left_joint" ); + joints_[RIGHT] = gazebo_ros_->getJoint ( parent, "rightJoint", "right_joint" ); + joints_[LEFT]->SetParam ( "fmax", 0, wheel_torque ); + joints_[RIGHT]->SetParam ( "fmax", 0, wheel_torque ); + + + + this->publish_tf_ = true; + if (!_sdf->HasElement("publishTf")) { + ROS_WARN_NAMED("diff_drive", "GazeboRosDiffDrive Plugin (ns = %s) missing , defaults to %d", + this->robot_namespace_.c_str(), this->publish_tf_); + } else { + this->publish_tf_ = _sdf->GetElement("publishTf")->Get(); + } + + // Initialize update rate stuff + if ( this->update_rate_ > 0.0 ) this->update_period_ = 1.0 / this->update_rate_; + else this->update_period_ = 0.0; +#if GAZEBO_MAJOR_VERSION >= 8 + last_update_time_ = parent->GetWorld()->SimTime(); +#else + last_update_time_ = parent->GetWorld()->GetSimTime(); +#endif + + // Initialize velocity stuff + wheel_speed_[RIGHT] = 0; + wheel_speed_[LEFT] = 0; + + // Initialize velocity support stuff + wheel_speed_instr_[RIGHT] = 0; + wheel_speed_instr_[LEFT] = 0; + + x_ = 0; + rot_ = 0; + alive_ = true; + + + if (this->publishWheelJointState_) + { + joint_state_publisher_ = gazebo_ros_->node()->advertise("joint_states", 1000); + ROS_INFO_NAMED("diff_drive", "%s: Advertise joint_states", gazebo_ros_->info()); + } + + transform_broadcaster_ = boost::shared_ptr(new tf::TransformBroadcaster()); + + // ROS: Subscribe to the velocity command topic (usually "cmd_vel") + ROS_INFO_NAMED("diff_drive", "%s: Try to subscribe to %s", gazebo_ros_->info(), command_topic_.c_str()); + + ros::SubscribeOptions so = + ros::SubscribeOptions::create(command_topic_, 1, + boost::bind(&GazeboRosDiffDrive::cmdVelCallback, this, _1), + ros::VoidPtr(), &queue_); + + cmd_vel_subscriber_ = gazebo_ros_->node()->subscribe(so); + ROS_INFO_NAMED("diff_drive", "%s: Subscribe to %s", gazebo_ros_->info(), command_topic_.c_str()); + + if (this->publish_tf_) + { + odometry_publisher_ = gazebo_ros_->node()->advertise(odometry_topic_, 1); + ROS_INFO_NAMED("diff_drive", "%s: Advertise odom on %s ", gazebo_ros_->info(), odometry_topic_.c_str()); + } + + // start custom queue for diff drive + this->callback_queue_thread_ = + boost::thread ( boost::bind ( &GazeboRosDiffDrive::QueueThread, this ) ); + + // listen to the update event (broadcast every simulation iteration) + this->update_connection_ = + event::Events::ConnectWorldUpdateBegin ( boost::bind ( &GazeboRosDiffDrive::UpdateChild, this ) ); + +} + +void GazeboRosDiffDrive::Reset() +{ +#if GAZEBO_MAJOR_VERSION >= 8 + last_update_time_ = parent->GetWorld()->SimTime(); +#else + last_update_time_ = parent->GetWorld()->GetSimTime(); +#endif + pose_encoder_.x = 0; + pose_encoder_.y = 0; + pose_encoder_.theta = 0; + x_ = 0; + rot_ = 0; + joints_[LEFT]->SetParam ( "fmax", 0, wheel_torque ); + joints_[RIGHT]->SetParam ( "fmax", 0, wheel_torque ); +} + +void GazeboRosDiffDrive::publishWheelJointState() +{ + ros::Time current_time = ros::Time::now(); + + joint_state_.header.stamp = current_time; + joint_state_.name.resize ( joints_.size() ); + joint_state_.position.resize ( joints_.size() ); + + for ( int i = 0; i < 2; i++ ) { + physics::JointPtr joint = joints_[i]; +#if GAZEBO_MAJOR_VERSION >= 8 + double position = joint->Position ( 0 ); +#else + double position = joint->GetAngle ( 0 ).Radian(); +#endif + joint_state_.name[i] = joint->GetName(); + joint_state_.position[i] = position; + } + joint_state_publisher_.publish ( joint_state_ ); +} + +void GazeboRosDiffDrive::publishWheelTF() +{ + ros::Time current_time = ros::Time::now(); + for ( int i = 0; i < 2; i++ ) { + + std::string wheel_frame = gazebo_ros_->resolveTF(joints_[i]->GetChild()->GetName ()); + std::string wheel_parent_frame = gazebo_ros_->resolveTF(joints_[i]->GetParent()->GetName ()); + +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d poseWheel = joints_[i]->GetChild()->RelativePose(); +#else + ignition::math::Pose3d poseWheel = joints_[i]->GetChild()->GetRelativePose().Ign(); +#endif + + tf::Quaternion qt ( poseWheel.Rot().X(), poseWheel.Rot().Y(), poseWheel.Rot().Z(), poseWheel.Rot().W() ); + tf::Vector3 vt ( poseWheel.Pos().X(), poseWheel.Pos().Y(), poseWheel.Pos().Z() ); + + tf::Transform tfWheel ( qt, vt ); + transform_broadcaster_->sendTransform ( + tf::StampedTransform ( tfWheel, current_time, wheel_parent_frame, wheel_frame ) ); + } +} + +// Update the controller +void GazeboRosDiffDrive::UpdateChild() +{ + + /* force reset SetParam("fmax") since Joint::Reset reset MaxForce to zero at + https://bitbucket.org/osrf/gazebo/src/8091da8b3c529a362f39b042095e12c94656a5d1/gazebo/physics/Joint.cc?at=gazebo2_2.2.5#cl-331 + (this has been solved in https://bitbucket.org/osrf/gazebo/diff/gazebo/physics/Joint.cc?diff2=b64ff1b7b6ff&at=issue_964 ) + and Joint::Reset is called after ModelPlugin::Reset, so we need to set maxForce to wheel_torque other than GazeboRosDiffDrive::Reset + (this seems to be solved in https://bitbucket.org/osrf/gazebo/commits/ec8801d8683160eccae22c74bf865d59fac81f1e) + */ + for ( int i = 0; i < 2; i++ ) { + if ( fabs(wheel_torque -joints_[i]->GetParam ( "fmax", 0 )) > 1e-6 ) { + joints_[i]->SetParam ( "fmax", 0, wheel_torque ); + } + } + + + if ( odom_source_ == ENCODER ) UpdateOdometryEncoder(); +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time current_time = parent->GetWorld()->SimTime(); +#else + common::Time current_time = parent->GetWorld()->GetSimTime(); +#endif + double seconds_since_last_update = ( current_time - last_update_time_ ).Double(); + + if ( seconds_since_last_update > update_period_ ) { + if (this->publish_tf_) publishOdometry ( seconds_since_last_update ); + if ( publishWheelTF_ ) publishWheelTF(); + if ( publishWheelJointState_ ) publishWheelJointState(); + + // Update robot in case new velocities have been requested + getWheelVelocities(); + + double current_speed[2]; + + current_speed[LEFT] = joints_[LEFT]->GetVelocity ( 0 ) * ( wheel_diameter_ / 2.0 ); + current_speed[RIGHT] = joints_[RIGHT]->GetVelocity ( 0 ) * ( wheel_diameter_ / 2.0 ); + + if ( wheel_accel == 0 || + ( fabs ( wheel_speed_[LEFT] - current_speed[LEFT] ) < 0.01 ) || + ( fabs ( wheel_speed_[RIGHT] - current_speed[RIGHT] ) < 0.01 ) ) { + //if max_accel == 0, or target speed is reached + joints_[LEFT]->SetParam ( "vel", 0, wheel_speed_[LEFT]/ ( wheel_diameter_ / 2.0 ) ); + joints_[RIGHT]->SetParam ( "vel", 0, wheel_speed_[RIGHT]/ ( wheel_diameter_ / 2.0 ) ); + } else { + if ( wheel_speed_[LEFT]>=current_speed[LEFT] ) + wheel_speed_instr_[LEFT]+=fmin ( wheel_speed_[LEFT]-current_speed[LEFT], wheel_accel * seconds_since_last_update ); + else + wheel_speed_instr_[LEFT]+=fmax ( wheel_speed_[LEFT]-current_speed[LEFT], -wheel_accel * seconds_since_last_update ); + + if ( wheel_speed_[RIGHT]>current_speed[RIGHT] ) + wheel_speed_instr_[RIGHT]+=fmin ( wheel_speed_[RIGHT]-current_speed[RIGHT], wheel_accel * seconds_since_last_update ); + else + wheel_speed_instr_[RIGHT]+=fmax ( wheel_speed_[RIGHT]-current_speed[RIGHT], -wheel_accel * seconds_since_last_update ); + + // ROS_INFO_NAMED("diff_drive", "actual wheel speed = %lf, issued wheel speed= %lf", current_speed[LEFT], wheel_speed_[LEFT]); + // ROS_INFO_NAMED("diff_drive", "actual wheel speed = %lf, issued wheel speed= %lf", current_speed[RIGHT],wheel_speed_[RIGHT]); + + joints_[LEFT]->SetParam ( "vel", 0, wheel_speed_instr_[LEFT] / ( wheel_diameter_ / 2.0 ) ); + joints_[RIGHT]->SetParam ( "vel", 0, wheel_speed_instr_[RIGHT] / ( wheel_diameter_ / 2.0 ) ); + } + last_update_time_+= common::Time ( update_period_ ); + } +} + +// Finalize the controller +void GazeboRosDiffDrive::FiniChild() +{ + alive_ = false; + queue_.clear(); + queue_.disable(); + gazebo_ros_->node()->shutdown(); + callback_queue_thread_.join(); +} + +void GazeboRosDiffDrive::getWheelVelocities() +{ + boost::mutex::scoped_lock scoped_lock ( lock ); + + double vr = x_; + double va = rot_; + + if(legacy_mode_) + { + wheel_speed_[LEFT] = vr + va * wheel_separation_ / 2.0; + wheel_speed_[RIGHT] = vr - va * wheel_separation_ / 2.0; + } + else + { + wheel_speed_[LEFT] = vr - va * wheel_separation_ / 2.0; + wheel_speed_[RIGHT] = vr + va * wheel_separation_ / 2.0; + } +} + +void GazeboRosDiffDrive::cmdVelCallback ( const geometry_msgs::Twist::ConstPtr& cmd_msg ) +{ + boost::mutex::scoped_lock scoped_lock ( lock ); + x_ = cmd_msg->linear.x; + rot_ = cmd_msg->angular.z; +} + +void GazeboRosDiffDrive::QueueThread() +{ + static const double timeout = 0.01; + + while ( alive_ && gazebo_ros_->node()->ok() ) { + queue_.callAvailable ( ros::WallDuration ( timeout ) ); + } +} + +void GazeboRosDiffDrive::UpdateOdometryEncoder() +{ + double vl = joints_[LEFT]->GetVelocity ( 0 ); + double vr = joints_[RIGHT]->GetVelocity ( 0 ); +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time current_time = parent->GetWorld()->SimTime(); +#else + common::Time current_time = parent->GetWorld()->GetSimTime(); +#endif + double seconds_since_last_update = ( current_time - last_odom_update_ ).Double(); + last_odom_update_ = current_time; + + double b = wheel_separation_; + + // Book: Sigwart 2011 Autonompus Mobile Robots page:337 + double sl = vl * ( wheel_diameter_ / 2.0 ) * seconds_since_last_update; + double sr = vr * ( wheel_diameter_ / 2.0 ) * seconds_since_last_update; + double ssum = sl + sr; + + double sdiff; + if(legacy_mode_) + { + sdiff = sl - sr; + } + else + { + + sdiff = sr - sl; + } + + double dx = ( ssum ) /2.0 * cos ( pose_encoder_.theta + ( sdiff ) / ( 2.0*b ) ); + double dy = ( ssum ) /2.0 * sin ( pose_encoder_.theta + ( sdiff ) / ( 2.0*b ) ); + double dtheta = ( sdiff ) /b; + + pose_encoder_.x += dx; + pose_encoder_.y += dy; + pose_encoder_.theta += dtheta; + + double w = dtheta/seconds_since_last_update; + double v = sqrt ( dx*dx+dy*dy ) /seconds_since_last_update; + + tf::Quaternion qt; + tf::Vector3 vt; + qt.setRPY ( 0,0,pose_encoder_.theta ); + vt = tf::Vector3 ( pose_encoder_.x, pose_encoder_.y, 0 ); + + odom_.pose.pose.position.x = vt.x(); + odom_.pose.pose.position.y = vt.y(); + odom_.pose.pose.position.z = vt.z(); + + odom_.pose.pose.orientation.x = qt.x(); + odom_.pose.pose.orientation.y = qt.y(); + odom_.pose.pose.orientation.z = qt.z(); + odom_.pose.pose.orientation.w = qt.w(); + + odom_.twist.twist.angular.z = w; + odom_.twist.twist.linear.x = dx/seconds_since_last_update; + odom_.twist.twist.linear.y = dy/seconds_since_last_update; +} + +void GazeboRosDiffDrive::publishOdometry ( double step_time ) +{ + + ros::Time current_time = ros::Time::now(); + std::string odom_frame = gazebo_ros_->resolveTF ( odometry_frame_ ); + std::string base_footprint_frame = gazebo_ros_->resolveTF ( robot_base_frame_ ); + + tf::Quaternion qt; + tf::Vector3 vt; + + if ( odom_source_ == ENCODER ) { + // getting data form encoder integration + qt = tf::Quaternion ( odom_.pose.pose.orientation.x, odom_.pose.pose.orientation.y, odom_.pose.pose.orientation.z, odom_.pose.pose.orientation.w ); + vt = tf::Vector3 ( odom_.pose.pose.position.x, odom_.pose.pose.position.y, odom_.pose.pose.position.z ); + + } + if ( odom_source_ == WORLD ) { + // getting data from gazebo world +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d pose = parent->WorldPose(); +#else + ignition::math::Pose3d pose = parent->GetWorldPose().Ign(); +#endif + qt = tf::Quaternion ( pose.Rot().X(), pose.Rot().Y(), pose.Rot().Z(), pose.Rot().W() ); + vt = tf::Vector3 ( pose.Pos().X(), pose.Pos().Y(), pose.Pos().Z() ); + + odom_.pose.pose.position.x = vt.x(); + odom_.pose.pose.position.y = vt.y(); + odom_.pose.pose.position.z = vt.z(); + + odom_.pose.pose.orientation.x = qt.x(); + odom_.pose.pose.orientation.y = qt.y(); + odom_.pose.pose.orientation.z = qt.z(); + odom_.pose.pose.orientation.w = qt.w(); + + // get velocity in /odom frame + ignition::math::Vector3d linear; +#if GAZEBO_MAJOR_VERSION >= 8 + linear = parent->WorldLinearVel(); + odom_.twist.twist.angular.z = parent->WorldAngularVel().Z(); +#else + linear = parent->GetWorldLinearVel().Ign(); + odom_.twist.twist.angular.z = parent->GetWorldAngularVel().Ign().Z(); +#endif + + // convert velocity to child_frame_id (aka base_footprint) + float yaw = pose.Rot().Yaw(); + odom_.twist.twist.linear.x = cosf ( yaw ) * linear.X() + sinf ( yaw ) * linear.Y(); + odom_.twist.twist.linear.y = cosf ( yaw ) * linear.Y() - sinf ( yaw ) * linear.X(); + } + + tf::Transform base_footprint_to_odom ( qt, vt ); + transform_broadcaster_->sendTransform ( + tf::StampedTransform ( base_footprint_to_odom, current_time, + odom_frame, base_footprint_frame ) ); + + + // set covariance + odom_.pose.covariance[0] = 0.00001; + odom_.pose.covariance[7] = 0.00001; + odom_.pose.covariance[14] = 1000000000000.0; + odom_.pose.covariance[21] = 1000000000000.0; + odom_.pose.covariance[28] = 1000000000000.0; + odom_.pose.covariance[35] = 0.001; + + + // set header + odom_.header.stamp = current_time; + odom_.header.frame_id = odom_frame; + odom_.child_frame_id = base_footprint_frame; + + odometry_publisher_.publish ( odom_ ); +} + +GZ_REGISTER_MODEL_PLUGIN ( GazeboRosDiffDrive ) +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_elevator.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_elevator.cpp new file mode 100755 index 0000000..080d8fb --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_elevator.cpp @@ -0,0 +1,92 @@ +/* + * Copyright 2015 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +#include "gazebo_plugins/gazebo_ros_elevator.h" + +using namespace gazebo; + +GZ_REGISTER_MODEL_PLUGIN(GazeboRosElevator); + +///////////////////////////////////////////////// +GazeboRosElevator::GazeboRosElevator() +{ +} + +///////////////////////////////////////////////// +GazeboRosElevator::~GazeboRosElevator() +{ + this->queue_.clear(); + this->queue_.disable(); + this->rosnode_->shutdown(); + this->callbackQueueThread_.join(); + + delete this->rosnode_; +} + +///////////////////////////////////////////////// +void GazeboRosElevator::Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf) +{ + // load parameters + this->robotNamespace_ = ""; + if (_sdf->HasElement("robotNamespace")) + { + this->robotNamespace_ = _sdf->GetElement( + "robotNamespace")->Get() + "/"; + } + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("elevator", "A ROS node for Gazebo has not been initialized," + << "unable to load plugin. Load the Gazebo system plugin " + << "'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + std::string topic = "elevator"; + if (_sdf->HasElement("topic")) + topic = _sdf->Get("topic"); + + ElevatorPlugin::Load(_parent, _sdf); + + this->rosnode_ = new ros::NodeHandle(this->robotNamespace_); + + ros::SubscribeOptions so = + ros::SubscribeOptions::create(topic, 1, + boost::bind(&GazeboRosElevator::OnElevator, this, _1), + ros::VoidPtr(), &this->queue_); + + this->elevatorSub_ = this->rosnode_->subscribe(so); + + // start custom queue for elevator + this->callbackQueueThread_ = + boost::thread(boost::bind(&GazeboRosElevator::QueueThread, this)); +} + +///////////////////////////////////////////////// +void GazeboRosElevator::OnElevator(const std_msgs::String::ConstPtr &_msg) +{ + this->MoveToFloor(std::stoi(_msg->data)); +} + +///////////////////////////////////////////////// +void GazeboRosElevator::QueueThread() +{ + static const double timeout = 0.01; + + while (this->rosnode_->ok()) + this->queue_.callAvailable(ros::WallDuration(timeout)); +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_f3d.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_f3d.cpp new file mode 100755 index 0000000..22f9f99 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_f3d.cpp @@ -0,0 +1,200 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + Desc: Force Feed Back Ground Truth + Author: Sachin Chitta and John Hsu + Date: 1 June 2008 + */ + +#include +#include + +namespace gazebo +{ +GZ_REGISTER_MODEL_PLUGIN(GazeboRosF3D); + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosF3D::GazeboRosF3D() +{ + this->f3d_connect_count_ = 0; +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosF3D::~GazeboRosF3D() +{ + this->update_connection_.reset(); + // Custom Callback Queue + this->queue_.clear(); + this->queue_.disable(); + this->rosnode_->shutdown(); + this->callback_queue_thread_.join(); + delete this->rosnode_; +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosF3D::Load( physics::ModelPtr _parent, sdf::ElementPtr _sdf ) +{ + // Get the world name. + this->world_ = _parent->GetWorld(); + + // load parameters + this->robot_namespace_ = ""; + if (_sdf->HasElement("robotNamespace")) + this->robot_namespace_ = _sdf->GetElement("robotNamespace")->Get() + "/"; + + if (!_sdf->HasElement("bodyName")) + { + ROS_FATAL_NAMED("f3d", "f3d plugin missing , cannot proceed"); + return; + } + else + this->link_name_ = _sdf->GetElement("bodyName")->Get(); + + this->link_ = _parent->GetLink(this->link_name_); + if (!this->link_) + { + ROS_FATAL_NAMED("f3d", "gazebo_ros_f3d plugin error: bodyName: %s does not exist\n",this->link_name_.c_str()); + return; + } + + if (!_sdf->HasElement("topicName")) + { + ROS_FATAL_NAMED("f3d", "f3d plugin missing , cannot proceed"); + return; + } + else + this->topic_name_ = _sdf->GetElement("topicName")->Get(); + + if (!_sdf->HasElement("frameName")) + { + ROS_INFO_NAMED("f3d", "f3d plugin missing , defaults to world"); + this->frame_name_ = "world"; + } + else + { + this->frame_name_ = _sdf->GetElement("frameName")->Get(); + // todo: frameName not used + ROS_INFO_NAMED("f3d", "f3d plugin specifies [%s], not used, default to world",this->frame_name_.c_str()); + } + + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("f3d", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + this->rosnode_ = new ros::NodeHandle(this->robot_namespace_); + + // resolve tf prefix + std::string prefix; + this->rosnode_->getParam(std::string("tf_prefix"), prefix); + this->frame_name_ = tf::resolve(prefix, this->frame_name_); + + // Custom Callback Queue + ros::AdvertiseOptions ao = ros::AdvertiseOptions::create( + this->topic_name_,1, + boost::bind( &GazeboRosF3D::F3DConnect,this), + boost::bind( &GazeboRosF3D::F3DDisconnect,this), ros::VoidPtr(), &this->queue_); + this->pub_ = this->rosnode_->advertise(ao); + + // Custom Callback Queue + this->callback_queue_thread_ = boost::thread( boost::bind( &GazeboRosF3D::QueueThread,this ) ); + + // New Mechanism for Updating every World Cycle + // Listen to the update event. This event is broadcast every + // simulation iteration. + this->update_connection_ = event::Events::ConnectWorldUpdateBegin( + boost::bind(&GazeboRosF3D::UpdateChild, this)); +} + +//////////////////////////////////////////////////////////////////////////////// +// Someone subscribes to me +void GazeboRosF3D::F3DConnect() +{ + this->f3d_connect_count_++; +} + +//////////////////////////////////////////////////////////////////////////////// +// Someone subscribes to me +void GazeboRosF3D::F3DDisconnect() +{ + this->f3d_connect_count_--; +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosF3D::UpdateChild() +{ + if (this->f3d_connect_count_ == 0) + return; + + ignition::math::Vector3d torque; + ignition::math::Vector3d force; + + // get force and torque on body +#if GAZEBO_MAJOR_VERSION >= 8 + force = this->link_->WorldForce(); + torque = this->link_->WorldTorque(); +#else + force = this->link_->GetWorldForce().Ign(); + torque = this->link_->GetWorldTorque().Ign(); +#endif + + this->lock_.lock(); + // copy data into wrench message + this->wrench_msg_.header.frame_id = this->frame_name_; +#if GAZEBO_MAJOR_VERSION >= 8 + this->wrench_msg_.header.stamp.sec = (this->world_->SimTime()).sec; + this->wrench_msg_.header.stamp.nsec = (this->world_->SimTime()).nsec; +#else + this->wrench_msg_.header.stamp.sec = (this->world_->GetSimTime()).sec; + this->wrench_msg_.header.stamp.nsec = (this->world_->GetSimTime()).nsec; +#endif + + this->wrench_msg_.wrench.force.x = force.X(); + this->wrench_msg_.wrench.force.y = force.Y(); + this->wrench_msg_.wrench.force.z = force.Z(); + this->wrench_msg_.wrench.torque.x = torque.X(); + this->wrench_msg_.wrench.torque.y = torque.Y(); + this->wrench_msg_.wrench.torque.z = torque.Z(); + + this->pub_.publish(this->wrench_msg_); + this->lock_.unlock(); + +} + +// Custom Callback Queue +//////////////////////////////////////////////////////////////////////////////// +// custom callback queue thread +void GazeboRosF3D::QueueThread() +{ + static const double timeout = 0.01; + + while (this->rosnode_->ok()) + { + this->queue_.callAvailable(ros::WallDuration(timeout)); + } +} + +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_force.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_force.cpp new file mode 100755 index 0000000..769f14e --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_force.cpp @@ -0,0 +1,160 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + Desc: GazeboRosForce plugin for manipulating objects in Gazebo + Author: John Hsu + Date: 24 Sept 2008 + */ + +#include +#include + +#include + +namespace gazebo +{ +GZ_REGISTER_MODEL_PLUGIN(GazeboRosForce); + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosForce::GazeboRosForce() +{ + this->wrench_msg_.force.x = 0; + this->wrench_msg_.force.y = 0; + this->wrench_msg_.force.z = 0; + this->wrench_msg_.torque.x = 0; + this->wrench_msg_.torque.y = 0; + this->wrench_msg_.torque.z = 0; +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosForce::~GazeboRosForce() +{ + this->update_connection_.reset(); + + // Custom Callback Queue + this->queue_.clear(); + this->queue_.disable(); + this->rosnode_->shutdown(); + this->callback_queue_thread_.join(); + + delete this->rosnode_; +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosForce::Load(physics::ModelPtr _model, sdf::ElementPtr _sdf) +{ + // Get the world name. + this->world_ = _model->GetWorld(); + + // load parameters + this->robot_namespace_ = ""; + if (_sdf->HasElement("robotNamespace")) + this->robot_namespace_ = _sdf->GetElement("robotNamespace")->Get() + "/"; + + if (!_sdf->HasElement("bodyName")) + { + ROS_FATAL_NAMED("force", "force plugin missing , cannot proceed"); + return; + } + else + this->link_name_ = _sdf->GetElement("bodyName")->Get(); + + this->link_ = _model->GetLink(this->link_name_); + if (!this->link_) + { + ROS_FATAL_NAMED("force", "gazebo_ros_force plugin error: link named: %s does not exist\n",this->link_name_.c_str()); + return; + } + + if (!_sdf->HasElement("topicName")) + { + ROS_FATAL_NAMED("force", "force plugin missing , cannot proceed"); + return; + } + else + this->topic_name_ = _sdf->GetElement("topicName")->Get(); + + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("force", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + this->rosnode_ = new ros::NodeHandle(this->robot_namespace_); + + // Custom Callback Queue + ros::SubscribeOptions so = ros::SubscribeOptions::create( + this->topic_name_,1, + boost::bind( &GazeboRosForce::UpdateObjectForce,this,_1), + ros::VoidPtr(), &this->queue_); + this->sub_ = this->rosnode_->subscribe(so); + + // Custom Callback Queue + this->callback_queue_thread_ = boost::thread( boost::bind( &GazeboRosForce::QueueThread,this ) ); + + // New Mechanism for Updating every World Cycle + // Listen to the update event. This event is broadcast every + // simulation iteration. + this->update_connection_ = event::Events::ConnectWorldUpdateBegin( + boost::bind(&GazeboRosForce::UpdateChild, this)); +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosForce::UpdateObjectForce(const geometry_msgs::Wrench::ConstPtr& _msg) +{ + this->wrench_msg_.force.x = _msg->force.x; + this->wrench_msg_.force.y = _msg->force.y; + this->wrench_msg_.force.z = _msg->force.z; + this->wrench_msg_.torque.x = _msg->torque.x; + this->wrench_msg_.torque.y = _msg->torque.y; + this->wrench_msg_.torque.z = _msg->torque.z; +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosForce::UpdateChild() +{ + this->lock_.lock(); + ignition::math::Vector3d force(this->wrench_msg_.force.x,this->wrench_msg_.force.y,this->wrench_msg_.force.z); + ignition::math::Vector3d torque(this->wrench_msg_.torque.x,this->wrench_msg_.torque.y,this->wrench_msg_.torque.z); + this->link_->AddForce(force); + this->link_->AddTorque(torque); + this->lock_.unlock(); +} + +// Custom Callback Queue +//////////////////////////////////////////////////////////////////////////////// +// custom callback queue thread +void GazeboRosForce::QueueThread() +{ + static const double timeout = 0.01; + + while (this->rosnode_->ok()) + { + this->queue_.callAvailable(ros::WallDuration(timeout)); + } +} + +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_ft_sensor.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_ft_sensor.cpp new file mode 100755 index 0000000..586b998 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_ft_sensor.cpp @@ -0,0 +1,255 @@ +/* + * Copyright (C) 2012-2014 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + * Desc: Force Torque Sensor Plugin + * Author: Francisco Suarez-Ruiz + * Date: 5 June 2014 + */ + +#include +#include + +namespace gazebo +{ +GZ_REGISTER_MODEL_PLUGIN(GazeboRosFT); + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosFT::GazeboRosFT() +{ + this->ft_connect_count_ = 0; + this->seed = 0; +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosFT::~GazeboRosFT() +{ + this->update_connection_.reset(); + // Custom Callback Queue + this->queue_.clear(); + this->queue_.disable(); + this->rosnode_->shutdown(); + this->callback_queue_thread_.join(); + delete this->rosnode_; +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosFT::Load( physics::ModelPtr _model, sdf::ElementPtr _sdf ) +{ + // Save pointers + this->model_ = _model; + this->world_ = this->model_->GetWorld(); + + // load parameters + this->robot_namespace_ = ""; + if (_sdf->HasElement("robotNamespace")) + this->robot_namespace_ = _sdf->GetElement("robotNamespace")->Get() + "/"; + + if (!_sdf->HasElement("jointName")) + { + ROS_FATAL_NAMED("ft_sensor", "ft_sensor plugin missing , cannot proceed"); + return; + } + else + this->joint_name_ = _sdf->GetElement("jointName")->Get(); + + this->joint_ = this->model_->GetJoint(this->joint_name_); + if (!this->joint_) + { + ROS_FATAL_NAMED("ft_sensor", "gazebo_ros_ft_sensor plugin error: jointName: %s does not exist\n",this->joint_name_.c_str()); + return; + } + + this->parent_link_ = this->joint_->GetParent(); + this->child_link_ = this->joint_->GetChild(); + this->frame_name_ = this->child_link_->GetName(); + + ROS_INFO_NAMED("ft_sensor", "ft_sensor plugin reporting wrench values to the frame [%s]", this->frame_name_.c_str()); + + if (!_sdf->HasElement("topicName")) + { + ROS_FATAL_NAMED("ft_sensor", "ft_sensor plugin missing , cannot proceed"); + return; + } + else + this->topic_name_ = _sdf->GetElement("topicName")->Get(); + + if (!_sdf->HasElement("gaussianNoise")) + { + ROS_INFO_NAMED("ft_sensor", "imu plugin missing , defaults to 0.0"); + this->gaussian_noise_ = 0.0; + } + else + this->gaussian_noise_ = _sdf->Get("gaussianNoise"); + + if (!_sdf->HasElement("updateRate")) + { + ROS_DEBUG_NAMED("ft_sensor", "ft_sensor plugin missing , defaults to 0.0" + " (as fast as possible)"); + this->update_rate_ = 0; + } + else + this->update_rate_ = _sdf->GetElement("updateRate")->Get(); + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("ft_sensor", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + this->rosnode_ = new ros::NodeHandle(this->robot_namespace_); + + // resolve tf prefix + std::string prefix; + this->rosnode_->getParam(std::string("tf_prefix"), prefix); + this->frame_name_ = tf::resolve(prefix, this->frame_name_); + + // Custom Callback Queue + ros::AdvertiseOptions ao = ros::AdvertiseOptions::create( + this->topic_name_,1, + boost::bind( &GazeboRosFT::FTConnect,this), + boost::bind( &GazeboRosFT::FTDisconnect,this), ros::VoidPtr(), &this->queue_); + this->pub_ = this->rosnode_->advertise(ao); + + // Custom Callback Queue + this->callback_queue_thread_ = boost::thread( boost::bind( &GazeboRosFT::QueueThread,this ) ); + + // New Mechanism for Updating every World Cycle + // Listen to the update event. This event is broadcast every + // simulation iteration. + this->update_connection_ = event::Events::ConnectWorldUpdateBegin( + boost::bind(&GazeboRosFT::UpdateChild, this)); +} + +//////////////////////////////////////////////////////////////////////////////// +// Someone subscribes to me +void GazeboRosFT::FTConnect() +{ + this->ft_connect_count_++; +} + +//////////////////////////////////////////////////////////////////////////////// +// Someone subscribes to me +void GazeboRosFT::FTDisconnect() +{ + this->ft_connect_count_--; +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosFT::UpdateChild() +{ +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time cur_time = this->world_->SimTime(); +#else + common::Time cur_time = this->world_->GetSimTime(); +#endif + + // rate control + if (this->update_rate_ > 0 && + (cur_time-this->last_time_).Double() < (1.0/this->update_rate_)) + return; + + if (this->ft_connect_count_ == 0) + return; + + physics::JointWrench wrench; + ignition::math::Vector3d torque; + ignition::math::Vector3d force; + + // FIXME: Should include options for diferent frames and measure directions + // E.g: https://bitbucket.org/osrf/gazebo/raw/default/gazebo/sensors/ForceTorqueSensor.hh + // Get force torque at the joint + // The wrench is reported in the CHILD + // The is child_to_parent + wrench = this->joint_->GetForceTorque(0); +#if GAZEBO_MAJOR_VERSION >= 8 + force = wrench.body2Force; + torque = wrench.body2Torque; +#else + force = wrench.body2Force.Ign(); + torque = wrench.body2Torque.Ign(); +#endif + + + this->lock_.lock(); + // copy data into wrench message + this->wrench_msg_.header.frame_id = this->frame_name_; +#if GAZEBO_MAJOR_VERSION >= 8 + this->wrench_msg_.header.stamp.sec = (this->world_->SimTime()).sec; + this->wrench_msg_.header.stamp.nsec = (this->world_->SimTime()).nsec; +#else + this->wrench_msg_.header.stamp.sec = (this->world_->GetSimTime()).sec; + this->wrench_msg_.header.stamp.nsec = (this->world_->GetSimTime()).nsec; +#endif + + this->wrench_msg_.wrench.force.x = force.X() + this->GaussianKernel(0, this->gaussian_noise_); + this->wrench_msg_.wrench.force.y = force.Y() + this->GaussianKernel(0, this->gaussian_noise_); + this->wrench_msg_.wrench.force.z = force.Z() + this->GaussianKernel(0, this->gaussian_noise_); + this->wrench_msg_.wrench.torque.x = torque.X() + this->GaussianKernel(0, this->gaussian_noise_); + this->wrench_msg_.wrench.torque.y = torque.Y() + this->GaussianKernel(0, this->gaussian_noise_); + this->wrench_msg_.wrench.torque.z = torque.Z() + this->GaussianKernel(0, this->gaussian_noise_); + + this->pub_.publish(this->wrench_msg_); + this->lock_.unlock(); + + // save last time stamp + this->last_time_ = cur_time; +} + +////////////////////////////////////////////////////////////////////////////// +// Utility for adding noise +double GazeboRosFT::GaussianKernel(double mu, double sigma) +{ + // using Box-Muller transform to generate two independent standard + // normally disbributed normal variables see wikipedia + + // normalized uniform random variable + double U = static_cast(rand_r(&this->seed)) / + static_cast(RAND_MAX); + + // normalized uniform random variable + double V = static_cast(rand_r(&this->seed)) / + static_cast(RAND_MAX); + + double X = sqrt(-2.0 * ::log(U)) * cos(2.0*M_PI * V); + // double Y = sqrt(-2.0 * ::log(U)) * sin(2.0*M_PI * V); + + // there are 2 indep. vars, we'll just use X + // scale to our mu and sigma + X = sigma * X + mu; + return X; +} + +// Custom Callback Queue +//////////////////////////////////////////////////////////////////////////////// +// custom callback queue thread +void GazeboRosFT::QueueThread() +{ + static const double timeout = 0.01; + + while (this->rosnode_->ok()) + { + this->queue_.callAvailable(ros::WallDuration(timeout)); + } +} + +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_gpu_laser.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_gpu_laser.cpp new file mode 100755 index 0000000..5a48d6e --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_gpu_laser.cpp @@ -0,0 +1,209 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + Desc: GazeboRosGpuLaser plugin for simulating ray sensors in Gazebo + Author: Mihai Emanuel Dolha + Date: 29 March 2012 + */ + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "gazebo_plugins/gazebo_ros_gpu_laser.h" +#include + +namespace gazebo +{ +// Register this plugin with the simulator +GZ_REGISTER_SENSOR_PLUGIN(GazeboRosLaser) + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosLaser::GazeboRosLaser() +{ + this->seed = 0; +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosLaser::~GazeboRosLaser() +{ + ROS_DEBUG_STREAM_NAMED("gpu_laser","Shutting down GPU Laser"); + this->rosnode_->shutdown(); + delete this->rosnode_; + ROS_DEBUG_STREAM_NAMED("gpu_laser","Unloaded"); +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosLaser::Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf) +{ + // load plugin + GpuRayPlugin::Load(_parent, this->sdf); + // Get the world name. + std::string worldName = _parent->WorldName(); + this->world_ = physics::get_world(worldName); + // save pointers + this->sdf = _sdf; + + GAZEBO_SENSORS_USING_DYNAMIC_POINTER_CAST; + this->parent_ray_sensor_ = + dynamic_pointer_cast(_parent); + + if (!this->parent_ray_sensor_) + gzthrow("GazeboRosLaser controller requires a Ray Sensor as its parent"); + + this->robot_namespace_ = GetRobotNamespace(_parent, _sdf, "Laser"); + + if (!this->sdf->HasElement("frameName")) + { + ROS_INFO_NAMED("gpu_laser", "GazeboRosLaser plugin missing , defaults to /world"); + this->frame_name_ = "/world"; + } + else + this->frame_name_ = this->sdf->Get("frameName"); + + if (!this->sdf->HasElement("topicName")) + { + ROS_INFO_NAMED("gpu_laser", "GazeboRosLaser plugin missing , defaults to /world"); + this->topic_name_ = "/world"; + } + else + this->topic_name_ = this->sdf->Get("topicName"); + + this->laser_connect_count_ = 0; + + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("gpu_laser", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + ROS_INFO_NAMED("gpu_laser", "Starting GazeboRosLaser Plugin (ns = %s)", this->robot_namespace_.c_str() ); + // ros callback queue for processing subscription + this->deferred_load_thread_ = boost::thread( + boost::bind(&GazeboRosLaser::LoadThread, this)); + +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosLaser::LoadThread() +{ + this->gazebo_node_ = gazebo::transport::NodePtr(new gazebo::transport::Node()); + this->gazebo_node_->Init(this->world_name_); + + this->pmq.startServiceThread(); + + this->rosnode_ = new ros::NodeHandle(this->robot_namespace_); + + this->tf_prefix_ = tf::getPrefixParam(*this->rosnode_); + if(this->tf_prefix_.empty()) { + this->tf_prefix_ = this->robot_namespace_; + boost::trim_right_if(this->tf_prefix_,boost::is_any_of("/")); + } + ROS_INFO_NAMED("gpu_laser", "GPU Laser Plugin (ns = %s) , set to \"%s\"", + this->robot_namespace_.c_str(), this->tf_prefix_.c_str()); + + // resolve tf prefix + this->frame_name_ = tf::resolve(this->tf_prefix_, this->frame_name_); + + if (this->topic_name_ != "") + { + ros::AdvertiseOptions ao = + ros::AdvertiseOptions::create( + this->topic_name_, 1, + boost::bind(&GazeboRosLaser::LaserConnect, this), + boost::bind(&GazeboRosLaser::LaserDisconnect, this), + ros::VoidPtr(), NULL); + this->pub_ = this->rosnode_->advertise(ao); + this->pub_queue_ = this->pmq.addPub(); + } + + // Initialize the controller + + // sensor generation off by default + this->parent_ray_sensor_->SetActive(false); + + ROS_INFO_STREAM_NAMED("gpu_laser","LoadThread function completed"); +} + +//////////////////////////////////////////////////////////////////////////////// +// Increment count +void GazeboRosLaser::LaserConnect() +{ + this->laser_connect_count_++; + if (this->laser_connect_count_ == 1) + this->laser_scan_sub_ = + this->gazebo_node_->Subscribe(this->parent_ray_sensor_->Topic(), + &GazeboRosLaser::OnScan, this); +} + +//////////////////////////////////////////////////////////////////////////////// +// Decrement count +void GazeboRosLaser::LaserDisconnect() +{ + this->laser_connect_count_--; + if (this->laser_connect_count_ == 0) + this->laser_scan_sub_.reset(); +} + +//////////////////////////////////////////////////////////////////////////////// +// Convert new Gazebo message to ROS message and publish it +void GazeboRosLaser::OnScan(ConstLaserScanStampedPtr &_msg) +{ + // We got a new message from the Gazebo sensor. Stuff a + // corresponding ROS message and publish it. + sensor_msgs::LaserScan laser_msg; + laser_msg.header.stamp = ros::Time(_msg->time().sec(), _msg->time().nsec()); + laser_msg.header.frame_id = this->frame_name_; + laser_msg.angle_min = _msg->scan().angle_min(); + laser_msg.angle_max = _msg->scan().angle_max(); + laser_msg.angle_increment = _msg->scan().angle_step(); + laser_msg.time_increment = 0; // instantaneous simulator scan + laser_msg.scan_time = 0; // not sure whether this is correct + laser_msg.range_min = _msg->scan().range_min(); + laser_msg.range_max = _msg->scan().range_max(); + laser_msg.ranges.resize(_msg->scan().ranges_size()); + std::copy(_msg->scan().ranges().begin(), + _msg->scan().ranges().end(), + laser_msg.ranges.begin()); + laser_msg.intensities.resize(_msg->scan().intensities_size()); + std::copy(_msg->scan().intensities().begin(), + _msg->scan().intensities().end(), + laser_msg.intensities.begin()); + this->pub_queue_->push(laser_msg, this->pub_); +} +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_hand_of_god.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_hand_of_god.cpp new file mode 100755 index 0000000..2725feb --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_hand_of_god.cpp @@ -0,0 +1,204 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2013, Open Source Robotics Foundation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the Open Source Robotics Foundation + * nor the names of its contributors may be + * used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +/** + * \author Jonathan Bohren + * \desc A "hand-of-god" plugin which drives a floating object around based + * on the location of a TF frame. This plugin is useful for connecting human input + * devices to "god-like" objects in a Gazebo simulation. + */ + +#include +#include + +namespace gazebo +{ + // Register this plugin with the simulator + GZ_REGISTER_MODEL_PLUGIN(GazeboRosHandOfGod); + + //////////////////////////////////////////////////////////////////////////////// + // Constructor + GazeboRosHandOfGod::GazeboRosHandOfGod() : + ModelPlugin(), + robot_namespace_(""), + frame_id_("hog"), + kl_(200), + ka_(200) + { + } + + //////////////////////////////////////////////////////////////////////////////// + // Destructor + GazeboRosHandOfGod::~GazeboRosHandOfGod() + { + } + + //////////////////////////////////////////////////////////////////////////////// + // Load the controller + void GazeboRosHandOfGod::Load( physics::ModelPtr _parent, sdf::ElementPtr _sdf ) + { + // Make sure the ROS node for Gazebo has already been initalized + if (!ros::isInitialized()) { + ROS_FATAL_STREAM_NAMED("hand_of_god", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + // Get sdf parameters + if(_sdf->HasElement("robotNamespace")) { + this->robot_namespace_ = _sdf->Get("robotNamespace") + "/"; + } + + if(_sdf->HasElement("frameId")) { + this->frame_id_ = _sdf->Get("frameId"); + } + + if(_sdf->HasElement("kl")) { + this->kl_ = _sdf->Get("kl"); + } + if(_sdf->HasElement("ka")) { + this->ka_ = _sdf->Get("ka"); + } + + if(_sdf->HasElement("linkName")) { + this->link_name_ = _sdf->Get("linkName"); + } else { + ROS_FATAL_STREAM_NAMED("hand_of_god", "The hand-of-god plugin requires a `linkName` parameter tag"); + return; + } + + // Store the model + model_ = _parent; + + // Get the floating link + floating_link_ = model_->GetLink(link_name_); + // Disable gravity for the hog + floating_link_->SetGravityMode(false); + if(!floating_link_) { + ROS_ERROR_NAMED("hand_of_god", "Floating link not found"); + const std::vector &links = model_->GetLinks(); + for(unsigned i=0; i < links.size(); i++) { + ROS_ERROR_STREAM_NAMED("hand_of_god", " -- Link "<GetName()); + } + return; + } + +#if GAZEBO_MAJOR_VERSION >= 8 + cl_ = 2.0 * sqrt(kl_*floating_link_->GetInertial()->Mass()); + ca_ = 2.0 * sqrt(ka_*floating_link_->GetInertial()->IXX()); +#else + cl_ = 2.0 * sqrt(kl_*floating_link_->GetInertial()->GetMass()); + ca_ = 2.0 * sqrt(ka_*floating_link_->GetInertial()->GetIXX()); +#endif + + // Create the TF listener for the desired position of the hog + tf_buffer_.reset(new tf2_ros::Buffer()); + tf_listener_.reset(new tf2_ros::TransformListener(*tf_buffer_)); + tf_broadcaster_.reset(new tf2_ros::TransformBroadcaster()); + + // Register update event handler + this->update_connection_ = event::Events::ConnectWorldUpdateBegin( + boost::bind(&GazeboRosHandOfGod::GazeboUpdate, this)); + } + + //////////////////////////////////////////////////////////////////////////////// + // Update the controller + void GazeboRosHandOfGod::GazeboUpdate() + { + // Get TF transform relative to the /world link + geometry_msgs::TransformStamped hog_desired_tform; + static bool errored = false; + try{ + hog_desired_tform = tf_buffer_->lookupTransform("world", frame_id_+"_desired", ros::Time(0)); + errored = false; + } catch (tf2::TransformException ex){ + if(!errored) { + ROS_ERROR_NAMED("hand_of_god", "%s",ex.what()); + errored = true; + } + return; + } + + // Convert TF transform to Gazebo Pose + const geometry_msgs::Vector3 &p = hog_desired_tform.transform.translation; + const geometry_msgs::Quaternion &q = hog_desired_tform.transform.rotation; + ignition::math::Pose3d hog_desired( + ignition::math::Vector3d(p.x, p.y, p.z), + ignition::math::Quaterniond(q.w, q.x, q.y, q.z)); + + // Relative transform from actual to desired pose +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d world_pose = floating_link_->DirtyPose(); + ignition::math::Vector3d worldLinearVel = floating_link_->WorldLinearVel(); + ignition::math::Vector3d relativeAngularVel = floating_link_->RelativeAngularVel(); +#else + ignition::math::Pose3d world_pose = floating_link_->GetDirtyPose().Ign(); + ignition::math::Vector3d worldLinearVel = floating_link_->GetWorldLinearVel().Ign(); + ignition::math::Vector3d relativeAngularVel = floating_link_->GetRelativeAngularVel().Ign(); +#endif + ignition::math::Vector3d err_pos = hog_desired.Pos() - world_pose.Pos(); + // Get exponential coordinates for rotation + ignition::math::Quaterniond err_rot = (ignition::math::Matrix4d(world_pose.Rot()).Inverse() + * ignition::math::Matrix4d(hog_desired.Rot())).Rotation(); + ignition::math::Quaterniond not_a_quaternion = err_rot.Log(); + + floating_link_->AddForce( + kl_ * err_pos - cl_ * worldLinearVel); + + floating_link_->AddRelativeTorque( + ka_ * ignition::math::Vector3d(not_a_quaternion.X(), not_a_quaternion.Y(), not_a_quaternion.Z()) + - ca_ * relativeAngularVel); + + // Convert actual pose to TransformStamped message + geometry_msgs::TransformStamped hog_actual_tform; + + hog_actual_tform.header.frame_id = "world"; + hog_actual_tform.header.stamp = ros::Time::now(); + + hog_actual_tform.child_frame_id = frame_id_ + "_actual"; + + hog_actual_tform.transform.translation.x = world_pose.Pos().X(); + hog_actual_tform.transform.translation.y = world_pose.Pos().Y(); + hog_actual_tform.transform.translation.z = world_pose.Pos().Z(); + + hog_actual_tform.transform.rotation.w = world_pose.Rot().W(); + hog_actual_tform.transform.rotation.x = world_pose.Rot().X(); + hog_actual_tform.transform.rotation.y = world_pose.Rot().Y(); + hog_actual_tform.transform.rotation.z = world_pose.Rot().Z(); + + tf_broadcaster_->sendTransform(hog_actual_tform); + } + +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_harness.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_harness.cpp new file mode 100755 index 0000000..d661ec8 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_harness.cpp @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2016 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +#include +#include +#include + +#include "gazebo_plugins/gazebo_ros_harness.h" + +namespace gazebo +{ + +// Register this plugin with the simulator +GZ_REGISTER_MODEL_PLUGIN(GazeboRosHarness) + +///////////////////////////////////////////////// +GazeboRosHarness::GazeboRosHarness() +{ +} + +///////////////////////////////////////////////// +GazeboRosHarness::~GazeboRosHarness() +{ + // Custom Callback Queue + this->queue_.clear(); + this->queue_.disable(); + + this->rosnode_->shutdown(); + delete this->rosnode_; +} + +///////////////////////////////////////////////// +// Load the controller +void GazeboRosHarness::Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf) +{ + // Load the plugin + HarnessPlugin::Load(_parent, _sdf); + + this->robotNamespace_ = ""; + if (_sdf->HasElement("robotNamespace")) + this->robotNamespace_ = _sdf->Get("robotNamespace") + "/"; + + // Init ROS + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("harness", "Not loading plugin since ROS hasn't been " + << "properly initialized. Try starting gazebo with ros plugin:\n" + << " gazebo -s libgazebo_ros_api_plugin.so\n"); + return; + } + + this->rosnode_ = new ros::NodeHandle(this->robotNamespace_); + + ros::SubscribeOptions so = ros::SubscribeOptions::create( + "/" + _parent->GetName() + "/harness/velocity", 1, + boost::bind(&GazeboRosHarness::OnVelocity, this, _1), + ros::VoidPtr(), &this->queue_); + this->velocitySub_ = this->rosnode_->subscribe(so); + + so = ros::SubscribeOptions::create( + "/" + _parent->GetName() + "/harness/detach", 1, + boost::bind(&GazeboRosHarness::OnDetach, this, _1), + ros::VoidPtr(), &this->queue_); + this->detachSub_ = this->rosnode_->subscribe(so); + + // Custom Callback Queue + this->callbackQueueThread_ = + boost::thread(boost::bind(&GazeboRosHarness::QueueThread, this)); +} + +///////////////////////////////////////////////// +void GazeboRosHarness::OnVelocity(const std_msgs::Float32::ConstPtr &msg) +{ + // Set the target winch velocity + this->SetWinchVelocity(msg->data); +} + +///////////////////////////////////////////////// +void GazeboRosHarness::OnDetach(const std_msgs::Bool::ConstPtr &msg) +{ + // Detach if true + if (msg->data) + this->Detach(); +} + +///////////////////////////////////////////////// +void GazeboRosHarness::QueueThread() +{ + static const double timeout = 0.01; + + while (this->rosnode_->ok()) + { + this->queue_.callAvailable(ros::WallDuration(timeout)); + } +} +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_imu.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_imu.cpp new file mode 100755 index 0000000..511dda2 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_imu.cpp @@ -0,0 +1,373 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + * Desc: 3D position interface for ground truth. + * Author: Sachin Chitta and John Hsu + * Date: 1 June 2008 + */ + +#include + +namespace gazebo +{ +// Register this plugin with the simulator +GZ_REGISTER_MODEL_PLUGIN(GazeboRosIMU) + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosIMU::GazeboRosIMU() +{ + this->seed = 0; +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosIMU::~GazeboRosIMU() +{ + this->update_connection_.reset(); + // Finalize the controller + this->rosnode_->shutdown(); + this->callback_queue_thread_.join(); + delete this->rosnode_; +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosIMU::Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf) +{ + // save pointers + this->world_ = _parent->GetWorld(); + this->sdf = _sdf; + + // ros callback queue for processing subscription + this->deferred_load_thread_ = boost::thread( + boost::bind(&GazeboRosIMU::LoadThread, this)); +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosIMU::LoadThread() +{ + // load parameters + this->robot_namespace_ = ""; + if (this->sdf->HasElement("robotNamespace")) + this->robot_namespace_ = this->sdf->Get("robotNamespace") + "/"; + + if (!this->sdf->HasElement("serviceName")) + { + ROS_INFO_NAMED("imu", "imu plugin missing , defaults to /default_imu"); + this->service_name_ = "/default_imu"; + } + else + this->service_name_ = this->sdf->Get("serviceName"); + + if (!this->sdf->HasElement("topicName")) + { + ROS_INFO_NAMED("imu", "imu plugin missing , defaults to /default_imu"); + this->topic_name_ = "/default_imu"; + } + else + this->topic_name_ = this->sdf->Get("topicName"); + + if (!this->sdf->HasElement("gaussianNoise")) + { + ROS_INFO_NAMED("imu", "imu plugin missing , defaults to 0.0"); + this->gaussian_noise_ = 0.0; + } + else + this->gaussian_noise_ = this->sdf->Get("gaussianNoise"); + + if (!this->sdf->HasElement("bodyName")) + { + ROS_FATAL_NAMED("imu", "imu plugin missing , cannot proceed"); + return; + } + else + this->link_name_ = this->sdf->Get("bodyName"); + + if (!this->sdf->HasElement("xyzOffset")) + { + ROS_INFO_NAMED("imu", "imu plugin missing , defaults to 0s"); + this->offset_.Pos() = ignition::math::Vector3d(0, 0, 0); + } + else + this->offset_.Pos() = this->sdf->Get("xyzOffset"); + + if (!this->sdf->HasElement("rpyOffset")) + { + ROS_INFO_NAMED("imu", "imu plugin missing , defaults to 0s"); + this->offset_.Rot() = ignition::math::Quaterniond(ignition::math::Vector3d(0, 0, 0)); + } + else + this->offset_.Rot() = ignition::math::Quaterniond(this->sdf->Get("rpyOffset")); + + if (!this->sdf->HasElement("updateRate")) + { + ROS_DEBUG_NAMED("imu", "imu plugin missing , defaults to 0.0" + " (as fast as possible)"); + this->update_rate_ = 0.0; + } + else + this->update_rate_ = this->sdf->GetElement("updateRate")->Get(); + + if (!this->sdf->HasElement("frameName")) + { + ROS_INFO_NAMED("imu", "imu plugin missing , defaults to "); + this->frame_name_ = link_name_; + } + else + this->frame_name_ = this->sdf->Get("frameName"); + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("imu", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + this->rosnode_ = new ros::NodeHandle(this->robot_namespace_); + + // publish multi queue + this->pmq.startServiceThread(); + + // assert that the body by link_name_ exists + this->link = boost::dynamic_pointer_cast( +#if GAZEBO_MAJOR_VERSION >= 8 + this->world_->EntityByName(this->link_name_)); +#else + this->world_->GetEntity(this->link_name_)); +#endif + if (!this->link) + { + ROS_FATAL_NAMED("imu", "gazebo_ros_imu plugin error: bodyName: %s does not exist\n", + this->link_name_.c_str()); + return; + } + + // if topic name specified as empty, do not publish + if (this->topic_name_ != "") + { + this->pub_Queue = this->pmq.addPub(); + this->pub_ = this->rosnode_->advertise( + this->topic_name_, 1); + + // advertise services on the custom queue + ros::AdvertiseServiceOptions aso = + ros::AdvertiseServiceOptions::create( + this->service_name_, boost::bind(&GazeboRosIMU::ServiceCallback, + this, _1, _2), ros::VoidPtr(), &this->imu_queue_); + this->srv_ = this->rosnode_->advertiseService(aso); + } + + // Initialize the controller +#if GAZEBO_MAJOR_VERSION >= 8 + this->last_time_ = this->world_->SimTime(); +#else + this->last_time_ = this->world_->GetSimTime(); +#endif + + // this->initial_pose_ = this->link->GetPose(); +#if GAZEBO_MAJOR_VERSION >= 8 + this->last_vpos_ = this->link->WorldLinearVel(); + this->last_veul_ = this->link->WorldAngularVel(); +#else + this->last_vpos_ = this->link->GetWorldLinearVel().Ign(); + this->last_veul_ = this->link->GetWorldAngularVel().Ign(); +#endif + this->apos_ = 0; + this->aeul_ = 0; + + // start custom queue for imu + this->callback_queue_thread_ = + boost::thread(boost::bind(&GazeboRosIMU::IMUQueueThread, this)); + + + // New Mechanism for Updating every World Cycle + // Listen to the update event. This event is broadcast every + // simulation iteration. + this->update_connection_ = event::Events::ConnectWorldUpdateBegin( + boost::bind(&GazeboRosIMU::UpdateChild, this)); +} + +//////////////////////////////////////////////////////////////////////////////// +// returns true always, imu is always calibrated in sim +bool GazeboRosIMU::ServiceCallback(std_srvs::Empty::Request &req, + std_srvs::Empty::Response &res) +{ + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosIMU::UpdateChild() +{ +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time cur_time = this->world_->SimTime(); +#else + common::Time cur_time = this->world_->GetSimTime(); +#endif + + // rate control + if (this->update_rate_ > 0 && + (cur_time - this->last_time_).Double() < (1.0 / this->update_rate_)) + return; + + if ((this->pub_.getNumSubscribers() > 0 && this->topic_name_ != "")) + { + ignition::math::Pose3d pose; + ignition::math::Quaterniond rot; + ignition::math::Vector3d pos; + + // Get Pose/Orientation ///@todo: verify correctness +#if GAZEBO_MAJOR_VERSION >= 8 + pose = this->link->WorldPose(); +#else + pose = this->link->GetWorldPose().Ign(); +#endif + // apply xyz offsets and get position and rotation components + pos = pose.Pos() + this->offset_.Pos(); + rot = pose.Rot(); + + // apply rpy offsets + rot = this->offset_.Rot()*rot; + rot.Normalize(); + + // get Rates +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Vector3d vpos = this->link->WorldLinearVel(); + ignition::math::Vector3d veul = this->link->WorldAngularVel(); +#else + ignition::math::Vector3d vpos = this->link->GetWorldLinearVel().Ign(); + ignition::math::Vector3d veul = this->link->GetWorldAngularVel().Ign(); +#endif + + // differentiate to get accelerations + double tmp_dt = this->last_time_.Double() - cur_time.Double(); + if (tmp_dt != 0) + { + this->apos_ = (this->last_vpos_ - vpos) / tmp_dt; + this->aeul_ = (this->last_veul_ - veul) / tmp_dt; + this->last_vpos_ = vpos; + this->last_veul_ = veul; + } + + // copy data into pose message + this->imu_msg_.header.frame_id = this->frame_name_; + this->imu_msg_.header.stamp.sec = cur_time.sec; + this->imu_msg_.header.stamp.nsec = cur_time.nsec; + + // orientation quaternion + + // uncomment this if we are reporting orientation in the local frame + // not the case for our imu definition + // // apply fixed orientation offsets of initial pose + // rot = this->initial_pose_.Rot()*rot; + // rot.Normalize(); + + this->imu_msg_.orientation.x = rot.X(); + this->imu_msg_.orientation.y = rot.Y(); + this->imu_msg_.orientation.z = rot.Z(); + this->imu_msg_.orientation.w = rot.W(); + + // pass euler angular rates + ignition::math::Vector3d linear_velocity( + veul.X() + this->GaussianKernel(0, this->gaussian_noise_), + veul.Y() + this->GaussianKernel(0, this->gaussian_noise_), + veul.Z() + this->GaussianKernel(0, this->gaussian_noise_)); + // rotate into local frame + // @todo: deal with offsets! + linear_velocity = rot.RotateVector(linear_velocity); + this->imu_msg_.angular_velocity.x = linear_velocity.X(); + this->imu_msg_.angular_velocity.y = linear_velocity.Y(); + this->imu_msg_.angular_velocity.z = linear_velocity.Z(); + + // pass accelerations + ignition::math::Vector3d linear_acceleration( + apos_.X() + this->GaussianKernel(0, this->gaussian_noise_), + apos_.Y() + this->GaussianKernel(0, this->gaussian_noise_), + apos_.Z() + this->GaussianKernel(0, this->gaussian_noise_)); + // rotate into local frame + // @todo: deal with offsets! + linear_acceleration = rot.RotateVector(linear_acceleration); + this->imu_msg_.linear_acceleration.x = linear_acceleration.X(); + this->imu_msg_.linear_acceleration.y = linear_acceleration.Y(); + this->imu_msg_.linear_acceleration.z = linear_acceleration.Z(); + + // fill in covariance matrix + /// @todo: let user set separate linear and angular covariance values. + /// @todo: apply appropriate rotations from frame_pose + double gn2 = this->gaussian_noise_*this->gaussian_noise_; + this->imu_msg_.orientation_covariance[0] = gn2; + this->imu_msg_.orientation_covariance[4] = gn2; + this->imu_msg_.orientation_covariance[8] = gn2; + this->imu_msg_.angular_velocity_covariance[0] = gn2; + this->imu_msg_.angular_velocity_covariance[4] = gn2; + this->imu_msg_.angular_velocity_covariance[8] = gn2; + this->imu_msg_.linear_acceleration_covariance[0] = gn2; + this->imu_msg_.linear_acceleration_covariance[4] = gn2; + this->imu_msg_.linear_acceleration_covariance[8] = gn2; + + { + boost::mutex::scoped_lock lock(this->lock_); + // publish to ros + if (this->pub_.getNumSubscribers() > 0 && this->topic_name_ != "") + this->pub_Queue->push(this->imu_msg_, this->pub_); + } + + // save last time stamp + this->last_time_ = cur_time; + } +} + + +////////////////////////////////////////////////////////////////////////////// +// Utility for adding noise +double GazeboRosIMU::GaussianKernel(double mu, double sigma) +{ + // using Box-Muller transform to generate two independent standard + // normally disbributed normal variables see wikipedia + + // normalized uniform random variable + double U = static_cast(rand_r(&this->seed)) / + static_cast(RAND_MAX); + + // normalized uniform random variable + double V = static_cast(rand_r(&this->seed)) / + static_cast(RAND_MAX); + + double X = sqrt(-2.0 * ::log(U)) * cos(2.0*M_PI * V); + // double Y = sqrt(-2.0 * ::log(U)) * sin(2.0*M_PI * V); + + // there are 2 indep. vars, we'll just use X + // scale to our mu and sigma + X = sigma * X + mu; + return X; +} + +//////////////////////////////////////////////////////////////////////////////// +// Put laser data to the interface +void GazeboRosIMU::IMUQueueThread() +{ + static const double timeout = 0.01; + + while (this->rosnode_->ok()) + { + this->imu_queue_.callAvailable(ros::WallDuration(timeout)); + } +} +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_imu_sensor.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_imu_sensor.cpp new file mode 100755 index 0000000..d00e3a9 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_imu_sensor.cpp @@ -0,0 +1,237 @@ +/* Copyright [2015] [Alessandro Settimi] + * + * email: ale.settimi@gmail.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License.*/ + +#include +#include +#include +#include + +GZ_REGISTER_SENSOR_PLUGIN(gazebo::GazeboRosImuSensor) + +gazebo::GazeboRosImuSensor::GazeboRosImuSensor(): SensorPlugin() +{ + accelerometer_data = ignition::math::Vector3d(0, 0, 0); + gyroscope_data = ignition::math::Vector3d(0, 0, 0); + orientation = ignition::math::Quaterniond(1,0,0,0); + seed=0; + sensor=NULL; +} + +void gazebo::GazeboRosImuSensor::Load(gazebo::sensors::SensorPtr sensor_, sdf::ElementPtr sdf_) +{ + sdf=sdf_; + sensor=dynamic_cast(sensor_.get()); + + if(sensor==NULL) + { + ROS_FATAL("Error: Sensor pointer is NULL!"); + return; + } + + sensor->SetActive(true); + + if(!LoadParameters()) + { + ROS_FATAL("Error Loading Parameters!"); + return; + } + + if (!ros::isInitialized()) //check if ros is initialized properly + { + ROS_FATAL("ROS has not been initialized!"); + return; + } + + node = new ros::NodeHandle(this->robot_namespace); + + imu_data_publisher = node->advertise(topic_name,1); + + connection = gazebo::event::Events::ConnectWorldUpdateBegin(boost::bind(&GazeboRosImuSensor::UpdateChild, this, _1)); + + last_time = sensor->LastUpdateTime(); +} + +void gazebo::GazeboRosImuSensor::UpdateChild(const gazebo::common::UpdateInfo &/*_info*/) +{ + common::Time current_time = sensor->LastUpdateTime(); + + if(update_rate>0 && (current_time-last_time).Double() < 1.0/update_rate) //update rate check + return; + + if(imu_data_publisher.getNumSubscribers() > 0) + { + orientation = offset.Rot()*sensor->Orientation(); //applying offsets to the orientation measurement + accelerometer_data = sensor->LinearAcceleration(); + gyroscope_data = sensor->AngularVelocity(); + + //Guassian noise is applied to all measurements + imu_msg.orientation.x = orientation.X() + GuassianKernel(0,gaussian_noise); + imu_msg.orientation.y = orientation.Y() + GuassianKernel(0,gaussian_noise); + imu_msg.orientation.z = orientation.Z() + GuassianKernel(0,gaussian_noise); + imu_msg.orientation.w = orientation.W() + GuassianKernel(0,gaussian_noise); + + imu_msg.linear_acceleration.x = accelerometer_data.X() + GuassianKernel(0,gaussian_noise); + imu_msg.linear_acceleration.y = accelerometer_data.Y() + GuassianKernel(0,gaussian_noise); + imu_msg.linear_acceleration.z = accelerometer_data.Z() + GuassianKernel(0,gaussian_noise); + + imu_msg.angular_velocity.x = gyroscope_data.X() + GuassianKernel(0,gaussian_noise); + imu_msg.angular_velocity.y = gyroscope_data.Y() + GuassianKernel(0,gaussian_noise); + imu_msg.angular_velocity.z = gyroscope_data.Z() + GuassianKernel(0,gaussian_noise); + + //covariance is related to the Gaussian noise + double gn2 = gaussian_noise*gaussian_noise; + imu_msg.orientation_covariance[0] = gn2; + imu_msg.orientation_covariance[4] = gn2; + imu_msg.orientation_covariance[8] = gn2; + imu_msg.angular_velocity_covariance[0] = gn2; + imu_msg.angular_velocity_covariance[4] = gn2; + imu_msg.angular_velocity_covariance[8] = gn2; + imu_msg.linear_acceleration_covariance[0] = gn2; + imu_msg.linear_acceleration_covariance[4] = gn2; + imu_msg.linear_acceleration_covariance[8] = gn2; + + //preparing message header + imu_msg.header.frame_id = body_name; + imu_msg.header.stamp.sec = current_time.sec; + imu_msg.header.stamp.nsec = current_time.nsec; + + //publishing data + imu_data_publisher.publish(imu_msg); + + ros::spinOnce(); + } + + last_time = current_time; +} + +double gazebo::GazeboRosImuSensor::GuassianKernel(double mu, double sigma) +{ + // generation of two normalized uniform random variables + double U1 = static_cast(rand_r(&seed)) / static_cast(RAND_MAX); + double U2 = static_cast(rand_r(&seed)) / static_cast(RAND_MAX); + + // using Box-Muller transform to obtain a varaible with a standard normal distribution + double Z0 = sqrt(-2.0 * ::log(U1)) * cos(2.0*M_PI * U2); + + // scaling + Z0 = sigma * Z0 + mu; + return Z0; +} + +bool gazebo::GazeboRosImuSensor::LoadParameters() +{ + //loading parameters from the sdf file + + //NAMESPACE + if (sdf->HasElement("robotNamespace")) + { + robot_namespace = sdf->Get("robotNamespace") +"/"; + ROS_INFO_STREAM(" set to: "<ParentName(); + std::size_t it = scoped_name.find("::"); + + robot_namespace = "/" +scoped_name.substr(0,it)+"/"; + ROS_WARN_STREAM("missing , set to default: " << robot_namespace); + } + + //TOPIC + if (sdf->HasElement("topicName")) + { + topic_name = robot_namespace + sdf->Get("topicName"); + ROS_INFO_STREAM(" set to: "<, set to /namespace/default: " << topic_name); + } + + //BODY NAME + if (sdf->HasElement("frameName")) + { + body_name = sdf->Get("frameName"); + ROS_INFO_STREAM(" set to: "<, cannot proceed"); + return false; + } + + //UPDATE RATE + if (sdf->HasElement("updateRateHZ")) + { + update_rate = sdf->Get("updateRateHZ"); + ROS_INFO_STREAM(" set to: " << update_rate); + } + else + { + update_rate = 1.0; + ROS_WARN_STREAM("missing , set to default: " << update_rate); + } + + //NOISE + if (sdf->HasElement("gaussianNoise")) + { + gaussian_noise = sdf->Get("gaussianNoise"); + ROS_INFO_STREAM(" set to: " << gaussian_noise); + } + else + { + gaussian_noise = 0.0; + ROS_WARN_STREAM("missing , set to default: " << gaussian_noise); + } + + //POSITION OFFSET, UNUSED + if (sdf->HasElement("xyzOffset")) + { + offset.Pos() = sdf->Get("xyzOffset"); + ROS_INFO_STREAM(" set to: " << offset.Pos()[0] << ' ' << offset.Pos()[1] << ' ' << offset.Pos()[2]); + } + else + { + offset.Pos() = ignition::math::Vector3d(0, 0, 0); + ROS_WARN_STREAM("missing , set to default: " << offset.Pos()[0] << ' ' << offset.Pos()[1] << ' ' << offset.Pos()[2]); + } + + //ORIENTATION OFFSET + if (sdf->HasElement("rpyOffset")) + { + offset.Rot() = ignition::math::Quaterniond(sdf->Get("rpyOffset")); + ROS_INFO_STREAM(" set to: " << offset.Rot().Roll() << ' ' << offset.Rot().Pitch() << ' ' << offset.Rot().Yaw()); + } + else + { + offset.Rot() = ignition::math::Quaterniond::Identity; + ROS_WARN_STREAM("missing , set to default: " << offset.Rot().Roll() << ' ' << offset.Rot().Pitch() << ' ' << offset.Rot().Yaw()); + } + + return true; +} + +gazebo::GazeboRosImuSensor::~GazeboRosImuSensor() +{ + if (connection.get()) + { + connection.reset(); + connection = gazebo::event::ConnectionPtr(); + } + + node->shutdown(); +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_joint_pose_trajectory.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_joint_pose_trajectory.cpp new file mode 100755 index 0000000..89b3467 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_joint_pose_trajectory.cpp @@ -0,0 +1,456 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + * Desc: 3D position interface for ground truth. + * Author: Sachin Chitta and John Hsu + * Date: 1 June 2008 + */ + +#include +#include +#include + +#include + +namespace gazebo +{ +GZ_REGISTER_MODEL_PLUGIN(GazeboRosJointPoseTrajectory); + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +ROS_DEPRECATED GazeboRosJointPoseTrajectory::GazeboRosJointPoseTrajectory() // replaced with GazeboROSJointPoseTrajectory +{ + + this->has_trajectory_ = false; + this->trajectory_index = 0; + this->joint_trajectory_.points.clear(); + this->physics_engine_enabled_ = true; + this->disable_physics_updates_ = true; +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosJointPoseTrajectory::~GazeboRosJointPoseTrajectory() +{ + this->update_connection_.reset(); + // Finalize the controller + this->rosnode_->shutdown(); + this->queue_.clear(); + this->queue_.disable(); + this->callback_queue_thread_.join(); + delete this->rosnode_; +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosJointPoseTrajectory::Load(physics::ModelPtr _model, + sdf::ElementPtr _sdf) +{ + // save pointers + this->model_ = _model; + this->sdf = _sdf; + this->world_ = this->model_->GetWorld(); + + // this->world_->SetGravity(ignition::math::Vector3d(0, 0, 0)); + + // load parameters + this->robot_namespace_ = ""; + if (this->sdf->HasElement("robotNamespace")) + this->robot_namespace_ = this->sdf->Get("robotNamespace") + "/"; + + if (!this->sdf->HasElement("serviceName")) + { + // default + this->service_name_ = "set_joint_trajectory"; + } + else + this->service_name_ = this->sdf->Get("serviceName"); + + if (!this->sdf->HasElement("topicName")) + { + // default + this->topic_name_ = "set_joint_trajectory"; + } + else + this->topic_name_ = this->sdf->Get("topicName"); + + if (!this->sdf->HasElement("updateRate")) + { + ROS_INFO_NAMED("joint_pose_trajectory", "joint trajectory plugin missing , defaults" + " to 0.0 (as fast as possible)"); + this->update_rate_ = 0; + } + else + this->update_rate_ = this->sdf->Get("updateRate"); + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("joint_pose_trajectory", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + this->deferred_load_thread_ = boost::thread( + boost::bind(&GazeboRosJointPoseTrajectory::LoadThread, this)); + +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosJointPoseTrajectory::LoadThread() +{ + this->rosnode_ = new ros::NodeHandle(this->robot_namespace_); + + // resolve tf prefix + std::string prefix; + this->rosnode_->getParam(std::string("tf_prefix"), prefix); + + if (this->topic_name_ != "") + { + ros::SubscribeOptions trajectory_so = + ros::SubscribeOptions::create( + this->topic_name_, 100, boost::bind( + &GazeboRosJointPoseTrajectory::SetTrajectory, this, _1), + ros::VoidPtr(), &this->queue_); + this->sub_ = this->rosnode_->subscribe(trajectory_so); + } + +#ifdef ENABLE_SERVICE + if (this->service_name_ != "") + { + ros::AdvertiseServiceOptions srv_aso = + ros::AdvertiseServiceOptions::create( + this->service_name_, + boost::bind(&GazeboRosJointPoseTrajectory::SetTrajectory, this, _1, _2), + ros::VoidPtr(), &this->queue_); + this->srv_ = this->rosnode_->advertiseService(srv_aso); + } +#endif + +#if GAZEBO_MAJOR_VERSION >= 8 + this->last_time_ = this->world_->SimTime(); +#else + this->last_time_ = this->world_->GetSimTime(); +#endif + + // start custom queue for joint trajectory plugin ros topics + this->callback_queue_thread_ = + boost::thread(boost::bind(&GazeboRosJointPoseTrajectory::QueueThread, this)); + + // New Mechanism for Updating every World Cycle + // Listen to the update event. This event is broadcast every + // simulation iteration. + this->update_connection_ = event::Events::ConnectWorldUpdateBegin( + boost::bind(&GazeboRosJointPoseTrajectory::UpdateStates, this)); +} + +//////////////////////////////////////////////////////////////////////////////// +// set joint trajectory +void GazeboRosJointPoseTrajectory::SetTrajectory( + const trajectory_msgs::JointTrajectory::ConstPtr& trajectory) +{ + boost::mutex::scoped_lock lock(this->update_mutex); + + this->reference_link_name_ = trajectory->header.frame_id; + // do this every time a new joint trajectory is supplied, + // use header.frame_id as the reference_link_name_ + if (this->reference_link_name_ != "world" && + this->reference_link_name_ != "/map" && + this->reference_link_name_ != "map") + { + physics::EntityPtr ent = +#if GAZEBO_MAJOR_VERSION >= 8 + this->world_->EntityByName(this->reference_link_name_); +#else + this->world_->GetEntity(this->reference_link_name_); +#endif + if (ent) + this->reference_link_ = boost::dynamic_pointer_cast(ent); + if (!this->reference_link_) + { + ROS_ERROR_NAMED("joint_pose_trajectory", "ros_joint_trajectory plugin needs a reference link [%s] as" + " frame_id, aborting.\n", this->reference_link_name_.c_str()); + return; + } + else + { + this->model_ = this->reference_link_->GetParentModel(); + ROS_DEBUG_NAMED("joint_pose_trajectory", "test: update model pose by keeping link [%s] stationary" + " inertially", this->reference_link_->GetName().c_str()); + } + } + + // copy joint configuration into a map + unsigned int chain_size = trajectory->joint_names.size(); + this->joints_.resize(chain_size); + for (unsigned int i = 0; i < chain_size; ++i) + { + this->joints_[i] = this->model_->GetJoint(trajectory->joint_names[i]); + } + + unsigned int points_size = trajectory->points.size(); + this->points_.resize(points_size); + for (unsigned int i = 0; i < points_size; ++i) + { + this->points_[i].positions.resize(chain_size); + this->points_[i].time_from_start = trajectory->points[i].time_from_start; + for (unsigned int j = 0; j < chain_size; ++j) + { + this->points_[i].positions[j] = trajectory->points[i].positions[j]; + } + } + + // trajectory start time + this->trajectory_start = gazebo::common::Time(trajectory->header.stamp.sec, + trajectory->header.stamp.nsec); +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time cur_time = this->world_->SimTime(); +#else + common::Time cur_time = this->world_->GetSimTime(); +#endif + if (this->trajectory_start < cur_time) + this->trajectory_start = cur_time; + + // update the joint trajectory to play + this->has_trajectory_ = true; + // reset trajectory_index to beginning of new trajectory + this->trajectory_index = 0; + + if (this->disable_physics_updates_) + { +#if GAZEBO_MAJOR_VERSION >= 8 + this->physics_engine_enabled_ = this->world_->PhysicsEnabled(); + this->world_->SetPhysicsEnabled(false); +#else + this->physics_engine_enabled_ = this->world_->GetEnablePhysicsEngine(); + this->world_->EnablePhysicsEngine(false); +#endif + } +} + +#ifdef ENABLE_SERVICE +bool GazeboRosJointPoseTrajectory::SetTrajectory( + const gazebo_msgs::SetJointTrajectory::Request& req, + const gazebo_msgs::SetJointTrajectory::Response& res) +{ + boost::mutex::scoped_lock lock(this->update_mutex); + + this->model_pose_ = req.model_pose; + this->set_model_pose_ = req.set_model_pose; + + this->reference_link_name_ = req.joint_trajectory.header.frame_id; + // do this every time a new joint_trajectory is supplied, + // use header.frame_id as the reference_link_name_ + if (this->reference_link_name_ != "world" && + this->reference_link_name_ != "/map" && + this->reference_link_name_ != "map") + { + physics::EntityPtr ent = +#if GAZEBO_MAJOR_VERSION >= 8 + this->world_->EntityByName(this->reference_link_name_); +#else + this->world_->GetEntity(this->reference_link_name_); +#endif + if (ent) + this->reference_link_ = boost::dynamic_pointer_cast(ent); + if (!this->reference_link_) + { + ROS_ERROR_NAMED("joint_pose_trajectory", "ros_joint_trajectory plugin specified a reference link [%s]" + " that does not exist, aborting.\n", + this->reference_link_name_.c_str()); + ROS_DEBUG_NAMED("joint_pose_trajectory", "will set model [%s] configuration, keeping model root link" + " stationary.", this->model_->GetName().c_str()); + return false; + } + else + ROS_DEBUG_NAMED("joint_pose_trajectory", "test: update model pose by keeping link [%s] stationary" + " inertially", this->reference_link_->GetName().c_str()); + } + +#if GAZEBO_MAJOR_VERSION >= 8 + this->model_ = this->world_->ModelByName(req.model_name); +#else + this->model_ = this->world_->GetModel(req.model_name); +#endif + if (!this->model_) // look for it by frame_id name + { + this->model_ = this->reference_link_->GetParentModel(); + if (this->model_) + { + ROS_INFO_NAMED("joint_pose_trajectory", "found model[%s] by link name specified in frame_id[%s]", + this->model_->GetName().c_str(), + req.joint_trajectory.header.frame_id.c_str()); + } + else + { + ROS_WARN_NAMED("joint_pose_trajectory", "no model found by link name specified in frame_id[%s]," + " aborting.", req.joint_trajectory.header.frame_id.c_str()); + return false; + } + } + + // copy joint configuration into a map + this->joint_trajectory_ = req.joint_trajectory; + + // trajectory start time + this->trajectory_start = gazebo::common::Time( + req.joint_trajectory.header.stamp.sec, + req.joint_trajectory.header.stamp.nsec); + + // update the joint_trajectory to play + this->has_trajectory_ = true; + // reset trajectory_index to beginning of new trajectory + this->trajectory_index = 0; + this->disable_physics_updates_ = req.disable_physics_updates; + if (this->disable_physics_updates_) + { +#if GAZEBO_MAJOR_VERSION >= 8 + this->physics_engine_enabled_ = this->world_->PhysicsEnabled(); + this->world_->SetPhysicsEnabled(false); +#else + this->physics_engine_enabled_ = this->world_->GetEnablePhysicsEngine(); + this->world_->EnablePhysicsEngine(false); +#endif + } + + return true; +} +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Play the trajectory, update states +void GazeboRosJointPoseTrajectory::UpdateStates() +{ + boost::mutex::scoped_lock lock(this->update_mutex); + if (this->has_trajectory_) + { +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time cur_time = this->world_->SimTime(); +#else + common::Time cur_time = this->world_->GetSimTime(); +#endif + // roll out trajectory via set model configuration + // gzerr << "i[" << trajectory_index << "] time " + // << trajectory_start << " now: " << cur_time << " : "<< "\n"; + if (cur_time >= this->trajectory_start) + { + // @todo: consider a while loop until the trajectory + // catches up to the current time + // gzerr << trajectory_index << " : " << this->points_.size() << "\n"; + if (this->trajectory_index < this->points_.size()) + { + ROS_INFO_NAMED("joint_pose_trajectory", "time [%f] updating configuration [%d/%lu]", + cur_time.Double(), this->trajectory_index, this->points_.size()); + + // get reference link pose before updates +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d reference_pose = this->model_->WorldPose(); +#else + ignition::math::Pose3d reference_pose = this->model_->GetWorldPose().Ign(); +#endif + if (this->reference_link_) + { +#if GAZEBO_MAJOR_VERSION >= 8 + reference_pose = this->reference_link_->WorldPose(); +#else + reference_pose = this->reference_link_->GetWorldPose().Ign(); +#endif + } + + // trajectory roll-out based on time: + // set model configuration from trajectory message + unsigned int chain_size = this->joints_.size(); + if (chain_size == + this->points_[this->trajectory_index].positions.size()) + { + for (unsigned int i = 0; i < chain_size; ++i) + { + // this is not the most efficient way to set things + if (this->joints_[i]) + { +#if GAZEBO_MAJOR_VERSION >= 9 + this->joints_[i]->SetPosition(0, + this->points_[this->trajectory_index].positions[i], true); +#else + ROS_WARN_ONCE("The joint_pose_trajectory plugin is using the Joint::SetPosition method without preserving the link velocity."); + ROS_WARN_ONCE("As a result, gravity will not be simulated correctly for your model."); + ROS_WARN_ONCE("Please upgrade to Gazebo 9."); + ROS_WARN_ONCE("For details, see https://github.com/ros-simulation/gazebo_ros_pkgs/issues/612"); + this->joints_[i]->SetPosition(0, + this->points_[this->trajectory_index].positions[i]); +#endif + } + } + + // set model pose + if (this->reference_link_) + this->model_->SetLinkWorldPose(reference_pose, + this->reference_link_); + else + this->model_->SetWorldPose(reference_pose); + } + else + { + ROS_ERROR_NAMED("joint_pose_trajectory", "point[%u] in JointTrajectory has different number of" + " joint names[%u] and positions[%lu].", + this->trajectory_index, chain_size, + this->points_[this->trajectory_index].positions.size()); + } + + // this->world_->SetPaused(is_paused); // resume original pause-state + gazebo::common::Time duration( + this->points_[this->trajectory_index].time_from_start.sec, + this->points_[this->trajectory_index].time_from_start.nsec); + + // reset start time for next trajectory point + this->trajectory_start += duration; + this->trajectory_index++; // increment to next trajectory point + + // save last update time stamp + this->last_time_ = cur_time; + } + else // no more trajectory points + { + // trajectory finished + this->reference_link_.reset(); + this->has_trajectory_ = false; + if (this->disable_physics_updates_) + { +#if GAZEBO_MAJOR_VERSION >= 8 + this->world_->SetPhysicsEnabled(this->physics_engine_enabled_); +#else + this->world_->EnablePhysicsEngine(this->physics_engine_enabled_); +#endif + } + } + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Put laser data to the interface +void GazeboRosJointPoseTrajectory::QueueThread() +{ + static const double timeout = 0.01; + while (this->rosnode_->ok()) + { + this->queue_.callAvailable(ros::WallDuration(timeout)); + } +} +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_joint_state_publisher.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_joint_state_publisher.cpp new file mode 100755 index 0000000..c125d73 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_joint_state_publisher.cpp @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2013, Markus Bader + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY Antons Rebguns ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Antons Rebguns BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **/ +#include +#include +#include +#include + +using namespace gazebo; + +GazeboRosJointStatePublisher::GazeboRosJointStatePublisher() {} + +// Destructor +GazeboRosJointStatePublisher::~GazeboRosJointStatePublisher() { + rosnode_->shutdown(); +} + +void GazeboRosJointStatePublisher::Load ( physics::ModelPtr _parent, sdf::ElementPtr _sdf ) { + // Store the pointer to the model + this->parent_ = _parent; + this->world_ = _parent->GetWorld(); + + this->robot_namespace_ = parent_->GetName (); + if ( !_sdf->HasElement ( "robotNamespace" ) ) { + ROS_INFO_NAMED("joint_state_publisher", "GazeboRosJointStatePublisher Plugin missing , defaults to \"%s\"", + this->robot_namespace_.c_str() ); + } else { + this->robot_namespace_ = _sdf->GetElement ( "robotNamespace" )->Get(); + if ( this->robot_namespace_.empty() ) this->robot_namespace_ = parent_->GetName (); + } + if ( !robot_namespace_.empty() ) this->robot_namespace_ += "/"; + rosnode_ = boost::shared_ptr ( new ros::NodeHandle ( this->robot_namespace_ ) ); + + if ( !_sdf->HasElement ( "jointName" ) ) { + ROS_ASSERT ( "GazeboRosJointStatePublisher Plugin missing jointNames" ); + } else { + sdf::ElementPtr element = _sdf->GetElement ( "jointName" ) ; + std::string joint_names = element->Get(); + boost::erase_all ( joint_names, " " ); + boost::split ( joint_names_, joint_names, boost::is_any_of ( "," ) ); + } + + this->update_rate_ = 100.0; + if ( !_sdf->HasElement ( "updateRate" ) ) { + ROS_WARN_NAMED("joint_state_publisher", "GazeboRosJointStatePublisher Plugin (ns = %s) missing , defaults to %f", + this->robot_namespace_.c_str(), this->update_rate_ ); + } else { + this->update_rate_ = _sdf->GetElement ( "updateRate" )->Get(); + } + + // Initialize update rate stuff + if ( this->update_rate_ > 0.0 ) { + this->update_period_ = 1.0 / this->update_rate_; + } else { + this->update_period_ = 0.0; + } +#if GAZEBO_MAJOR_VERSION >= 8 + last_update_time_ = this->world_->SimTime(); +#else + last_update_time_ = this->world_->GetSimTime(); +#endif + + for ( unsigned int i = 0; i< joint_names_.size(); i++ ) { + joints_.push_back ( this->parent_->GetJoint ( joint_names_[i] ) ); + ROS_INFO_NAMED("joint_state_publisher", "GazeboRosJointStatePublisher is going to publish joint: %s", joint_names_[i].c_str() ); + } + + ROS_INFO_NAMED("joint_state_publisher", "Starting GazeboRosJointStatePublisher Plugin (ns = %s)!, parent name: %s", this->robot_namespace_.c_str(), parent_->GetName ().c_str() ); + + tf_prefix_ = tf::getPrefixParam ( *rosnode_ ); + joint_state_publisher_ = rosnode_->advertise ( "joint_states",1000 ); + +#if GAZEBO_MAJOR_VERSION >= 8 + last_update_time_ = this->world_->SimTime(); +#else + last_update_time_ = this->world_->GetSimTime(); +#endif + // Listen to the update event. This event is broadcast every + // simulation iteration. + this->updateConnection = event::Events::ConnectWorldUpdateBegin ( + boost::bind ( &GazeboRosJointStatePublisher::OnUpdate, this, _1 ) ); +} + +void GazeboRosJointStatePublisher::OnUpdate ( const common::UpdateInfo & _info ) { + // Apply a small linear velocity to the model. +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time current_time = this->world_->SimTime(); +#else + common::Time current_time = this->world_->GetSimTime(); +#endif + if (current_time < last_update_time_) + { + ROS_WARN_NAMED("joint_state_publisher", "Negative joint state update time difference detected."); + last_update_time_ = current_time; + } + + double seconds_since_last_update = ( current_time - last_update_time_ ).Double(); + + if ( seconds_since_last_update > update_period_ ) { + + publishJointStates(); + + last_update_time_+= common::Time ( update_period_ ); + + } + +} + +void GazeboRosJointStatePublisher::publishJointStates() { + ros::Time current_time = ros::Time::now(); + + joint_state_.header.stamp = current_time; + joint_state_.name.resize ( joints_.size() ); + joint_state_.position.resize ( joints_.size() ); + joint_state_.velocity.resize ( joints_.size() ); + + for ( int i = 0; i < joints_.size(); i++ ) { + physics::JointPtr joint = joints_[i]; + double velocity = joint->GetVelocity( 0 ); +#if GAZEBO_MAJOR_VERSION >= 8 + double position = joint->Position ( 0 ); +#else + double position = joint->GetAngle ( 0 ).Radian(); +#endif + joint_state_.name[i] = joint->GetName(); + joint_state_.position[i] = position; + joint_state_.velocity[i] = velocity; + } + joint_state_publisher_.publish ( joint_state_ ); +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_joint_trajectory.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_joint_trajectory.cpp new file mode 100755 index 0000000..60187a9 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_joint_trajectory.cpp @@ -0,0 +1,458 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +// ************************************************************* +// DEPRECATED +// This class has been renamed to gazebo_ros_joint_pose_trajectory +// ************************************************************* + +#include +#include +#include + +#include "gazebo_plugins/gazebo_ros_joint_trajectory.h" + +namespace gazebo +{ +GZ_REGISTER_MODEL_PLUGIN(GazeboRosJointTrajectory); + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +ROS_DEPRECATED GazeboRosJointTrajectory::GazeboRosJointTrajectory() // replaced with GazeboROSJointPoseTrajectory +{ + ROS_WARN_NAMED("gazebo_ros_joint_trajectory","DEPRECATED: gazebo_ros_joint_trajectory has been renamed to gazebo_ros_joint_pose_trajectory"); + + this->has_trajectory_ = false; + this->trajectory_index = 0; + this->joint_trajectory_.points.clear(); + this->physics_engine_enabled_ = true; + this->disable_physics_updates_ = true; +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosJointTrajectory::~GazeboRosJointTrajectory() +{ + this->update_connection_.reset(); + // Finalize the controller + this->rosnode_->shutdown(); + this->queue_.clear(); + this->queue_.disable(); + this->callback_queue_thread_.join(); + delete this->rosnode_; +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosJointTrajectory::Load(physics::ModelPtr _model, + sdf::ElementPtr _sdf) +{ + // save pointers + this->model_ = _model; + this->sdf = _sdf; + this->world_ = this->model_->GetWorld(); + + // this->world_->SetGravity(ignition::math::Vector3d(0, 0, 0)); + + // load parameters + this->robot_namespace_ = ""; + if (this->sdf->HasElement("robotNamespace")) + this->robot_namespace_ = this->sdf->Get("robotNamespace") + "/"; + + if (!this->sdf->HasElement("serviceName")) + { + // default + this->service_name_ = "set_joint_trajectory"; + } + else + this->service_name_ = this->sdf->Get("serviceName"); + + if (!this->sdf->HasElement("topicName")) + { + // default + this->topic_name_ = "set_joint_trajectory"; + } + else + this->topic_name_ = this->sdf->Get("topicName"); + + if (!this->sdf->HasElement("updateRate")) + { + ROS_INFO_NAMED("joint_trajectory", "joint trajectory plugin missing , defaults" + " to 0.0 (as fast as possible)"); + this->update_rate_ = 0; + } + else + this->update_rate_ = this->sdf->Get("updateRate"); + + // ros callback queue for processing subscription + if (ros::isInitialized()) + { + this->deferred_load_thread_ = boost::thread( + boost::bind(&GazeboRosJointTrajectory::LoadThread, this)); + } + else + { + gzerr << "Not loading plugin since ROS hasn't been " + << "properly initialized. Try starting gazebo with ros plugin:\n" + << " gazebo -s libgazebo_ros_api_plugin.so\n"; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosJointTrajectory::LoadThread() +{ + this->rosnode_ = new ros::NodeHandle(this->robot_namespace_); + + // resolve tf prefix + std::string prefix; + this->rosnode_->getParam(std::string("tf_prefix"), prefix); + + if (this->topic_name_ != "") + { + ros::SubscribeOptions trajectory_so = + ros::SubscribeOptions::create( + this->topic_name_, 100, boost::bind( + &GazeboRosJointTrajectory::SetTrajectory, this, _1), + ros::VoidPtr(), &this->queue_); + this->sub_ = this->rosnode_->subscribe(trajectory_so); + } + +#ifdef ENABLE_SERVICE + if (this->service_name_ != "") + { + ros::AdvertiseServiceOptions srv_aso = + ros::AdvertiseServiceOptions::create( + this->service_name_, + boost::bind(&GazeboRosJointTrajectory::SetTrajectory, this, _1, _2), + ros::VoidPtr(), &this->queue_); + this->srv_ = this->rosnode_->advertiseService(srv_aso); + } +#endif + +#if GAZEBO_MAJOR_VERSION >= 8 + this->last_time_ = this->world_->SimTime(); +#else + this->last_time_ = this->world_->GetSimTime(); +#endif + + // start custom queue for joint trajectory plugin ros topics + this->callback_queue_thread_ = + boost::thread(boost::bind(&GazeboRosJointTrajectory::QueueThread, this)); + + // New Mechanism for Updating every World Cycle + // Listen to the update event. This event is broadcast every + // simulation iteration. + this->update_connection_ = event::Events::ConnectWorldUpdateBegin( + boost::bind(&GazeboRosJointTrajectory::UpdateStates, this)); +} + +//////////////////////////////////////////////////////////////////////////////// +// set joint trajectory +void GazeboRosJointTrajectory::SetTrajectory( + const trajectory_msgs::JointTrajectory::ConstPtr& trajectory) +{ + boost::mutex::scoped_lock lock(this->update_mutex); + + this->reference_link_name_ = trajectory->header.frame_id; + // do this every time a new joint trajectory is supplied, + // use header.frame_id as the reference_link_name_ + if (this->reference_link_name_ != "world" && + this->reference_link_name_ != "/map" && + this->reference_link_name_ != "map") + { + physics::EntityPtr ent = +#if GAZEBO_MAJOR_VERSION >= 8 + this->world_->EntityByName(this->reference_link_name_); +#else + this->world_->GetEntity(this->reference_link_name_); +#endif + if (ent) + this->reference_link_ = boost::dynamic_pointer_cast(ent); + if (!this->reference_link_) + { + ROS_ERROR_NAMED("joint_trajectory", "ros_joint_trajectory plugin needs a reference link [%s] as" + " frame_id, aborting.\n", this->reference_link_name_.c_str()); + return; + } + else + { + this->model_ = this->reference_link_->GetParentModel(); + ROS_DEBUG_NAMED("joint_trajectory", "test: update model pose by keeping link [%s] stationary" + " inertially", this->reference_link_->GetName().c_str()); + } + } + + // copy joint configuration into a map + unsigned int chain_size = trajectory->joint_names.size(); + this->joints_.resize(chain_size); + for (unsigned int i = 0; i < chain_size; ++i) + { + this->joints_[i] = this->model_->GetJoint(trajectory->joint_names[i]); + } + + unsigned int points_size = trajectory->points.size(); + this->points_.resize(points_size); + for (unsigned int i = 0; i < points_size; ++i) + { + this->points_[i].positions.resize(chain_size); + this->points_[i].time_from_start = trajectory->points[i].time_from_start; + for (unsigned int j = 0; j < chain_size; ++j) + { + this->points_[i].positions[j] = trajectory->points[i].positions[j]; + } + } + + // trajectory start time + this->trajectory_start = gazebo::common::Time(trajectory->header.stamp.sec, + trajectory->header.stamp.nsec); +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time cur_time = this->world_->SimTime(); +#else + common::Time cur_time = this->world_->GetSimTime(); +#endif + if (this->trajectory_start < cur_time) + this->trajectory_start = cur_time; + + // update the joint trajectory to play + this->has_trajectory_ = true; + // reset trajectory_index to beginning of new trajectory + this->trajectory_index = 0; + + if (this->disable_physics_updates_) + { +#if GAZEBO_MAJOR_VERSION >= 8 + this->physics_engine_enabled_ = this->world_->PhysicsEnabled(); + this->world_->SetPhysicsEnabled(false); +#else + this->physics_engine_enabled_ = this->world_->GetEnablePhysicsEngine(); + this->world_->EnablePhysicsEngine(false); +#endif + } +} + +#ifdef ENABLE_SERVICE +bool GazeboRosJointTrajectory::SetTrajectory( + const gazebo_msgs::SetJointTrajectory::Request& req, + const gazebo_msgs::SetJointTrajectory::Response& res) +{ + boost::mutex::scoped_lock lock(this->update_mutex); + + this->model_pose_ = req.model_pose; + this->set_model_pose_ = req.set_model_pose; + + this->reference_link_name_ = req.joint_trajectory.header.frame_id; + // do this every time a new joint_trajectory is supplied, + // use header.frame_id as the reference_link_name_ + if (this->reference_link_name_ != "world" && + this->reference_link_name_ != "/map" && + this->reference_link_name_ != "map") + { + physics::EntityPtr ent = +#if GAZEBO_MAJOR_VERSION >= 8 + this->world_->EntityByName(this->reference_link_name_); +#else + this->world_->GetEntity(this->reference_link_name_); +#endif + if (ent) + this->reference_link_ = boost::shared_dynamic_cast(ent); + if (!this->reference_link_) + { + ROS_ERROR_NAMED("joint_trajectory", "ros_joint_trajectory plugin specified a reference link [%s]" + " that does not exist, aborting.\n", + this->reference_link_name_.c_str()); + ROS_DEBUG_NAMED("joint_trajectory", "will set model [%s] configuration, keeping model root link" + " stationary.", this->model_->GetName().c_str()); + return false; + } + else + ROS_DEBUG_NAMED("joint_trajectory", "test: update model pose by keeping link [%s] stationary" + " inertially", this->reference_link_->GetName().c_str()); + } + +#if GAZEBO_MAJOR_VERSION >= 8 + this->model_ = this->world_->ModelByName(req.model_name); +#else + this->model_ = this->world_->GetModel(req.model_name); +#endif + if (!this->model_) // look for it by frame_id name + { + this->model_ = this->reference_link_->GetParentModel(); + if (this->model_) + { + ROS_INFO_NAMED("joint_trajectory", "found model[%s] by link name specified in frame_id[%s]", + this->model_->GetName().c_str(), + req.joint_trajectory.header.frame_id.c_str()); + } + else + { + ROS_WARN_NAMED("joint_trajectory", "no model found by link name specified in frame_id[%s]," + " aborting.", req.joint_trajectory.header.frame_id.c_str()); + return false; + } + } + + // copy joint configuration into a map + this->joint_trajectory_ = req.joint_trajectory; + + // trajectory start time + this->trajectory_start = gazebo::common::Time( + req.joint_trajectory.header.stamp.sec, + req.joint_trajectory.header.stamp.nsec); + + // update the joint_trajectory to play + this->has_trajectory_ = true; + // reset trajectory_index to beginning of new trajectory + this->trajectory_index = 0; + this->disable_physics_updates_ = req.disable_physics_updates; + if (this->disable_physics_updates_) + { +#if GAZEBO_MAJOR_VERSION >= 8 + this->physics_engine_enabled_ = this->world_->PhysicsEnabled(); + this->world_->SetPhysicsEnabled(false); +#else + this->physics_engine_enabled_ = this->world_->GetEnablePhysicsEngine(); + this->world_->EnablePhysicsEngine(false); +#endif + } + + return true; +} +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Play the trajectory, update states +void GazeboRosJointTrajectory::UpdateStates() +{ + boost::mutex::scoped_lock lock(this->update_mutex); + if (this->has_trajectory_) + { +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time cur_time = this->world_->SimTime(); +#else + common::Time cur_time = this->world_->GetSimTime(); +#endif + // roll out trajectory via set model configuration + // gzerr << "i[" << trajectory_index << "] time " + // << trajectory_start << " now: " << cur_time << " : "<< "\n"; + if (cur_time >= this->trajectory_start) + { + // @todo: consider a while loop until the trajectory + // catches up to the current time + // gzerr << trajectory_index << " : " << this->points_.size() << "\n"; + if (this->trajectory_index < this->points_.size()) + { + ROS_INFO_NAMED("joint_trajectory", "time [%f] updating configuration [%d/%lu]", + cur_time.Double(), this->trajectory_index, this->points_.size()); + + // get reference link pose before updates +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d reference_pose = this->model_->WorldPose(); +#else + ignition::math::Pose3d reference_pose = this->model_->GetWorldPose().Ign(); +#endif + if (this->reference_link_) + { +#if GAZEBO_MAJOR_VERSION >= 8 + reference_pose = this->reference_link_->WorldPose(); +#else + reference_pose = this->reference_link_->GetWorldPose().Ign(); +#endif + } + + // trajectory roll-out based on time: + // set model configuration from trajectory message + unsigned int chain_size = this->joints_.size(); + if (chain_size == + this->points_[this->trajectory_index].positions.size()) + { + for (unsigned int i = 0; i < chain_size; ++i) + { + // this is not the most efficient way to set things + if (this->joints_[i]) + { +#if GAZEBO_MAJOR_VERSION >= 9 + this->joints_[i]->SetPosition(0, + this->points_[this->trajectory_index].positions[i], true); +#else + ROS_WARN_ONCE("The joint_trajectory plugin is using the Joint::SetPosition method without preserving the link velocity."); + ROS_WARN_ONCE("As a result, gravity will not be simulated correctly for your model."); + ROS_WARN_ONCE("Please upgrade to Gazebo 9."); + ROS_WARN_ONCE("For details, see https://github.com/ros-simulation/gazebo_ros_pkgs/issues/612"); + this->joints_[i]->SetPosition(0, + this->points_[this->trajectory_index].positions[i]); +#endif + } + } + + // set model pose + if (this->reference_link_) + this->model_->SetLinkWorldPose(reference_pose, + this->reference_link_); + else + this->model_->SetWorldPose(reference_pose); + } + else + { + ROS_ERROR_NAMED("joint_trajectory", "point[%u] in JointTrajectory has different number of" + " joint names[%u] and positions[%lu].", + this->trajectory_index, chain_size, + this->points_[this->trajectory_index].positions.size()); + } + + // this->world_->SetPaused(is_paused); // resume original pause-state + gazebo::common::Time duration( + this->points_[this->trajectory_index].time_from_start.sec, + this->points_[this->trajectory_index].time_from_start.nsec); + + // reset start time for next trajectory point + this->trajectory_start += duration; + this->trajectory_index++; // increment to next trajectory point + + // save last update time stamp + this->last_time_ = cur_time; + } + else // no more trajectory points + { + // trajectory finished + this->reference_link_.reset(); + this->has_trajectory_ = false; + if (this->disable_physics_updates_) + { +#if GAZEBO_MAJOR_VERSION >= 8 + this->world_->SetPhysicsEnabled(this->physics_engine_enabled_); +#else + this->world_->EnablePhysicsEngine(this->physics_engine_enabled_); +#endif + } + } + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Put laser data to the interface +void GazeboRosJointTrajectory::QueueThread() +{ + static const double timeout = 0.01; + while (this->rosnode_->ok()) + { + this->queue_.callAvailable(ros::WallDuration(timeout)); + } +} +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_laser.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_laser.cpp new file mode 100755 index 0000000..b2b42c8 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_laser.cpp @@ -0,0 +1,204 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + * Desc: Ros Laser controller. + * Author: Nathan Koenig + * Date: 01 Feb 2007 + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +namespace gazebo +{ +// Register this plugin with the simulator +GZ_REGISTER_SENSOR_PLUGIN(GazeboRosLaser) + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosLaser::GazeboRosLaser() +{ + this->seed = 0; +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosLaser::~GazeboRosLaser() +{ + this->rosnode_->shutdown(); + delete this->rosnode_; +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosLaser::Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf) +{ + // load plugin + RayPlugin::Load(_parent, this->sdf); + // Get the world name. + std::string worldName = _parent->WorldName(); + this->world_ = physics::get_world(worldName); + // save pointers + this->sdf = _sdf; + + GAZEBO_SENSORS_USING_DYNAMIC_POINTER_CAST; + this->parent_ray_sensor_ = + dynamic_pointer_cast(_parent); + + if (!this->parent_ray_sensor_) + gzthrow("GazeboRosLaser controller requires a Ray Sensor as its parent"); + + this->robot_namespace_ = GetRobotNamespace(_parent, _sdf, "Laser"); + + if (!this->sdf->HasElement("frameName")) + { + ROS_INFO_NAMED("laser", "Laser plugin missing , defaults to /world"); + this->frame_name_ = "/world"; + } + else + this->frame_name_ = this->sdf->Get("frameName"); + + + if (!this->sdf->HasElement("topicName")) + { + ROS_INFO_NAMED("laser", "Laser plugin missing , defaults to /world"); + this->topic_name_ = "/world"; + } + else + this->topic_name_ = this->sdf->Get("topicName"); + + this->laser_connect_count_ = 0; + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("laser", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + ROS_INFO_NAMED("laser", "Starting Laser Plugin (ns = %s)", this->robot_namespace_.c_str() ); + // ros callback queue for processing subscription + this->deferred_load_thread_ = boost::thread( + boost::bind(&GazeboRosLaser::LoadThread, this)); + +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosLaser::LoadThread() +{ + this->gazebo_node_ = gazebo::transport::NodePtr(new gazebo::transport::Node()); + this->gazebo_node_->Init(this->world_name_); + + this->pmq.startServiceThread(); + + this->rosnode_ = new ros::NodeHandle(this->robot_namespace_); + + this->tf_prefix_ = tf::getPrefixParam(*this->rosnode_); + if(this->tf_prefix_.empty()) { + this->tf_prefix_ = this->robot_namespace_; + boost::trim_right_if(this->tf_prefix_,boost::is_any_of("/")); + } + ROS_INFO_NAMED("laser", "Laser Plugin (ns = %s) , set to \"%s\"", + this->robot_namespace_.c_str(), this->tf_prefix_.c_str()); + + // resolve tf prefix + this->frame_name_ = tf::resolve(this->tf_prefix_, this->frame_name_); + + if (this->topic_name_ != "") + { + ros::AdvertiseOptions ao = + ros::AdvertiseOptions::create( + this->topic_name_, 1, + boost::bind(&GazeboRosLaser::LaserConnect, this), + boost::bind(&GazeboRosLaser::LaserDisconnect, this), + ros::VoidPtr(), NULL); + this->pub_ = this->rosnode_->advertise(ao); + this->pub_queue_ = this->pmq.addPub(); + } + + // Initialize the controller + + // sensor generation off by default + this->parent_ray_sensor_->SetActive(false); +} + +//////////////////////////////////////////////////////////////////////////////// +// Increment count +void GazeboRosLaser::LaserConnect() +{ + this->laser_connect_count_++; + if (this->laser_connect_count_ == 1) + this->laser_scan_sub_ = + this->gazebo_node_->Subscribe(this->parent_ray_sensor_->Topic(), + &GazeboRosLaser::OnScan, this); +} + +//////////////////////////////////////////////////////////////////////////////// +// Decrement count +void GazeboRosLaser::LaserDisconnect() +{ + this->laser_connect_count_--; + if (this->laser_connect_count_ == 0) + this->laser_scan_sub_.reset(); +} + +//////////////////////////////////////////////////////////////////////////////// +// Convert new Gazebo message to ROS message and publish it +void GazeboRosLaser::OnScan(ConstLaserScanStampedPtr &_msg) +{ + // We got a new message from the Gazebo sensor. Stuff a + // corresponding ROS message and publish it. + sensor_msgs::LaserScan laser_msg; + laser_msg.header.stamp = ros::Time(_msg->time().sec(), _msg->time().nsec()); + laser_msg.header.frame_id = this->frame_name_; + laser_msg.angle_min = _msg->scan().angle_min(); + laser_msg.angle_max = _msg->scan().angle_max(); + laser_msg.angle_increment = _msg->scan().angle_step(); + laser_msg.time_increment = 0; // instantaneous simulator scan + laser_msg.scan_time = 0; // not sure whether this is correct + laser_msg.range_min = _msg->scan().range_min(); + laser_msg.range_max = _msg->scan().range_max(); + laser_msg.ranges.resize(_msg->scan().ranges_size()); + std::copy(_msg->scan().ranges().begin(), + _msg->scan().ranges().end(), + laser_msg.ranges.begin()); + laser_msg.intensities.resize(_msg->scan().intensities_size()); + std::copy(_msg->scan().intensities().begin(), + _msg->scan().intensities().end(), + laser_msg.intensities.begin()); + this->pub_queue_->push(laser_msg, this->pub_); +} +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_multicamera.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_multicamera.cpp new file mode 100755 index 0000000..0094db5 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_multicamera.cpp @@ -0,0 +1,130 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + * Desc: Syncronizes shutters across multiple cameras + * Author: John Hsu + * Date: 10 June 2013 + */ + +#include + +#include +#include +#include + +#include "gazebo_plugins/gazebo_ros_multicamera.h" + +namespace gazebo +{ +// Register this plugin with the simulator +GZ_REGISTER_SENSOR_PLUGIN(GazeboRosMultiCamera) + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosMultiCamera::GazeboRosMultiCamera() +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosMultiCamera::~GazeboRosMultiCamera() +{ +} + +void GazeboRosMultiCamera::Load(sensors::SensorPtr _parent, + sdf::ElementPtr _sdf) +{ + MultiCameraPlugin::Load(_parent, _sdf); + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("multicamera", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + // initialize shared_ptr members + this->image_connect_count_ = boost::shared_ptr(new int(0)); + this->image_connect_count_lock_ = boost::shared_ptr(new boost::mutex); + this->was_active_ = boost::shared_ptr(new bool(false)); + + // copying from CameraPlugin into GazeboRosCameraUtils + for (unsigned i = 0; i < this->camera.size(); ++i) + { + GazeboRosCameraUtils* util = new GazeboRosCameraUtils(); + util->parentSensor_ = this->parentSensor; + util->width_ = this->width[i]; + util->height_ = this->height[i]; + util->depth_ = this->depth[i]; + util->format_ = this->format[i]; + util->camera_ = this->camera[i]; + // Set up a shared connection counter + util->image_connect_count_ = this->image_connect_count_; + util->image_connect_count_lock_ = this->image_connect_count_lock_; + util->was_active_ = this->was_active_; + if (this->camera[i]->Name().find("left") != std::string::npos) + { + // FIXME: hardcoded, left hack_baseline_ 0 + util->Load(_parent, _sdf, "/left", 0.0); + } + else if (this->camera[i]->Name().find("right") != std::string::npos) + { + double hackBaseline = 0.0; + if (_sdf->HasElement("hackBaseline")) + hackBaseline = _sdf->Get("hackBaseline"); + util->Load(_parent, _sdf, "/right", hackBaseline); + } + this->utils.push_back(util); + } +} + +//////////////////////////////////////////////////////////////////////////////// + +void GazeboRosMultiCamera::OnNewFrame(const unsigned char *_image, + GazeboRosCameraUtils* util) +{ + common::Time sensor_update_time = util->parentSensor_->LastMeasurementTime(); + + if (util->parentSensor_->IsActive()) + { + if (sensor_update_time - util->last_update_time_ >= util->update_period_) + { + util->PutCameraData(_image, sensor_update_time); + util->PublishCameraInfo(sensor_update_time); + util->last_update_time_ = sensor_update_time; + } + } +} + +// Update the controller +void GazeboRosMultiCamera::OnNewFrameLeft(const unsigned char *_image, + unsigned int _width, unsigned int _height, unsigned int _depth, + const std::string &_format) +{ + OnNewFrame(_image, this->utils[0]); +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosMultiCamera::OnNewFrameRight(const unsigned char *_image, + unsigned int _width, unsigned int _height, unsigned int _depth, + const std::string &_format) +{ + OnNewFrame(_image, this->utils[1]); +} +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_openni_kinect.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_openni_kinect.cpp new file mode 100755 index 0000000..0b841aa --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_openni_kinect.cpp @@ -0,0 +1,481 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + Desc: GazeboRosOpenniKinect plugin for simulating cameras in Gazebo + Author: John Hsu + Date: 24 Sept 2008 + */ + +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include + +#include + +namespace gazebo +{ +// Register this plugin with the simulator +GZ_REGISTER_SENSOR_PLUGIN(GazeboRosOpenniKinect) + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosOpenniKinect::GazeboRosOpenniKinect() +{ + this->point_cloud_connect_count_ = 0; + this->depth_info_connect_count_ = 0; + this->depth_image_connect_count_ = 0; + this->last_depth_image_camera_info_update_time_ = common::Time(0); +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosOpenniKinect::~GazeboRosOpenniKinect() +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosOpenniKinect::Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf) +{ + DepthCameraPlugin::Load(_parent, _sdf); + + // copying from DepthCameraPlugin into GazeboRosCameraUtils + this->parentSensor_ = this->parentSensor; + this->width_ = this->width; + this->height_ = this->height; + this->depth_ = this->depth; + this->format_ = this->format; + this->camera_ = this->depthCamera; + + // using a different default + if (!_sdf->HasElement("imageTopicName")) + this->image_topic_name_ = "ir/image_raw"; + if (!_sdf->HasElement("cameraInfoTopicName")) + this->camera_info_topic_name_ = "ir/camera_info"; + + // point cloud stuff + if (!_sdf->HasElement("pointCloudTopicName")) + this->point_cloud_topic_name_ = "points"; + else + this->point_cloud_topic_name_ = _sdf->GetElement("pointCloudTopicName")->Get(); + + // depth image stuff + if (!_sdf->HasElement("depthImageTopicName")) + this->depth_image_topic_name_ = "depth/image_raw"; + else + this->depth_image_topic_name_ = _sdf->GetElement("depthImageTopicName")->Get(); + + if (!_sdf->HasElement("depthImageCameraInfoTopicName")) + this->depth_image_camera_info_topic_name_ = "depth/camera_info"; + else + this->depth_image_camera_info_topic_name_ = _sdf->GetElement("depthImageCameraInfoTopicName")->Get(); + + if (!_sdf->HasElement("pointCloudCutoff")) + this->point_cloud_cutoff_ = 0.4; + else + this->point_cloud_cutoff_ = _sdf->GetElement("pointCloudCutoff")->Get(); + if (!_sdf->HasElement("pointCloudCutoffMax")) + this->point_cloud_cutoff_max_ = 5.0; + else + this->point_cloud_cutoff_max_ = _sdf->GetElement("pointCloudCutoffMax")->Get(); + + load_connection_ = GazeboRosCameraUtils::OnLoad(boost::bind(&GazeboRosOpenniKinect::Advertise, this)); + GazeboRosCameraUtils::Load(_parent, _sdf); +} + +void GazeboRosOpenniKinect::Advertise() +{ + ros::AdvertiseOptions point_cloud_ao = + ros::AdvertiseOptions::create( + this->point_cloud_topic_name_,1, + boost::bind( &GazeboRosOpenniKinect::PointCloudConnect,this), + boost::bind( &GazeboRosOpenniKinect::PointCloudDisconnect,this), + ros::VoidPtr(), &this->camera_queue_); + this->point_cloud_pub_ = this->rosnode_->advertise(point_cloud_ao); + + ros::AdvertiseOptions depth_image_ao = + ros::AdvertiseOptions::create< sensor_msgs::Image >( + this->depth_image_topic_name_,1, + boost::bind( &GazeboRosOpenniKinect::DepthImageConnect,this), + boost::bind( &GazeboRosOpenniKinect::DepthImageDisconnect,this), + ros::VoidPtr(), &this->camera_queue_); + this->depth_image_pub_ = this->rosnode_->advertise(depth_image_ao); + + ros::AdvertiseOptions depth_image_camera_info_ao = + ros::AdvertiseOptions::create( + this->depth_image_camera_info_topic_name_,1, + boost::bind( &GazeboRosOpenniKinect::DepthInfoConnect,this), + boost::bind( &GazeboRosOpenniKinect::DepthInfoDisconnect,this), + ros::VoidPtr(), &this->camera_queue_); + this->depth_image_camera_info_pub_ = this->rosnode_->advertise(depth_image_camera_info_ao); +} + +//////////////////////////////////////////////////////////////////////////////// +// Increment count +void GazeboRosOpenniKinect::PointCloudConnect() +{ + this->point_cloud_connect_count_++; + (*this->image_connect_count_)++; + this->parentSensor->SetActive(true); +} +//////////////////////////////////////////////////////////////////////////////// +// Decrement count +void GazeboRosOpenniKinect::PointCloudDisconnect() +{ + this->point_cloud_connect_count_--; + (*this->image_connect_count_)--; + if (this->point_cloud_connect_count_ <= 0) + this->parentSensor->SetActive(false); +} + +//////////////////////////////////////////////////////////////////////////////// +// Increment count +void GazeboRosOpenniKinect::DepthImageConnect() +{ + this->depth_image_connect_count_++; + this->parentSensor->SetActive(true); +} +//////////////////////////////////////////////////////////////////////////////// +// Decrement count +void GazeboRosOpenniKinect::DepthImageDisconnect() +{ + this->depth_image_connect_count_--; +} + +//////////////////////////////////////////////////////////////////////////////// +// Increment count +void GazeboRosOpenniKinect::DepthInfoConnect() +{ + this->depth_info_connect_count_++; +} +//////////////////////////////////////////////////////////////////////////////// +// Decrement count +void GazeboRosOpenniKinect::DepthInfoDisconnect() +{ + this->depth_info_connect_count_--; +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosOpenniKinect::OnNewDepthFrame(const float *_image, + unsigned int _width, unsigned int _height, unsigned int _depth, + const std::string &_format) +{ + if (!this->initialized_ || this->height_ <=0 || this->width_ <=0) + return; + + this->depth_sensor_update_time_ = this->parentSensor->LastMeasurementTime(); + if (this->parentSensor->IsActive()) + { + if (this->point_cloud_connect_count_ <= 0 && + this->depth_image_connect_count_ <= 0 && + (*this->image_connect_count_) <= 0) + { + this->parentSensor->SetActive(false); + } + else + { + if (this->point_cloud_connect_count_ > 0) + this->FillPointdCloud(_image); + + if (this->depth_image_connect_count_ > 0) + this->FillDepthImage(_image); + } + } + else + { + if (this->point_cloud_connect_count_ > 0 || + this->depth_image_connect_count_ <= 0) + // do this first so there's chance for sensor to run 1 frame after activate + this->parentSensor->SetActive(true); + } + PublishCameraInfo(); +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosOpenniKinect::OnNewImageFrame(const unsigned char *_image, + unsigned int _width, unsigned int _height, unsigned int _depth, + const std::string &_format) +{ + if (!this->initialized_ || this->height_ <=0 || this->width_ <=0) + return; + + //ROS_ERROR_NAMED("openni_kinect", "camera_ new frame %s %s",this->parentSensor_->Name().c_str(),this->frame_name_.c_str()); + this->sensor_update_time_ = this->parentSensor_->LastMeasurementTime(); + + if (this->parentSensor->IsActive()) + { + if (this->point_cloud_connect_count_ <= 0 && + this->depth_image_connect_count_ <= 0 && + (*this->image_connect_count_) <= 0) + { + this->parentSensor->SetActive(false); + } + else + { + if ((*this->image_connect_count_) > 0) + this->PutCameraData(_image); + } + } + else + { + if ((*this->image_connect_count_) > 0) + // do this first so there's chance for sensor to run 1 frame after activate + this->parentSensor->SetActive(true); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Put point cloud data to the interface +void GazeboRosOpenniKinect::FillPointdCloud(const float *_src) +{ + this->lock_.lock(); + + this->point_cloud_msg_.header.frame_id = this->frame_name_; + this->point_cloud_msg_.header.stamp.sec = this->depth_sensor_update_time_.sec; + this->point_cloud_msg_.header.stamp.nsec = this->depth_sensor_update_time_.nsec; + this->point_cloud_msg_.width = this->width; + this->point_cloud_msg_.height = this->height; + this->point_cloud_msg_.row_step = this->point_cloud_msg_.point_step * this->width; + + ///copy from depth to point cloud message + FillPointCloudHelper(this->point_cloud_msg_, + this->height, + this->width, + this->skip_, + (void*)_src ); + + this->point_cloud_pub_.publish(this->point_cloud_msg_); + + this->lock_.unlock(); +} + +//////////////////////////////////////////////////////////////////////////////// +// Put depth image data to the interface +void GazeboRosOpenniKinect::FillDepthImage(const float *_src) +{ + this->lock_.lock(); + // copy data into image + this->depth_image_msg_.header.frame_id = this->frame_name_; + this->depth_image_msg_.header.stamp.sec = this->depth_sensor_update_time_.sec; + this->depth_image_msg_.header.stamp.nsec = this->depth_sensor_update_time_.nsec; + + ///copy from depth to depth image message + FillDepthImageHelper(this->depth_image_msg_, + this->height, + this->width, + this->skip_, + (void*)_src ); + + this->depth_image_pub_.publish(this->depth_image_msg_); + + this->lock_.unlock(); +} + + +// Fill depth information +bool GazeboRosOpenniKinect::FillPointCloudHelper( + sensor_msgs::PointCloud2 &point_cloud_msg, + uint32_t rows_arg, uint32_t cols_arg, + uint32_t step_arg, void* data_arg) +{ + sensor_msgs::PointCloud2Modifier pcd_modifier(point_cloud_msg); + pcd_modifier.setPointCloud2FieldsByString(2, "xyz", "rgb"); + // convert to flat array shape, we need to reconvert later + pcd_modifier.resize(rows_arg*cols_arg); + point_cloud_msg.is_dense = true; + + sensor_msgs::PointCloud2Iterator iter_x(point_cloud_msg_, "x"); + sensor_msgs::PointCloud2Iterator iter_y(point_cloud_msg_, "y"); + sensor_msgs::PointCloud2Iterator iter_z(point_cloud_msg_, "z"); + sensor_msgs::PointCloud2Iterator iter_rgb(point_cloud_msg_, "rgb"); + + float* toCopyFrom = (float*)data_arg; + int index = 0; + + double hfov = this->parentSensor->DepthCamera()->HFOV().Radian(); + double fl = ((double)this->width) / (2.0 *tan(hfov/2.0)); + + // convert depth to point cloud + for (uint32_t j=0; j1) pAngle = atan2( (double)j - 0.5*(double)(rows_arg-1), fl); + else pAngle = 0.0; + + for (uint32_t i=0; i1) yAngle = atan2( (double)i - 0.5*(double)(cols_arg-1), fl); + else yAngle = 0.0; + + double depth = toCopyFrom[index++]; // + 0.0*this->myParent->GetNearClip(); + + if(depth > this->point_cloud_cutoff_ && + depth < this->point_cloud_cutoff_max_) + { + // in optical frame + // hardcoded rotation rpy(-M_PI/2, 0, -M_PI/2) is built-in + // to urdf, where the *_optical_frame should have above relative + // rotation from the physical camera *_frame + *iter_x = depth * tan(yAngle); + *iter_y = depth * tan(pAngle); + *iter_z = depth; + } + else //point in the unseeable range + { + *iter_x = *iter_y = *iter_z = std::numeric_limits::quiet_NaN (); + point_cloud_msg.is_dense = false; + } + + // put image color data for each point + uint8_t* image_src = (uint8_t*)(&(this->image_msg_.data[0])); + if (this->image_msg_.data.size() == rows_arg*cols_arg*3) + { + // color + iter_rgb[0] = image_src[i*3+j*cols_arg*3+0]; + iter_rgb[1] = image_src[i*3+j*cols_arg*3+1]; + iter_rgb[2] = image_src[i*3+j*cols_arg*3+2]; + } + else if (this->image_msg_.data.size() == rows_arg*cols_arg) + { + // mono (or bayer? @todo; fix for bayer) + iter_rgb[0] = image_src[i+j*cols_arg]; + iter_rgb[1] = image_src[i+j*cols_arg]; + iter_rgb[2] = image_src[i+j*cols_arg]; + } + else + { + // no image + iter_rgb[0] = 0; + iter_rgb[1] = 0; + iter_rgb[2] = 0; + } + } + } + + // reconvert to original height and width after the flat reshape + point_cloud_msg.height = rows_arg; + point_cloud_msg.width = cols_arg; + point_cloud_msg.row_step = point_cloud_msg.point_step * point_cloud_msg.width; + + return true; +} + +// Fill depth information +bool GazeboRosOpenniKinect::FillDepthImageHelper( + sensor_msgs::Image& image_msg, + uint32_t rows_arg, uint32_t cols_arg, + uint32_t step_arg, void* data_arg) +{ + image_msg.encoding = sensor_msgs::image_encodings::TYPE_32FC1; + image_msg.height = rows_arg; + image_msg.width = cols_arg; + image_msg.step = sizeof(float) * cols_arg; + image_msg.data.resize(rows_arg * cols_arg * sizeof(float)); + image_msg.is_bigendian = 0; + + const float bad_point = std::numeric_limits::quiet_NaN(); + + float* dest = (float*)(&(image_msg.data[0])); + float* toCopyFrom = (float*)data_arg; + int index = 0; + + // convert depth to point cloud + for (uint32_t j = 0; j < rows_arg; j++) + { + for (uint32_t i = 0; i < cols_arg; i++) + { + float depth = toCopyFrom[index++]; + + if (depth > this->point_cloud_cutoff_ && + depth < this->point_cloud_cutoff_max_) + { + dest[i + j * cols_arg] = depth; + } + else //point in the unseeable range + { + dest[i + j * cols_arg] = bad_point; + } + } + } + return true; +} + +void GazeboRosOpenniKinect::PublishCameraInfo() +{ + ROS_DEBUG_NAMED("openni_kinect", "publishing default camera info, then openni kinect camera info"); + GazeboRosCameraUtils::PublishCameraInfo(); + + if (this->depth_info_connect_count_ > 0) + { + this->sensor_update_time_ = this->parentSensor_->LastMeasurementTime(); +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time cur_time = this->world_->SimTime(); +#else + common::Time cur_time = this->world_->GetSimTime(); +#endif + if (this->sensor_update_time_ - this->last_depth_image_camera_info_update_time_ >= this->update_period_) + { + this->PublishCameraInfo(this->depth_image_camera_info_pub_); + this->last_depth_image_camera_info_update_time_ = this->sensor_update_time_; + } + } +} + +//@todo: publish disparity similar to openni_camera_deprecated/src/nodelets/openni_nodelet.cpp. +/* +#include +pub_disparity_ = comm_nh.advertise ("depth/disparity", 5, subscriberChanged2, subscriberChanged2); + +void GazeboRosDepthCamera::PublishDisparityImage(const DepthImage& depth, ros::Time time) +{ + stereo_msgs::DisparityImagePtr disp_msg = boost::make_shared (); + disp_msg->header.stamp = time; + disp_msg->header.frame_id = device_->isDepthRegistered () ? rgb_frame_id_ : depth_frame_id_; + disp_msg->image.header = disp_msg->header; + disp_msg->image.encoding = sensor_msgs::image_encodings::TYPE_32FC1; + disp_msg->image.height = depth_height_; + disp_msg->image.width = depth_width_; + disp_msg->image.step = disp_msg->image.width * sizeof (float); + disp_msg->image.data.resize (disp_msg->image.height * disp_msg->image.step); + disp_msg->T = depth.getBaseline (); + disp_msg->f = depth.getFocalLength () * depth_width_ / depth.getWidth (); + + /// @todo Compute these values from DepthGenerator::GetDeviceMaxDepth() and the like + disp_msg->min_disparity = 0.0; + disp_msg->max_disparity = disp_msg->T * disp_msg->f / 0.3; + disp_msg->delta_d = 0.125; + + depth.fillDisparityImage (depth_width_, depth_height_, reinterpret_cast(&disp_msg->image.data[0]), disp_msg->image.step); + + pub_disparity_.publish (disp_msg); +} +*/ + +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_p3d.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_p3d.cpp new file mode 100755 index 0000000..a252d22 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_p3d.cpp @@ -0,0 +1,397 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#include +#include +#include + +#include "gazebo_plugins/gazebo_ros_p3d.h" + +namespace gazebo +{ +GZ_REGISTER_MODEL_PLUGIN(GazeboRosP3D); + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosP3D::GazeboRosP3D() +{ + this->seed = 0; +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosP3D::~GazeboRosP3D() +{ + this->update_connection_.reset(); + // Finalize the controller + this->rosnode_->shutdown(); + this->p3d_queue_.clear(); + this->p3d_queue_.disable(); + this->callback_queue_thread_.join(); + delete this->rosnode_; +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosP3D::Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf) +{ + // Get the world name. + this->world_ = _parent->GetWorld(); + this->model_ = _parent; + + // load parameters + this->robot_namespace_ = ""; + if (_sdf->HasElement("robotNamespace")) + this->robot_namespace_ = + _sdf->GetElement("robotNamespace")->Get() + "/"; + + if (!_sdf->HasElement("bodyName")) + { + ROS_FATAL_NAMED("p3d", "p3d plugin missing , cannot proceed"); + return; + } + else + this->link_name_ = _sdf->GetElement("bodyName")->Get(); + + this->link_ = _parent->GetLink(this->link_name_); + if (!this->link_) + { + ROS_FATAL_NAMED("p3d", "gazebo_ros_p3d plugin error: bodyName: %s does not exist\n", + this->link_name_.c_str()); + return; + } + + if (!_sdf->HasElement("topicName")) + { + ROS_FATAL_NAMED("p3d", "p3d plugin missing , cannot proceed"); + return; + } + else + this->topic_name_ = _sdf->GetElement("topicName")->Get(); + + if (!_sdf->HasElement("frameName")) + { + ROS_DEBUG_NAMED("p3d", "p3d plugin missing , defaults to world"); + this->frame_name_ = "world"; + } + else + this->frame_name_ = _sdf->GetElement("frameName")->Get(); + + if (!_sdf->HasElement("xyzOffset")) + { + ROS_DEBUG_NAMED("p3d", "p3d plugin missing , defaults to 0s"); + this->offset_.Pos() = ignition::math::Vector3d(0, 0, 0); + } + else + this->offset_.Pos() = _sdf->GetElement("xyzOffset")->Get(); + + if (!_sdf->HasElement("rpyOffset")) + { + ROS_DEBUG_NAMED("p3d", "p3d plugin missing , defaults to 0s"); + this->offset_.Rot() = ignition::math::Quaterniond(ignition::math::Vector3d(0, 0, 0)); + } + else + this->offset_.Rot() = ignition::math::Quaterniond(_sdf->GetElement("rpyOffset")->Get()); + + if (!_sdf->HasElement("gaussianNoise")) + { + ROS_DEBUG_NAMED("p3d", "p3d plugin missing , defaults to 0.0"); + this->gaussian_noise_ = 0; + } + else + this->gaussian_noise_ = _sdf->GetElement("gaussianNoise")->Get(); + + if (!_sdf->HasElement("updateRate")) + { + ROS_DEBUG_NAMED("p3d", "p3d plugin missing , defaults to 0.0" + " (as fast as possible)"); + this->update_rate_ = 0; + } + else + this->update_rate_ = _sdf->GetElement("updateRate")->Get(); + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("p3d", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + this->rosnode_ = new ros::NodeHandle(this->robot_namespace_); + + // publish multi queue + this->pmq.startServiceThread(); + + // resolve tf prefix + std::string prefix; + this->rosnode_->getParam(std::string("tf_prefix"), prefix); + this->tf_frame_name_ = tf::resolve(prefix, this->frame_name_); + + if (this->topic_name_ != "") + { + this->pub_Queue = this->pmq.addPub(); + this->pub_ = + this->rosnode_->advertise(this->topic_name_, 1); + } + +#if GAZEBO_MAJOR_VERSION >= 8 + this->last_time_ = this->world_->SimTime(); +#else + this->last_time_ = this->world_->GetSimTime(); +#endif + // initialize body +#if GAZEBO_MAJOR_VERSION >= 8 + this->last_vpos_ = this->link_->WorldLinearVel(); + this->last_veul_ = this->link_->WorldAngularVel(); +#else + this->last_vpos_ = this->link_->GetWorldLinearVel().Ign(); + this->last_veul_ = this->link_->GetWorldAngularVel().Ign(); +#endif + this->apos_ = 0; + this->aeul_ = 0; + + // if frameName specified is "/world", "world", "/map" or "map" report + // back inertial values in the gazebo world + if (this->frame_name_ != "/world" && + this->frame_name_ != "world" && + this->frame_name_ != "/map" && + this->frame_name_ != "map") + { + this->reference_link_ = this->model_->GetLink(this->frame_name_); + if (!this->reference_link_) + { + ROS_ERROR_NAMED("p3d", "gazebo_ros_p3d plugin: frameName: %s does not exist, will" + " not publish pose\n", this->frame_name_.c_str()); + return; + } + } + + // init reference frame state + if (this->reference_link_) + { + ROS_DEBUG_NAMED("p3d", "got body %s", this->reference_link_->GetName().c_str()); + this->frame_apos_ = 0; + this->frame_aeul_ = 0; +#if GAZEBO_MAJOR_VERSION >= 8 + this->last_frame_vpos_ = this->reference_link_->WorldLinearVel(); + this->last_frame_veul_ = this->reference_link_->WorldAngularVel(); +#else + this->last_frame_vpos_ = this->reference_link_->GetWorldLinearVel().Ign(); + this->last_frame_veul_ = this->reference_link_->GetWorldAngularVel().Ign(); +#endif + } + + + // start custom queue for p3d + this->callback_queue_thread_ = boost::thread( + boost::bind(&GazeboRosP3D::P3DQueueThread, this)); + + // New Mechanism for Updating every World Cycle + // Listen to the update event. This event is broadcast every + // simulation iteration. + this->update_connection_ = event::Events::ConnectWorldUpdateBegin( + boost::bind(&GazeboRosP3D::UpdateChild, this)); +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosP3D::UpdateChild() +{ + if (!this->link_) + return; + +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time cur_time = this->world_->SimTime(); +#else + common::Time cur_time = this->world_->GetSimTime(); +#endif + + if (cur_time < this->last_time_) + { + ROS_WARN_NAMED("p3d", "Negative update time difference detected."); + this->last_time_ = cur_time; + } + + // rate control + if (this->update_rate_ > 0 && + (cur_time-this->last_time_).Double() < (1.0/this->update_rate_)) + return; + + if (this->pub_.getNumSubscribers() > 0) + { + // differentiate to get accelerations + double tmp_dt = cur_time.Double() - this->last_time_.Double(); + if (tmp_dt != 0) + { + this->lock.lock(); + + if (this->topic_name_ != "") + { + // copy data into pose message + this->pose_msg_.header.frame_id = this->tf_frame_name_; + this->pose_msg_.header.stamp.sec = cur_time.sec; + this->pose_msg_.header.stamp.nsec = cur_time.nsec; + + this->pose_msg_.child_frame_id = this->link_name_; + + ignition::math::Pose3d pose, frame_pose; + ignition::math::Vector3d frame_vpos; + ignition::math::Vector3d frame_veul; + + // get inertial Rates + // Get Pose/Orientation +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Vector3d vpos = this->link_->WorldLinearVel(); + ignition::math::Vector3d veul = this->link_->WorldAngularVel(); + + pose = this->link_->WorldPose(); +#else + ignition::math::Vector3d vpos = this->link_->GetWorldLinearVel().Ign(); + ignition::math::Vector3d veul = this->link_->GetWorldAngularVel().Ign(); + + pose = this->link_->GetWorldPose().Ign(); +#endif + + // Apply Reference Frame + if (this->reference_link_) + { + // convert to relative pose, rates +#if GAZEBO_MAJOR_VERSION >= 8 + frame_pose = this->reference_link_->WorldPose(); + frame_vpos = this->reference_link_->WorldLinearVel(); + frame_veul = this->reference_link_->WorldAngularVel(); +#else + frame_pose = this->reference_link_->GetWorldPose().Ign(); + frame_vpos = this->reference_link_->GetWorldLinearVel().Ign(); + frame_veul = this->reference_link_->GetWorldAngularVel().Ign(); +#endif + pose.Pos() = pose.Pos() - frame_pose.Pos(); + pose.Pos() = frame_pose.Rot().RotateVectorReverse(pose.Pos()); + pose.Rot() *= frame_pose.Rot().Inverse(); + + vpos = frame_pose.Rot().RotateVector(vpos - frame_vpos); + veul = frame_pose.Rot().RotateVector(veul - frame_veul); + } + + // Apply Constant Offsets + // apply xyz offsets and get position and rotation components + pose.Pos() = pose.Pos() + this->offset_.Pos(); + // apply rpy offsets + pose.Rot() = this->offset_.Rot()*pose.Rot(); + pose.Rot().Normalize(); + + // compute accelerations (not used) + this->apos_ = (this->last_vpos_ - vpos) / tmp_dt; + this->aeul_ = (this->last_veul_ - veul) / tmp_dt; + this->last_vpos_ = vpos; + this->last_veul_ = veul; + + this->frame_apos_ = (this->last_frame_vpos_ - frame_vpos) / tmp_dt; + this->frame_aeul_ = (this->last_frame_veul_ - frame_veul) / tmp_dt; + this->last_frame_vpos_ = frame_vpos; + this->last_frame_veul_ = frame_veul; + + // Fill out messages + this->pose_msg_.pose.pose.position.x = pose.Pos().X(); + this->pose_msg_.pose.pose.position.y = pose.Pos().Y(); + this->pose_msg_.pose.pose.position.z = pose.Pos().Z(); + + this->pose_msg_.pose.pose.orientation.x = pose.Rot().X(); + this->pose_msg_.pose.pose.orientation.y = pose.Rot().Y(); + this->pose_msg_.pose.pose.orientation.z = pose.Rot().Z(); + this->pose_msg_.pose.pose.orientation.w = pose.Rot().W(); + + this->pose_msg_.twist.twist.linear.x = vpos.X() + + this->GaussianKernel(0, this->gaussian_noise_); + this->pose_msg_.twist.twist.linear.y = vpos.Y() + + this->GaussianKernel(0, this->gaussian_noise_); + this->pose_msg_.twist.twist.linear.z = vpos.Z() + + this->GaussianKernel(0, this->gaussian_noise_); + // pass euler angular rates + this->pose_msg_.twist.twist.angular.x = veul.X() + + this->GaussianKernel(0, this->gaussian_noise_); + this->pose_msg_.twist.twist.angular.y = veul.Y() + + this->GaussianKernel(0, this->gaussian_noise_); + this->pose_msg_.twist.twist.angular.z = veul.Z() + + this->GaussianKernel(0, this->gaussian_noise_); + + // fill in covariance matrix + /// @todo: let user set separate linear and angular covariance values. + double gn2 = this->gaussian_noise_*this->gaussian_noise_; + this->pose_msg_.pose.covariance[0] = gn2; + this->pose_msg_.pose.covariance[7] = gn2; + this->pose_msg_.pose.covariance[14] = gn2; + this->pose_msg_.pose.covariance[21] = gn2; + this->pose_msg_.pose.covariance[28] = gn2; + this->pose_msg_.pose.covariance[35] = gn2; + + this->pose_msg_.twist.covariance[0] = gn2; + this->pose_msg_.twist.covariance[7] = gn2; + this->pose_msg_.twist.covariance[14] = gn2; + this->pose_msg_.twist.covariance[21] = gn2; + this->pose_msg_.twist.covariance[28] = gn2; + this->pose_msg_.twist.covariance[35] = gn2; + + // publish to ros + this->pub_Queue->push(this->pose_msg_, this->pub_); + } + + this->lock.unlock(); + + // save last time stamp + this->last_time_ = cur_time; + } + } +} + +////////////////////////////////////////////////////////////////////////////// +// Utility for adding noise +double GazeboRosP3D::GaussianKernel(double mu, double sigma) +{ + // using Box-Muller transform to generate two independent standard + // normally disbributed normal variables see wikipedia + + // normalized uniform random variable + double U = static_cast(rand_r(&this->seed)) / + static_cast(RAND_MAX); + + // normalized uniform random variable + double V = static_cast(rand_r(&this->seed)) / + static_cast(RAND_MAX); + + double X = sqrt(-2.0 * ::log(U)) * cos(2.0*M_PI * V); + // double Y = sqrt(-2.0 * ::log(U)) * sin(2.0*M_PI * V); + + // there are 2 indep. vars, we'll just use X + // scale to our mu and sigma + X = sigma * X + mu; + return X; +} + +//////////////////////////////////////////////////////////////////////////////// +// Put laser data to the interface +void GazeboRosP3D::P3DQueueThread() +{ + static const double timeout = 0.01; + + while (this->rosnode_->ok()) + { + this->p3d_queue_.callAvailable(ros::WallDuration(timeout)); + } +} +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_planar_move.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_planar_move.cpp new file mode 100755 index 0000000..fdad12b --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_planar_move.cpp @@ -0,0 +1,295 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + * Desc: Simple model controller that uses a twist message to move a robot on + * the xy plane. + * Author: Piyush Khandelwal + * Date: 29 July 2013 + */ + +#include + +namespace gazebo +{ + + GazeboRosPlanarMove::GazeboRosPlanarMove() {} + + GazeboRosPlanarMove::~GazeboRosPlanarMove() {} + + // Load the controller + void GazeboRosPlanarMove::Load(physics::ModelPtr parent, + sdf::ElementPtr sdf) + { + + parent_ = parent; + + /* Parse parameters */ + + robot_namespace_ = ""; + if (!sdf->HasElement("robotNamespace")) + { + ROS_INFO_NAMED("planar_move", "PlanarMovePlugin missing , " + "defaults to \"%s\"", robot_namespace_.c_str()); + } + else + { + robot_namespace_ = + sdf->GetElement("robotNamespace")->Get(); + } + + command_topic_ = "cmd_vel"; + if (!sdf->HasElement("commandTopic")) + { + ROS_WARN_NAMED("planar_move", "PlanarMovePlugin (ns = %s) missing , " + "defaults to \"%s\"", + robot_namespace_.c_str(), command_topic_.c_str()); + } + else + { + command_topic_ = sdf->GetElement("commandTopic")->Get(); + } + + odometry_topic_ = "odom"; + if (!sdf->HasElement("odometryTopic")) + { + ROS_WARN_NAMED("planar_move", "PlanarMovePlugin (ns = %s) missing , " + "defaults to \"%s\"", + robot_namespace_.c_str(), odometry_topic_.c_str()); + } + else + { + odometry_topic_ = sdf->GetElement("odometryTopic")->Get(); + } + + odometry_frame_ = "odom"; + if (!sdf->HasElement("odometryFrame")) + { + ROS_WARN_NAMED("planar_move", "PlanarMovePlugin (ns = %s) missing , " + "defaults to \"%s\"", + robot_namespace_.c_str(), odometry_frame_.c_str()); + } + else + { + odometry_frame_ = sdf->GetElement("odometryFrame")->Get(); + } + + robot_base_frame_ = "base_footprint"; + if (!sdf->HasElement("robotBaseFrame")) + { + ROS_WARN_NAMED("planar_move", "PlanarMovePlugin (ns = %s) missing , " + "defaults to \"%s\"", + robot_namespace_.c_str(), robot_base_frame_.c_str()); + } + else + { + robot_base_frame_ = sdf->GetElement("robotBaseFrame")->Get(); + } + + odometry_rate_ = 20.0; + if (!sdf->HasElement("odometryRate")) + { + ROS_WARN_NAMED("planar_move", "PlanarMovePlugin (ns = %s) missing , " + "defaults to %f", + robot_namespace_.c_str(), odometry_rate_); + } + else + { + odometry_rate_ = sdf->GetElement("odometryRate")->Get(); + } + +#if GAZEBO_MAJOR_VERSION >= 8 + last_odom_publish_time_ = parent_->GetWorld()->SimTime(); +#else + last_odom_publish_time_ = parent_->GetWorld()->GetSimTime(); +#endif +#if GAZEBO_MAJOR_VERSION >= 8 + last_odom_pose_ = parent_->WorldPose(); +#else + last_odom_pose_ = parent_->GetWorldPose().Ign(); +#endif + x_ = 0; + y_ = 0; + rot_ = 0; + alive_ = true; + + // Ensure that ROS has been initialized and subscribe to cmd_vel + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("planar_move", "PlanarMovePlugin (ns = " << robot_namespace_ + << "). A ROS node for Gazebo has not been initialized, " + << "unable to load plugin. Load the Gazebo system plugin " + << "'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + rosnode_.reset(new ros::NodeHandle(robot_namespace_)); + + ROS_DEBUG_NAMED("planar_move", "OCPlugin (%s) has started", + robot_namespace_.c_str()); + + tf_prefix_ = tf::getPrefixParam(*rosnode_); + transform_broadcaster_.reset(new tf::TransformBroadcaster()); + + // subscribe to the odometry topic + ros::SubscribeOptions so = + ros::SubscribeOptions::create(command_topic_, 1, + boost::bind(&GazeboRosPlanarMove::cmdVelCallback, this, _1), + ros::VoidPtr(), &queue_); + + vel_sub_ = rosnode_->subscribe(so); + odometry_pub_ = rosnode_->advertise(odometry_topic_, 1); + + // start custom queue for diff drive + callback_queue_thread_ = + boost::thread(boost::bind(&GazeboRosPlanarMove::QueueThread, this)); + + // listen to the update event (broadcast every simulation iteration) + update_connection_ = + event::Events::ConnectWorldUpdateBegin( + boost::bind(&GazeboRosPlanarMove::UpdateChild, this)); + + } + + // Update the controller + void GazeboRosPlanarMove::UpdateChild() + { + boost::mutex::scoped_lock scoped_lock(lock); +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d pose = parent_->WorldPose(); +#else + ignition::math::Pose3d pose = parent_->GetWorldPose().Ign(); +#endif + float yaw = pose.Rot().Yaw(); + parent_->SetLinearVel(ignition::math::Vector3d( + x_ * cosf(yaw) - y_ * sinf(yaw), + y_ * cosf(yaw) + x_ * sinf(yaw), + 0)); + parent_->SetAngularVel(ignition::math::Vector3d(0, 0, rot_)); + if (odometry_rate_ > 0.0) { +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time current_time = parent_->GetWorld()->SimTime(); +#else + common::Time current_time = parent_->GetWorld()->GetSimTime(); +#endif + double seconds_since_last_update = + (current_time - last_odom_publish_time_).Double(); + if (seconds_since_last_update > (1.0 / odometry_rate_)) { + publishOdometry(seconds_since_last_update); + last_odom_publish_time_ = current_time; + } + } + } + + // Finalize the controller + void GazeboRosPlanarMove::FiniChild() { + alive_ = false; + queue_.clear(); + queue_.disable(); + rosnode_->shutdown(); + callback_queue_thread_.join(); + } + + void GazeboRosPlanarMove::cmdVelCallback( + const geometry_msgs::Twist::ConstPtr& cmd_msg) + { + boost::mutex::scoped_lock scoped_lock(lock); + x_ = cmd_msg->linear.x; + y_ = cmd_msg->linear.y; + rot_ = cmd_msg->angular.z; + } + + void GazeboRosPlanarMove::QueueThread() + { + static const double timeout = 0.01; + while (alive_ && rosnode_->ok()) + { + queue_.callAvailable(ros::WallDuration(timeout)); + } + } + + void GazeboRosPlanarMove::publishOdometry(double step_time) + { + + ros::Time current_time = ros::Time::now(); + std::string odom_frame = tf::resolve(tf_prefix_, odometry_frame_); + std::string base_footprint_frame = + tf::resolve(tf_prefix_, robot_base_frame_); + + // getting data for base_footprint to odom transform +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d pose = this->parent_->WorldPose(); +#else + ignition::math::Pose3d pose = this->parent_->GetWorldPose().Ign(); +#endif + + tf::Quaternion qt(pose.Rot().X(), pose.Rot().Y(), pose.Rot().Z(), pose.Rot().W()); + tf::Vector3 vt(pose.Pos().X(), pose.Pos().Y(), pose.Pos().Z()); + + tf::Transform base_footprint_to_odom(qt, vt); + transform_broadcaster_->sendTransform( + tf::StampedTransform(base_footprint_to_odom, current_time, odom_frame, + base_footprint_frame)); + + // publish odom topic + odom_.pose.pose.position.x = pose.Pos().X(); + odom_.pose.pose.position.y = pose.Pos().Y(); + + odom_.pose.pose.orientation.x = pose.Rot().X(); + odom_.pose.pose.orientation.y = pose.Rot().Y(); + odom_.pose.pose.orientation.z = pose.Rot().Z(); + odom_.pose.pose.orientation.w = pose.Rot().W(); + odom_.pose.covariance[0] = 0.00001; + odom_.pose.covariance[7] = 0.00001; + odom_.pose.covariance[14] = 1000000000000.0; + odom_.pose.covariance[21] = 1000000000000.0; + odom_.pose.covariance[28] = 1000000000000.0; + odom_.pose.covariance[35] = 0.001; + + // get velocity in /odom frame + ignition::math::Vector3d linear; + linear.X() = (pose.Pos().X() - last_odom_pose_.Pos().X()) / step_time; + linear.Y() = (pose.Pos().Y() - last_odom_pose_.Pos().Y()) / step_time; + if (rot_ > M_PI / step_time) + { + // we cannot calculate the angular velocity correctly + odom_.twist.twist.angular.z = rot_; + } + else + { + float last_yaw = last_odom_pose_.Rot().Yaw(); + float current_yaw = pose.Rot().Yaw(); + while (current_yaw < last_yaw - M_PI) current_yaw += 2 * M_PI; + while (current_yaw > last_yaw + M_PI) current_yaw -= 2 * M_PI; + float angular_diff = current_yaw - last_yaw; + odom_.twist.twist.angular.z = angular_diff / step_time; + } + last_odom_pose_ = pose; + + // convert velocity to child_frame_id (aka base_footprint) + float yaw = pose.Rot().Yaw(); + odom_.twist.twist.linear.x = cosf(yaw) * linear.X() + sinf(yaw) * linear.Y(); + odom_.twist.twist.linear.y = cosf(yaw) * linear.Y() - sinf(yaw) * linear.X(); + + odom_.header.stamp = current_time; + odom_.header.frame_id = odom_frame; + odom_.child_frame_id = base_footprint_frame; + + odometry_pub_.publish(odom_); + } + + GZ_REGISTER_MODEL_PLUGIN(GazeboRosPlanarMove) +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_projector.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_projector.cpp new file mode 100755 index 0000000..ec05cc0 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_projector.cpp @@ -0,0 +1,176 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + Desc: GazeboRosTextureProjector plugin that controls texture projection + Author: Jared Duke + Date: 17 Jun 2010 + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +namespace gazebo +{ +GZ_REGISTER_MODEL_PLUGIN(GazeboRosProjector); + +typedef std::map OgrePassMap; +typedef OgrePassMap::iterator OgrePassMapIterator; + + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosProjector::GazeboRosProjector() +{ + this->rosnode_ = NULL; +} + + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosProjector::~GazeboRosProjector() +{ + // Custom Callback Queue + this->queue_.clear(); + this->queue_.disable(); + this->rosnode_->shutdown(); + this->callback_queue_thread_.join(); + + delete this->rosnode_; +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosProjector::Load( physics::ModelPtr _parent, sdf::ElementPtr _sdf ) +{ + this->world_ = _parent->GetWorld(); + + + + + // Create a new transport node for talking to the projector + this->node_.reset(new transport::Node()); + // Initialize the node with the world name +#if GAZEBO_MAJOR_VERSION >= 8 + this->node_->Init(this->world_->Name()); +#else + this->node_->Init(this->world_->GetName()); +#endif + // Setting projector topic + std::string name = std::string("~/") + _parent->GetName() + "/" + + _sdf->Get("projector"); + // Create a publisher on the ~/physics topic + this->projector_pub_ = node_->Advertise(name); + + + + // load parameters + this->robot_namespace_ = ""; + if (_sdf->HasElement("robotNamespace")) + this->robot_namespace_ = _sdf->GetElement("robotNamespace")->Get() + "/"; + + this->texture_topic_name_ = ""; + if (_sdf->HasElement("textureTopicName")) + this->texture_topic_name_ = _sdf->GetElement("textureTopicName")->Get(); + + this->projector_topic_name_ = ""; + if (_sdf->HasElement("projectorTopicName")) + this->projector_topic_name_ = _sdf->GetElement("projectorTopicName")->Get(); + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("projector", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + + this->rosnode_ = new ros::NodeHandle(this->robot_namespace_); + + + // Custom Callback Queue + ros::SubscribeOptions so = ros::SubscribeOptions::create( + this->projector_topic_name_,1, + boost::bind( &GazeboRosProjector::ToggleProjector,this,_1), + ros::VoidPtr(), &this->queue_); + this->projectorSubscriber_ = this->rosnode_->subscribe(so); + + ros::SubscribeOptions so2 = ros::SubscribeOptions::create( + this->texture_topic_name_,1, + boost::bind( &GazeboRosProjector::LoadImage,this,_1), + ros::VoidPtr(), &this->queue_); + this->imageSubscriber_ = this->rosnode_->subscribe(so2); + + + // Custom Callback Queue + this->callback_queue_thread_ = boost::thread( boost::bind( &GazeboRosProjector::QueueThread,this ) ); + +} + + +//////////////////////////////////////////////////////////////////////////////// +// Load a texture into the projector +void GazeboRosProjector::LoadImage(const std_msgs::String::ConstPtr& imageMsg) +{ + msgs::Projector msg; + msg.set_name("texture_projector"); + msg.set_texture(imageMsg->data); + this->projector_pub_->Publish(msg); +} + +//////////////////////////////////////////////////////////////////////////////// +// Toggle the activation of the projector +void GazeboRosProjector::ToggleProjector(const std_msgs::Int32::ConstPtr& projectorMsg) +{ + msgs::Projector msg; + msg.set_name("texture_projector"); + msg.set_enabled(projectorMsg->data); + this->projector_pub_->Publish(msg); +} + + +//////////////////////////////////////////////////////////////////////////////// +// Custom callback queue thread +void GazeboRosProjector::QueueThread() +{ + static const double timeout = 0.01; + + while (this->rosnode_->ok()) + { + this->queue_.callAvailable(ros::WallDuration(timeout)); + } +} + +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_prosilica.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_prosilica.cpp new file mode 100755 index 0000000..cb25c41 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_prosilica.cpp @@ -0,0 +1,346 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + @mainpage + Desc: GazeboRosProsilica plugin for simulating Prosilica cameras in Gazebo + Author: John Hsu + Date: 24 Sept 2008 +*/ + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +namespace gazebo +{ + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosProsilica::GazeboRosProsilica() +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosProsilica::~GazeboRosProsilica() +{ + // Finalize the controller + this->poll_srv_.shutdown(); +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosProsilica::Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf) +{ + + CameraPlugin::Load(_parent, _sdf); + this->parentSensor_ = this->parentSensor; + this->width_ = this->width; + this->height_ = this->height; + this->depth_ = this->depth; + this->format_ = this->format; + this->camera_ = this->camera; + GazeboRosCameraUtils::Load(_parent, _sdf); + + this->load_connection_ = GazeboRosCameraUtils::OnLoad(boost::bind(&GazeboRosProsilica::Advertise, this)); +} + +void GazeboRosProsilica::Advertise() +{ + // camera mode for prosilica: + // prosilica::AcquisitionMode mode_; /// @todo Make this property of Camera + + //ROS_ERROR_NAMED("prosilica", "before trigger_mode %s %s",this->mode_param_name.c_str(),this->mode_.c_str()); + + if (!this->rosnode_->searchParam("trigger_mode",this->mode_param_name)) ///\@todo: hardcoded per prosilica_camera wiki api, make this an urdf parameter + this->mode_param_name = "trigger_mode"; + + if (!this->rosnode_->getParam(this->mode_param_name,this->mode_)) + this->mode_ = "streaming"; + + ROS_INFO_NAMED("prosilica", "trigger_mode %s %s",this->mode_param_name.c_str(),this->mode_.c_str()); + + + if (this->mode_ == "polled") + { + poll_srv_ = polled_camera::advertise(*this->rosnode_,this->pollServiceName,&GazeboRosProsilica::pollCallback,this); + } + else if (this->mode_ == "streaming") + { + ROS_DEBUG_NAMED("prosilica", "do nothing here,mode: %s",this->mode_.c_str()); + } + else + { + ROS_ERROR_NAMED("prosilica", "trigger_mode is invalid: %s, using streaming mode",this->mode_.c_str()); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosProsilica::OnNewImageFrame(const unsigned char *_image, + unsigned int _width, unsigned int _height, unsigned int _depth, + const std::string &_format) +{ + if (!this->rosnode_->getParam(this->mode_param_name,this->mode_)) + this->mode_ = "streaming"; + + // should do nothing except turning camera on/off, as we are using service. + /// @todo: consider adding thumbnailing feature here if subscribed. + common::Time sensor_update_time = this->parentSensor_->LastMeasurementTime(); + + // as long as ros is connected, parent is active + //ROS_ERROR_NAMED("prosilica", "debug image count %d",this->image_connect_count_); + if (!this->parentSensor->IsActive()) + { + if ((*this->image_connect_count_) > 0) + // do this first so there's chance for sensor to run 1 frame after activate + this->parentSensor->SetActive(true); + } + else + { + //ROS_ERROR_NAMED("prosilica", "camera_ new frame %s %s",this->parentSensor_->Name().c_str(),this->frame_name_.c_str()); + + if (this->mode_ == "streaming") + { + if ((*this->image_connect_count_) > 0) + { + if (sensor_update_time - this->last_update_time_ >= this->update_period_) + { + this->PutCameraData(_image, sensor_update_time); + this->PublishCameraInfo(sensor_update_time); + this->last_update_time_ = sensor_update_time; + } + } + } + + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// new prosilica interface. +void GazeboRosProsilica::pollCallback(polled_camera::GetPolledImage::Request& req, + polled_camera::GetPolledImage::Response& rsp, + sensor_msgs::Image& image, sensor_msgs::CameraInfo& info) +{ + if (!this->rosnode_->getParam(this->mode_param_name,this->mode_)) + this->mode_ = "streaming"; + + /// @todo Support binning (maybe just cv::resize) + /// @todo Don't adjust K, P for ROI, set CameraInfo.roi fields instead + /// @todo D parameter order is k1, k2, t1, t2, k3 + + if (this->mode_ != "polled") + { + rsp.success = false; + rsp.status_message = "Camera is not in triggered mode"; + return; + } + + if (req.binning_x > 1 || req.binning_y > 1) + { + rsp.success = false; + rsp.status_message = "Gazebo Prosilica plugin does not support binning"; + return; + } + + // get region from request + if (req.roi.x_offset <= 0 || req.roi.y_offset <= 0 || req.roi.width <= 0 || req.roi.height <= 0) + { + req.roi.x_offset = 0; + req.roi.y_offset = 0; + req.roi.width = this->width_; + req.roi.height = this->height; + } + const unsigned char *src = NULL; + ROS_ERROR_NAMED("prosilica", "roidebug %d %d %d %d", req.roi.x_offset, req.roi.y_offset, req.roi.width, req.roi.height); + + // signal sensor to start update + (*this->image_connect_count_)++; + + // wait until an image has been returned + while(!src) + { + { + // Get a pointer to image data + src = this->parentSensor->Camera()->ImageData(0); + + if (src) + { + + // fill CameraInfo + this->roiCameraInfoMsg = &info; + this->roiCameraInfoMsg->header.frame_id = this->frame_name_; + + common::Time roiLastRenderTime = this->parentSensor_->LastMeasurementTime(); + this->roiCameraInfoMsg->header.stamp.sec = roiLastRenderTime.sec; + this->roiCameraInfoMsg->header.stamp.nsec = roiLastRenderTime.nsec; + + this->roiCameraInfoMsg->width = req.roi.width; //this->parentSensor->ImageWidth() ; + this->roiCameraInfoMsg->height = req.roi.height; //this->parentSensor->ImageHeight(); + // distortion +#if ROS_VERSION_MINIMUM(1, 3, 0) + this->roiCameraInfoMsg->distortion_model = "plumb_bob"; + this->roiCameraInfoMsg->D.resize(5); +#endif + this->roiCameraInfoMsg->D[0] = this->distortion_k1_; + this->roiCameraInfoMsg->D[1] = this->distortion_k2_; + this->roiCameraInfoMsg->D[2] = this->distortion_k3_; + this->roiCameraInfoMsg->D[3] = this->distortion_t1_; + this->roiCameraInfoMsg->D[4] = this->distortion_t2_; + // original camera matrix + this->roiCameraInfoMsg->K[0] = this->focal_length_; + this->roiCameraInfoMsg->K[1] = 0.0; + this->roiCameraInfoMsg->K[2] = this->cx_ - req.roi.x_offset; + this->roiCameraInfoMsg->K[3] = 0.0; + this->roiCameraInfoMsg->K[4] = this->focal_length_; + this->roiCameraInfoMsg->K[5] = this->cy_ - req.roi.y_offset; + this->roiCameraInfoMsg->K[6] = 0.0; + this->roiCameraInfoMsg->K[7] = 0.0; + this->roiCameraInfoMsg->K[8] = 1.0; + // rectification + this->roiCameraInfoMsg->R[0] = 1.0; + this->roiCameraInfoMsg->R[1] = 0.0; + this->roiCameraInfoMsg->R[2] = 0.0; + this->roiCameraInfoMsg->R[3] = 0.0; + this->roiCameraInfoMsg->R[4] = 1.0; + this->roiCameraInfoMsg->R[5] = 0.0; + this->roiCameraInfoMsg->R[6] = 0.0; + this->roiCameraInfoMsg->R[7] = 0.0; + this->roiCameraInfoMsg->R[8] = 1.0; + // camera projection matrix (same as camera matrix due to lack of distortion/rectification) (is this generated?) + this->roiCameraInfoMsg->P[0] = this->focal_length_; + this->roiCameraInfoMsg->P[1] = 0.0; + this->roiCameraInfoMsg->P[2] = this->cx_ - req.roi.x_offset; + this->roiCameraInfoMsg->P[3] = -this->focal_length_ * this->hack_baseline_; + this->roiCameraInfoMsg->P[4] = 0.0; + this->roiCameraInfoMsg->P[5] = this->focal_length_; + this->roiCameraInfoMsg->P[6] = this->cy_ - req.roi.y_offset; + this->roiCameraInfoMsg->P[7] = 0.0; + this->roiCameraInfoMsg->P[8] = 0.0; + this->roiCameraInfoMsg->P[9] = 0.0; + this->roiCameraInfoMsg->P[10] = 1.0; + this->roiCameraInfoMsg->P[11] = 0.0; + this->camera_info_pub_.publish(*this->roiCameraInfoMsg); + + // copy data into image_msg_, then convert to roiImageMsg(image) + this->image_msg_.header.frame_id = this->frame_name_; + + common::Time lastRenderTime = this->parentSensor_->LastMeasurementTime(); + this->image_msg_.header.stamp.sec = lastRenderTime.sec; + this->image_msg_.header.stamp.nsec = lastRenderTime.nsec; + + //unsigned char dst[this->width_*this->height]; + + /// @todo: don't bother if there are no subscribers + + // copy from src to image_msg_ + fillImage(this->image_msg_, + this->type_, + this->height_, + this->width_, + this->skip_*this->width_, + (void*)src ); + + /// @todo: publish to ros, thumbnails and rect image in the Update call? + + this->image_pub_.publish(this->image_msg_); + + { + // copy data into ROI image + this->roiImageMsg = ℑ + this->roiImageMsg->header.frame_id = this->frame_name_; + common::Time roiLastRenderTime = this->parentSensor_->LastMeasurementTime(); + this->roiImageMsg->header.stamp.sec = roiLastRenderTime.sec; + this->roiImageMsg->header.stamp.nsec = roiLastRenderTime.nsec; + + // convert image_msg_ to a CvImage using cv_bridge + boost::shared_ptr img_bridge_; + img_bridge_ = cv_bridge::toCvCopy(this->image_msg_); + + // for debug + //cvNamedWindow("showme",CV_WINDOW_AUTOSIZE); + //cvSetMouseCallback("showme", &GazeboRosProsilica::mouse_cb, this); + //cvStartWindowThread(); + //cvShowImage("showme",img_bridge_.toIpl()); + + // crop image to roi + cv::Mat roi(img_bridge_->image, + cv::Rect(req.roi.x_offset, req.roi.y_offset, + req.roi.width, req.roi.height)); + img_bridge_->image = roi; + + // copy roi'd image into roiImageMsg + img_bridge_->toImageMsg(*this->roiImageMsg); + } + } + } + usleep(100000); + } + (*this->image_connect_count_)--; + rsp.success = true; + return; +} + + +/* +void GazeboRosProsilica::OnStats( const boost::shared_ptr &_msg) +{ + this->simTime = msgs::Convert( _msg->sim_time() ); + + ignition::math::Pose3d pose; + pose.Pos().X() = 0.5*sin(0.01*this->simTime.Double()); + gzdbg << "plugin simTime [" << this->simTime.Double() << "] update pose [" << pose.Pos().X() << "]\n"; +} +*/ + +// Register this plugin with the simulator +GZ_REGISTER_SENSOR_PLUGIN(GazeboRosProsilica) + + +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_range.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_range.cpp new file mode 100755 index 0000000..0439552 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_range.cpp @@ -0,0 +1,348 @@ +/* + * Software License Agreement (Modified BSD License) + * + * Copyright (c) 2013-2015, PAL Robotics, S.L. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of PAL Robotics, S.L. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** \author Jose Capriles, Bence Magyar. */ + +#include "gazebo_plugins/gazebo_ros_range.h" +#include "gazebo_plugins/gazebo_ros_utils.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +namespace gazebo +{ +// Register this plugin with the simulator +GZ_REGISTER_SENSOR_PLUGIN(GazeboRosRange) + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosRange::GazeboRosRange() +{ + this->seed = 0; +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosRange::~GazeboRosRange() +{ + this->range_queue_.clear(); + this->range_queue_.disable(); + this->rosnode_->shutdown(); + this->callback_queue_thread_.join(); + + delete this->rosnode_; +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosRange::Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf) +{ + // load plugin + RayPlugin::Load(_parent, this->sdf); + // Get then name of the parent sensor + this->parent_sensor_ = _parent; + // Get the world name. + std::string worldName = _parent->WorldName(); + this->world_ = physics::get_world(worldName); + // save pointers + this->sdf = _sdf; + + this->last_update_time_ = common::Time(0); + + GAZEBO_SENSORS_USING_DYNAMIC_POINTER_CAST; + this->parent_ray_sensor_ = + dynamic_pointer_cast(this->parent_sensor_); + + if (!this->parent_ray_sensor_) + gzthrow("GazeboRosRange controller requires a Ray Sensor as its parent"); + + this->robot_namespace_ = ""; + if (this->sdf->HasElement("robotNamespace")) + this->robot_namespace_ = this->sdf->Get("robotNamespace") + "/"; + + if (!this->sdf->HasElement("frameName")) + { + ROS_INFO_NAMED("range", "Range plugin missing , defaults to /world"); + this->frame_name_ = "/world"; + } + else + this->frame_name_ = this->sdf->Get("frameName"); + + if (!this->sdf->HasElement("topicName")) + { + ROS_INFO_NAMED("range", "Range plugin missing , defaults to /range"); + this->topic_name_ = "/range"; + } + else + this->topic_name_ = this->sdf->Get("topicName"); + + if (!this->sdf->HasElement("radiation")) + { + ROS_WARN_NAMED("range", "Range plugin missing , defaults to ultrasound"); + this->radiation_ = "ultrasound"; + + } + else + this->radiation_ = _sdf->GetElement("radiation")->Get(); + + if (!this->sdf->HasElement("fov")) + { + ROS_WARN_NAMED("range", "Range plugin missing , defaults to 0.05"); + this->fov_ = 0.05; + } + else + this->fov_ = _sdf->GetElement("fov")->Get(); + if (!this->sdf->HasElement("gaussianNoise")) + { + ROS_INFO_NAMED("range", "Range plugin missing , defaults to 0.0"); + this->gaussian_noise_ = 0; + } + else + this->gaussian_noise_ = this->sdf->Get("gaussianNoise"); + + if (!this->sdf->HasElement("updateRate")) + { + ROS_INFO_NAMED("range", "Range plugin missing , defaults to 0"); + this->update_rate_ = 0; + } + else + this->update_rate_ = this->sdf->Get("updateRate"); + + // prepare to throttle this plugin at the same rate + // ideally, we should invoke a plugin update when the sensor updates, + // have to think about how to do that properly later + if (this->update_rate_ > 0.0) + this->update_period_ = 1.0/this->update_rate_; + else + this->update_period_ = 0.0; + + this->range_connect_count_ = 0; + + this->range_msg_.header.frame_id = this->frame_name_; + if (this->radiation_==std::string("ultrasound")) + this->range_msg_.radiation_type = sensor_msgs::Range::ULTRASOUND; + else + this->range_msg_.radiation_type = sensor_msgs::Range::INFRARED; + + this->range_msg_.field_of_view = fov_; + this->range_msg_.max_range = this->parent_ray_sensor_->RangeMax(); + this->range_msg_.min_range = this->parent_ray_sensor_->RangeMin(); + + // Init ROS + if (ros::isInitialized()) + { + // ros callback queue for processing subscription + this->deferred_load_thread_ = boost::thread( + boost::bind(&GazeboRosRange::LoadThread, this)); + } + else + { + gzerr << "Not loading plugin since ROS hasn't been " + << "properly initialized. Try starting gazebo with ros plugin:\n" + << " gazebo -s libgazebo_ros_api_plugin.so\n"; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosRange::LoadThread() +{ + this->rosnode_ = new ros::NodeHandle(this->robot_namespace_); + + // resolve tf prefix + std::string prefix; + this->rosnode_->getParam(std::string("tf_prefix"), prefix); + this->frame_name_ = tf::resolve(prefix, this->frame_name_); + + if (this->topic_name_ != "") + { + ros::AdvertiseOptions ao = + ros::AdvertiseOptions::create( + this->topic_name_, 1, + boost::bind(&GazeboRosRange::RangeConnect, this), + boost::bind(&GazeboRosRange::RangeDisconnect, this), + ros::VoidPtr(), &this->range_queue_); + this->pub_ = this->rosnode_->advertise(ao); + } + + + // Initialize the controller + + // sensor generation off by default + this->parent_ray_sensor_->SetActive(false); + // start custom queue for range + this->callback_queue_thread_ = + boost::thread(boost::bind(&GazeboRosRange::RangeQueueThread, this)); +} + +//////////////////////////////////////////////////////////////////////////////// +// Increment count +void GazeboRosRange::RangeConnect() +{ + this->range_connect_count_++; + this->parent_ray_sensor_->SetActive(true); +} +//////////////////////////////////////////////////////////////////////////////// +// Decrement count +void GazeboRosRange::RangeDisconnect() +{ + this->range_connect_count_--; + + if (this->range_connect_count_ == 0) + this->parent_ray_sensor_->SetActive(false); +} + + +//////////////////////////////////////////////////////////////////////////////// +// Update the plugin +void GazeboRosRange::OnNewLaserScans() +{ + if (this->topic_name_ != "") + { +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time cur_time = this->world_->SimTime(); +#else + common::Time cur_time = this->world_->GetSimTime(); +#endif + if (cur_time < this->last_update_time_) + { + ROS_WARN_NAMED("range", "Negative sensor update time difference detected."); + this->last_update_time_ = cur_time; + } + + if (cur_time - this->last_update_time_ >= this->update_period_) + { + common::Time sensor_update_time = + this->parent_sensor_->LastUpdateTime(); + this->PutRangeData(sensor_update_time); + this->last_update_time_ = cur_time; + } + } + else + { + ROS_INFO_NAMED("range", "gazebo_ros_range topic name not set"); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Put range data to the interface +void GazeboRosRange::PutRangeData(common::Time &_updateTime) +{ + this->parent_ray_sensor_->SetActive(false); + + /***************************************************************/ + /* */ + /* point scan from ray sensor */ + /* */ + /***************************************************************/ + { + boost::mutex::scoped_lock lock(this->lock_); + // Add Frame Name + this->range_msg_.header.frame_id = this->frame_name_; + this->range_msg_.header.stamp.sec = _updateTime.sec; + this->range_msg_.header.stamp.nsec = _updateTime.nsec; + + // find ray with minimal range + range_msg_.range = std::numeric_limits::max(); + + int num_ranges = parent_ray_sensor_->LaserShape()->GetSampleCount() * parent_ray_sensor_->LaserShape()->GetVerticalSampleCount(); + + for(int i = 0; i < num_ranges; ++i) + { + double ray = parent_ray_sensor_->LaserShape()->GetRange(i); + if (ray < range_msg_.range) + range_msg_.range = ray; + } + + // add Gaussian noise and limit to min/max range + if (range_msg_.range < range_msg_.max_range) + range_msg_.range = std::min(range_msg_.range + this->GaussianKernel(0,gaussian_noise_), parent_ray_sensor_->RangeMax()); + + this->parent_ray_sensor_->SetActive(true); + + // send data out via ros message + if (this->range_connect_count_ > 0 && this->topic_name_ != "") + this->pub_.publish(this->range_msg_); + } +} + +////////////////////////////////////////////////////////////////////////////// +// Utility for adding noise +double GazeboRosRange::GaussianKernel(double mu, double sigma) +{ + // using Box-Muller transform to generate two independent standard + // normally disbributed normal variables see wikipedia + + // normalized uniform random variable + double U = static_cast(rand_r(&this->seed)) / + static_cast(RAND_MAX); + + // normalized uniform random variable + double V = static_cast(rand_r(&this->seed)) / + static_cast(RAND_MAX); + + double X = sqrt(-2.0 * ::log(U)) * cos(2.0*M_PI * V); + // double Y = sqrt(-2.0 * ::log(U)) * sin(2.0*M_PI * V); + + // there are 2 indep. vars, we'll just use X + // scale to our mu and sigma + X = sigma * X + mu; + return X; +} + +//////////////////////////////////////////////////////////////////////////////// +// Put range data to the interface +void GazeboRosRange::RangeQueueThread() +{ + static const double timeout = 0.01; + + while (this->rosnode_->ok()) + { + this->range_queue_.callAvailable(ros::WallDuration(timeout)); + } +} +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_skid_steer_drive.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_skid_steer_drive.cpp new file mode 100755 index 0000000..61d23ab --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_skid_steer_drive.cpp @@ -0,0 +1,478 @@ +/* + * Copyright (c) 2010, Daniel Hewlett, Antons Rebguns + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY Antons Rebguns ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Antons Rebguns BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **/ + +/* + * \file gazebo_ros_skid_steer_drive.cpp + * + * \brief A skid steering drive plugin. Inspired by gazebo_ros_diff_drive and SkidSteerDrivePlugin + * + * \author Zdenek Materna (imaterna@fit.vutbr.cz) + * + * $ Id: 06/25/2013 11:23:40 AM materna $ + */ + + +#include +#include + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace gazebo { + + enum { + RIGHT_FRONT=0, + LEFT_FRONT=1, + RIGHT_REAR=2, + LEFT_REAR=3, + }; + + GazeboRosSkidSteerDrive::GazeboRosSkidSteerDrive() {} + + // Destructor + GazeboRosSkidSteerDrive::~GazeboRosSkidSteerDrive() { + delete rosnode_; + delete transform_broadcaster_; + } + + // Load the controller + void GazeboRosSkidSteerDrive::Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf) { + + this->parent = _parent; + this->world = _parent->GetWorld(); + + this->robot_namespace_ = ""; + if (!_sdf->HasElement("robotNamespace")) { + ROS_INFO_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin missing , defaults to \"%s\"", + this->robot_namespace_.c_str()); + } else { + this->robot_namespace_ = + _sdf->GetElement("robotNamespace")->Get() + "/"; + } + + this->broadcast_tf_ = false; + if (!_sdf->HasElement("broadcastTF")) { + if (!this->broadcast_tf_) + ROS_INFO_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to false.",this->robot_namespace_.c_str()); + else ROS_INFO_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to true.",this->robot_namespace_.c_str()); + + } else { + this->broadcast_tf_ = _sdf->GetElement("broadcastTF")->Get(); + } + + // TODO write error if joint doesn't exist! + this->left_front_joint_name_ = "left_front_joint"; + if (!_sdf->HasElement("leftFrontJoint")) { + ROS_WARN_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to \"%s\"", + this->robot_namespace_.c_str(), this->left_front_joint_name_.c_str()); + } else { + this->left_front_joint_name_ = _sdf->GetElement("leftFrontJoint")->Get(); + } + + this->right_front_joint_name_ = "right_front_joint"; + if (!_sdf->HasElement("rightFrontJoint")) { + ROS_WARN_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to \"%s\"", + this->robot_namespace_.c_str(), this->right_front_joint_name_.c_str()); + } else { + this->right_front_joint_name_ = _sdf->GetElement("rightFrontJoint")->Get(); + } + + this->left_rear_joint_name_ = "left_rear_joint"; + if (!_sdf->HasElement("leftRearJoint")) { + ROS_WARN_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to \"%s\"", + this->robot_namespace_.c_str(), this->left_rear_joint_name_.c_str()); + } else { + this->left_rear_joint_name_ = _sdf->GetElement("leftRearJoint")->Get(); + } + + this->right_rear_joint_name_ = "right_rear_joint"; + if (!_sdf->HasElement("rightRearJoint")) { + ROS_WARN_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to \"%s\"", + this->robot_namespace_.c_str(), this->right_rear_joint_name_.c_str()); + } else { + this->right_rear_joint_name_ = _sdf->GetElement("rightRearJoint")->Get(); + } + + + // This assumes that front and rear wheel spacing is identical + /*this->wheel_separation_ = this->parent->GetJoint(left_front_joint_name_)->GetAnchor(0).Distance( + this->parent->GetJoint(right_front_joint_name_)->GetAnchor(0));*/ + + this->wheel_separation_ = 0.4; + + if (!_sdf->HasElement("wheelSeparation")) { + ROS_WARN_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to value from robot_description: %f", + this->robot_namespace_.c_str(), this->wheel_separation_); + } else { + this->wheel_separation_ = + _sdf->GetElement("wheelSeparation")->Get(); + } + + // TODO get this from robot_description + this->wheel_diameter_ = 0.15; + if (!_sdf->HasElement("wheelDiameter")) { + ROS_WARN_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to %f", + this->robot_namespace_.c_str(), this->wheel_diameter_); + } else { + this->wheel_diameter_ = _sdf->GetElement("wheelDiameter")->Get(); + } + + this->torque = 5.0; + if (!_sdf->HasElement("torque")) { + ROS_WARN_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to %f", + this->robot_namespace_.c_str(), this->torque); + } else { + this->torque = _sdf->GetElement("torque")->Get(); + } + + this->command_topic_ = "cmd_vel"; + if (!_sdf->HasElement("commandTopic")) { + ROS_WARN_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to \"%s\"", + this->robot_namespace_.c_str(), this->command_topic_.c_str()); + } else { + this->command_topic_ = _sdf->GetElement("commandTopic")->Get(); + } + + this->odometry_topic_ = "odom"; + if (!_sdf->HasElement("odometryTopic")) { + ROS_WARN_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to \"%s\"", + this->robot_namespace_.c_str(), this->odometry_topic_.c_str()); + } else { + this->odometry_topic_ = _sdf->GetElement("odometryTopic")->Get(); + } + + this->odometry_frame_ = "odom"; + if (!_sdf->HasElement("odometryFrame")) { + ROS_WARN_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to \"%s\"", + this->robot_namespace_.c_str(), this->odometry_frame_.c_str()); + } else { + this->odometry_frame_ = _sdf->GetElement("odometryFrame")->Get(); + } + + this->robot_base_frame_ = "base_footprint"; + if (!_sdf->HasElement("robotBaseFrame")) { + ROS_WARN_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to \"%s\"", + this->robot_namespace_.c_str(), this->robot_base_frame_.c_str()); + } else { + this->robot_base_frame_ = _sdf->GetElement("robotBaseFrame")->Get(); + } + + this->update_rate_ = 100.0; + if (!_sdf->HasElement("updateRate")) { + ROS_WARN_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to %f", + this->robot_namespace_.c_str(), this->update_rate_); + } else { + this->update_rate_ = _sdf->GetElement("updateRate")->Get(); + } + + this->covariance_x_ = 0.0001; + if (!_sdf->HasElement("covariance_x")) { + ROS_WARN_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to %f", + this->robot_namespace_.c_str(), covariance_x_); + } else { + covariance_x_ = _sdf->GetElement("covariance_x")->Get(); + } + + this->covariance_y_ = 0.0001; + if (!_sdf->HasElement("covariance_y")) { + ROS_WARN_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to %f", + this->robot_namespace_.c_str(), covariance_y_); + } else { + covariance_y_ = _sdf->GetElement("covariance_y")->Get(); + } + + this->covariance_yaw_ = 0.01; + if (!_sdf->HasElement("covariance_yaw")) { + ROS_WARN_NAMED("skid_steer_drive", "GazeboRosSkidSteerDrive Plugin (ns = %s) missing , defaults to %f", + this->robot_namespace_.c_str(), covariance_yaw_); + } else { + covariance_yaw_ = _sdf->GetElement("covariance_yaw")->Get(); + } + + // Initialize update rate stuff + if (this->update_rate_ > 0.0) { + this->update_period_ = 1.0 / this->update_rate_; + } else { + this->update_period_ = 0.0; + } +#if GAZEBO_MAJOR_VERSION >= 8 + last_update_time_ = this->world->SimTime(); +#else + last_update_time_ = this->world->GetSimTime(); +#endif + + // Initialize velocity stuff + wheel_speed_[RIGHT_FRONT] = 0; + wheel_speed_[LEFT_FRONT] = 0; + wheel_speed_[RIGHT_REAR] = 0; + wheel_speed_[LEFT_REAR] = 0; + + x_ = 0; + rot_ = 0; + alive_ = true; + + joints[LEFT_FRONT] = this->parent->GetJoint(left_front_joint_name_); + joints[RIGHT_FRONT] = this->parent->GetJoint(right_front_joint_name_); + joints[LEFT_REAR] = this->parent->GetJoint(left_rear_joint_name_); + joints[RIGHT_REAR] = this->parent->GetJoint(right_rear_joint_name_); + + if (!joints[LEFT_FRONT]) { + char error[200]; + snprintf(error, 200, + "GazeboRosSkidSteerDrive Plugin (ns = %s) couldn't get left front hinge joint named \"%s\"", + this->robot_namespace_.c_str(), this->left_front_joint_name_.c_str()); + gzthrow(error); + } + + if (!joints[RIGHT_FRONT]) { + char error[200]; + snprintf(error, 200, + "GazeboRosSkidSteerDrive Plugin (ns = %s) couldn't get right front hinge joint named \"%s\"", + this->robot_namespace_.c_str(), this->right_front_joint_name_.c_str()); + gzthrow(error); + } + + if (!joints[LEFT_REAR]) { + char error[200]; + snprintf(error, 200, + "GazeboRosSkidSteerDrive Plugin (ns = %s) couldn't get left rear hinge joint named \"%s\"", + this->robot_namespace_.c_str(), this->left_rear_joint_name_.c_str()); + gzthrow(error); + } + + if (!joints[RIGHT_REAR]) { + char error[200]; + snprintf(error, 200, + "GazeboRosSkidSteerDrive Plugin (ns = %s) couldn't get right rear hinge joint named \"%s\"", + this->robot_namespace_.c_str(), this->right_rear_joint_name_.c_str()); + gzthrow(error); + } + +#if GAZEBO_MAJOR_VERSION > 2 + joints[LEFT_FRONT]->SetParam("fmax", 0, torque); + joints[RIGHT_FRONT]->SetParam("fmax", 0, torque); + joints[LEFT_REAR]->SetParam("fmax", 0, torque); + joints[RIGHT_REAR]->SetParam("fmax", 0, torque); +#else + joints[LEFT_FRONT]->SetMaxForce(0, torque); + joints[RIGHT_FRONT]->SetMaxForce(0, torque); + joints[LEFT_REAR]->SetMaxForce(0, torque); + joints[RIGHT_REAR]->SetMaxForce(0, torque); +#endif + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("skid_steer_drive", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + rosnode_ = new ros::NodeHandle(this->robot_namespace_); + + ROS_INFO_NAMED("skid_steer_drive", "Starting GazeboRosSkidSteerDrive Plugin (ns = %s)", this->robot_namespace_.c_str()); + + tf_prefix_ = tf::getPrefixParam(*rosnode_); + transform_broadcaster_ = new tf::TransformBroadcaster(); + + // ROS: Subscribe to the velocity command topic (usually "cmd_vel") + ros::SubscribeOptions so = + ros::SubscribeOptions::create(command_topic_, 1, + boost::bind(&GazeboRosSkidSteerDrive::cmdVelCallback, this, _1), + ros::VoidPtr(), &queue_); + + cmd_vel_subscriber_ = rosnode_->subscribe(so); + + odometry_publisher_ = rosnode_->advertise(odometry_topic_, 1); + + // start custom queue for diff drive + this->callback_queue_thread_ = + boost::thread(boost::bind(&GazeboRosSkidSteerDrive::QueueThread, this)); + + // listen to the update event (broadcast every simulation iteration) + this->update_connection_ = + event::Events::ConnectWorldUpdateBegin( + boost::bind(&GazeboRosSkidSteerDrive::UpdateChild, this)); + + } + + // Update the controller + void GazeboRosSkidSteerDrive::UpdateChild() { +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time current_time = this->world->SimTime(); +#else + common::Time current_time = this->world->GetSimTime(); +#endif + double seconds_since_last_update = + (current_time - last_update_time_).Double(); + if (seconds_since_last_update > update_period_) { + + publishOdometry(seconds_since_last_update); + + // Update robot in case new velocities have been requested + getWheelVelocities(); +#if GAZEBO_MAJOR_VERSION > 2 + joints[LEFT_FRONT]->SetParam("vel", 0, wheel_speed_[LEFT_FRONT] / (wheel_diameter_ / 2.0)); + joints[RIGHT_FRONT]->SetParam("vel", 0, wheel_speed_[RIGHT_FRONT] / (wheel_diameter_ / 2.0)); + joints[LEFT_REAR]->SetParam("vel", 0, wheel_speed_[LEFT_REAR] / (wheel_diameter_ / 2.0)); + joints[RIGHT_REAR]->SetParam("vel", 0, wheel_speed_[RIGHT_REAR] / (wheel_diameter_ / 2.0)); +#else + joints[LEFT_FRONT]->SetVelocity(0, wheel_speed_[LEFT_FRONT] / (wheel_diameter_ / 2.0)); + joints[RIGHT_FRONT]->SetVelocity(0, wheel_speed_[RIGHT_FRONT] / (wheel_diameter_ / 2.0)); + joints[LEFT_REAR]->SetVelocity(0, wheel_speed_[LEFT_REAR] / (wheel_diameter_ / 2.0)); + joints[RIGHT_REAR]->SetVelocity(0, wheel_speed_[RIGHT_REAR] / (wheel_diameter_ / 2.0)); +#endif + + last_update_time_+= common::Time(update_period_); + + } + } + + // Finalize the controller + void GazeboRosSkidSteerDrive::FiniChild() { + alive_ = false; + queue_.clear(); + queue_.disable(); + rosnode_->shutdown(); + callback_queue_thread_.join(); + } + + void GazeboRosSkidSteerDrive::getWheelVelocities() { + boost::mutex::scoped_lock scoped_lock(lock); + + double vr = x_; + double va = rot_; + + wheel_speed_[RIGHT_FRONT] = vr + va * wheel_separation_ / 2.0; + wheel_speed_[RIGHT_REAR] = vr + va * wheel_separation_ / 2.0; + + wheel_speed_[LEFT_FRONT] = vr - va * wheel_separation_ / 2.0; + wheel_speed_[LEFT_REAR] = vr - va * wheel_separation_ / 2.0; + + } + + void GazeboRosSkidSteerDrive::cmdVelCallback( + const geometry_msgs::Twist::ConstPtr& cmd_msg) { + + boost::mutex::scoped_lock scoped_lock(lock); + x_ = cmd_msg->linear.x; + rot_ = cmd_msg->angular.z; + } + + void GazeboRosSkidSteerDrive::QueueThread() { + static const double timeout = 0.01; + + while (alive_ && rosnode_->ok()) { + queue_.callAvailable(ros::WallDuration(timeout)); + } + } + + void GazeboRosSkidSteerDrive::publishOdometry(double step_time) { + ros::Time current_time = ros::Time::now(); + std::string odom_frame = + tf::resolve(tf_prefix_, odometry_frame_); + std::string base_footprint_frame = + tf::resolve(tf_prefix_, robot_base_frame_); + + // TODO create some non-perfect odometry! + // getting data for base_footprint to odom transform +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d pose = this->parent->WorldPose(); +#else + ignition::math::Pose3d pose = this->parent->GetWorldPose().Ign(); +#endif + + tf::Quaternion qt(pose.Rot().X(), pose.Rot().Y(), pose.Rot().Z(), pose.Rot().W()); + tf::Vector3 vt(pose.Pos().X(), pose.Pos().Y(), pose.Pos().Z()); + + tf::Transform base_footprint_to_odom(qt, vt); + if (this->broadcast_tf_) { + + transform_broadcaster_->sendTransform( + tf::StampedTransform(base_footprint_to_odom, current_time, + odom_frame, base_footprint_frame)); + + } + + // publish odom topic + odom_.pose.pose.position.x = pose.Pos().X(); + odom_.pose.pose.position.y = pose.Pos().Y(); + + odom_.pose.pose.orientation.x = pose.Rot().X(); + odom_.pose.pose.orientation.y = pose.Rot().Y(); + odom_.pose.pose.orientation.z = pose.Rot().Z(); + odom_.pose.pose.orientation.w = pose.Rot().W(); + odom_.pose.covariance[0] = this->covariance_x_; + odom_.pose.covariance[7] = this->covariance_y_; + odom_.pose.covariance[14] = 1000000000000.0; + odom_.pose.covariance[21] = 1000000000000.0; + odom_.pose.covariance[28] = 1000000000000.0; + odom_.pose.covariance[35] = this->covariance_yaw_; + + // get velocity in /odom frame + ignition::math::Vector3d linear; +#if GAZEBO_MAJOR_VERSION >= 8 + linear = this->parent->WorldLinearVel(); + odom_.twist.twist.angular.z = this->parent->WorldAngularVel().Z(); +#else + linear = this->parent->GetWorldLinearVel().Ign(); + odom_.twist.twist.angular.z = this->parent->GetWorldAngularVel().Ign().Z(); +#endif + + // convert velocity to child_frame_id (aka base_footprint) + float yaw = pose.Rot().Yaw(); + odom_.twist.twist.linear.x = cosf(yaw) * linear.X() + sinf(yaw) * linear.Y(); + odom_.twist.twist.linear.y = cosf(yaw) * linear.Y() - sinf(yaw) * linear.X(); + odom_.twist.covariance[0] = this->covariance_x_; + odom_.twist.covariance[7] = this->covariance_y_; + odom_.twist.covariance[14] = 1000000000000.0; + odom_.twist.covariance[21] = 1000000000000.0; + odom_.twist.covariance[28] = 1000000000000.0; + odom_.twist.covariance[35] = this->covariance_yaw_; + + odom_.header.stamp = current_time; + odom_.header.frame_id = odom_frame; + odom_.child_frame_id = base_footprint_frame; + + odometry_publisher_.publish(odom_); + } + + GZ_REGISTER_MODEL_PLUGIN(GazeboRosSkidSteerDrive) +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_template.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_template.cpp new file mode 100755 index 0000000..2aeb34e --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_template.cpp @@ -0,0 +1,80 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2013, Open Source Robotics Foundation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the Open Source Robotics Foundation + * nor the names of its contributors may be + * used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +/** + * \author Dave Coleman + * \desc Example ROS plugin for Gazebo + */ + +#include +#include + +namespace gazebo +{ +// Register this plugin with the simulator +GZ_REGISTER_MODEL_PLUGIN(GazeboRosTemplate); + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosTemplate::GazeboRosTemplate() +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosTemplate::~GazeboRosTemplate() +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosTemplate::Load( physics::ModelPtr _parent, sdf::ElementPtr _sdf ) +{ + // Make sure the ROS node for Gazebo has already been initalized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("template", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosTemplate::UpdateChild() +{ +} + +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_tricycle_drive.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_tricycle_drive.cpp new file mode 100755 index 0000000..3e05df0 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_tricycle_drive.cpp @@ -0,0 +1,485 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2013, Markus Bader + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +/** + * \file gazebo_ros_tricycle_drive.cpp + * \brief A tricycle drive plugin for gazebo. + * \author Markus Bader + * \date 22th of June 2014 + */ + + +#include +#include + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace gazebo +{ + +enum { + RIGHT, + LEFT, +}; + +GazeboRosTricycleDrive::GazeboRosTricycleDrive() {} + +// Destructor +GazeboRosTricycleDrive::~GazeboRosTricycleDrive() {} + +// Load the controller +void GazeboRosTricycleDrive::Load ( physics::ModelPtr _parent, sdf::ElementPtr _sdf ) +{ + parent = _parent; + gazebo_ros_ = GazeboRosPtr ( new GazeboRos ( _parent, _sdf, "TricycleDrive" ) ); + // Make sure the ROS node for Gazebo has already been initialized + gazebo_ros_->isInitialized(); + + gazebo_ros_->getParameter ( diameter_actuated_wheel_, "actuatedWheelDiameter", 0.15 ); + gazebo_ros_->getParameter ( diameter_encoder_wheel_, "encoderWheelDiameter", 0.15 ); + gazebo_ros_->getParameter ( wheel_torque_, "wheelTorque", 5.0 ); + gazebo_ros_->getParameter ( command_topic_, "commandTopic", "cmd_vel" ); + gazebo_ros_->getParameter ( odometry_topic_, "odometryTopic", "odom" ); + gazebo_ros_->getParameter ( odometry_frame_, "odometryFrame", "odom" ); + gazebo_ros_->getParameter ( robot_base_frame_, "robotBaseFrame", "base_link" ); + + gazebo_ros_->getParameter ( update_rate_, "updateRate", 100.0 ); + gazebo_ros_->getParameter ( wheel_acceleration_, "wheelAcceleration", 0 ); + gazebo_ros_->getParameter ( wheel_deceleration_, "wheelDeceleration", wheel_acceleration_ ); + gazebo_ros_->getParameter ( wheel_speed_tolerance_, "wheelSpeedTolerance", 0.01 ); + gazebo_ros_->getParameter ( steering_speed_, "steeringSpeed", 0 ); + gazebo_ros_->getParameter ( steering_angle_tolerance_, "steeringAngleTolerance", 0.01 ); + gazebo_ros_->getParameter ( separation_encoder_wheel_, "encoderWheelSeparation", 0.5 ); + + gazebo_ros_->getParameterBoolean ( publishWheelTF_, "publishWheelTF", false ); + gazebo_ros_->getParameterBoolean ( publishWheelJointState_, "publishWheelJointState", false ); + + gazebo_ros_->getParameterBoolean ( publishWheelJointState_, "publishWheelJointState", false ); + + joint_steering_ = gazebo_ros_->getJoint ( parent, "steeringJoint", "front_steering_joint" ); + joint_wheel_actuated_ = gazebo_ros_->getJoint ( parent, "actuatedWheelJoint", "front_wheel_joint" ); + joint_wheel_encoder_left_ = gazebo_ros_->getJoint ( parent, "encoderWheelLeftJoint", "left_wheel_joint" ); + joint_wheel_encoder_right_ = gazebo_ros_->getJoint ( parent, "encoderWheelRightJoint", "right_wheel_joint" ); + + std::map odomOptions; + odomOptions["encoder"] = ENCODER; + odomOptions["world"] = WORLD; + gazebo_ros_->getParameter ( odom_source_, "odometrySource", odomOptions, WORLD ); + + joint_wheel_actuated_->SetParam ( "fmax", 0, wheel_torque_ ); + joint_steering_->SetParam ( "fmax", 0, wheel_torque_ ); + + + // Initialize update rate stuff + if ( this->update_rate_ > 0.0 ) this->update_period_ = 1.0 / this->update_rate_; + else this->update_period_ = 0.0; +#if GAZEBO_MAJOR_VERSION >= 8 + last_actuator_update_ = parent->GetWorld()->SimTime(); +#else + last_actuator_update_ = parent->GetWorld()->GetSimTime(); +#endif + + // Initialize velocity stuff + alive_ = true; + + if ( this->publishWheelJointState_ ) { + joint_state_publisher_ = gazebo_ros_->node()->advertise ( "joint_states", 1000 ); + ROS_INFO_NAMED("tricycle_drive", "%s: Advertise joint_states", gazebo_ros_->info() ); + } + + transform_broadcaster_ = boost::shared_ptr ( new tf::TransformBroadcaster() ); + + // ROS: Subscribe to the velocity command topic (usually "cmd_vel") + ROS_INFO_NAMED("tricycle_drive", "%s: Try to subscribe to %s", gazebo_ros_->info(), command_topic_.c_str() ); + + ros::SubscribeOptions so = + ros::SubscribeOptions::create ( command_topic_, 1, + boost::bind ( &GazeboRosTricycleDrive::cmdVelCallback, this, _1 ), + ros::VoidPtr(), &queue_ ); + + cmd_vel_subscriber_ = gazebo_ros_->node()->subscribe ( so ); + ROS_INFO_NAMED("tricycle_drive", "%s: Subscribe to %s", gazebo_ros_->info(), command_topic_.c_str() ); + + odometry_publisher_ = gazebo_ros_->node()->advertise ( odometry_topic_, 1 ); + ROS_INFO_NAMED("tricycle_drive", "%s: Advertise odom on %s ", gazebo_ros_->info(), odometry_topic_.c_str() ); + + // start custom queue for diff drive + this->callback_queue_thread_ = boost::thread ( boost::bind ( &GazeboRosTricycleDrive::QueueThread, this ) ); + + // listen to the update event (broadcast every simulation iteration) + this->update_connection_ = event::Events::ConnectWorldUpdateBegin ( boost::bind ( &GazeboRosTricycleDrive::UpdateChild, this ) ); + +} + +void GazeboRosTricycleDrive::publishWheelJointState() +{ + std::vector joints; + joints.push_back ( joint_steering_ ); + joints.push_back ( joint_wheel_actuated_ ); + joints.push_back ( joint_wheel_encoder_left_ ); + joints.push_back ( joint_wheel_encoder_right_ ); + + ros::Time current_time = ros::Time::now(); + joint_state_.header.stamp = current_time; + joint_state_.name.resize ( joints.size() ); + joint_state_.position.resize ( joints.size() ); + joint_state_.velocity.resize ( joints.size() ); + joint_state_.effort.resize ( joints.size() ); + for ( std::size_t i = 0; i < joints.size(); i++ ) { + joint_state_.name[i] = joints[i]->GetName(); +#if GAZEBO_MAJOR_VERSION >= 8 + joint_state_.position[i] = joints[i]->Position ( 0 ); +#else + joint_state_.position[i] = joints[i]->GetAngle ( 0 ).Radian(); +#endif + joint_state_.velocity[i] = joints[i]->GetVelocity ( 0 ); + joint_state_.effort[i] = joints[i]->GetForce ( 0 ); + } + joint_state_publisher_.publish ( joint_state_ ); +} + +void GazeboRosTricycleDrive::publishWheelTF() +{ + ros::Time current_time = ros::Time::now(); + std::vector joints; + joints.push_back ( joint_steering_ ); + joints.push_back ( joint_wheel_actuated_ ); + joints.push_back ( joint_wheel_encoder_left_ ); + joints.push_back ( joint_wheel_encoder_right_ ); + for ( std::size_t i = 0; i < joints.size(); i++ ) { + std::string frame = gazebo_ros_->resolveTF ( joints[i]->GetName() ); + std::string parent_frame = gazebo_ros_->resolveTF ( joints[i]->GetParent()->GetName() ); + +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d pose = joints[i]->GetChild()->RelativePose(); +#else + ignition::math::Pose3d pose = joints[i]->GetChild()->GetRelativePose().Ign(); +#endif + + tf::Quaternion qt ( pose.Rot().X(), pose.Rot().Y(), pose.Rot().Z(), pose.Rot().W() ); + tf::Vector3 vt ( pose.Pos().X(), pose.Pos().Y(), pose.Pos().Z() ); + + tf::Transform transform ( qt, vt ); + transform_broadcaster_->sendTransform ( tf::StampedTransform ( transform, current_time, parent_frame, frame ) ); + } + +} +// Update the controller +void GazeboRosTricycleDrive::UpdateChild() +{ + if ( odom_source_ == ENCODER ) UpdateOdometryEncoder(); +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time current_time = parent->GetWorld()->SimTime(); +#else + common::Time current_time = parent->GetWorld()->GetSimTime(); +#endif + double seconds_since_last_update = ( current_time - last_actuator_update_ ).Double(); + if ( seconds_since_last_update > update_period_ ) { + + publishOdometry ( seconds_since_last_update ); + if ( publishWheelTF_ ) publishWheelTF(); + if ( publishWheelJointState_ ) publishWheelJointState(); + + double target_wheel_roation_speed = cmd_.speed / ( diameter_actuated_wheel_ / 2.0 ); + double target_steering_angle = cmd_.angle; + + motorController ( target_wheel_roation_speed, target_steering_angle, seconds_since_last_update ); + + //ROS_INFO_NAMED("tricycle_drive", "v = %f, w = %f ", target_wheel_roation_speed, target_steering_angle); + + last_actuator_update_ += common::Time ( update_period_ ); + } +} + + +void GazeboRosTricycleDrive::motorController ( double target_speed, double target_angle, double dt ) +{ + double applied_speed = target_speed; + double applied_angle = target_angle; + + double current_speed = joint_wheel_actuated_->GetVelocity ( 0 ); + if (wheel_acceleration_ > 0) + { + double diff_speed = current_speed - target_speed; + if ( fabs ( diff_speed ) < wheel_speed_tolerance_ ) + { + applied_speed = current_speed; + } + else if ( fabs(diff_speed) > wheel_acceleration_ * dt ) + { + if(diff_speed > 0) + { + applied_speed = current_speed - wheel_acceleration_ * dt; + } + else + { + applied_speed = current_speed + wheel_deceleration_ * dt; + } + } + } + joint_wheel_actuated_->SetParam ( "vel", 0, applied_speed ); + +#if GAZEBO_MAJOR_VERSION >= 8 + double current_angle = joint_steering_->Position ( 0 ); +#else + double current_angle = joint_steering_->GetAngle ( 0 ).Radian(); +#endif + + // truncate target angle + if (target_angle > +M_PI / 2.0) + { + target_angle = +M_PI / 2.0; + } + else if (target_angle < -M_PI / 2.0) + { + target_angle = -M_PI / 2.0; + } + + // if steering_speed_ is > 0, use speed control, otherwise use position control + // With position control, one cannot expect dynamics to work correctly. + double diff_angle = current_angle - target_angle; + if ( steering_speed_ > 0 ) { + // this means we will steer using steering speed + double applied_steering_speed = 0; + if (fabs(diff_angle) < steering_angle_tolerance_ ) { + // we're withing angle tolerance + applied_steering_speed = 0; + } else if ( diff_angle < target_speed ) { + // steer toward target angle + applied_steering_speed = steering_speed_; + } else { + // steer toward target angle + applied_steering_speed = -steering_speed_; + } + + // use speed control, not recommended, for better dynamics use force control + joint_steering_->SetParam ( "vel", 0, applied_steering_speed ); + } + else { + // steering_speed_ is zero, use position control. + // This is not a good idea if we want dynamics to work. + if (fabs(diff_angle) < steering_speed_ * dt) + { + // we can take a step and still not overshoot target + if(diff_angle > 0) + { + applied_angle = current_angle - steering_speed_ * dt; + } + else + { + applied_angle = current_angle + steering_speed_ * dt; + } + } + else + { + applied_angle = target_angle; + } +#if GAZEBO_MAJOR_VERSION >= 9 + joint_steering_->SetPosition(0, applied_angle, true); +#else + ROS_WARN_ONCE("The tricycle_drive plugin is using the Joint::SetPosition method without preserving the link velocity."); + ROS_WARN_ONCE("As a result, gravity will not be simulated correctly for your model."); + ROS_WARN_ONCE("Please upgrade to Gazebo 9."); + ROS_WARN_ONCE("For details, see https://github.com/ros-simulation/gazebo_ros_pkgs/issues/612"); + joint_steering_->SetPosition(0, applied_angle); +#endif + } + //ROS_INFO_NAMED("tricycle_drive", "target: [%3.2f, %3.2f], current: [%3.2f, %3.2f], applied: [%3.2f, %3.2f/%3.2f] ", + // target_speed, target_angle, current_speed, current_angle, applied_speed, applied_angle, applied_steering_speed ); +} + +// Finalize the controller +void GazeboRosTricycleDrive::FiniChild() +{ + alive_ = false; + queue_.clear(); + queue_.disable(); + gazebo_ros_->node()->shutdown(); + callback_queue_thread_.join(); +} + +void GazeboRosTricycleDrive::cmdVelCallback ( const geometry_msgs::Twist::ConstPtr& cmd_msg ) +{ + boost::mutex::scoped_lock scoped_lock ( lock ); + cmd_.speed = cmd_msg->linear.x; + cmd_.angle = cmd_msg->angular.z; +} + +void GazeboRosTricycleDrive::QueueThread() +{ + static const double timeout = 0.01; + + while ( alive_ && gazebo_ros_->node()->ok() ) { + queue_.callAvailable ( ros::WallDuration ( timeout ) ); + } +} + +void GazeboRosTricycleDrive::UpdateOdometryEncoder() +{ + double vl = joint_wheel_encoder_left_->GetVelocity ( 0 ); + double vr = joint_wheel_encoder_right_->GetVelocity ( 0 ); +#if GAZEBO_MAJOR_VERSION >= 8 + common::Time current_time = parent->GetWorld()->SimTime(); +#else + common::Time current_time = parent->GetWorld()->GetSimTime(); +#endif + double seconds_since_last_update = ( current_time - last_odom_update_ ).Double(); + last_odom_update_ = current_time; + + double b = separation_encoder_wheel_; + + // Book: Sigwart 2011 Autonompus Mobile Robots page:337 + double sl = vl * ( diameter_encoder_wheel_ / 2.0 ) * seconds_since_last_update; + double sr = vr * ( diameter_encoder_wheel_ / 2.0 ) * seconds_since_last_update; + double theta = ( sl - sr ) /b; + + + double dx = ( sl + sr ) /2.0 * cos ( pose_encoder_.theta + ( sl - sr ) / ( 2.0*b ) ); + double dy = ( sl + sr ) /2.0 * sin ( pose_encoder_.theta + ( sl - sr ) / ( 2.0*b ) ); + double dtheta = ( sl - sr ) /b; + + pose_encoder_.x += dx; + pose_encoder_.y += dy; + pose_encoder_.theta += dtheta; + + double w = dtheta/seconds_since_last_update; + double v = sqrt ( dx*dx+dy*dy ) /seconds_since_last_update; + + tf::Quaternion qt; + tf::Vector3 vt; + qt.setRPY ( 0,0,pose_encoder_.theta ); + vt = tf::Vector3 ( pose_encoder_.x, pose_encoder_.y, 0 ); + + odom_.pose.pose.position.x = vt.x(); + odom_.pose.pose.position.y = vt.y(); + odom_.pose.pose.position.z = vt.z(); + + odom_.pose.pose.orientation.x = qt.x(); + odom_.pose.pose.orientation.y = qt.y(); + odom_.pose.pose.orientation.z = qt.z(); + odom_.pose.pose.orientation.w = qt.w(); + + odom_.twist.twist.angular.z = w; + odom_.twist.twist.linear.x = dx/seconds_since_last_update; + odom_.twist.twist.linear.y = dy/seconds_since_last_update; +} + +void GazeboRosTricycleDrive::publishOdometry ( double step_time ) +{ + + ros::Time current_time = ros::Time::now(); + std::string odom_frame = gazebo_ros_->resolveTF ( odometry_frame_ ); + std::string base_footprint_frame = gazebo_ros_->resolveTF ( robot_base_frame_ ); + + tf::Quaternion qt; + tf::Vector3 vt; + + if ( odom_source_ == ENCODER ) { + // getting data form encoder integration + qt = tf::Quaternion ( odom_.pose.pose.orientation.x, odom_.pose.pose.orientation.y, odom_.pose.pose.orientation.z, odom_.pose.pose.orientation.w ); + vt = tf::Vector3 ( odom_.pose.pose.position.x, odom_.pose.pose.position.y, odom_.pose.pose.position.z ); + + } + if ( odom_source_ == WORLD ) { + // getting data form gazebo world +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d pose = parent->WorldPose(); +#else + ignition::math::Pose3d pose = parent->GetWorldPose().Ign(); +#endif + qt = tf::Quaternion ( pose.Rot().X(), pose.Rot().Y(), pose.Rot().Z(), pose.Rot().W() ); + vt = tf::Vector3 ( pose.Pos().X(), pose.Pos().Y(), pose.Pos().Z() ); + + odom_.pose.pose.position.x = vt.x(); + odom_.pose.pose.position.y = vt.y(); + odom_.pose.pose.position.z = vt.z(); + + odom_.pose.pose.orientation.x = qt.x(); + odom_.pose.pose.orientation.y = qt.y(); + odom_.pose.pose.orientation.z = qt.z(); + odom_.pose.pose.orientation.w = qt.w(); + + // get velocity in /odom frame + ignition::math::Vector3d linear; +#if GAZEBO_MAJOR_VERSION >= 8 + linear = parent->WorldLinearVel(); + odom_.twist.twist.angular.z = parent->WorldAngularVel().Z(); +#else + linear = parent->GetWorldLinearVel().Ign(); + odom_.twist.twist.angular.z = parent->GetWorldAngularVel().Ign().Z(); +#endif + + // convert velocity to child_frame_id (aka base_footprint) + float yaw = pose.Rot().Yaw(); + odom_.twist.twist.linear.x = cosf ( yaw ) * linear.X() + sinf ( yaw ) * linear.Y(); + odom_.twist.twist.linear.y = cosf ( yaw ) * linear.Y() - sinf ( yaw ) * linear.X(); + } + + tf::Transform base_footprint_to_odom ( qt, vt ); + transform_broadcaster_->sendTransform ( + tf::StampedTransform ( base_footprint_to_odom, current_time, + odom_frame, base_footprint_frame ) ); + + + // set covariance + odom_.pose.covariance[0] = 0.00001; + odom_.pose.covariance[7] = 0.00001; + odom_.pose.covariance[14] = 1000000000000.0; + odom_.pose.covariance[21] = 1000000000000.0; + odom_.pose.covariance[28] = 1000000000000.0; + odom_.pose.covariance[35] = 0.001; + + + // set header + odom_.header.stamp = current_time; + odom_.header.frame_id = odom_frame; + odom_.child_frame_id = base_footprint_frame; + + odometry_publisher_.publish ( odom_ ); +} + +GZ_REGISTER_MODEL_PLUGIN ( GazeboRosTricycleDrive ) +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_triggered_camera.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_triggered_camera.cpp new file mode 100755 index 0000000..7ea48d0 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_triggered_camera.cpp @@ -0,0 +1,133 @@ +/* + * Copyright 2017 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#include "gazebo_plugins/gazebo_ros_triggered_camera.h" + +#include +#include + +#include +#include +#include + +namespace gazebo +{ + +// Register this plugin with the simulator +GZ_REGISTER_SENSOR_PLUGIN(GazeboRosTriggeredCamera) + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosTriggeredCamera::GazeboRosTriggeredCamera() +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosTriggeredCamera::~GazeboRosTriggeredCamera() +{ + ROS_DEBUG_STREAM_NAMED("camera","Unloaded"); +} + +void GazeboRosTriggeredCamera::Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf) +{ + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM("A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + CameraPlugin::Load(_parent, _sdf); + // copying from CameraPlugin into GazeboRosTriggeredCameraUtils + this->parentSensor_ = this->parentSensor; + this->width_ = this->width; + this->height_ = this->height; + this->depth_ = this->depth; + this->format_ = this->format; + this->camera_ = this->camera; + + GazeboRosCameraUtils::Load(_parent, _sdf); + + this->SetCameraEnabled(false); + this->preRenderConnection_ = + event::Events::ConnectPreRender( + std::bind(&GazeboRosTriggeredCamera::PreRender, this)); +} + +void GazeboRosTriggeredCamera::Load(sensors::SensorPtr _parent, + sdf::ElementPtr _sdf, + const std::string &_camera_name_suffix, + double _hack_baseline) +{ + GazeboRosCameraUtils::Load(_parent, _sdf, _camera_name_suffix, _hack_baseline); + + this->SetCameraEnabled(false); + this->preRenderConnection_ = + event::Events::ConnectPreRender( + std::bind(&GazeboRosTriggeredCamera::PreRender, this)); +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosTriggeredCamera::OnNewFrame(const unsigned char *_image, + unsigned int _width, unsigned int _height, unsigned int _depth, + const std::string &_format) +{ + this->sensor_update_time_ = this->parentSensor_->LastMeasurementTime(); + + if ((*this->image_connect_count_) > 0) + { + this->PutCameraData(_image); + this->PublishCameraInfo(); + } + this->SetCameraEnabled(false); + + std::lock_guard lock(this->mutex); + this->triggered = std::max(this->triggered-1, 0); +} + +void GazeboRosTriggeredCamera::TriggerCamera() +{ + std::lock_guard lock(this->mutex); + if (!this->parentSensor_) + return; + this->triggered++; +} + +bool GazeboRosTriggeredCamera::CanTriggerCamera() +{ + return true; +} + +void GazeboRosTriggeredCamera::PreRender() +{ + std::lock_guard lock(this->mutex); + if (this->triggered > 0) + { + this->SetCameraEnabled(true); + } +} + +void GazeboRosTriggeredCamera::SetCameraEnabled(const bool _enabled) +{ + this->parentSensor_->SetActive(_enabled); + this->parentSensor_->SetUpdateRate(_enabled ? 0.0 : DBL_MIN); +} + +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_triggered_multicamera.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_triggered_multicamera.cpp new file mode 100755 index 0000000..11cbff5 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_triggered_multicamera.cpp @@ -0,0 +1,110 @@ +/* + * Copyright 2017 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#include + +#include +#include +#include + +#include "gazebo_plugins/gazebo_ros_triggered_multicamera.h" + +namespace gazebo +{ +// Register this plugin with the simulator +GZ_REGISTER_SENSOR_PLUGIN(GazeboRosTriggeredMultiCamera) + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosTriggeredMultiCamera::GazeboRosTriggeredMultiCamera() +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosTriggeredMultiCamera::~GazeboRosTriggeredMultiCamera() +{ +} + +void GazeboRosTriggeredMultiCamera::Load(sensors::SensorPtr _parent, + sdf::ElementPtr _sdf) +{ + MultiCameraPlugin::Load(_parent, _sdf); + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM("A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + // initialize shared_ptr members + this->image_connect_count_ = boost::shared_ptr(new int(0)); + this->image_connect_count_lock_ = boost::shared_ptr(new boost::mutex); + this->was_active_ = boost::shared_ptr(new bool(false)); + + // copying from CameraPlugin into GazeboRosCameraUtils + for (unsigned i = 0; i < this->camera.size(); ++i) + { + GazeboRosTriggeredCamera * cam = new GazeboRosTriggeredCamera(); + cam->parentSensor_ = this->parentSensor; + cam->width_ = this->width[i]; + cam->height_ = this->height[i]; + cam->depth_ = this->depth[i]; + cam->format_ = this->format[i]; + cam->camera_ = this->camera[i]; + // Set up a shared connection counter + cam->image_connect_count_ = this->image_connect_count_; + cam->image_connect_count_lock_ = this->image_connect_count_lock_; + cam->was_active_ = this->was_active_; + if (this->camera[i]->Name().find("left") != std::string::npos) + { + // FIXME: hardcoded, left hack_baseline_ 0 + cam->Load(_parent, _sdf, "/left", 0.0); + } + else if (this->camera[i]->Name().find("right") != std::string::npos) + { + double hackBaseline = 0.0; + if (_sdf->HasElement("hackBaseline")) + hackBaseline = _sdf->Get("hackBaseline"); + cam->Load(_parent, _sdf, "/right", hackBaseline); + } + this->triggered_cameras.push_back(cam); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosTriggeredMultiCamera::OnNewFrameLeft(const unsigned char *_image, + unsigned int _width, unsigned int _height, unsigned int _depth, + const std::string &_format) +{ + GazeboRosTriggeredCamera * cam = this->triggered_cameras[0]; + cam->OnNewFrame(_image, _width, _height, _depth, _format); +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosTriggeredMultiCamera::OnNewFrameRight(const unsigned char *_image, + unsigned int _width, unsigned int _height, unsigned int _depth, + const std::string &_format) +{ + GazeboRosTriggeredCamera * cam = this->triggered_cameras[1]; + cam->OnNewFrame(_image, _width, _height, _depth, _format); +} +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_utils.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_utils.cpp new file mode 100755 index 0000000..15e2741 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_utils.cpp @@ -0,0 +1,152 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2013, Markus Bader + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + + +#include + +#include +#include + +using namespace gazebo; + +const char* GazeboRos::info() const { + return info_text.c_str(); +} +boost::shared_ptr& GazeboRos ::node() { + return rosnode_; +} +const boost::shared_ptr& GazeboRos ::node() const { + return rosnode_; +} + +std::string GazeboRos ::resolveTF(const std::string &name) { + return tf::resolve(tf_prefix_, name); +} +void GazeboRos ::readCommonParameter() { + + ROS_INFO_NAMED("utils", "Starting plugin %s", info()); + + std::string debugLevel; + getParameter(debugLevel, "rosDebugLevel", "na"); + if(boost::iequals(debugLevel, std::string("Debug"))) { + if( ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Debug) ) { + ros::console::notifyLoggerLevelsChanged(); + } + } else if(boost::iequals(debugLevel, std::string("Info"))) { + if( ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Info) ) { + ros::console::notifyLoggerLevelsChanged(); + } + } else if(boost::iequals(debugLevel, std::string("Warn"))) { + if( ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Warn) ) { + ros::console::notifyLoggerLevelsChanged(); + } + } else if(boost::iequals(debugLevel, std::string("Error"))) { + if( ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Error) ) { + ros::console::notifyLoggerLevelsChanged(); + } + } else if(boost::iequals(debugLevel, std::string("Fatal"))) { + if( ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Fatal) ) { + ros::console::notifyLoggerLevelsChanged(); + } + } + if (sdf_->HasElement("rosDebugLevel")) { + ROS_INFO_NAMED("utils", "%s: = %s", info(), debugLevel.c_str()); + } + + + tf_prefix_ = tf::getPrefixParam(*rosnode_); + if(tf_prefix_.empty()) + { + tf_prefix_ = namespace_; + boost::trim_right_if(tf_prefix_,boost::is_any_of("/")); + } + ROS_INFO_NAMED("utils", "%s: = %s", info(), tf_prefix_.c_str()); +} + + +void GazeboRos ::getParameterBoolean(bool &_value, const char *_tag_name, const bool &_default) { + _value = _default; + if (!sdf_->HasElement(_tag_name)) { + ROS_WARN_NAMED("utils", "%s: missing <%s> default is %s", + info(), _tag_name, (_default?"ture":"false")); + } else { + getParameterBoolean(_value, _tag_name); + } + +} +void GazeboRos ::getParameterBoolean(bool &_value, const char *_tag_name) { + + if (sdf_->HasElement(_tag_name)) { + std::string value = sdf_->GetElement(_tag_name)->Get(); + if(boost::iequals(value, std::string("true"))) + { + _value = true; + } + else if(boost::iequals(value, std::string("false"))) + { + _value = false; + } + else + { + ROS_WARN_NAMED("utils", "%s: <%s> must be either true or false", + info(), _tag_name); + } + } + ROS_DEBUG_NAMED("utils", "%s: <%s> = %s", + info(), _tag_name, (_value?"ture":"false")); + +} + +physics::JointPtr GazeboRos::getJoint(physics::ModelPtr &_parent, const char *_tag_name, const std::string &_joint_default_name) { + std::string joint_name; + getParameter(joint_name, _tag_name, _joint_default_name); + physics::JointPtr joint = _parent->GetJoint(joint_name); + if (!joint) + { + char error[200]; + snprintf(error, 200, + "%s: couldn't get wheel hinge joint named %s", + info() , joint_name.c_str()); + gzthrow(error); + } + return joint; +} + +void GazeboRos::isInitialized() { + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM(info() << "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_vacuum_gripper.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_vacuum_gripper.cpp new file mode 100755 index 0000000..fee4d38 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_vacuum_gripper.cpp @@ -0,0 +1,259 @@ +/* + * Copyright 2015 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + Desc: GazeboVacuumGripper plugin for manipulating objects in Gazebo + Author: Kentaro Wada + Date: 7 Dec 2015 + */ + +#include +#include + +#include +#include + + +namespace gazebo +{ +GZ_REGISTER_MODEL_PLUGIN(GazeboRosVacuumGripper); + +//////////////////////////////////////////////////////////////////////////////// +// Constructor +GazeboRosVacuumGripper::GazeboRosVacuumGripper() +{ + connect_count_ = 0; + status_ = false; +} + +//////////////////////////////////////////////////////////////////////////////// +// Destructor +GazeboRosVacuumGripper::~GazeboRosVacuumGripper() +{ + update_connection_.reset(); + + // Custom Callback Queue + queue_.clear(); + queue_.disable(); + rosnode_->shutdown(); + callback_queue_thread_.join(); + + delete rosnode_; +} + +//////////////////////////////////////////////////////////////////////////////// +// Load the controller +void GazeboRosVacuumGripper::Load(physics::ModelPtr _model, sdf::ElementPtr _sdf) +{ + ROS_INFO_NAMED("vacuum_gripper", "Loading gazebo_ros_vacuum_gripper"); + + // Set attached model; + parent_ = _model; + + // Get the world name. + world_ = _model->GetWorld(); + + // load parameters + robot_namespace_ = ""; + if (_sdf->HasElement("robotNamespace")) + robot_namespace_ = _sdf->GetElement("robotNamespace")->Get() + "/"; + + if (!_sdf->HasElement("bodyName")) + { + ROS_FATAL_NAMED("vacuum_gripper", "vacuum_gripper plugin missing , cannot proceed"); + return; + } + else + link_name_ = _sdf->GetElement("bodyName")->Get(); + + link_ = _model->GetLink(link_name_); + if (!link_) + { + std::string found; + physics::Link_V links = _model->GetLinks(); + for (size_t i = 0; i < links.size(); i++) { + found += std::string(" ") + links[i]->GetName(); + } + ROS_FATAL_NAMED("vacuum_gripper", "gazebo_ros_vacuum_gripper plugin error: link named: %s does not exist", link_name_.c_str()); + ROS_FATAL_NAMED("vacuum_gripper", "gazebo_ros_vacuum_gripper plugin error: You should check it exists and is not connected with fixed joint"); + ROS_FATAL_NAMED("vacuum_gripper", "gazebo_ros_vacuum_gripper plugin error: Found links are: %s", found.c_str()); + return; + } + + if (!_sdf->HasElement("topicName")) + { + ROS_FATAL_NAMED("vacuum_gripper", "vacuum_gripper plugin missing , cannot proceed"); + return; + } + else + topic_name_ = _sdf->GetElement("topicName")->Get(); + + // Make sure the ROS node for Gazebo has already been initialized + if (!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("vacuum_gripper", "A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + rosnode_ = new ros::NodeHandle(robot_namespace_); + + // Custom Callback Queue + ros::AdvertiseOptions ao = ros::AdvertiseOptions::create( + topic_name_, 1, + boost::bind(&GazeboRosVacuumGripper::Connect, this), + boost::bind(&GazeboRosVacuumGripper::Disconnect, this), + ros::VoidPtr(), &queue_); + pub_ = rosnode_->advertise(ao); + + // Custom Callback Queue + ros::AdvertiseServiceOptions aso1 = + ros::AdvertiseServiceOptions::create( + "on", boost::bind(&GazeboRosVacuumGripper::OnServiceCallback, + this, _1, _2), ros::VoidPtr(), &queue_); + srv1_ = rosnode_->advertiseService(aso1); + ros::AdvertiseServiceOptions aso2 = + ros::AdvertiseServiceOptions::create( + "off", boost::bind(&GazeboRosVacuumGripper::OffServiceCallback, + this, _1, _2), ros::VoidPtr(), &queue_); + srv2_ = rosnode_->advertiseService(aso2); + + // Custom Callback Queue + callback_queue_thread_ = boost::thread( boost::bind( &GazeboRosVacuumGripper::QueueThread,this ) ); + + // New Mechanism for Updating every World Cycle + // Listen to the update event. This event is broadcast every + // simulation iteration. + update_connection_ = event::Events::ConnectWorldUpdateBegin( + boost::bind(&GazeboRosVacuumGripper::UpdateChild, this)); + + ROS_INFO_NAMED("vacuum_gripper", "Loaded gazebo_ros_vacuum_gripper"); +} + +bool GazeboRosVacuumGripper::OnServiceCallback(std_srvs::Empty::Request &req, + std_srvs::Empty::Response &res) +{ + if (status_) { + ROS_WARN_NAMED("vacuum_gripper", "gazebo_ros_vacuum_gripper: already status is 'on'"); + } else { + status_ = true; + ROS_INFO_NAMED("vacuum_gripper", "gazebo_ros_vacuum_gripper: status: off -> on"); + } + return true; +} +bool GazeboRosVacuumGripper::OffServiceCallback(std_srvs::Empty::Request &req, + std_srvs::Empty::Response &res) +{ + if (status_) { + status_ = false; + ROS_INFO_NAMED("vacuum_gripper", "gazebo_ros_vacuum_gripper: status: on -> off"); + } else { + ROS_WARN_NAMED("vacuum_gripper", "gazebo_ros_vacuum_gripper: already status is 'off'"); + } + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// Update the controller +void GazeboRosVacuumGripper::UpdateChild() +{ + std_msgs::Bool grasping_msg; + grasping_msg.data = false; + if (!status_) { + pub_.publish(grasping_msg); + return; + } + // apply force + lock_.lock(); +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d parent_pose = link_->WorldPose(); + physics::Model_V models = world_->Models(); +#else + ignition::math::Pose3d parent_pose = link_->GetWorldPose().Ign(); + physics::Model_V models = world_->GetModels(); +#endif + for (size_t i = 0; i < models.size(); i++) { + if (models[i]->GetName() == link_->GetName() || + models[i]->GetName() == parent_->GetName()) + { + continue; + } + physics::Link_V links = models[i]->GetLinks(); + for (size_t j = 0; j < links.size(); j++) { +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d link_pose = links[j]->WorldPose(); +#else + ignition::math::Pose3d link_pose = links[j]->GetWorldPose().Ign(); +#endif + ignition::math::Pose3d diff = parent_pose - link_pose; + double norm = diff.Pos().Length(); + if (norm < 0.05) { +#if GAZEBO_MAJOR_VERSION >= 8 + links[j]->SetLinearVel(link_->WorldLinearVel()); + links[j]->SetAngularVel(link_->WorldAngularVel()); +#else + links[j]->SetLinearVel(link_->GetWorldLinearVel()); + links[j]->SetAngularVel(link_->GetWorldAngularVel()); +#endif + double norm_force = 1 / norm; + if (norm < 0.01) { + // apply friction like force + // TODO(unknown): should apply friction actually + link_pose.Set(parent_pose.Pos(), link_pose.Rot()); + links[j]->SetWorldPose(link_pose); + } + if (norm_force > 20) { + norm_force = 20; // max_force + } + ignition::math::Vector3d force = norm_force * diff.Pos().Normalize(); + links[j]->AddForce(force); + grasping_msg.data = true; + } + } + } + pub_.publish(grasping_msg); + lock_.unlock(); +} + +// Custom Callback Queue +//////////////////////////////////////////////////////////////////////////////// +// custom callback queue thread +void GazeboRosVacuumGripper::QueueThread() +{ + static const double timeout = 0.01; + + while (rosnode_->ok()) + { + queue_.callAvailable(ros::WallDuration(timeout)); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Someone subscribes to me +void GazeboRosVacuumGripper::Connect() +{ + this->connect_count_++; +} + +//////////////////////////////////////////////////////////////////////////////// +// Someone subscribes to me +void GazeboRosVacuumGripper::Disconnect() +{ + this->connect_count_--; +} + +} // namespace gazebo diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_video.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_video.cpp new file mode 100755 index 0000000..4e49711 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_video.cpp @@ -0,0 +1,254 @@ +/* + * Copyright 2013 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/* + * Desc: Video plugin for displaying ROS image topics on Ogre textures + * Author: Piyush Khandelwal + * Date: 26 July 2013 + */ + +#include +#include + +namespace gazebo +{ + + VideoVisual::VideoVisual( + const std::string &name, rendering::VisualPtr parent, + int height, int width) : + rendering::Visual(name, parent), height_(height), width_(width) + { + + texture_ = Ogre::TextureManager::getSingleton().createManual( + name + "__VideoTexture__", + Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + Ogre::TEX_TYPE_2D, + width_, height_, + 0, + Ogre::PF_BYTE_BGRA, + Ogre::TU_DYNAMIC_WRITE_ONLY_DISCARDABLE); + + Ogre::MaterialPtr material = + Ogre::MaterialManager::getSingleton().create( + name + "__VideoMaterial__", "General"); + material->getTechnique(0)->getPass(0)->createTextureUnitState( + name + "__VideoTexture__"); + material->setReceiveShadows(false); + + double factor = 1.0; + + Ogre::ManualObject mo(name + "__VideoObject__"); + mo.begin(name + "__VideoMaterial__", + Ogre::RenderOperation::OT_TRIANGLE_LIST); + + mo.position(-factor / 2, factor / 2, 0.51); + mo.textureCoord(0, 0); + + mo.position(factor / 2, factor / 2, 0.51); + mo.textureCoord(1, 0); + + mo.position(factor / 2, -factor / 2, 0.51); + mo.textureCoord(1, 1); + + mo.position(-factor / 2, -factor / 2, 0.51); + mo.textureCoord(0, 1); + + mo.triangle(0, 3, 2); + mo.triangle(2, 1, 0); + mo.end(); + + mo.convertToMesh(name + "__VideoMesh__"); + + Ogre::MovableObject *obj = (Ogre::MovableObject*) + GetSceneNode()->getCreator()->createEntity( + name + "__VideoEntity__", + name + "__VideoMesh__"); + obj->setCastShadows(false); + AttachObject(obj); + } + + VideoVisual::~VideoVisual() {} + + void VideoVisual::render(const cv::Mat& image) + { + + // Fix image size if necessary + const cv::Mat* image_ptr = ℑ + cv::Mat converted_image; + if (image_ptr->rows != height_ || image_ptr->cols != width_) + { + cv::resize(*image_ptr, converted_image, cv::Size(width_, height_)); + image_ptr = &converted_image; + } + + // Get the pixel buffer + Ogre::HardwarePixelBufferSharedPtr pixelBuffer = + texture_->getBuffer(); + + // Lock the pixel buffer and get a pixel box + pixelBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD); + const Ogre::PixelBox& pixelBox = pixelBuffer->getCurrentLock(); + uint8_t* pDest = static_cast(pixelBox.data); + + memcpy(pDest, image_ptr->data, height_ * width_ * 4); + + // Unlock the pixel buffer + pixelBuffer->unlock(); + } + + // Constructor + GazeboRosVideo::GazeboRosVideo() {} + + // Destructor + GazeboRosVideo::~GazeboRosVideo() { + update_connection_.reset(); + + // Custom Callback Queue + queue_.clear(); + queue_.disable(); + rosnode_->shutdown(); + callback_queue_thread_.join(); + + delete rosnode_; + } + + // Load the controller + void GazeboRosVideo::Load( + rendering::VisualPtr parent, sdf::ElementPtr sdf) + { + + model_ = parent; + sdf::ElementPtr p_sdf; + if (sdf->HasElement("sdf")) + { + p_sdf = sdf->GetElement("sdf"); + } + else + { + p_sdf = sdf; + } + + robot_namespace_ = ""; + if (!p_sdf->HasElement("robotNamespace")) + { + ROS_WARN_NAMED("video", "GazeboRosVideo plugin missing , " + "defaults to \"%s\".", robot_namespace_.c_str()); + } + else + { + robot_namespace_ = + p_sdf->GetElement("robotNamespace")->Get(); + } + + topic_name_ = "image_raw"; + if (!p_sdf->HasElement("topicName")) + { + ROS_WARN_NAMED("video", "GazeboRosVideo Plugin (ns = %s) missing , " + "defaults to \"%s\".", robot_namespace_.c_str(), topic_name_.c_str()); + } + else + { + topic_name_ = p_sdf->GetElement("topicName")->Get(); + } + + int height = 240; + if (!p_sdf->HasElement("height")) { + ROS_WARN_NAMED("video", "GazeboRosVideo Plugin (ns = %s) missing , " + "defaults to %i.", robot_namespace_.c_str(), height); + } + else + { + height = p_sdf->GetElement("height")->Get(); + } + + int width = 320; + if (!p_sdf->HasElement("width")) { + ROS_WARN_NAMED("video", "GazeboRosVideo Plugin (ns = %s) missing , " + "defaults to %i", robot_namespace_.c_str(), width); + } + else + { + width = p_sdf->GetElement("width")->Get(); + } + + std::string name = robot_namespace_ + "_visual"; + video_visual_.reset( + new VideoVisual(name, parent, height, width)); + + // Initialize the ROS node for the gazebo client if necessary + if (!ros::isInitialized()) + { + int argc = 0; + char** argv = NULL; + ros::init(argc, argv, "gazebo_client", + ros::init_options::NoSigintHandler); + } + std::string gazebo_source = + (ros::this_node::getName() == "/gazebo_client") ? "gzclient" : "gzserver"; + rosnode_ = new ros::NodeHandle(robot_namespace_); + + // Subscribe to the image topic + ros::SubscribeOptions so = + ros::SubscribeOptions::create(topic_name_, 1, + boost::bind(&GazeboRosVideo::processImage, this, _1), + ros::VoidPtr(), &queue_); + camera_subscriber_ = rosnode_->subscribe(so); + + new_image_available_ = false; + + callback_queue_thread_ = + boost::thread(boost::bind(&GazeboRosVideo::QueueThread, this)); + + update_connection_ = + event::Events::ConnectPreRender( + boost::bind(&GazeboRosVideo::UpdateChild, this)); + + ROS_INFO_NAMED("video", "GazeboRosVideo (%s, ns = %s) has started", + gazebo_source.c_str(), robot_namespace_.c_str()); + } + + // Update the controller + void GazeboRosVideo::UpdateChild() + { + boost::mutex::scoped_lock scoped_lock(m_image_); + if (new_image_available_) + { + video_visual_->render(image_->image); + } + new_image_available_ = false; + } + + void GazeboRosVideo::processImage(const sensor_msgs::ImageConstPtr &msg) + { + // Get a reference to the image from the image message pointer + boost::mutex::scoped_lock scoped_lock(m_image_); + // We get image with alpha channel as it allows memcpy onto ogre texture + image_ = cv_bridge::toCvCopy(msg, "bgra8"); + new_image_available_ = true; + } + + void GazeboRosVideo::QueueThread() + { + static const double timeout = 0.01; + while (rosnode_->ok()) + { + queue_.callAvailable(ros::WallDuration(timeout)); + } + } + + GZ_REGISTER_VISUAL_PLUGIN(GazeboRosVideo); +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/hokuyo_node.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/hokuyo_node.cpp new file mode 100755 index 0000000..c4b09f9 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/hokuyo_node.cpp @@ -0,0 +1,60 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2009-2010, Willow Garage, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of the Willow Garage nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*********************************************************************/ + +#include +#include + +void callback(gazebo_plugins::HokuyoConfig &config, uint32_t level) +{ + ROS_INFO_NAMED("hokuyo_node", "Reconfigure request : %f %f %i %i %i %s %i %s %f %i", + config.min_ang, config.max_ang, (int)config.intensity, config.cluster, config.skip, + config.port.c_str(), (int)config.calibrate_time, config.frame_id.c_str(), config.time_offset, (int)config.allow_unsafe_settings); + + // do nothing for now + + ROS_INFO_NAMED("hokuyo_node", "Reconfigure to : %f %f %i %i %i %s %i %s %f %i", + config.min_ang, config.max_ang, (int)config.intensity, config.cluster, config.skip, + config.port.c_str(), (int)config.calibrate_time, config.frame_id.c_str(), config.time_offset, (int)config.allow_unsafe_settings); +} + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "hokuyo_node"); + dynamic_reconfigure::Server srv; + dynamic_reconfigure::Server::CallbackType f = boost::bind(&callback, _1, _2); + srv.setCallback(f); + ROS_INFO_NAMED("hokuyo_node", "Starting to spin..."); + ros::spin(); + return 0; +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/src/vision_reconfigure.cpp b/gazebo_ros_pkgs/gazebo_plugins/src/vision_reconfigure.cpp new file mode 100755 index 0000000..9934e72 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/src/vision_reconfigure.cpp @@ -0,0 +1,144 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2009-2010, Willow Garage, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of the Willow Garage nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*********************************************************************/ + +#include + +VisionReconfigure::VisionReconfigure() : nh_("") +{ + this->nh_.setCallbackQueue(&this->queue_); + + // Custom Callback Queue + this->callback_queue_thread_ = boost::thread( boost::bind( &VisionReconfigure::QueueThread,this ) ); + + // this code needs to be rewritten + // for now, it publishes on pub_projector_ which is used by gazebo_ros_projector plugin directly + // and it publishes pub_header_, which is published by projector_controller in ethercat_trigger_controllers package in real life + this->pub_projector_ = this->nh_.advertise("/projector_wg6802418_controller/projector", 1,true); // publish latched for sim + this->pub_header_ = this->nh_.advertise("/projector_controller/rising_edge_timestamps", 1,true); // publish latched for sim + dynamic_reconfigure::Server::CallbackType f = boost::bind(&VisionReconfigure::ReconfigureCallback, this, _1, _2); + this->srv_.setCallback(f); + + + // initialize from relevant params on server + gazebo_plugins::CameraSynchronizerConfig config; + this->nh_.getParam("/camera_synchronizer_node/projector_mode",config.projector_mode); + this->nh_.getParam("/camera_synchronizer_node/forearm_l_trig_mode",config.forearm_l_trig_mode); + this->nh_.getParam("/camera_synchronizer_node/forearm_r_trig_mode",config.forearm_r_trig_mode); + this->nh_.getParam("/camera_synchronizer_node/narrow_stereo_trig_mode",config.narrow_stereo_trig_mode); + this->nh_.getParam("/camera_synchronizer_node/wide_stereo_trig_mode",config.wide_stereo_trig_mode); + this->ReconfigureCallback(config,0); + +} + +VisionReconfigure::~VisionReconfigure() +{ + this->nh_.shutdown(); + this->callback_queue_thread_.join(); +} + +void VisionReconfigure::ReconfigureCallback(gazebo_plugins::CameraSynchronizerConfig &config, uint32_t level) +{ + + // turn on or off projector in gazebo plugin + if (config.projector_mode == gazebo_plugins::CameraSynchronizer_ProjectorOff) + { + this->projector_msg_.data = 0; + } + else if (config.projector_mode == gazebo_plugins::CameraSynchronizer_ProjectorAuto) + { + // turn on or off projector based on narrow stereo trigger mode + if (config.wide_stereo_trig_mode == gazebo_plugins::CameraSynchronizer_WithProjector || + config.narrow_stereo_trig_mode == gazebo_plugins::CameraSynchronizer_WithProjector || + config.forearm_r_trig_mode == gazebo_plugins::CameraSynchronizer_WithProjector || + config.forearm_l_trig_mode == gazebo_plugins::CameraSynchronizer_WithProjector) + { + this->projector_msg_.data = 1; + } + else if (config.wide_stereo_trig_mode == gazebo_plugins::CameraSynchronizer_AlternateProjector || + config.narrow_stereo_trig_mode == gazebo_plugins::CameraSynchronizer_AlternateProjector || + config.forearm_r_trig_mode == gazebo_plugins::CameraSynchronizer_AlternateProjector || + config.forearm_l_trig_mode == gazebo_plugins::CameraSynchronizer_AlternateProjector) + { + ROS_WARN_NAMED("vision_reconfigure", "Alternate Projector Mode not supported in simulation, setting projector to on for now"); + this->projector_msg_.data = 1; + } + else + { + ROS_DEBUG_NAMED("vision_reconfigure", "Projector only supported for modes: WithProjector and AlternateProjector"); + this->projector_msg_.data = 0; + } + } + else if (config.projector_mode == gazebo_plugins::CameraSynchronizer_ProjectorOn) + { + this->projector_msg_.data = 1; + } + else + { + ROS_ERROR_NAMED("vision_reconfigure", "projector_mode is not in any recognized state [%d]",config.projector_mode); + } + + this->pub_projector_.publish(projector_msg_); +} + +void VisionReconfigure::QueueThread() +{ + // FIXME: hardcoded to 100Hz update rate for ros callback queue + static const double timeout = 0.01; + while (this->nh_.ok()) + { + this->queue_.callAvailable(ros::WallDuration(timeout)); + } +} + +void VisionReconfigure::spinOnce() +{ + if (projector_msg_.data == 1) + { + std_msgs::Header rh; + rh.stamp = ros::Time::now(); + rh.frame_id = "projector_wg6802418_frame"; + this->pub_header_.publish(rh); + } +} + +void VisionReconfigure::spin(double spin_frequency) +{ + ros::Rate loop_rate(spin_frequency); + while(this->nh_.ok()) + { + ros::spinOnce(); + this->spinOnce(); + loop_rate.sleep(); + } +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/bumper_test/gazebo_ros_bumper.world b/gazebo_ros_pkgs/gazebo_plugins/test/bumper_test/gazebo_ros_bumper.world new file mode 100755 index 0000000..2c60189 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/bumper_test/gazebo_ros_bumper.world @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + + + + + + + + + + true + 100.0 + world + test_bumper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/bumper_test/test_bumper.launch b/gazebo_ros_pkgs/gazebo_plugins/test/bumper_test/test_bumper.launch new file mode 100755 index 0000000..83808d4 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/bumper_test/test_bumper.launch @@ -0,0 +1,6 @@ + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/bumper_test/test_bumper.py b/gazebo_ros_pkgs/gazebo_plugins/test/bumper_test/test_bumper.py new file mode 100755 index 0000000..00a5915 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/bumper_test/test_bumper.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python +# Software License Agreement (BSD License) +# +# Copyright (c) 2008, Willow Garage, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of the Willow Garage nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +## Gazebo test bumper for a box + +PKG = 'gazebo_plugins' +NAME = 'test_bumper' + +import math +import roslib +roslib.load_manifest(PKG) + +import sys, unittest +import os, os.path, threading, time +import rospy, rostest +from nav_msgs.msg import * +from geometry_msgs.msg import Pose +from geometry_msgs.msg import Twist +from geometry_msgs.msg import Wrench +from geometry_msgs.msg import Vector3 +from gazebo_msgs.msg import ContactsState +from gazebo_msgs.msg import ContactState + +class BumperTest(unittest.TestCase): + def __init__(self, *args): + super(BumperTest, self).__init__(*args) + self.success = False + + self.sample_count = 0 + + self.min_samples_topic = "~min_samples" + self.min_samples = 1000 + + # in seconds + self.test_duration_topic = "~test_duration" + self.test_duration = 10.0 + + # test start time in seconds + self.test_start_time_topic = "~test_start_time" + self.test_start_time = 0.0 + + self.bumper_topic_name = "~bumper_topic_name" + self.bumper_topic = "/test_bumper" + self.bumper_state = ContactsState() + + self.fz_sum = 0 + self.fz_avg = 0 + + def bumperStateInput(self, contacts_state): + self.bumper_state = contacts_state + self.sample_count+=1 + self.fz_sum += contacts_state.states[0].total_wrench.force.z + self.fz_avg = self.fz_sum / self.sample_count + + def checkContact(self): + # see if total wrench is close to 98.1N + if self.sample_count > 20: + if abs(self.fz_avg - 98.1) < 0.01: + print "z force ",self.fz_avg + self.success = True + + + def test_bumper(self): + print "LNK\n" + rospy.init_node(NAME, anonymous=True) + self.bumper_topic = rospy.get_param(self.bumper_topic_name,self.bumper_topic); + self.min_samples = rospy.get_param(self.min_samples_topic,self.min_samples); + self.test_duration = rospy.get_param(self.test_duration_topic,self.test_duration); + self.test_start_time = rospy.get_param(self.test_start_time_topic,self.test_start_time); + + while not rospy.is_shutdown() and time.time() < self.test_start_time: + rospy.stdinfo("Waiting for test to start at time [%s]"% self.test_start_time) + time.sleep(0.1) + + print "subscribe" + rospy.Subscriber(self.bumper_topic, ContactsState, self.bumperStateInput) + + start_t = time.time() + timeout_t = start_t + self.test_duration + while not rospy.is_shutdown() and not self.success and time.time() < timeout_t: + self.checkContact() + time.sleep(0.1) + self.assert_(self.success) + +if __name__ == '__main__': + print "Waiting for test to start at time " + rostest.run(PKG, sys.argv[0], BumperTest, sys.argv) #, text_mode=True) + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.cpp b/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.cpp new file mode 100755 index 0000000..92d6078 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.cpp @@ -0,0 +1,15 @@ +#include "camera.h" + +// Test if the camera image is published at all, and that the timestamp +// is not too long in the past. +TEST_F(CameraTest, cameraSubscribeTest) +{ + subscribeTest(); +} + +int main(int argc, char** argv) +{ + ros::init(argc, argv, "gazebo_camera_test"); + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.h b/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.h new file mode 100755 index 0000000..a2f997b --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.h @@ -0,0 +1,87 @@ +#ifndef GAZEBO_PLUGINS_TEST_CAMERA_CAMERA_H +#define GAZEBO_PLUGINS_TEST_CAMERA_CAMERA_H + +#include +#include +#include + +class CameraTest : public testing::Test +{ +protected: + virtual void SetUp() + { + has_new_image_ = false; + } + + ros::NodeHandle nh_; + image_transport::Subscriber cam_sub_; + bool has_new_image_; + ros::Time image_stamp_; +public: + void subscribeTest(); + + void imageCallback(const sensor_msgs::ImageConstPtr& msg) + { + image_stamp_ = msg->header.stamp; + has_new_image_ = true; + } +}; + +// Test if the camera image is published at all, and that the timestamp +// is not too long in the past. +void CameraTest::subscribeTest() +{ + image_transport::ImageTransport it(nh_); + cam_sub_ = it.subscribe("camera1/image_raw", 1, + &CameraTest::imageCallback, + dynamic_cast(this)); + +#if 0 + // wait for gazebo to start publishing + // TODO(lucasw) this isn't really necessary since this test + // is purely passive + bool wait_for_topic = true; + while (wait_for_topic) + { + // @todo this fails without the additional 0.5 second sleep after the + // publisher comes online, which means on a slower or more heavily + // loaded system it may take longer than 0.5 seconds, and the test + // would hang until the timeout is reached and fail. + if (cam_sub_.getNumPublishers() > 0) + wait_for_topic = false; + ros::Duration(0.5).sleep(); + } +#endif + + while (!has_new_image_) + { + ros::spinOnce(); + ros::Duration(0.1).sleep(); + } + + // This check depends on the update period being much longer + // than the expected difference between now and the received image time + // TODO(lucasw) + // this likely isn't that robust - what if the testing system is really slow? + double time_diff = (ros::Time::now() - image_stamp_).toSec(); + ROS_INFO_STREAM(time_diff); + EXPECT_LT(time_diff, 1.0); + cam_sub_.shutdown(); + + // make sure nothing is subscribing to image_trigger topic + // there is no easy API, so call getSystemState + XmlRpc::XmlRpcValue args, result, payload; + args[0] = ros::this_node::getName(); + EXPECT_TRUE(ros::master::execute("getSystemState", args, result, payload, true)); + // [publishers, subscribers, services] + // subscribers in index 1 of payload + for (int i = 0; i < payload[1].size(); ++i) + { + // [ [topic1, [topic1Subscriber1...topic1SubscriberN]] ... ] + // topic name i is in index 0 + std::string topic = payload[1][i][0]; + EXPECT_EQ(topic.find("image_trigger"), std::string::npos); + } +} + +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.test b/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.test new file mode 100755 index 0000000..4de8fd0 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.test @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.world b/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.world new file mode 100755 index 0000000..895c60f --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera.world @@ -0,0 +1,138 @@ + + + + + + model://ground_plane + + + + + model://sun + + + + + + 4.927360 -4.376610 3.740080 0.000000 0.275643 2.356190 + orbit + + + + + false + 2.0 0.0 4.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.5 + + + + 0.03 0.5 0.5 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.5 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + + + + true + 0.0 0.0 0.5 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.5 + + 1.3962634 + + 640 + 480 + R8G8B8 + + + 0.02 + 300 + + + gaussian + + 0.0 + 0.007 + + + + true + + 0.0 + camera1 + image_raw + camera_info + camera_link + 0.07 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera16bit.cpp b/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera16bit.cpp new file mode 100755 index 0000000..bea1b00 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera16bit.cpp @@ -0,0 +1,15 @@ +#include "camera.h" + +// Test if the camera image is published at all, and that the timestamp +// is not too long in the past. +TEST_F(CameraTest, camera16bitSubscribeTest) +{ + subscribeTest(); +} + +int main(int argc, char** argv) +{ + ros::init(argc, argv, "gazebo_camera_test"); + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera16bit.test b/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera16bit.test new file mode 100755 index 0000000..ba9c0af --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera16bit.test @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera16bit.world b/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera16bit.world new file mode 100755 index 0000000..a6c455a --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/camera16bit.world @@ -0,0 +1,138 @@ + + + + + + model://ground_plane + + + + + model://sun + + + + + + 4.927360 -4.376610 3.740080 0.000000 0.275643 2.356190 + orbit + + + + + false + 2.0 0.0 4.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.5 + + + + 0.03 0.5 0.5 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.5 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + + + + true + 0.0 0.0 0.5 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.5 + + 1.3962634 + + 640 + 480 + R16G16B16 + + + 0.02 + 300 + + + gaussian + + 0.0 + 0.007 + + + + true + + 0.0 + camera1 + image_raw + camera_info + camera_link + 0.07 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/depth_camera.cpp b/gazebo_ros_pkgs/gazebo_plugins/test/camera/depth_camera.cpp new file mode 100755 index 0000000..0c0ce12 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/depth_camera.cpp @@ -0,0 +1,128 @@ +#include +#include +#include +#include + +class DepthCameraTest : public testing::Test +{ +protected: + virtual void SetUp() + { + has_new_image_ = false; + has_new_depth_ = false; + has_new_points_ = false; + } + + ros::NodeHandle nh_; + image_transport::Subscriber cam_sub_; + image_transport::Subscriber depth_sub_; + ros::Subscriber points_sub_; + bool has_new_image_; + ros::Time image_stamp_; + bool has_new_depth_; + ros::Time depth_stamp_; + bool has_new_points_; + ros::Time points_stamp_; +public: + void imageCallback(const sensor_msgs::ImageConstPtr& msg) + { + image_stamp_ = msg->header.stamp; + has_new_image_ = true; + } + void depthCallback(const sensor_msgs::ImageConstPtr& msg) + { + depth_stamp_ = msg->header.stamp; + has_new_depth_ = true; + } + void pointsCallback(const sensor_msgs::PointCloud2ConstPtr& msg) + { + points_stamp_ = msg->header.stamp; + has_new_points_ = true; + } +}; + +// Test if the camera image is published at all, and that the timestamp +// is not too long in the past. +TEST_F(DepthCameraTest, cameraSubscribeTest) +{ + image_transport::ImageTransport it(nh_); + cam_sub_ = it.subscribe("camera1/image_raw", 1, + &DepthCameraTest::imageCallback, + dynamic_cast(this)); + depth_sub_ = it.subscribe("camera1/depth/image_raw", 1, + &DepthCameraTest::depthCallback, + dynamic_cast(this)); + points_sub_ = nh_.subscribe("camera1/points", 1, + &DepthCameraTest::pointsCallback, + dynamic_cast(this)); +#if 0 + // wait for gazebo to start publishing + // TODO(lucasw) this isn't really necessary since this test + // is purely passive + bool wait_for_topic = true; + while (wait_for_topic) + { + // @todo this fails without the additional 0.5 second sleep after the + // publisher comes online, which means on a slower or more heavily + // loaded system it may take longer than 0.5 seconds, and the test + // would hang until the timeout is reached and fail. + if (cam_sub_.getNumPublishers() > 0) + wait_for_topic = false; + ros::Duration(0.5).sleep(); + } +#endif + + while (!has_new_image_ || !has_new_depth_ || !has_new_points_) + { + ros::spinOnce(); + ros::Duration(0.1).sleep(); + } + + EXPECT_EQ(depth_stamp_.toSec(), image_stamp_.toSec()); + EXPECT_EQ(depth_stamp_.toSec(), points_stamp_.toSec()); + // This check depends on the update period (currently 1.0/update_rate = 2.0 seconds) + // being much longer than the expected difference between now and the + // received image time. + const double max_time = 1.0; + const ros::Time current_time = ros::Time::now(); + // TODO(lucasw) + // this likely isn't that robust - what if the testing system is really slow? + double time_diff; + time_diff = (current_time - image_stamp_).toSec(); + ROS_INFO_STREAM(time_diff); + EXPECT_LT(time_diff, max_time); + + time_diff = (current_time - depth_stamp_).toSec(); + ROS_INFO_STREAM(time_diff); + EXPECT_LT(time_diff, max_time); + + time_diff = (current_time - points_stamp_).toSec(); + ROS_INFO_STREAM(time_diff); + EXPECT_LT(time_diff, max_time); + + cam_sub_.shutdown(); + depth_sub_.shutdown(); + points_sub_.shutdown(); + + // make sure nothing is subscribing to image_trigger topic + // there is no easy API, so call getSystemState + XmlRpc::XmlRpcValue args, result, payload; + args[0] = ros::this_node::getName(); + EXPECT_TRUE(ros::master::execute("getSystemState", args, result, payload, true)); + // [publishers, subscribers, services] + // subscribers in index 1 of payload + for (int i = 0; i < payload[1].size(); ++i) + { + // [ [topic1, [topic1Subscriber1...topic1SubscriberN]] ... ] + // topic name i is in index 0 + std::string topic = payload[1][i][0]; + EXPECT_EQ(topic.find("image_trigger"), std::string::npos); + } +} + +int main(int argc, char** argv) +{ + ros::init(argc, argv, "gazebo_depth_camera_test"); + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/depth_camera.test b/gazebo_ros_pkgs/gazebo_plugins/test/camera/depth_camera.test new file mode 100755 index 0000000..439129b --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/depth_camera.test @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/depth_camera.world b/gazebo_ros_pkgs/gazebo_plugins/test/camera/depth_camera.world new file mode 100755 index 0000000..a1502f0 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/depth_camera.world @@ -0,0 +1,144 @@ + + + + + + model://ground_plane + + + + + model://sun + + + + + + 4.927360 -4.376610 3.740080 0.000000 0.275643 2.356190 + orbit + + + + + false + 2.0 0.0 4.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.5 + + + + 0.03 0.5 0.5 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.5 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + + + + true + 0.0 0.0 0.5 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.5 + + + 1.3962634 + + 640 + 480 + R8G8B8 + + + 0.02 + 300 + + + + true + + 0.0 + camera1 + image_raw + camera_info + depth/image_raw + + depth/camera_info + points + camera_link + + 0.07 + 0.001 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion.h b/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion.h new file mode 100755 index 0000000..f08ad79 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion.h @@ -0,0 +1,183 @@ +#ifndef GAZEBO_PLUGINS_TEST_CAMERA_DISTORTION_H +#define GAZEBO_PLUGINS_TEST_CAMERA_DISTORTION_H + +// OpenCV includes +#include +#include + +// Test includes +#include + +// ROS includes +#include +#include +#include + +using namespace cv; + +void diffBetween(Mat& orig, Mat& diff, long& total_diff) +{ + MatIterator_ it, end; + Vec3b orig_pixel, diff_pixel; + total_diff = 0; + + for(int i=0; i(i,j); + diff_pixel = diff.at(i,j); + total_diff += abs(orig_pixel[0] - diff_pixel[0]) + + abs(orig_pixel[1] - diff_pixel[1]) + + abs(orig_pixel[2] - diff_pixel[2]); + } + } +} + +class DistortionTest : public testing::Test +{ + protected: + ros::NodeHandle nh_; + + // Used to listen for images + image_transport::Subscriber cam_sub_distorted_; + image_transport::Subscriber cam_sub_undistorted_; + + // Stores found images + sensor_msgs::ImageConstPtr cam_image_distorted_; + sensor_msgs::ImageConstPtr cam_image_undistorted_; + + // Listens for camera metadata to be published + ros::Subscriber cam_info_distorted_sub_; + // Stores received camera metadata + sensor_msgs::CameraInfoConstPtr cam_info_distorted_; + + public: + void cameraDistortionTest(); + + void imageCallback(const sensor_msgs::ImageConstPtr& msg, int cam_index) + { + // for now, only support 2 cameras + assert(cam_index == 0 || cam_index == 1); + if(cam_index == 0) + { + cam_image_undistorted_ = msg; + } + else + { + cam_image_distorted_ = msg; + } + } + void camInfoCallback(const sensor_msgs::CameraInfoConstPtr& msg) + { + cam_info_distorted_ = msg; + } +}; + +void DistortionTest::cameraDistortionTest() +{ + ros::AsyncSpinner spinner(2); + spinner.start(); + + image_transport::ImageTransport trans(nh_); + cam_sub_undistorted_ = + trans.subscribe("/camera_undistorted/image_raw", + 1, + boost::bind(&DistortionTest::imageCallback, + dynamic_cast(this), _1, 0) + ); + + cam_info_distorted_ = nullptr; + cam_image_distorted_ = nullptr; + // acquire information from ROS topics + cam_sub_distorted_ = + trans.subscribe("/camera_distorted/image_raw", + 1, + boost::bind(&DistortionTest::imageCallback, + dynamic_cast(this), _1, 1) + ); + cam_info_distorted_sub_ = + nh_.subscribe("/camera_distorted/camera_info", + 1, + &DistortionTest::camInfoCallback, + dynamic_cast(this) + ); + + // keep waiting until we have an image + + if(cam_info_distorted_ && cam_image_distorted_) { + std::cerr << "available immediately" << std::endl; + } + while (!cam_info_distorted_ || + !cam_image_distorted_ || + !cam_image_undistorted_) + { + ros::Duration(0.1).sleep(); + } + cam_sub_undistorted_.shutdown(); + cam_sub_distorted_.shutdown(); + cam_info_distorted_sub_.shutdown(); + + // load camera coefficients from published ROS information + Mat intrinsic_distorted_matrix = Mat(3, 3, CV_64F); + if(cam_info_distorted_->K.size() == 9) + { + memcpy(intrinsic_distorted_matrix.data, cam_info_distorted_->K.data(), + cam_info_distorted_->K.size()*sizeof(double)); + } + Mat distortion_coeffs = Mat(5, 1, CV_64F); + if(cam_info_distorted_->D.size() == 5) + { + memcpy(distortion_coeffs.data, cam_info_distorted_->D.data(), + cam_info_distorted_->D.size()*sizeof(double)); + } + + // Information acquired, now test the quality of the undistortion + + Mat distorted = Mat(cv_bridge::toCvCopy(cam_image_distorted_)->image); + Mat fixed = distorted.clone(); + Mat undistorted = Mat(cv_bridge::toCvCopy(cam_image_undistorted_)->image); + + //crop the image to remove black borders leftover from (un)distortion + int cropBorder = 50; + cv::Rect myROI(cropBorder, cropBorder, + fixed.rows - 2 * cropBorder, fixed.cols - 2 * cropBorder); + cv::Mat fixed_crop = fixed(myROI); + cv::Mat undistorted_crop = undistorted(myROI); + + + undistort(distorted, fixed, intrinsic_distorted_matrix, distortion_coeffs); + + //Ensure that we didn't crop away everything + ASSERT_GT(distorted.rows, 0); + ASSERT_GT(distorted.cols, 0); + ASSERT_GT(undistorted.rows, 0); + ASSERT_GT(undistorted.cols, 0); + ASSERT_GT(fixed.rows, 0); + ASSERT_GT(fixed.cols, 0); + + // The difference between the undistorted image and the no-distortion camera + // image should be the lowest when we use the correct distortion parameters. + long diff1 = 0, diff2 = 0; + diffBetween(fixed_crop, undistorted_crop, diff1); + + const double OFFSET = 0.01; + + // test each parameter, varying one at a time + for(size_t i = 0; i < 5; ++i) + { + distortion_coeffs.at(i,0) += OFFSET; + undistort(distorted, fixed, intrinsic_distorted_matrix, distortion_coeffs); + diffBetween(fixed_crop, undistorted_crop, diff2); + EXPECT_GE(diff2, diff1); + distortion_coeffs.at(i,0) -= OFFSET; + + distortion_coeffs.at(i,0) -= OFFSET; + undistort(distorted, fixed, intrinsic_distorted_matrix, distortion_coeffs); + diffBetween(fixed_crop, undistorted_crop, diff2); + EXPECT_GE(diff2, diff1); + distortion_coeffs.at(i,0) += OFFSET; + } +} + +#endif diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_barrel.cpp b/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_barrel.cpp new file mode 100755 index 0000000..b136164 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_barrel.cpp @@ -0,0 +1,13 @@ +#include "distortion.h" + +TEST_F(DistortionTest, barrelDistortion) +{ + cameraDistortionTest(); +} + +int main(int argc, char** argv) +{ + ros::init(argc, argv, "gazebo_camera_barrel_distortion_test"); + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_barrel.test b/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_barrel.test new file mode 100755 index 0000000..7187b93 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_barrel.test @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_barrel.world b/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_barrel.world new file mode 100755 index 0000000..ddb7d54 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_barrel.world @@ -0,0 +1,127 @@ + + + + + + + model://sun + + + + true + 0.0 0.0 2.5 0.0 1.5707 0.0 + + 0 0 0 0 0 0 + + + + 0.1 0.1 0.1 + + + + + 30.0 + + 0.927295218 + + 1000 + 1000 + R8G8B8 + + + 0.02 + 300 + + + + -0.1 + -0.1 + 0 + 0 + -0.1 +
0.5 0.5
+
+
+ + true + 0.0 + camera_distorted + image_raw + camera_info + camera_distorted_link + 0.07 + + -0.1 + -0.1 + 0.0 + 0.0 + -0.1 + false + +
+ +
+ + + true + 0.0 0.0 2.5 0.0 1.5707 0.0 + + 0 0 0 0 0 0 + + + + 0.1 0.1 0.1 + + + + + 30.0 + + 0.927295218 + + 1000 + 1000 + R8G8B8 + + + 0.02 + 300 + + + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 +
0.5 0.5
+
+
+ + true + 0.0 + camera_undistorted + image_raw + camera_info + camera_undistorted_link + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + +
+ +
+ + + model://checkerboard_plane + +
+
diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_pincushion.cpp b/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_pincushion.cpp new file mode 100755 index 0000000..79cff4c --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_pincushion.cpp @@ -0,0 +1,13 @@ +#include "distortion.h" + +TEST_F(DistortionTest, pincushionDistortion) +{ + cameraDistortionTest(); +} + +int main(int argc, char** argv) +{ + ros::init(argc, argv, "gazebo_camera_pincushion_distortion_test"); + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_pincushion.test b/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_pincushion.test new file mode 100755 index 0000000..2361fe9 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_pincushion.test @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_pincushion.world b/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_pincushion.world new file mode 100755 index 0000000..0b9f49c --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/distortion_pincushion.world @@ -0,0 +1,127 @@ + + + + + + + model://sun + + + + true + 0.0 0.0 2.5 0.0 1.5707 0.0 + + 0 0 0 0 0 0 + + + + 0.1 0.1 0.1 + + + + + 30.0 + + 0.927295218 + + 1000 + 1000 + R8G8B8 + + + 0.02 + 300 + + + + 0.1 + 0.1 + 0 + 0 + 0.1 +
0.5 0.5
+
+
+ + true + 0.0 + camera_distorted + image_raw + camera_info + camera_distorted_link + 0.07 + + 0.1 + 0.1 + 0.0 + 0.0 + 0.1 + false + +
+ +
+ + + true + 0.0 0.0 2.5 0.0 1.5707 0.0 + + 0 0 0 0 0 0 + + + + 0.1 0.1 0.1 + + + + + 30.0 + + 0.927295218 + + 1000 + 1000 + R8G8B8 + + + 0.02 + 300 + + + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 +
0.5 0.5
+
+
+ + true + 0.0 + camera_undistorted + image_raw + camera_info + camera_undistorted_link + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + +
+ +
+ + + model://checkerboard_plane + +
+
diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/multicamera.cpp b/gazebo_ros_pkgs/gazebo_plugins/test/camera/multicamera.cpp new file mode 100755 index 0000000..b0e68ac --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/multicamera.cpp @@ -0,0 +1,116 @@ +#include +// #include +// #include +// #include +#include +#include +#include +#include + +class MultiCameraTest : public testing::Test +{ +protected: + virtual void SetUp() + { + has_new_image_ = false; + } + + ros::NodeHandle nh_; + // image_transport::SubscriberFilter cam_left_sub_; + // image_transport::SubscriberFilter cam_right_sub_; + message_filters::Subscriber cam_left_sub_; + message_filters::Subscriber cam_right_sub_; + + bool has_new_image_; + ros::Time image_left_stamp_; + ros::Time image_right_stamp_; + + // typedef message_filters::sync_policies::ApproximateTime< + // sensor_msgs::Image, sensor_msgs::Image + // > MySyncPolicy; + // message_filters::Synchronizer< MySyncPolicy > sync_; + + +public: + void imageCallback( + const sensor_msgs::ImageConstPtr& left_msg, + const sensor_msgs::ImageConstPtr& right_msg) + { + image_left_stamp_ = left_msg->header.stamp; + image_right_stamp_ = right_msg->header.stamp; + has_new_image_ = true; + } +}; + +// Test if the camera image is published at all, and that the timestamp +// is not too long in the past. +TEST_F(MultiCameraTest, cameraSubscribeTest) +{ + // image_transport::ImageTransport it(nh_); + // cam_left_sub_.subscribe(it, "stereo/camera/left/image_raw", 1); + // cam_right_sub_.subscribe(it, "stereo/camera/right/image_raw", 1); + // sync_ = message_filters::Synchronizer( + // MySyncPolicy(4), cam_left_sub_, cam_right_sub_); + cam_left_sub_.subscribe(nh_, "stereo/camera/left/image_raw", 1); + cam_right_sub_.subscribe(nh_, "stereo/camera/right/image_raw", 1); + message_filters::TimeSynchronizer sync( + cam_left_sub_, cam_right_sub_, 4); + sync.registerCallback(boost::bind(&MultiCameraTest::imageCallback, + dynamic_cast(this), _1, _2)); +#if 0 + // wait for gazebo to start publishing + // TODO(lucasw) this isn't really necessary since this test + // is purely passive + bool wait_for_topic = true; + while (wait_for_topic) + { + // @todo this fails without the additional 0.5 second sleep after the + // publisher comes online, which means on a slower or more heavily + // loaded system it may take longer than 0.5 seconds, and the test + // would hang until the timeout is reached and fail. + if (cam_sub_.getNumPublishers() > 0) + wait_for_topic = false; + ros::Duration(0.5).sleep(); + } +#endif + + while (!has_new_image_) + { + ros::spinOnce(); + ros::Duration(0.1).sleep(); + } + + double sync_diff = (image_left_stamp_ - image_right_stamp_).toSec(); + EXPECT_EQ(sync_diff, 0.0); + + // This check depends on the update period being much longer + // than the expected difference between now and the received image time + // TODO(lucasw) + // this likely isn't that robust - what if the testing system is really slow? + double time_diff = (ros::Time::now() - image_left_stamp_).toSec(); + ROS_INFO_STREAM(time_diff); + EXPECT_LT(time_diff, 1.0); + // cam_sub_.shutdown(); + + // make sure nothing is subscribing to image_trigger topic + // there is no easy API, so call getSystemState + XmlRpc::XmlRpcValue args, result, payload; + args[0] = ros::this_node::getName(); + EXPECT_TRUE(ros::master::execute("getSystemState", args, result, payload, true)); + // [publishers, subscribers, services] + // subscribers in index 1 of payload + for (int i = 0; i < payload[1].size(); ++i) + { + // [ [topic1, [topic1Subscriber1...topic1SubscriberN]] ... ] + // topic name i is in index 0 + std::string topic = payload[1][i][0]; + EXPECT_EQ(topic.find("image_trigger"), std::string::npos); + } +} + +int main(int argc, char** argv) +{ + ros::init(argc, argv, "gazebo_multicamera_test"); + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/multicamera.test b/gazebo_ros_pkgs/gazebo_plugins/test/camera/multicamera.test new file mode 100755 index 0000000..3ec022a --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/multicamera.test @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/multicamera.world b/gazebo_ros_pkgs/gazebo_plugins/test/camera/multicamera.world new file mode 100755 index 0000000..4c0b176 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/multicamera.world @@ -0,0 +1,146 @@ + + + + + + model://ground_plane + + + + + model://sun + + + + + + 4.927360 -4.376610 3.740080 0.000000 0.275643 2.356190 + orbit + + + + + false + 0.0 2.0 2.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.5 + + + + 0.03 0.5 0.5 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.5 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + + 0.1 + + 1.3962634 + + 640 + 480 + R8G8B8 + + + 0.02 + 300 + + + gaussian + 0.0 + 0.007 + + + + 0 -0.07 0 0 0 0 + 1.3962634 + + 640 + 480 + R8G8B8 + + + 0.02 + 300 + + + gaussian + 0.0 + 0.007 + + + + true + 0.0 + stereo/camera + image_raw + camera_info + left_camera_optical_frame + + 0.07 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/triggered_camera.cpp b/gazebo_ros_pkgs/gazebo_plugins/test/camera/triggered_camera.cpp new file mode 100755 index 0000000..9d7a51a --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/triggered_camera.cpp @@ -0,0 +1,114 @@ +#include +#include +#include +#include + +class TriggeredCameraTest : public testing::Test +{ +protected: + virtual void SetUp() + { + images_received_ = 0; + } + + ros::NodeHandle nh_; + image_transport::Subscriber cam_sub_; + int images_received_; + ros::Time image_stamp_; +public: + void imageCallback(const sensor_msgs::ImageConstPtr& msg) + { + image_stamp_ = msg->header.stamp; + images_received_++; + } +}; + +// Test if the camera image is published at all, and that the timestamp +// is not too long in the past. +TEST_F(TriggeredCameraTest, cameraSubscribeTest) +{ + image_transport::ImageTransport it(nh_); + cam_sub_ = it.subscribe("camera1/image_raw", 5, + &TriggeredCameraTest::imageCallback, + dynamic_cast(this)); + + // wait for 3 seconds to confirm that we don't receive any images + for (unsigned int i = 0; i < 30; ++i) + { + ros::spinOnce(); + ros::Duration(0.1).sleep(); + } + EXPECT_EQ(images_received_, 0); + + // make sure something is subscribing to image_trigger topic + // there is no easy API, so call getSystemState + XmlRpc::XmlRpcValue args, result, payload; + args[0] = ros::this_node::getName(); + EXPECT_TRUE(ros::master::execute("getSystemState", args, result, payload, true)); + // [publishers, subscribers, services] + // subscribers in index 1 of payload + int trigger_listeners = 0; + for (int i = 0; i < payload[1].size(); ++i) + { + // [ [topic1, [topic1Subscriber1...topic1SubscriberN]] ... ] + // topic name i is in index 0 + std::string topic = payload[1][i][0]; + if (topic.find("image_trigger") != std::string::npos) + { + trigger_listeners++; + } + } + EXPECT_EQ(trigger_listeners, 1); + + // publish to trigger topic and expect an update within one second: + ros::Publisher trigger_pub = nh_.advertise("camera1/image_trigger", 1, true); + std_msgs::Empty msg; + + trigger_pub.publish(msg); + for (unsigned int i = 0; i < 10 && !images_received_; ++i) + { + ros::spinOnce(); + ros::Duration(0.1).sleep(); + } + EXPECT_EQ(images_received_, 1); + + // then wait for 3 seconds to confirm that we don't receive any more images + for (unsigned int i = 0; i < 30; ++i) + { + ros::spinOnce(); + ros::Duration(0.1).sleep(); + } + EXPECT_EQ(images_received_, 1); + + // then send two trigger messages very close together, and expect two more + // images + trigger_pub.publish(msg); + ros::spinOnce(); + ros::Duration(0.01).sleep(); + trigger_pub.publish(msg); + ros::spinOnce(); + ros::Duration(0.01).sleep(); + for (unsigned int i = 0; i < 10 && images_received_ < 2; ++i) + { + ros::spinOnce(); + ros::Duration(0.1).sleep(); + } + EXPECT_EQ(images_received_, 3); + + // then wait for 3 seconds to confirm that we don't receive any more images + for (unsigned int i = 0; i < 30; ++i) + { + ros::spinOnce(); + ros::Duration(0.1).sleep(); + } + EXPECT_EQ(images_received_, 3); + + cam_sub_.shutdown(); +} + +int main(int argc, char** argv) +{ + ros::init(argc, argv, "gazebo_camera_test"); + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/triggered_camera.test b/gazebo_ros_pkgs/gazebo_plugins/test/camera/triggered_camera.test new file mode 100755 index 0000000..e9f6ec5 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/triggered_camera.test @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/camera/triggered_camera.world b/gazebo_ros_pkgs/gazebo_plugins/test/camera/triggered_camera.world new file mode 100755 index 0000000..30cb340 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/camera/triggered_camera.world @@ -0,0 +1,140 @@ + + + + + + model://ground_plane + + + + + model://sun + + + + + + 4.927360 -4.376610 3.740080 0.000000 0.275643 2.356190 + orbit + + + + + false + 2.0 0.0 4.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.5 + + + + 0.03 0.5 0.5 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.5 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + + + + true + 0.0 0.0 0.5 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0 + 1 + + 1.3962634 + + 640 + 480 + R8G8B8 + + + 0.02 + 300 + + + gaussian + + 0.0 + 0.007 + + + + true + image_trigger + + 0.0 + camera1 + image_raw + camera_info + camera_link + 0.07 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/config/example_models.yaml b/gazebo_ros_pkgs/gazebo_plugins/test/config/example_models.yaml new file mode 100755 index 0000000..754bac1 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/config/example_models.yaml @@ -0,0 +1,31 @@ +gazebo_models: # everything here is namespaced under "gazebo_models" + pr2: # model name used inside gazebo + specification: robot_description # potentially contains: + # 1. a verbatim string with URDF or Gazebo Model XML or + # 2. a parameter name that refers to a parameter containing (1.) + # the spawner will differentiate automatically + namespace: / # namespace for gazebo_ros_plugins related to this model + initial_pose: # initial pose for the model + x: 0 + y: 0 + z: 0 + rx: 0 + ry: 0 + rz: 0 + joint_name: r_forearm_link # name of the joint to set initial position + position: 1.57 # initial joint position + joint_name: head_pan_link # name of the joint to set initial position + position: 0.78 # initial joint position + + # another example + table: + specification: table_description + namespace: /table + initial_pose: + x: 1 + y: 0 + z: 0 + rx: 0 + ry: 0 + rz: 0 + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/multi_robot_scenario.launch b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/multi_robot_scenario.launch new file mode 100755 index 0000000..ee83cab --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/multi_robot_scenario.launch @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/pioneer3dx.gazebo.launch b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/pioneer3dx.gazebo.launch new file mode 100755 index 0000000..b13c1fe --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/pioneer3dx.gazebo.launch @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/pioneer3dx.rviz b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/pioneer3dx.rviz new file mode 100755 index 0000000..4300d22 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/pioneer3dx.rviz @@ -0,0 +1,482 @@ +Panels: + - Class: rviz/Displays + Help Height: 84 + Name: Displays + Property Tree Widget: + Expanded: + - /Global Options1 + - /Status1 + - /RobotModel1 + - /TF1/Tree1 + - /LaserScan1 + - /LaserScan2 + - /Camera1 + Splitter Ratio: 0.528662 + Tree Height: 344 + - Class: rviz/Selection + Name: Selection + - Class: rviz/Tool Properties + Expanded: + - /2D Pose Estimate1 + - /2D Nav Goal1 + - /Publish Point1 + Name: Tool Properties + Splitter Ratio: 0.588679 + - Class: rviz/Views + Expanded: + - /Current View1 + Name: Views + Splitter Ratio: 0.5 + - Class: rviz/Time + Experimental: false + Name: Time + SyncMode: 0 + SyncSource: LaserScan +Visualization Manager: + Class: "" + Displays: + - Alpha: 0.5 + Cell Size: 1 + Class: rviz/Grid + Color: 160; 160; 164 + Enabled: true + Line Style: + Line Width: 0.03 + Value: Lines + Name: Grid + Normal Cell Count: 0 + Offset: + X: 0 + Y: 0 + Z: 0 + Plane: XY + Plane Cell Count: 10 + Reference Frame: + Value: true + - Alpha: 1 + Class: rviz/RobotModel + Collision Enabled: false + Enabled: true + Links: + All Links Enabled: true + Expand Joint Details: false + Expand Link Details: false + Expand Tree: false + Link Tree Style: Links in Alphabetic Order + base_link: + Alpha: 1 + Show Axes: false + Show Trail: false + battery0: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + center_hubcap: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + center_wheel: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + chassis: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + front_camera: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + front_laser: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + left_hub: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + left_wheel: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + right_hub: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + right_wheel: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + sonar: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + swivel: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + top: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + Name: RobotModel + Robot Description: r1/robot_description + TF Prefix: r1 + Update Interval: 0 + Value: true + Visual Enabled: true + - Class: rviz/TF + Enabled: true + Frame Timeout: 15 + Frames: + All Enabled: true + base_link: + Value: true + r1/base_link: + Value: true + r1/battery0: + Value: true + r1/center_hubcap: + Value: true + r1/center_wheel: + Value: true + r1/chassis: + Value: true + r1/front_camera: + Value: true + r1/front_laser: + Value: true + r1/left_hub: + Value: true + r1/left_wheel: + Value: true + r1/odom: + Value: true + r1/right_hub: + Value: true + r1/right_wheel: + Value: true + r1/sonar: + Value: true + r1/swivel: + Value: true + r1/top: + Value: true + r2/base_link: + Value: true + r2/battery0: + Value: true + r2/center_hubcap: + Value: true + r2/center_wheel: + Value: true + r2/chassis: + Value: true + r2/front_camera: + Value: true + r2/front_laser: + Value: true + r2/left_hub: + Value: true + r2/left_wheel: + Value: true + r2/odom: + Value: true + r2/right_hub: + Value: true + r2/right_wheel: + Value: true + r2/sonar: + Value: true + r2/swivel: + Value: true + r2/top: + Value: true + Marker Scale: 1 + Name: TF + Show Arrows: true + Show Axes: true + Show Names: false + Tree: + base_link: + r1/odom: + r1/base_link: + r1/chassis: + r1/battery0: + {} + r1/front_camera: + {} + r1/front_laser: + {} + r1/left_hub: + r1/left_wheel: + {} + r1/right_hub: + r1/right_wheel: + {} + r1/sonar: + {} + r1/swivel: + r1/center_wheel: + r1/center_hubcap: + {} + r1/top: + {} + r2/odom: + r2/base_link: + r2/chassis: + r2/battery0: + {} + r2/front_camera: + {} + r2/front_laser: + {} + r2/left_hub: + r2/left_wheel: + {} + r2/right_hub: + r2/right_wheel: + {} + r2/sonar: + {} + r2/swivel: + r2/center_wheel: + r2/center_hubcap: + {} + r2/top: + {} + Update Interval: 0 + Value: true + - Alpha: 1 + Class: rviz/RobotModel + Collision Enabled: false + Enabled: true + Links: + All Links Enabled: true + Expand Joint Details: false + Expand Link Details: false + Expand Tree: false + Link Tree Style: Links in Alphabetic Order + base_link: + Alpha: 1 + Show Axes: false + Show Trail: false + battery0: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + center_hubcap: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + center_wheel: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + chassis: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + front_camera: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + front_laser: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + left_hub: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + left_wheel: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + right_hub: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + right_wheel: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + sonar: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + swivel: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + top: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + Name: RobotModel + Robot Description: r2/robot_description + TF Prefix: r2 + Update Interval: 0 + Value: true + Visual Enabled: true + - Alpha: 1 + Autocompute Intensity Bounds: true + Autocompute Value Bounds: + Max Value: 10 + Min Value: -10 + Value: true + Axis: Z + Channel Name: intensity + Class: rviz/LaserScan + Color: 255; 85; 255 + Color Transformer: FlatColor + Decay Time: 0 + Enabled: true + Invert Rainbow: false + Max Color: 255; 255; 255 + Max Intensity: 999999 + Min Color: 0; 0; 0 + Min Intensity: -999999 + Name: LaserScan + Position Transformer: XYZ + Queue Size: 10 + Selectable: true + Size (Pixels): 3 + Size (m): 0.03 + Style: Flat Squares + Topic: /r1/front_laser/scan + Use Fixed Frame: true + Use rainbow: true + Value: true + - Alpha: 1 + Autocompute Intensity Bounds: true + Autocompute Value Bounds: + Max Value: 10 + Min Value: -10 + Value: true + Axis: Z + Channel Name: intensity + Class: rviz/LaserScan + Color: 255; 85; 255 + Color Transformer: FlatColor + Decay Time: 0 + Enabled: true + Invert Rainbow: false + Max Color: 255; 255; 255 + Max Intensity: 3.49902e-38 + Min Color: 0; 0; 0 + Min Intensity: -999999 + Name: LaserScan + Position Transformer: XYZ + Queue Size: 10 + Selectable: true + Size (Pixels): 3 + Size (m): 0.03 + Style: Flat Squares + Topic: /r2/front_laser/scan + Use Fixed Frame: true + Use rainbow: true + Value: true + - Class: rviz/Camera + Enabled: true + Image Rendering: background and overlay + Image Topic: /r1/front_camera/image_raw + Name: Camera + Overlay Alpha: 0.5 + Queue Size: 2 + Transport Hint: raw + Value: true + Visibility: + Grid: true + LaserScan: true + RobotModel: true + TF: true + Value: true + Zoom Factor: 1 + Enabled: true + Global Options: + Background Color: 48; 48; 48 + Fixed Frame: base_link + Frame Rate: 30 + Name: root + Tools: + - Class: rviz/Interact + Hide Inactive Objects: true + - Class: rviz/MoveCamera + - Class: rviz/Select + - Class: rviz/FocusCamera + - Class: rviz/Measure + - Class: rviz/SetInitialPose + Topic: /initialpose + - Class: rviz/SetGoal + Topic: /move_base_simple/goal + - Class: rviz/PublishPoint + Single click: true + Topic: /clicked_point + Value: true + Views: + Current: + Class: rviz/Orbit + Distance: 2.00511 + Enable Stereo Rendering: + Stereo Eye Separation: 0.06 + Stereo Focal Distance: 1 + Swap Stereo Eyes: false + Value: false + Focal Point: + X: -0.243573 + Y: -0.560009 + Z: 0.448538 + Name: Current View + Near Clip Distance: 0.01 + Pitch: 0.585398 + Target Frame: + Value: Orbit (rviz) + Yaw: 0.665372 + Saved: ~ +Window Geometry: + Camera: + collapsed: false + Displays: + collapsed: false + Height: 846 + Hide Left Dock: false + Hide Right Dock: false + QMainWindow State: 000000ff00000000fd00000004000000000000013c000002affc0200000009fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006a00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003f000001ed000000e900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000c00430061006d0065007200610100000232000000bc0000001600ffffff000000010000010f000002affc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003f000002af000000b600fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000004b00000003efc0100000002fb0000000800540069006d00650100000000000004b00000029a00fffffffb0000000800540069006d0065010000000000000450000000000000000000000259000002af00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + Selection: + collapsed: false + Time: + collapsed: false + Tool Properties: + collapsed: false + Views: + collapsed: false + Width: 1200 + X: 2265 + Y: 97 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/pioneer3dx.urdf.launch b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/pioneer3dx.urdf.launch new file mode 100755 index 0000000..02822f0 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/launch/pioneer3dx.urdf.launch @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/laser/hokuyo.dae b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/laser/hokuyo.dae new file mode 100755 index 0000000..bc65151 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/laser/hokuyo.dae @@ -0,0 +1,253 @@ + + + + + Blender User + Blender 2.64.0 r51232 + + 2013-03-22T08:19:53 + 2013-03-22T08:19:53 + + Z_UP + + + + + + + 49.13434 + 1.777778 + 0.1 + 100 + + + + + + + + + + 1 1 1 + 1 + 0 + 0.00111109 + + + + + 0.000999987 + 0 + 1 + 1 + 1 + 1 + 1 + 2 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 2880 + 2 + 30.002 + 1.000799 + 0.04999995 + 29.99998 + 1 + 2 + 0 + 0 + 1 + 1 + 1 + 1 + 8192 + 1 + 1 + 0 + 1 + 1 + 1 + 3 + 0 + 0 + 0 + 0 + 45 + 0 + 1 + 1 + 1 + 3 + 0.15 + 75 + 1 + 1 + 0 + 1 + 1 + 0 + + + + + + + + + + + + 0 0 0 1 + + + 0 0 0 1 + + + 0.020312 0.020312 0.020312 1 + + + 0.25 0.25 0.25 1 + + + 12 + + + 1 + + + + + + 1 + + + + 1 + + + + + + + 0 0 0 1 + + + 0 0 0 1 + + + 0.695112 0.695112 0.695112 1 + + + 0.0625 0.0625 0.0625 1 + + + 0 + + + 1 + + + + + + 1 + + + + 1 + + + + + + + + + + + + + + + -0.02213996 0.005949974 -0.004869997 -0.02213996 0.005949974 0.004869997 -0.02164 0.009949982 -0.004999995 -0.02164 0.009949982 -0.005999982 -0.02164 0.009949982 0.004999995 -0.02164 0.009949982 0.005999982 -0.02149999 0.009949982 -0.006499946 -0.02149999 0.009949982 0.006499946 -0.02113997 0.009949982 -0.006869971 -0.02113997 0.009949982 0.006869971 -0.02063995 0.005949974 0.006999969 -0.02063995 0.009949982 -0.006999969 -0.02063995 0.009949982 0.006999969 -0.01979994 0.009949982 -0.006999969 -0.01979994 0.005949974 -0.006999969 -0.01979994 0.005949974 0.006999969 -0.01979994 0.009949982 0.006999969 -0.01838999 0.005949974 0.01014 -0.02063995 0.005949974 -0.006999969 -0.02113997 0.005949974 0.006869971 -0.02113997 0.005949974 -0.006869971 -0.02149999 0.005949974 0.006499946 -0.02149999 0.005949974 -0.006499946 -0.02164 0.005949974 0.005999982 -0.02164 0.005949974 0.004999995 -0.02164 0.005949974 -0.004999995 -0.02164 0.005949974 -0.005999982 -0.01920998 0.01990997 0.004999995 -0.01920998 0.01990997 -0.004999995 -0.005279958 0.02695 -0.01798999 -0.009719967 0.02695 -0.01595997 -0.01014 0.02695 -0.01576995 -0.01365 0.02695 -0.01273 -0.01416999 0.02695 -0.01227998 -0.01655995 0.02695 -0.008569955 -0.01705998 0.02695 -0.007789969 -0.01822996 0.02695 -0.003779947 -0.01855999 0.02695 -0.00266999 -0.01855999 0.02695 0.00127995 -0.01855999 0.02695 0.00266999 -0.01750999 0.02695 0.006229996 -0.01705998 0.02695 0.007789969 -0.01516997 0.02695 0.01071995 -0.01416999 0.02695 0.01227998 -0.01170998 0.02695 0.01440995 -0.01014 0.02695 0.01576995 -0.007389962 0.02695 0.01703 -0.005279958 0.02695 0.01798999 -0.002529978 0.02695 0.01838999 0 0.02695 0.01874995 0.002529978 0.02695 0.01838999 0.005279958 0.02695 0.01798999 0.007389962 0.02695 0.01703 0.01014 0.02695 0.01576995 0.01170998 0.02695 0.01440995 0.01416999 0.02695 0.01227998 0.01516997 0.02695 0.01071995 0.01705998 0.02695 0.007789969 0.01750999 0.02695 0.006229996 0.01855999 0.02695 0.00266999 0.01855999 0.02695 0.00127995 0.01855999 0.02695 -0.00266999 0.01822996 0.02695 -0.003779947 0.01705998 0.02695 -0.007789969 0.01655995 0.02695 -0.008569955 0.01416999 0.02695 -0.01227998 0.01365 0.02695 -0.01273 0.01014 0.02695 -0.01576995 0.009719967 0.02695 -0.01595997 0.005279958 0.02695 -0.01798999 0.005049943 0.02695 -0.01801997 -0.005049943 0.02695 -0.01801997 0 0.02695 -0.01874995 -0.01885998 0.02594995 0.001289963 -0.01850998 0.02594995 -0.003849983 -0.02039998 0.009949982 -0.004999995 -0.02039998 0.009949982 0.004999995 -0.01848 0.02594995 0.003999948 -0.01836997 0.02572995 0.004629969 -0.01840996 0.02588999 0.004329979 -0.01838999 0.02579998 0.004489958 -0.01835 0.02544999 0.004859983 -0.01838999 0.02494996 0.004999995 -0.01835995 0.02517998 0.004969954 -0.02164 0.02494996 0.004999995 -0.02164 0.02544999 0.004869997 -0.02188998 0.02537995 0.004869997 -0.02206999 0.02519994 0.004869997 -0.02213996 0.02494996 0.004869997 -0.02164 0.02581995 0.004499971 -0.02206999 0.02569997 0.004499971 -0.02238994 0.02537995 0.004499971 -0.02249997 0.02494996 0.004499971 -0.02164 0.02594995 0.003999948 -0.02213996 0.02581995 0.003999948 -0.02263998 0.02494996 0.003999948 -0.02249997 0.02544999 0.003999948 -0.02213996 0.02581995 -0.003999948 -0.02249997 0.02544999 -0.003999948 -0.02263998 0.02494996 -0.003999948 -0.02206999 0.02569997 -0.004499971 -0.02188998 0.02537995 -0.004869997 -0.02238994 0.02537995 -0.004499971 -0.02249997 0.02494996 -0.004499971 -0.02206999 0.02519994 -0.004869997 -0.02213996 0.02494996 -0.004869997 -0.01838999 0.02494996 -0.004999995 -0.02164 0.02494996 -0.004999995 -0.01835 0.02555996 -0.004789948 -0.01835995 0.02526998 -0.004949986 -0.01835 0.02543997 -0.00484997 -0.01836997 0.02577996 -0.004559993 -0.02164 0.02544999 -0.004869997 -0.02164 0.02581995 -0.004499971 -0.01848 0.02594995 -0.003999948 -0.02164 0.02594995 -0.003999948 -0.01841998 0.02590996 -0.004269957 -0.02001994 0.01871997 -0.004999995 -0.01986998 0.01879996 -0.004999995 -0.02025997 0.01844996 -0.004999995 -0.02039998 0.01794999 -0.004999995 -0.02037996 0.01813995 -0.004999995 -0.02039998 0.01794999 0.004999995 -0.02033996 0.01826995 0.004999995 -0.01993995 0.01877999 0.004999995 -0.01936 0.01894998 0.004999995 -0.01962 0.01892 0.004999995 -0.01879996 0.01894998 0.006679952 -0.01845997 0.01894998 0.007699966 -0.01936 0.01894998 -0.004999995 -0.01971 0.01888996 -0.004999995 -0.01845997 0.01894998 -0.007699966 -0.01668 0.01894998 -0.01102995 -0.01141995 0.01894998 -0.01641994 -7.8e-4 0.01894998 -0.01997995 0 0.01894998 -0.01993995 0.002989947 0.01894998 -0.01976996 0.01315999 0.01894998 -0.01505994 0.01454997 0.01894998 -0.01358997 0.01576 0.01894998 -0.01230996 0.01990997 0.01894998 0.001369953 0.01990997 0.01894998 -0.001889944 0.01919996 0.01894998 0.005609989 0.01779997 0.01894998 0.009119987 0.00792998 0.01894998 0.01826995 0.01008999 0.01894998 0.01726996 -0.007959961 0.01894998 0.01832997 -0.004529953 0.01894998 0.01947999 -0.01668 0.01894998 0.01102995 -0.01892 0.01881998 0.007889986 -0.02024996 0.01843994 0.004999995 -0.02017998 0.01855999 0.004999995 -0.00812 0.01894998 -0.01827996 0.006659984 0.01894998 -0.01885998 0.01576 0.01894998 0.01230996 0.002989947 0.01894998 0.01976996 0.002719998 0.01894998 0.01978999 -0.01141995 0.01894998 0.01641994 -0.01256996 0.01894998 0.01545 -0.01767998 0.01894998 -0.009159982 -0.01892 0.01881998 -0.007889986 -0.01937997 0.01794999 -0.008079946 -0.01830995 0.01794999 -0.01009994 -0.01925998 0.01844996 -0.008029997 -0.01458996 0.01894998 -0.01362997 -0.01709997 0.01881998 -0.01130998 -0.01750999 0.01794999 -0.01159 -0.0151 0.01794999 -0.01457995 -0.01739996 0.01844996 -0.01150995 -0.01431 0.01894998 -0.01397997 -0.01466 0.01881998 -0.01432996 -0.01501995 0.01794999 -0.01467996 -0.01491999 0.01844996 -0.01457995 -0.01034998 0.01894998 -0.01701998 -0.008319973 0.01881998 -0.01872998 -0.01169997 0.01881998 -0.01682996 -0.01198995 0.01794999 -0.01723998 -0.01190996 0.01844996 -0.01712995 -8.2e-4 0.01794999 -0.02098 -0.004759967 0.01794999 -0.02044999 -0.004729986 0.01844996 -0.02031999 -0.005689978 0.01794999 -0.02013999 -0.01073998 0.01794999 -0.01794999 -0.008529961 0.01794999 -0.01918995 -0.008469998 0.01844996 -0.01906996 -2.5e-4 0.01794999 -0.02094995 -8.2e-4 0.01844996 -0.02085 -8.1e-4 0.01881998 -0.02047997 -0.005379974 0.01894998 -0.01919996 -0.004649996 0.01881998 -0.01996999 -0.004529953 0.01894998 -0.01947999 0.005379974 0.01894998 -0.01917999 0.006829977 0.01881998 -0.01932996 0.003069996 0.01881998 -0.02026998 0.003139972 0.01794999 -0.02075999 0.003119945 0.01844996 -0.02063 0.01381999 0.01794999 -0.01580995 0.01059997 0.01794999 -0.01813 0.01052999 0.01844996 -0.01800996 0.01034998 0.01794999 -0.01824998 0.005209982 0.01794999 -0.02024996 0.006989955 0.01794999 -0.01979994 0.006949961 0.01844996 -0.01966995 0.01469999 0.01794999 -0.01488 0.01372998 0.01844996 -0.01570999 0.01348996 0.01881998 -0.01542997 0.01008999 0.01894998 -0.01726996 0.01034998 0.01881998 -0.01769995 0.01036995 0.01894998 -0.01705998 0.01774996 0.01894998 -0.009199976 0.01823997 0.01881998 -0.009349942 0.01615995 0.01881998 -0.01261997 0.01655 0.01794999 -0.01291996 0.01644998 0.01844996 -0.01283997 0.02090996 0.01794999 -0.00198996 0.02023994 0.01794999 -0.005469977 0.02002996 0.01844996 -0.005849957 0.02015995 0.01794999 -0.005889952 0.01807999 0.01794999 -0.01052999 0.01868999 0.01794999 -0.009579956 0.01857 0.01844996 -0.009519994 0.02090996 0.01794999 0 0.02076995 0.01844996 -0.001969993 0.02041 0.01881998 -0.001939952 0.01919996 0.01894998 -0.005609989 0.01967996 0.01881998 -0.00575 0.01949995 0.01894998 -0.004049956 0.01990997 0.01894998 0.001889944 0.02041 0.01881998 0.001939952 0.02090996 0.01794999 0.00198996 0.02023994 0.01794999 0.005469977 0.02076995 0.01844996 0.001969993 0.01876997 0.01894998 0.006669998 0.01967996 0.01881998 0.00575 0.02015995 0.01794999 0.005889952 0.02002996 0.01844996 0.005849957 0.01627999 0.01894998 0.0115 0.01615995 0.01881998 0.01261997 0.01823997 0.01881998 0.009349942 0.01868999 0.01794999 0.009579956 0.01857 0.01844996 0.009519994 0.01059997 0.01794999 0.01813 0.01381999 0.01794999 0.01580995 0.01372998 0.01844996 0.01570999 0.01469999 0.01794999 0.01488 0.01807999 0.01794999 0.01052999 0.01655 0.01794999 0.01291996 0.01644998 0.01844996 0.01283997 0.01034998 0.01794999 0.01824998 0.01052999 0.01844996 0.01800996 0.01034998 0.01881998 0.01769995 0.01315999 0.01894998 0.01505994 0.01348996 0.01881998 0.01542997 0.01258999 0.01894998 0.01546996 0.006659984 0.01894998 0.01885998 0.003069996 0.01881998 0.02026998 0.006829977 0.01881998 0.01932996 0.006989955 0.01794999 0.01979994 0.006949961 0.01844996 0.01966995 -0.004759967 0.01794999 0.02044999 -8.2e-4 0.01794999 0.02098 -8.2e-4 0.01844996 0.02085 -2.5e-4 0.01794999 0.02094995 0.005209982 0.01794999 0.02024996 0.003139972 0.01794999 0.02075999 0.003119945 0.01844996 0.02063 -0.005689978 0.01794999 0.02013999 -0.004729986 0.01844996 0.02031999 -0.004649996 0.01881998 0.01996999 -7.8e-4 0.01894998 0.01997995 -8.1e-4 0.01881998 0.02047997 -0.002709984 0.01894998 0.01972997 -0.00812 0.01894998 0.01827996 -0.01169997 0.01881998 0.01682996 -0.008319973 0.01881998 0.01872998 -0.008529961 0.01794999 0.01918995 -0.008469998 0.01844996 0.01906996 -0.01750999 0.01794999 0.01159 -0.0151 0.01794999 0.01457995 -0.01491999 0.01844996 0.01457995 -0.01501995 0.01794999 0.01467996 -0.01073998 0.01794999 0.01794999 -0.01198995 0.01794999 0.01723998 -0.01190996 0.01844996 0.01712995 -0.01937997 0.01794999 0.008079946 -0.01830995 0.01794999 0.01009994 -0.01925998 0.01844996 0.008029997 -0.01739996 0.01844996 0.01150995 -0.01709997 0.01881998 0.01130998 -0.01431 0.01894998 0.01397997 -0.01466 0.01881998 0.01432996 -0.01629996 0.01894998 0.0115 -0.01014 0.03504997 -0.01576995 -0.005279958 0.03504997 0.01798999 0 0.03504997 0.01874995 0.005279958 0.03504997 0.01798999 0.01014 0.03504997 0.01576995 0.01416999 0.03504997 0.01227998 0.01705998 0.03504997 0.007789969 0.01855999 0.03504997 0.00266999 0.01855999 0.03504997 -0.00266999 -0.01014 0.03504997 0.01576995 -0.01416999 0.03504997 0.01227998 -0.01705998 0.03504997 0.007789969 -0.01855999 0.03504997 0.00266999 -0.01855999 0.03504997 -0.00266999 -0.01705998 0.03504997 -0.007789969 -0.01416999 0.03504997 -0.01227998 -0.005279958 0.03504997 -0.01798999 0 0.03504997 -0.01874995 0.005279958 0.03504997 -0.01798999 0.01014 0.03504997 -0.01576995 0.01416999 0.03504997 -0.01227998 0.01705998 0.03504997 -0.007789969 0.001609981 0.03494995 -0.01717996 -0.003309965 0.03504997 -0.01692998 -0.003309965 0.03494995 -0.01692998 0.001759946 0.03494995 -0.01713997 0.001969993 0.03494995 -0.01708996 0.001609981 0.03504997 -0.01717996 0.004629969 0.03494995 -0.01644998 0.006399989 0.03494995 -0.01601999 0.007199943 0.03494995 -0.01555997 0.007989943 0.03494995 -0.0151 0.006399989 0.03504997 -0.01601999 0.009659945 0.03494995 -0.01413995 0.01066994 0.03494995 -0.01354998 0.01066994 0.03504997 -0.01354998 0.01512998 0.03494995 -0.007909953 0.01104998 0.03494995 -0.01314997 0.01406997 0.03504997 -0.009979963 0.01406997 0.03494995 -0.009979963 0.01695996 0.03494995 -0.002209961 0.01631999 0.03494995 -0.005589962 0.01631999 0.03504997 -0.005589962 0.01652997 0.03494995 -0.004479944 -0.007969975 0.03494995 -0.01529997 -0.007969975 0.03504997 -0.01529997 -0.009269952 0.03494995 -0.01454997 -0.01002997 0.03494995 0.01388996 -0.01088994 0.03494995 0.01314997 -0.01299995 0.03494995 0.01133996 -0.01299995 0.03504997 0.01133996 -0.01378995 0.03494995 0.01010996 -0.01567995 0.03494995 0.007189989 -0.01567995 0.03504997 0.007189989 -0.01626998 0.03494995 0.005199968 -0.01706999 0.03494995 0.002459943 -0.01706999 0.03494995 0.002019941 -0.01706999 0.03494995 9.7e-4 -0.01706999 0.03494995 6.9e-4 -0.01706999 0.03504997 0.002459943 -0.01706999 0.03494995 -0.002209961 -0.01706999 0.03494995 -0.002459943 -0.01706999 0.03504997 -0.002459943 -0.01647996 0.03494995 -0.004479944 -0.01567995 0.03494995 -0.007189989 -0.01567995 0.03504997 -0.007189989 -0.01521998 0.03494995 -0.007909953 -0.01299995 0.03504997 -0.01133996 -0.01299995 0.03494995 -0.01133996 -0.01002997 0.03494995 -0.01388996 -0.01088994 0.03494995 -0.01314997 -0.009269952 0.03504997 -0.01454997 -0.009269952 0.03494995 0.01454997 -0.009269952 0.03504997 0.01454997 0.01718997 0.03494995 9.7e-4 0.01699 0.03494995 0.002019941 0.01638996 0.03494995 0.005199968 0.01631999 0.03494995 0.005589962 0.01631999 0.03504997 0.005589962 0.01104998 0.03494995 0.01314997 0.01406997 0.03494995 0.009979963 0.01406997 0.03504997 0.009979963 0.01394999 0.03494995 0.01010996 0.01066994 0.03494995 0.01354998 0.009659945 0.03494995 0.01413995 0.01066994 0.03504997 0.01354998 0.007199943 0.03494995 0.01555997 0.006399989 0.03494995 0.01601999 0.006399989 0.03504997 0.01601999 0.004629969 0.03494995 0.01644998 0.001969993 0.03494995 0.01708996 0.001759946 0.03494995 0.01713997 0.001609981 0.03494995 0.01717996 0.001609981 0.03504997 0.01717996 -0.003309965 0.03494995 0.01692998 -0.007969975 0.03504997 0.01529997 -0.007969975 0.03494995 0.01529997 -0.003309965 0.03504997 0.01692998 0.01722997 0.03504997 7.5e-4 0.01722997 0.03494995 7.5e-4 0.01722997 0.03494995 -7.5e-4 0.01722997 0.03504997 -7.5e-4 -0.02063995 0.005949974 0.006999969 -0.02213996 0.005949974 0.004869997 -0.02213996 0.005949974 -0.004869997 -0.02263998 0.005949974 -0.003999948 -0.02263998 0.005949974 0 -0.02263998 0.005949974 0.003999948 -0.02249997 0.005949974 -0.004499971 -0.02249997 0.005949974 0.004499971 -0.01838999 0.005949974 -0.01014 -0.01510995 0.005949974 -0.01458996 -0.01510995 0.005949974 0.01458996 -0.01077997 0.005949974 -0.01801997 -0.01077997 0.005949974 0.01801997 -0.005709946 0.005949974 -0.02020996 -0.005709946 0.005949974 0.02020996 -2.5e-4 0.005949974 -0.02099996 -2.5e-4 0.005949974 0.02099996 0 0.005949974 -0.02096998 0 0.005949974 0.02096998 0.005239963 0.005949974 -0.02033996 0.005239963 0.005949974 0.02033996 0.01036 0.005949974 -0.01826995 0.01036 0.005949974 0.01826995 0.01475995 0.005949974 -0.01493996 0.01475995 0.005949974 0.01493996 0.01814997 0.005949974 -0.01056998 0.01814997 0.005949974 0.01056998 0.02026998 0.005949974 -0.005479991 0.02099996 0.005949974 0 0.02026998 0.005949974 0.005479991 -0.02499997 -0.03504997 -0.023 -0.02499997 -0.03504997 0.023 -0.02472996 -0.03504997 -0.02399998 -0.02472996 -0.03504997 0.02399998 -0.02399998 -0.03504997 -0.02472996 -0.02399998 -0.03504997 0.02472996 -0.02363997 0.003949999 -0.02164 -0.02363997 0.003949999 0.02164 -0.02363997 0.00544995 -0.02164 -0.02363997 0.00544995 0.02164 -0.02357 0.005699992 -0.02164 -0.02357 0.005699992 0.02164 -0.02338999 0.005879998 -0.02164 -0.02338999 0.005879998 0.02164 -0.02336996 0.003959953 0.02263998 -0.02336996 0.00544995 -0.02263998 -0.02336996 0.00544995 0.02263998 -0.02336996 0.003959953 -0.02263998 -0.02331 0.005699992 -0.02260994 -0.02331 0.005699992 0.02260994 -0.02314996 0.005879998 -0.02250999 -0.02314996 0.005879998 0.02250999 -0.02313995 0.005949974 -0.02164 -0.02313995 0.005949974 0 -0.02313995 0.005949974 0.02164 -0.023 -0.03504997 -0.02499997 -0.023 -0.03504997 0.02499997 -0.02293998 0.005949974 -0.02238994 -0.02293998 0.005949974 0.02238994 0 -0.03504997 0 -0.02263998 0.003959953 0.02336996 -0.02263998 0.003959953 -0.02336996 -0.02263998 0.00544995 -0.02336996 -0.02263998 0.00544995 0.02336996 -0.02260994 0.005699992 -0.02331 -0.02260994 0.005699992 0.02331 -0.02250999 0.005879998 -0.02314996 -0.02250999 0.005879998 0.02314996 0 0.005949974 -0.02313995 -0.02164 0.005949974 -0.02313995 -0.02238994 0.005949974 -0.02293998 -0.02238994 0.005949974 0.02293998 -0.02164 0.003949999 -0.02363997 -0.02164 0.003949999 0.02363997 -0.02164 0.00544995 -0.02363997 -0.02164 0.00544995 0.02363997 -0.02164 0.005699992 -0.02357 -0.02164 0.005699992 0.02357 -0.02164 0.005879998 -0.02338999 -0.02164 0.005879998 0.02338999 -0.02164 0.005949974 0.02313995 -0.005709946 0.005949974 -0.02020996 -0.01077997 0.005949974 -0.01801997 -0.01510995 0.005949974 -0.01458996 -0.01838999 0.005949974 -0.01014 -0.02213996 0.005949974 -0.004869997 0 0.005949974 0.02313995 0.02164 0.003949999 -0.02363997 0.02164 0.003949999 0.02363997 0.02164 0.00544995 -0.02363997 0.02164 0.00544995 0.02363997 0.02164 0.005699992 -0.02357 0.02164 0.005699992 0.02357 0.02164 0.005879998 -0.02338999 0.02164 0.005879998 0.02338999 0.02164 0.005949974 -0.02313995 0.02164 0.005949974 0.02313995 0.02238994 0.005949974 -0.02293998 0.02238994 0.005949974 0.02293998 0.02250999 0.005879998 -0.02314996 0.02250999 0.005879998 0.02314996 0.02260994 0.005699992 -0.02331 0.02260994 0.005699992 0.02331 0.02263998 0.003959953 -0.02336996 0.02263998 0.003959953 0.02336996 0.02263998 0.00544995 -0.02336996 0.02263998 0.00544995 0.02336996 0.02293998 0.005949974 -0.02238994 0.02293998 0.005949974 0.02238994 0.023 -0.03504997 -0.02499997 0.023 -0.03504997 0.02499997 0.02313995 0.005949974 -0.02164 0.02313995 0.005949974 0 0.02313995 0.005949974 0.02164 0.02314996 0.005879998 -0.02250999 0.02314996 0.005879998 0.02250999 0.02331 0.005699992 -0.02260994 0.02331 0.005699992 0.02260994 0.02336996 0.003959953 -0.02263998 0.02336996 0.003959953 0.02263998 0.02336996 0.00544995 -0.02263998 0.02336996 0.00544995 0.02263998 0.02338999 0.005879998 -0.02164 0.02338999 0.005879998 0.02164 0.02357 0.005699992 -0.02164 0.02357 0.005699992 0.02164 0.02363997 0.003949999 -0.02164 0.02363997 0.003949999 0.02164 0.02363997 0.00544995 -0.02164 0.02363997 0.00544995 0.02164 0.02399998 -0.03504997 -0.02472996 0.02399998 -0.03504997 0.02472996 0.02472996 -0.03504997 -0.02399998 0.02472996 -0.03504997 0.02399998 0.02499997 -0.03504997 -0.023 0.02499997 -0.03504997 0.023 0 0.03504997 0 -0.02213996 0.005949974 0.004869997 -0.02063995 0.005949974 0.006999969 -0.01979994 0.005949974 0.006999969 -0.01838999 0.005949974 0.01014 -0.02113997 0.005949974 0.006869971 -0.02149999 0.005949974 0.006499946 -0.02164 0.005949974 0.005999982 -0.02164 0.005949974 0.004999995 -0.02263998 0.005949974 -0.003999948 -0.02263998 0.005949974 0.003999948 -0.02249997 0.005949974 -0.004499971 -0.02249997 0.005949974 0.004499971 -0.01838999 0.005949974 -0.01014 -0.01510995 0.005949974 -0.01458996 -0.01510995 0.005949974 0.01458996 -0.01077997 0.005949974 -0.01801997 -0.01077997 0.005949974 0.01801997 -0.005709946 0.005949974 -0.02020996 -0.005709946 0.005949974 0.02020996 -2.5e-4 0.005949974 -0.02099996 -2.5e-4 0.005949974 0.02099996 0 0.005949974 -0.02096998 0 0.005949974 0.02096998 0.005239963 0.005949974 -0.02033996 0.005239963 0.005949974 0.02033996 0.01036 0.005949974 -0.01826995 0.01036 0.005949974 0.01826995 0.01475995 0.005949974 -0.01493996 0.01475995 0.005949974 0.01493996 0.01814997 0.005949974 -0.01056998 0.01814997 0.005949974 0.01056998 0.02026998 0.005949974 -0.005479991 0.02099996 0.005949974 0 0.02026998 0.005949974 0.005479991 -0.005709946 0.005949974 -0.02020996 -0.01077997 0.005949974 -0.01801997 -0.01510995 0.005949974 -0.01458996 -0.01838999 0.005949974 -0.01014 -0.01979994 0.005949974 0.006999969 -0.01838999 0.005949974 0.01014 -0.02113997 0.005949974 0.006869971 -0.02149999 0.005949974 0.006499946 -0.02164 0.005949974 0.005999982 -0.02164 0.005949974 0.004999995 -0.02263998 0.005949974 -0.003999948 -0.02263998 0.005949974 0.003999948 -0.02249997 0.005949974 -0.004499971 -0.02249997 0.005949974 0.004499971 -0.01838999 0.005949974 -0.01014 -0.01510995 0.005949974 -0.01458996 -0.01510995 0.005949974 0.01458996 -0.01077997 0.005949974 -0.01801997 -0.01077997 0.005949974 0.01801997 -0.005709946 0.005949974 -0.02020996 -0.005709946 0.005949974 0.02020996 -2.5e-4 0.005949974 -0.02099996 -2.5e-4 0.005949974 0.02099996 0 0.005949974 -0.02096998 0 0.005949974 0.02096998 0.005239963 0.005949974 -0.02033996 0.005239963 0.005949974 0.02033996 0.01036 0.005949974 -0.01826995 0.01036 0.005949974 0.01826995 0.01475995 0.005949974 -0.01493996 0.01475995 0.005949974 0.01493996 0.01814997 0.005949974 -0.01056998 0.01814997 0.005949974 0.01056998 0.02026998 0.005949974 -0.005479991 0.02099996 0.005949974 0 0.02026998 0.005949974 0.005479991 -0.005709946 0.005949974 -0.02020996 -0.01077997 0.005949974 -0.01801997 -0.01510995 0.005949974 -0.01458996 -0.01838999 0.005949974 -0.01014 -0.02063995 0.005949974 0.006999969 -0.02213996 0.005949974 0.004869997 -0.02213996 0.005949974 -0.004869997 -0.01979994 0.005949974 0.006999969 -0.01838999 0.005949974 0.01014 -0.02113997 0.005949974 0.006869971 -0.02149999 0.005949974 0.006499946 -0.02164 0.005949974 0.005999982 -0.02164 0.005949974 0.004999995 -0.02263998 0.005949974 -0.003999948 -0.02263998 0.005949974 0.003999948 -0.02249997 0.005949974 -0.004499971 -0.02249997 0.005949974 0.004499971 -0.01838999 0.005949974 -0.01014 -0.01510995 0.005949974 -0.01458996 -0.01510995 0.005949974 0.01458996 -0.01077997 0.005949974 -0.01801997 -0.01077997 0.005949974 0.01801997 -0.005709946 0.005949974 -0.02020996 -0.005709946 0.005949974 0.02020996 -2.5e-4 0.005949974 -0.02099996 -2.5e-4 0.005949974 0.02099996 0 0.005949974 -0.02096998 0 0.005949974 0.02096998 0.005239963 0.005949974 -0.02033996 0.005239963 0.005949974 0.02033996 0.01036 0.005949974 -0.01826995 0.01036 0.005949974 0.01826995 0.01475995 0.005949974 -0.01493996 0.01475995 0.005949974 0.01493996 0.01814997 0.005949974 -0.01056998 0.01814997 0.005949974 0.01056998 0.02026998 0.005949974 -0.005479991 0.02099996 0.005949974 0 0.02026998 0.005949974 0.005479991 -0.005709946 0.005949974 -0.02020996 -0.01077997 0.005949974 -0.01801997 -0.01510995 0.005949974 -0.01458996 -0.01838999 0.005949974 -0.01014 -0.00945729 0.003627836 -0.001710772 0 -0.01554995 0.02431994 0 0.005949974 0 + + + + + + + + + + 0 -1 0 0 -1 0 -0.9492978 0 -0.3143782 -0.9492978 0 0.3143782 -0.7785766 0.001171708 0.6275485 -0.7808654 0.001171231 0.6246982 -0.6209343 -0.001221954 0.7838616 -0.6453004 -0.01542252 0.7637733 -0.3964945 -0.0151537 0.9179121 -0.4893132 0.006718158 0.8720822 -0.4938785 0.006718337 0.8695049 -0.1431924 -0.008457064 0.9896588 -0.316222 0.006060898 0.9486659 -0.3172233 0.0060606 0.9483315 0.2392156 0.007879972 0.9709345 0.119358 -0.01385879 0.9927546 0.0559594 0.00282979 0.9984291 0.1191433 0.00413686 0.9928685 0.05255794 0.004160761 0.9986092 -0.1333157 -0.004680752 0.9910625 0.2450903 0.007883667 0.9694681 0.3747907 -0.01294112 0.9270192 0.4188861 0.001862525 0.9080369 0.4327281 0.001863181 0.9015226 0.6034716 -0.002766609 0.7973797 0.5845207 -0.01302987 0.8112742 0.7900453 -0.01468151 0.6128727 0.7272006 0.007067918 0.6863886 0.7263449 0.007068157 0.6872941 0.9823358 0.002611696 0.1871086 0.9289886 -0.004128932 0.3700852 0.9230861 -0.009820222 0.3844679 0.8414472 0.006709396 0.5402976 0.8421885 0.006709873 0.5391413 0.9819628 0.002612411 0.1890563 0.9911401 -0.01446169 0.1320315 0.9999719 0.007499694 0 0.9999719 0.007499694 0 0.9911401 -0.01446169 -0.1320315 0.9819628 0.002612411 -0.1890563 0.9823358 0.002611696 -0.1871086 0.9231205 -0.004674613 -0.3844823 0.9289375 -0.01127177 -0.3700649 0.7900453 -0.01468151 -0.6128727 0.8421885 0.006709873 -0.5391413 0.8414472 0.006709396 -0.5402976 0.4327281 0.001863181 -0.9015226 0.5845689 -0.002225697 -0.8113411 0.6034404 -0.0105375 -0.7973385 0.7263449 0.007068157 -0.6872941 0.7272006 0.007067918 -0.6863886 0.4188861 0.001862525 -0.9080369 0.3747907 -0.01294112 -0.9270192 0.2450903 0.007883667 -0.9694681 0.2392156 0.007879972 -0.9709345 0.119358 -0.01385879 -0.9927546 0.0559594 0.00282979 -0.9984291 0.1191433 0.00413686 -0.9928685 0.05255794 0.004160761 -0.9986092 -0.1431956 -0.005152344 -0.989681 -0.1333114 -0.009266734 -0.9910309 -0.3964945 -0.0151537 -0.9179121 -0.3172233 0.0060606 -0.9483315 -0.316222 0.006060898 -0.9486659 -0.7808654 0.001171231 -0.6246982 -0.6453768 -8.88654e-4 -0.7638639 -0.6208926 -0.01165908 -0.783809 -0.4938785 0.006718337 -0.8695049 -0.4893132 0.006718158 -0.8720822 -0.7785766 0.001171708 -0.6275485 -0.8049004 -0.01266139 -0.5932749 -0.881016 0.007450222 -0.4730277 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.9471516 0.1680965 0.2732169 -0.407418 0.1514139 -0.9006023 -0.9422059 0.2770094 -0.1884511 -0.9113164 0.1482697 -0.3840813 -0.9315509 0.1626105 -0.3252239 -0.7991091 -0.3146805 -0.5122509 -0.9081746 0.2506373 -0.3352608 -0.9111543 0.1456485 -0.3854666 -0.928664 0.2243673 -0.2953684 -0.925579 0.2859641 -0.2480482 -0.9177774 0.2868903 0.2745518 -0.9178981 0.2856691 0.2754201 -0.9143468 0.1813663 0.3620446 -0.9384292 0.1466302 0.31281 -0.9311535 0.1683419 0.3234411 -0.901751 0.1467134 0.4065961 -0.9103941 0.1680585 0.3780726 -0.912325 0.3225979 0.2521777 -0.9188216 0.2869244 0.2710005 -0.9848498 0.1048805 0.138097 -0.9578264 0.2873474 0 -0.9559739 0.2861407 -0.06509518 -0.9987523 -0.04993659 0 -0.9210147 0.2770513 -0.2738146 -0.4861897 0.1523008 -0.8604789 -0.4091901 0.1777053 -0.8949773 -0.3149025 0.1457877 -0.9378605 -0.1278769 0.1498839 -0.9803991 -0.309273 0.1512408 -0.9388697 -0.141013 0.1688628 -0.9755002 -0.1303948 0.1630746 -0.977959 -0.4837509 0.1474936 -0.8626881 -0.636475 0.163087 -0.7538581 -0.645197 0.1696269 -0.744948 -0.7708169 0.1599442 -0.6166515 -0.6459589 0.159875 -0.746443 -0.7711567 0.1450923 -0.6198915 -0.8274903 0.1763324 -0.533073 -0.8709936 0.1562899 -0.4657721 -0.9149418 0.1555567 -0.3724025 -0.7441748 0.5367867 -0.3975726 -0.9384292 0.1466302 -0.3128098 -0.9364062 0.1603595 0.3121352 -0.8722791 0.1474033 0.4662632 -0.8271023 0.1767897 0.5335236 -0.7664864 0.1686882 0.6197121 -0.8297607 0.1690638 0.5318973 -0.7716946 0.1450895 0.6192225 -0.6450954 0.1696101 0.7450398 -0.6363618 0.1663306 0.7532449 -0.64563 0.1662972 0.7453235 -0.6361207 0.1630551 0.754164 -0.4856274 0.1477051 0.8615968 -0.4099487 0.177209 0.8947284 -0.2937462 0.1736751 0.9399735 -0.4077602 0.1746891 0.8962228 -0.3145152 0.1452308 0.9380769 -0.1418845 0.1683772 0.9754577 -0.1341822 0.1666406 0.976845 -0.1389042 0.1666364 0.9761855 -0.1267469 0.1627997 0.9784843 0.1395421 0.1371724 0.980669 0.05338537 0.1733645 0.9834097 0.07274723 0.1735997 0.9821257 0.1416881 0.1761806 0.9741073 0.2381073 0.1455035 0.9602779 0.4082419 0.1680009 0.8972816 0.4154286 0.1666471 0.8942303 0.4107152 0.1666655 0.8964015 0.4143497 0.165222 0.894995 0.6486326 0.1363442 0.7487897 0.575868 0.1693211 0.7998164 0.575499 0.1693159 0.8000832 0.6442187 0.1772168 0.7440273 0.7189208 0.1454344 0.6797072 0.8300612 0.16697 0.5320899 0.8296917 0.1670521 0.5326398 0.8285282 0.1670665 0.5344434 0.8312138 0.1651425 0.5308593 0.9521918 0.1337416 0.2746708 0.9171259 0.1644181 0.3631072 0.914055 0.1643574 0.3707966 0.9438654 0.1778166 0.2783871 0.9717582 0.1459009 0.1854698 0.9860588 0.1663975 0 0.9860587 0.1663975 0 0.9860587 0.1663975 0 0.9860587 0.1663975 0 0.9500489 0.1327823 -0.2824464 0.9697747 0.1601643 -0.1840775 0.9693279 0.1601721 -0.1864089 0.9447124 0.1775989 -0.2756393 0.830715 0.1654286 -0.5315507 0.8288937 0.166745 -0.533977 0.7189707 0.1454441 -0.6796524 0.6466634 0.1530798 -0.747257 0.717962 0.1537514 -0.6788895 0.6443232 0.1772074 -0.743939 0.5763537 0.1462174 -0.8040131 0.4070715 0.1568021 -0.8998366 0.5925795 0.1567866 -0.7901059 0.4147536 0.1656929 -0.8947209 0.4098841 0.1681987 -0.8964955 0.2399455 0.1457665 -0.9597803 0.1279237 0.1474865 -0.9807565 0.2369926 0.1489789 -0.9600207 0.1408129 0.1768286 -0.9741167 0.05614864 0.1468989 -0.9875566 0.05065917 0.1469421 -0.987847 -0.1424711 -3.79589e-4 -0.9897989 -0.129338 0 -0.9916005 -0.4158082 0 -0.9094523 -0.4154945 -2.07829e-4 -0.9095956 -0.4121701 0 -0.911107 -0.6546844 0 -0.7559022 -0.6546447 -3.01789e-5 -0.7559368 -0.6543759 0 -0.7561693 -0.840663 0 -0.5415588 -0.8408741 2.12565e-4 -0.5412307 -0.8418785 0 -0.5396671 -0.9599732 0 -0.280092 -0.9596633 -5.69179e-4 -0.2811512 -0.9585365 0 -0.2849697 -1 0 0 -1 0 0 -1 0 0 -0.9591508 0 0.2828954 -0.9596631 -8.33003e-4 0.2811512 -0.9608235 0 0.2771607 -0.8403387 0 0.5420618 -0.840874 -4.25545e-4 0.5412307 -0.8418794 0 0.5396656 -0.6545795 0 0.7559933 -0.6546447 -3.46783e-5 0.7559368 -0.6547469 0 0.7558482 -0.4165412 0 0.9091168 -0.4154945 4.29833e-4 0.9095956 -0.4141279 0 0.9102187 -0.1439396 0 0.9895865 -0.142471 5.09058e-4 0.9897989 -0.1408738 0 0.9900277 0.1408738 0 0.9900277 0.142471 5.09058e-4 0.9897989 0.1439396 0 0.9895865 0.4141279 0 0.9102187 0.4154945 4.29833e-4 0.9095956 0.4165412 0 0.9091168 0.6547469 0 0.7558482 0.6546447 -3.46783e-5 0.7559368 0.6545795 0 0.7559933 0.8418794 0 0.5396656 0.840874 -4.25545e-4 0.5412307 0.8403387 0 0.5420618 0.9608235 0 0.2771607 0.9596631 -8.33003e-4 0.2811512 0.9591508 0 0.2828954 1 0 0 1 0 0 1 0 0 0.9585365 0 -0.2849697 0.9596633 -5.69179e-4 -0.2811512 0.9599732 0 -0.280092 0.8418785 0 -0.5396671 0.8408741 2.12565e-4 -0.5412307 0.840663 0 -0.5415588 0.6543759 0 -0.7561693 0.6546447 -3.01789e-5 -0.7559368 0.6546844 0 -0.7559022 0.4121701 0 -0.911107 0.4154945 -2.07829e-4 -0.9095956 0.4158082 0 -0.9094523 0.129338 0 -0.9916005 0.1424711 -3.79589e-4 -0.9897989 0.1430675 0 -0.9897129 -0.1430675 0 -0.9897129 -1 0 0 -1 0 0 -1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9838701 0.1788842 -0.007730364 0.9677938 0.2516258 -0.008649408 0.7070808 0.7070799 0.006879746 0.8947982 0.4464178 0.006871819 0.8719238 0.4895934 0.002814829 0.377206 0.9261251 -0.008792817 0.2516237 0.9677851 0 0.1293374 0.9916006 -0.9629649 0 0.269627 -0.9629649 0 0.269627 -0.251012 0.07028329 0.965429 -0.1845505 0.1845505 0.9653404 -0.07028359 0.2510112 0.9654293 -0.1942211 0.6936423 0.6936414 -0.1935422 0.6935194 0.6939541 -0.5112335 0.5112336 0.690855 -0.5112314 0.5112344 0.690856 -0.6932809 0.1941184 0.6940315 -0.7049736 0.1803423 0.6859219 -0.2607492 0.9343423 0.2429284 -0.243086 0.9349478 0.2584215 -0.682882 0.6828859 0.2594976 -0.6944488 0.6756823 0.2473751 -0.9403539 0.2405559 0.2405565 -0.9297617 0.2603295 0.2603303 -0.2516335 0.9678226 0 -0.2516335 0.9678226 0 -0.7167247 0.6973562 0 -0.7167247 0.6973562 0 -0.962965 0.2696263 0 -0.962965 0.2696263 0 -0.7167251 0 -0.6973558 -0.9629649 0 -0.269627 -0.9629649 0 -0.269627 -0.07028359 0.2510112 -0.9654293 -0.1845506 0.1845506 -0.9653404 -0.2440263 0.938564 -0.2440261 -0.2595868 0.9301772 -0.2595866 -0.6923445 0.673635 -0.2586021 -0.6852509 0.685255 -0.2466917 -0.9343009 0.2616005 -0.2421712 -0.9350127 0.2391895 -0.2618005 -0.1936007 0.6937291 -0.6937282 -0.1941202 0.693282 -0.6940299 -0.5112318 0.5112348 -0.6908552 -0.5112326 0.5112326 -0.6908563 -0.6994224 0.1789222 -0.6919503 -0.7027144 0.1967598 -0.6837237 -0.251012 0.07028329 -0.965429 0 0.1543763 -0.9880121 -0.009795784 0.2516214 -0.9677761 -0.007334709 0.722306 -0.6915347 0.00679636 0.4472005 -0.8944079 0.006780803 0.5067117 -0.8620889 -0.009076535 0.9677828 -0.2516229 0 0.9892032 -0.1465499 -0.2263051 0.7072249 0.6697902 0.3015977 0.696307 0.6513029 0.7167264 0.6973544 0 0.5183387 0.69911 -0.4925142 0.03862148 0.6995103 -0.7135781 -0.1644762 0.9669772 0.1946862 -0.1248043 0.9671578 0.2214269 0.01370066 0.9675313 0.2523798 0.06004744 0.9683741 0.2421693 0.1849305 0.9670732 0.1748434 0.1059339 0.9677575 -0.2285243 -0.1261059 0.966584 -0.2231875 -0.199501 0.9668129 -0.1596003 -0.6712515 0.704275 -0.2311238 -0.4654791 0.8727707 -0.1469718 -0.4844728 0.8612704 -0.1532949 -0.8913083 0.3450198 -0.2941612 -0.915989 0.251125 -0.3128905 -0.944593 0.09943693 -0.3128201 -0.9346077 0.1752427 0.3095133 -0.9163941 0.251105 0.3117182 -0.8494461 0.4497035 0.2760577 -0.6587777 0.7186641 0.2225626 -0.11454 0.9926847 0.03817999 -0.2079164 0.9745261 0.08408081 -0.2403051 0.9673867 0.08010166 -0.2239108 0.9672326 0.119688 -0.2239329 0.9672339 -0.1196353 -0.2369856 0.9674997 -0.08821576 -0.168695 0.984063 -0.05623167 -0.220901 0.9681158 -0.1181289 -0.195109 0.9681603 -0.1568376 -0.1642051 0.9670629 -0.194489 -0.1243403 0.9671458 -0.2217399 -0.03328311 0.9677709 -0.249623 0.01294058 0.9675522 -0.2523397 0.01371669 0.9672559 -0.2534325 0.01418453 0.9682756 -0.2494817 0.05979275 0.9683793 -0.2422114 0.1485582 0.966945 -0.2072386 0.1849181 0.9670735 -0.1748546 0.1827625 0.9676989 -0.173657 0.181624 0.9682638 -0.1716915 0.2103747 0.9683087 -0.1346127 0.2516335 0.9678226 0 0.2516335 0.9678226 0 0.2516335 0.9678227 0 0.2469634 0.9678903 -0.04687726 0.2482241 0.9675434 0.04737603 0.2343087 0.9675045 0.09504997 0.2367252 0.9670455 0.09372389 0.21423 0.9671535 0.1368191 0.1064419 0.9675605 0.2291214 0.1058055 0.9677801 0.2284879 0.1058276 0.9677543 0.2285876 0.1467888 0.9679301 0.2038734 -0.0766099 0.966454 0.245148 -0.08143335 0.9670985 0.2410164 -0.07958346 0.9681548 0.2373665 -0.03413015 0.9680389 0.2484672 -0.1947117 0.9681448 0.1574264 -0.2211804 0.9681038 0.1177042 -0.6276769 0.7031698 0.3340269 -0.6718416 0.7042246 0.2295574 -0.8316648 0.4851421 0.270131 -0.224141 0.7071188 -0.6706294 -0.08158397 0.9665949 -0.242978 -0.08118349 0.9673035 -0.240277 -0.230294 0.6945442 -0.6815959 -0.09658795 0.6949279 -0.7125629 -0.1300739 0.2494957 -0.9596003 0.05087167 0.2513077 -0.9665695 0.3019366 0.6962896 -0.6511644 0.06135189 0.9674767 -0.2454073 0.1061488 0.9675673 -0.2292293 0.3024179 0.6942894 -0.653074 0.4201316 0.6941274 -0.584531 0.5638182 0.2583763 -0.7844429 0.7015674 0.2590524 -0.6638488 0.657499 0.7065963 -0.2615662 0.6635753 0.6994388 -0.2654304 0.7016292 0.6998641 -0.133816 0.5189352 0.6991608 0.4918134 0.2101477 0.9683169 0.1349092 0.1812267 0.9682484 0.1721977 0.5147917 0.7040795 0.4891439 0.4141255 0.7046437 0.5761747 0.562515 0.2665852 0.7826297 0.4170309 0.2669032 0.8688198 0.03983807 0.6995611 0.7134614 0.01843094 0.9683725 0.2488275 0.01364505 0.9676027 0.2521088 0.03827118 0.7060714 0.7071057 -0.09523808 0.7051784 0.7026044 -0.1298174 0.2567928 0.9577082 -0.305629 0.2567279 0.916887 -0.4603919 0.7019324 0.5434429 -0.1641054 0.967066 0.194558 -0.164548 0.966937 0.1948249 -0.463243 0.6961148 0.5484799 -0.5580259 0.6967077 0.4507831 -0.8506854 0.2602313 -0.4567428 -0.2229626 0.9675791 -0.1186526 -0.6337479 0.6961472 -0.3372576 -0.6271286 0.7031058 -0.3351895 -0.8501825 0.2659004 -0.454408 -0.8554773 0.2506282 -0.4531491 -0.7517282 0.2706233 -0.6013882 -0.1978173 0.9671215 -0.159826 -0.5579887 0.6967101 -0.4508255 -0.5582559 0.6964031 -0.4509689 -0.7490752 0.2696682 -0.6051161 -0.7513393 0.2621917 -0.6055946 -0.1644515 0.9669765 -0.1947106 -0.4595423 0.7019816 -0.5440982 -0.464033 0.6961706 -0.5477408 -0.6238481 0.261821 -0.7363854 -0.621176 0.2712791 -0.7352197 -0.1242595 0.9673138 -0.221051 -0.3465486 0.7069951 -0.6164916 -0.3499536 0.7017597 -0.6205367 -0.4731478 0.2687683 -0.8389843 -0.4767771 0.2609524 -0.839397 -0.1288474 0.2567702 -0.9578452 -0.305629 0.2567279 -0.9168869 -0.3062461 0.2581284 -0.9162877 -0.3065935 0.2567667 -0.916554 -0.4726419 0.2588881 -0.8423696 0.05413478 0.2532923 -0.965874 0.05391412 0.2545722 -0.9655498 0.03948223 0.7060217 -0.7070888 -0.09333491 0.7052802 -0.7027577 -0.03303414 0.9680098 -0.2487279 -0.07829689 0.9681807 -0.2376884 0.06135183 0.9674766 -0.2454078 0.1740778 0.696309 -0.6963121 0.1739403 0.6986982 -0.6939493 0.2341818 0.2688215 -0.9342879 0.2314112 0.2534631 -0.9392579 0.5634199 0.2665578 -0.7819878 0.4170309 0.2669032 -0.8688198 0.4046592 0.2732187 -0.8726983 0.4044461 0.2603067 -0.8767347 0.2365246 0.2621741 -0.9355859 0.7046238 0.2473371 -0.6650787 0.7013934 0.2572429 -0.6647355 0.5154538 0.7040323 -0.488514 0.415661 0.7047259 -0.5749672 0.1455301 0.9686573 -0.2013059 0.15098 0.9678227 -0.2013067 0.2147524 0.9670686 -0.1366009 0.5968894 0.7068039 -0.3796725 0.6017773 0.7001448 -0.3842673 0.8154708 0.2526968 -0.5207222 0.8161497 0.2468252 -0.5224721 0.9629638 0.2696306 0 0.9449788 0.2718722 -0.1819358 0.9482918 0.2608299 -0.18086 0.9482879 0.261008 -0.1806234 0.8967889 0.2617092 -0.3567605 0.8974719 0.258296 -0.3575298 0.8130294 0.2577725 -0.5220504 0.9629638 0.2696306 0 0.9629638 0.2696306 0 0.7167264 0.6973544 0 0.70467 0.6965711 -0.1350152 0.2486808 0.9674128 -0.04764741 0.2481271 0.9675516 -0.04771661 0.9482879 0.261008 0.1806234 0.2469177 0.9678809 0.04730957 0.7014893 0.6998912 0.1344058 0.7047534 0.6966033 0.1344119 0.9482918 0.2608299 0.18086 0.9449788 0.2718721 0.1819358 0.2322279 0.9682156 0.09289127 0.6569463 0.7066604 0.2627788 0.6640112 0.699507 0.2641569 0.8976452 0.2582861 0.3571012 0.8966205 0.2616998 0.3571906 0.2123748 0.9678058 0.1350885 0.6024934 0.7000937 0.3832371 0.59627 0.7067469 0.3807505 0.8154708 0.2526969 0.5207222 0.8130294 0.2577725 0.5220504 0.5647161 0.2584066 0.7837867 0.7015674 0.2590524 0.6638488 0.7013934 0.2572429 0.6647355 0.7046238 0.2473371 0.6650787 0.8161497 0.2468252 0.5224721 0.4044461 0.2603067 0.8767347 0.4046592 0.2732187 0.8726983 0.3027438 0.6943063 0.6529051 0.4217932 0.6940296 0.5834496 0.1488554 0.9671839 0.2059057 0.1488695 0.9669557 0.2069647 0.06135171 0.9674767 0.2454074 0.1735082 0.6987219 0.6940336 0.1745008 0.6963297 0.6961856 0.2341818 0.2688215 0.9342879 0.2365246 0.2621741 0.9355859 -0.1291 0.2495277 0.9597235 0.05087167 0.2513077 0.9665695 0.05391412 0.2545722 0.9655498 0.05413478 0.2532923 0.965874 0.2314112 0.2534631 0.9392579 -0.3065935 0.2567667 0.916554 -0.3062461 0.2581284 0.9162877 -0.2280214 0.6946619 0.6822397 -0.09468263 0.6948394 0.7129049 -0.03354847 0.9669889 0.2526004 -0.03234249 0.9677872 0.2496837 -0.1255912 0.9665973 0.22342 -0.3491178 0.7017115 0.6210619 -0.3474251 0.7069473 0.616053 -0.4731478 0.2687683 0.8389843 -0.4726419 0.2588881 0.8423696 -0.8506854 0.2602313 0.4567428 -0.7513393 0.2621915 0.6055946 -0.7490752 0.2696682 0.6051161 -0.7517282 0.2706233 0.6013882 -0.6221522 0.2713071 0.7343835 -0.6228598 0.2618451 0.7372128 -0.4767771 0.2609524 0.839397 -0.8554773 0.2506282 0.4531491 -0.8501825 0.2659004 0.454408 -0.6330834 0.6962109 0.3383722 -0.5582225 0.6964006 0.4510145 -0.1946848 0.9681715 0.1572951 -0.1992351 0.9668231 0.15987 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0.2576645 0 -0.9662344 -0.05074721 0 -0.9987115 -0.05074721 0 -0.9987115 -0.3301701 0 -0.9439214 -0.3301701 0 -0.9439214 0.2314149 -0.04166501 -0.9719626 0.2337992 -0.0328713 -0.9717291 -0.2353472 -0.01319801 0.9718218 0.2360719 0 -0.9717356 0.498471 0 -0.8669065 0.5025548 0.05025458 -0.8630836 0.4977039 -0.0518344 -0.8657968 0.5000953 0.04980254 -0.8645372 0.5044022 0 -0.8634689 0.7249996 0 -0.6887493 0.7241208 -0.006897449 -0.6896386 0.8897777 0 -0.4563943 0.8898923 -0.008304476 -0.4560952 0.8900858 0 -0.4557931 0.7240293 0 -0.6897691 -0.9833266 0 0.1818479 -0.9818185 -0.044227 0.1845983 0.9825241 -0.002599418 -0.1861173 0.9825702 0 -0.1858918 0.6556872 0 0.7550326 -0.6556872 0 0.7550326 -0.6515577 -0.04579263 0.7572157 -0.6516571 -0.04426085 0.7572213 -0.6510875 0 0.7590027 -0.8414006 0 0.540412 -0.8395078 -0.03620713 0.54214 -0.8394931 0 0.5433704 -0.9587494 0 0.2842525 -0.9582376 0.04984301 0.2815961 -0.9599216 0 0.2802686 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9598937 0 -0.2803642 -0.9588532 0.03467482 -0.281777 -0.9590831 0 -0.2831244 -0.8426965 0 -0.5383889 0.8393291 -0.04166615 0.5420246 0.8395044 0 0.5433529 0.6522963 0 0.757964 0.6490944 0.0781871 0.7566791 0.6515577 0.04579263 0.7572157 0.8899229 0 0.4561109 0.9838697 0 0.1788867 0.9821668 0.01870387 0.187079 0.9826549 -0.003704786 0.1854068 0.9822553 -0.03267395 0.1846804 0.9842713 0 0.1766641 0.8899229 0 0.4561109 0.7249996 0 0.6887493 0.7241208 -0.006897449 0.6896386 0.7232667 0.02902907 0.6899583 0.7348049 0 0.6782786 0.5044022 0 0.8634689 0.4990119 0.0604375 0.864485 0.5005733 0.02391499 0.8653637 0.498471 0 0.8669065 0.2360719 0 0.9717356 0.2353472 0.01319825 0.9718218 0.2337992 -0.03287124 0.9717291 0.2314148 -0.04166501 0.9719625 0.2576645 0 0.9662344 -0.05074721 0 0.9987115 -0.05074721 0 0.9987115 -0.3301701 0 0.9439214 0.3301701 0 -0.9439214 0 -1 0 0 -1 0 0 -1 0 0 0.03485059 -0.9993925 0.9993925 0.03485059 0 1 0 0 0 0 -1 -0.260666 0 0.9654291 -0.9654291 0 -0.260666 -0.9654291 0 -0.260666 -0.260666 0 -0.9654291 -0.9645484 0.04270619 -0.2604277 -0.9646556 0.04270696 -0.2600302 0.9654291 0 -0.260666 0.2604277 0.04270619 -0.9645484 0.7071068 0 0.7071068 0.2689354 0.9604846 -0.07171601 0.2758985 0.9581687 -0.07611 0.2031767 0.95783 -0.2031767 0.2031767 0.95783 -0.2031767 0.07389479 0.9579936 -0.2771059 0.07417577 0.9603113 -0.2688869 0.6940287 0.6940234 -0.1914564 0.6821739 0.707958 -0.1828504 0.4946855 0.7145437 -0.4946855 0.4946855 0.7145437 -0.4946855 0.1876068 0.7087336 -0.6800739 0.1862189 0.6947355 -0.694741 0.9324051 0.2610736 -0.2499225 0.9336825 0.2543331 -0.2520944 0.6852533 0.2466892 -0.6852533 0.6852534 0.2466892 -0.6852534 0.2503941 0.2542446 -0.9341641 0.2516342 0.2609541 -0.9319781 0 0 0 0 0.7071041 -0.7071095 0 0.7071041 -0.7071095 0 0.2696301 -0.9629639 0 0.2696301 -0.9629639 0.2696297 0.9629641 0 0.2696297 0.9629641 0 0.2696297 0.9629641 0 0.7071095 0.7071041 0 0.7071095 0.7071041 0 0.9629639 0.2696301 0 0.9629639 0.2696301 0 -0.07611 0.9581687 -0.2758985 -0.2031767 0.95783 -0.2031767 -0.2031767 0.95783 -0.2031767 -0.2771059 0.9579936 -0.07389479 -0.2688869 0.9603113 -0.07417577 -0.1914564 0.6940234 -0.6940287 -0.1828504 0.7079579 -0.6821739 -0.4946855 0.7145437 -0.4946855 -0.4946855 0.7145437 -0.4946855 -0.6800737 0.7087335 -0.1876068 -0.694741 0.6947355 -0.1862189 -0.2499225 0.2610736 -0.9324051 -0.2520944 0.2543331 -0.9336825 -0.6852533 0.2466892 -0.6852533 -0.6852534 0.2466892 -0.6852534 -0.9341641 0.2542446 -0.2503941 -0.9319781 0.2609541 -0.2516342 0.07171601 0.9604846 0.2689354 0.07611 0.9581687 0.2758985 0.2031767 0.95783 0.2031767 0.2031767 0.95783 0.2031767 0.2771059 0.9579936 0.07389479 0.2688869 0.9603113 0.07417577 0.1914564 0.6940234 0.6940287 0.1828504 0.7079579 0.6821739 0.4946855 0.7145437 0.4946855 0.4946855 0.7145437 0.4946855 0.6800737 0.7087335 0.1876068 0.694741 0.6947355 0.1862189 0.2499225 0.2610736 0.9324051 0.2520944 0.2543331 0.9336825 0.6852533 0.2466892 0.6852533 0.6852534 0.2466892 0.6852534 0.9341641 0.2542446 0.2503941 0.9319781 0.2609541 0.2516342 -0.2696297 0.9629641 0 -0.2696297 0.9629641 0 -0.2696297 0.9629641 0 -0.7071095 0.7071041 0 -0.7071095 0.7071041 0 -0.9629639 0.2696301 0 -0.9629639 0.2696301 0 0 0.9629641 0.2696297 0 0.9629641 0.2696297 0 0.9629641 0.2696297 0 0.7071041 0.7071095 0 0.7071041 0.7071095 0 0.2696301 0.9629639 0 0.2696301 0.9629639 -0.2689354 0.9604846 0.07171601 -0.2758985 0.9581687 0.07611 -0.2031767 0.95783 0.2031767 -0.2031767 0.95783 0.2031767 -0.07389479 0.9579936 0.2771059 -0.07417577 0.9603113 0.2688869 -0.6940287 0.6940234 0.1914564 -0.6821739 0.707958 0.1828504 -0.4946855 0.7145437 0.4946855 -0.4946855 0.7145437 0.4946855 -0.1876068 0.7087336 0.6800739 -0.1862189 0.6947355 0.694741 -0.9324051 0.2610736 0.2499225 -0.9336825 0.2543331 0.2520944 -0.6852533 0.2466892 0.6852533 -0.6852534 0.2466892 0.6852534 -0.2503941 0.2542446 0.9341641 -0.2516342 0.2609541 0.9319781 -0.9629639 0 -0.2696301 -0.9629639 0 -0.2696301 -0.7167251 0 -0.6973558 -0.7167237 -2.52567e-7 -0.6973572 -0.2516344 0 -0.9678224 -0.2516335 0 -0.9678226 -0.2516344 0 -0.9678224 -0.2516344 0 0.9678224 -0.2516344 0 0.9678224 -0.7167251 0 0.6973558 -0.7167251 0 0.6973558 -0.9629639 0 0.2696301 -0.9629639 0 0.2696301 -1 0 0 -1 0 0 0 0 1 0 0 -1 0 0 -1 -1 0 0 -1 0 0 -0.9122474 0 0.4096398 -0.8835567 -0.01679629 -0.4680228 -0.957763 0.01149314 -0.2873293 -0.957763 0.01149314 0.2873293 -0.8835567 -0.01679629 0.4680228 -0.9086417 0.007449328 0.4175103 -0.881016 0.007450222 0.4730277 -0.8049004 -0.01266139 0.5932749 -0.9122221 0.007446944 -0.4096284 -0.901296 0 -0.4332039 0 0 1 0 0 1 0 0 -1 0 0 -1 0 0 -1 -0.9190827 0.28875 -0.2681613 -0.9068856 0.3034356 -0.292379 -0.9189138 0.2091057 0.3344731 0.9175001 0.1444488 -0.3705781 0.8302804 0.1654177 -0.5322325 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 -0.2516344 0 0.9678224 0.002348303 0.6348381 0.7726417 -0.7167251 0 0.6973558 -0.7167251 0 0.6973558 -0.2516344 0 0.9678224 -0.2516344 0 0.9678224 -0.2516344 0 -0.9678224 -0.2516344 0 -0.9678224 -0.7167251 0 -0.6973558 -0.004324674 0.7071006 -0.7070997 0.003669202 0.9127396 -0.4085254 0.2344187 0.967514 -0.09468168 -0.7256583 0.6450302 -0.2394912 -0.3975354 0.9086532 0.1277299 0.2290577 0.9690912 -0.09162318 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 0 0 0 0 0 0 0.03485059 -0.9993925 0.9993925 0.03485059 0 -0.9993925 0.03485059 0 -0.9993925 0.03485059 0 0 0 1 0 0 1 1 0 0 0 0 -1 -1 0 0 -1 0 0 -0.7071068 0 0.7071068 -0.7071068 0 0.7071068 -0.260666 0 0.9654291 -0.9654291 0 0.260666 -0.9654291 0 0.260666 -0.9646556 0.04270696 0.2600302 -0.9645484 0.04270619 0.2604277 -0.706249 0.04924374 0.7062489 -0.7062489 0.04924374 0.7062489 -0.2604277 0.04270619 0.9645484 -0.2600302 0.04270696 0.9646556 -0.7071068 0 -0.7071068 -0.7071068 0 -0.7071068 -0.260666 0 -0.9654291 -0.2600301 0.04270696 -0.9646555 -0.2604277 0.04270619 -0.9645484 -0.7062489 0.04924374 -0.706249 -0.7062489 0.04924374 -0.7062489 0.260666 0 -0.9654291 0.7071068 0 -0.7071068 0.7071068 0 -0.7071068 0.260666 0 -0.9654291 0.9654291 0 -0.260666 0.9646556 0.04270696 -0.2600302 0.9645484 0.04270619 -0.2604277 0.706249 0.04924374 -0.7062489 0.7062489 0.04924374 -0.7062489 0.2600302 0.04270696 -0.9646556 0.2604278 0.04270619 0.9645484 0.2600301 0.04270696 0.9646556 0.9645479 0.04271709 0.2604277 0.964656 0.04269605 0.2600303 0.7062489 0.04924374 0.7062489 0.706249 0.04924374 0.7062489 0.7071068 0 0.7071068 0.9654291 0 0.260666 0.9654291 0 0.260666 0.260666 0 0.9654291 0.260666 0 0.9654291 0 0 0 0 0 0 -1.5404e-7 1 -6.36081e-7 3.24032e-7 1 5.61656e-7 6.54708e-7 1 0 -6.48629e-7 1 0 -5.82531e-7 1 2.98564e-7 4.26935e-7 1 4.96095e-7 -3.27791e-7 1 5.66667e-7 6.28108e-7 1 1.84581e-7 -1.5404e-7 1 6.36081e-7 5.49908e-7 1 -3.55121e-7 5.49908e-7 1 3.55121e-7 -4.74061e-7 1 -4.51486e-7 0 1 6.53629e-7 2.16121e-7 1 -6.17868e-7 3.24032e-7 1 -5.61656e-7 -5.82531e-7 1 -2.98564e-7 -4.74061e-7 1 4.51486e-7 4.26935e-7 1 -4.96095e-7 -3.27791e-7 1 -5.66667e-7 -6.43363e-7 1 1.20963e-7 2.16121e-7 1 6.17868e-7 6.28108e-7 1 -1.84581e-7 -6.43363e-7 1 -1.20963e-7 0 1 -6.53629e-7 0 0.9629641 -0.2696297 0 0.9629641 -0.2696297 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1872387 -0.9823144 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1364855 -0.9817008 -0.1327975 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.08765232 -0.9373711 -0.3371237 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1734797 -0.9848374 0 0 0 0 0 0 0 0 0 0 -0.1734797 -0.9848374 0 0 0 0 0 0 0 0 0.9629641 -0.2696297 0 0 0 -0.07171601 0.9604846 -0.2689354 -0.08764123 -0.9899891 0.1106374 0.07545632 -0.9970984 0.01005166 -0.165484 -0.9851234 -0.04633498 0.06710433 -0.9963871 -0.05205571 -0.01855289 -0.9915714 -0.1282264 -0.1596735 -0.9861569 0.0447086 0.01166564 -0.9952132 0.09702873 0.1506127 0.98234 0.1110134 0.01357448 -0.9934884 -0.1131218 0 0 0 -0.1199531 -0.9858954 0.1167114 0.0334047 -0.9960209 0.08262425 0.07395762 -0.9967855 -0.03080356 -0.1550459 -0.986953 0.04341232 -0.04902708 -0.9923275 0.1135011 -0.05939245 -0.9717465 0.2284322 0.01359909 -0.9934894 -0.1131098 0 0 0 -0.1297165 -0.9869306 0.09561127 0.05006933 -0.9965522 0.06615769 0.07658731 -0.9970107 -0.01020228 -0.1044685 -0.9857454 -0.1318801 0.1044685 0.9857454 0.1318801 0 -0.9662557 0.2575849 -0.01562213 -0.9940313 0.1079711 -0.1443563 -0.9795069 -0.1404551 0.03801149 -0.9948446 -0.09401881 0.06233876 -0.9968829 0.04835891 -0.05876457 -0.9889584 -0.136044 -0.05089199 -0.9793348 0.195738 0.01164436 -0.9952126 0.09703755 -0.1872387 -0.9823144 0 0.05545455 -0.995769 -0.0732733 -0.1144365 -0.9871711 0.1113438 0.07075601 -0.9970582 0.02947002 -0.1506127 -0.98234 -0.1110134 0.05876457 0.9889584 0.136044 -0.1603716 -0.9844262 0.07201397 -0.01855289 -0.9915714 -0.1282265 0 0.03485065 0.9993925 0 0.03485059 0.9993926 0 0.03485053 0.9993925 0 0.03485059 0.9993926 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 -0.1707559 -0.9841526 -0.04781168 0.070692 0.9597275 0.2718927 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1790391 0.9805517 0.08039653 -0.1790391 -0.9805517 -0.08039653 0 -0.9156407 -0.4019977 + + + + + + + + + + + + + + + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 +

376 0 371 0 375 0 325 1 326 1 329 1 161 2 75 2 120 2 122 3 76 3 284 3 277 4 404 4 278 4 278 5 404 5 280 5 280 6 404 6 406 6 280 7 406 7 282 7 408 8 275 8 406 8 406 9 275 9 281 9 406 10 281 10 282 10 410 11 259 11 408 11 408 12 259 12 266 12 408 13 266 13 275 13 414 14 263 14 264 14 414 15 264 15 412 15 412 16 264 16 262 16 412 17 262 17 410 17 410 18 262 18 260 18 410 19 260 19 259 19 263 20 414 20 257 20 257 21 414 21 416 21 257 22 416 22 248 22 248 23 416 23 241 23 241 24 416 24 418 24 241 25 418 25 242 25 420 26 246 26 418 26 418 27 246 27 244 27 418 28 244 28 242 28 230 29 234 29 423 29 423 30 234 30 239 30 423 31 239 31 420 31 420 32 239 32 245 32 420 33 245 33 246 33 230 34 423 34 229 34 229 35 423 35 422 35 229 36 422 36 221 36 221 37 422 37 214 37 214 38 422 38 421 38 214 39 421 39 215 39 215 40 421 40 217 40 217 41 421 41 419 41 217 42 419 42 219 42 417 43 212 43 419 43 419 44 212 44 218 44 419 45 218 45 219 45 199 46 197 46 415 46 415 47 197 47 196 47 415 48 196 48 417 48 417 49 196 49 203 49 417 50 203 50 212 50 199 51 415 51 201 51 201 52 415 52 413 52 201 53 413 53 200 53 200 54 413 54 194 54 194 55 413 55 411 55 194 56 411 56 185 56 185 57 411 57 409 57 185 58 409 58 178 58 178 59 409 59 407 59 178 60 407 60 179 60 405 61 183 61 407 61 407 62 183 62 181 62 407 63 181 63 179 63 167 64 171 64 403 64 403 65 171 65 176 65 403 66 176 66 405 66 405 67 176 67 182 67 405 68 182 68 183 68 167 69 403 69 166 69 166 70 403 70 402 70 166 71 402 71 162 71 84 72 76 72 122 72 122 73 123 73 84 73 84 74 123 74 150 74 84 75 150 75 151 75 151 76 124 76 84 76 126 77 125 77 84 77 84 78 125 78 27 78 84 79 27 79 82 79 118 80 117 80 107 80 107 81 106 81 28 81 120 82 107 82 121 82 121 83 107 83 119 83 118 84 107 84 130 84 130 85 107 85 28 85 130 86 28 86 129 86 41 87 40 87 127 87 31 88 30 88 173 88 114 89 74 89 36 89 28 90 106 90 34 90 108 91 35 91 110 91 110 92 35 92 34 92 110 93 34 93 109 93 109 94 34 94 106 94 108 95 111 95 35 95 36 96 116 96 114 96 78 97 40 97 80 97 80 98 40 98 79 98 40 99 81 99 83 99 125 100 127 100 27 100 27 101 127 101 40 101 27 102 40 102 82 102 82 103 40 103 83 103 79 104 40 104 77 104 77 105 40 105 39 105 77 106 39 106 73 106 73 107 39 107 38 107 73 108 38 108 74 108 74 109 38 109 37 109 74 110 37 110 36 110 173 111 30 111 152 111 152 112 30 112 29 112 152 113 29 113 188 113 188 114 29 114 71 114 188 115 71 115 190 115 190 116 71 116 72 116 190 117 72 117 134 117 173 118 133 118 31 118 31 119 133 119 169 119 31 120 169 120 32 120 32 121 169 121 164 121 32 122 164 122 33 122 33 123 164 123 132 123 33 124 132 124 34 124 34 125 132 125 159 125 34 126 159 126 28 126 28 127 159 127 131 127 28 128 131 128 129 128 127 129 128 129 41 129 41 130 128 130 148 130 41 131 148 131 42 131 42 132 148 132 291 132 42 133 291 133 43 133 43 134 291 134 289 134 43 135 289 135 44 135 44 136 289 136 158 136 44 137 158 137 45 137 158 138 157 138 45 138 45 139 157 139 272 139 45 140 272 140 46 140 46 141 272 141 146 141 46 142 146 142 47 142 47 143 146 143 147 143 47 144 147 144 48 144 48 145 147 145 271 145 48 146 271 146 49 146 49 147 271 147 269 147 49 148 269 148 50 148 269 149 156 149 50 149 50 150 156 150 155 150 50 151 155 151 51 151 51 152 155 152 254 152 51 153 254 153 52 153 52 154 254 154 144 154 52 155 144 155 53 155 53 156 144 156 145 156 53 157 145 157 54 157 145 158 253 158 54 158 54 159 253 159 251 159 54 160 251 160 55 160 55 161 251 161 154 161 55 162 154 162 56 162 56 163 154 163 236 163 56 164 236 164 57 164 57 165 236 165 143 165 57 166 143 166 58 166 143 167 232 167 58 167 58 168 232 168 142 168 58 169 142 169 59 169 59 170 142 170 227 170 59 171 227 171 60 171 60 172 227 172 140 172 60 173 140 173 61 173 61 174 140 174 141 174 61 175 141 175 62 175 141 176 226 176 62 176 62 177 226 177 224 177 62 178 224 178 63 178 64 179 209 179 139 179 64 180 139 180 65 180 65 181 139 181 138 181 65 182 138 182 66 182 66 183 138 183 137 183 66 184 137 184 67 184 67 185 137 185 208 185 67 186 208 186 68 186 208 187 206 187 68 187 68 188 206 188 153 188 68 189 153 189 69 189 69 190 153 190 191 190 69 191 191 191 70 191 70 192 191 192 136 192 70 193 136 193 72 193 72 194 136 194 135 194 72 195 135 195 134 195 71 196 308 196 309 196 71 197 29 197 308 197 308 198 29 198 30 198 308 199 30 199 292 199 30 200 31 200 292 200 292 201 31 201 32 201 292 202 32 202 307 202 32 203 33 203 307 203 307 204 33 204 34 204 307 205 34 205 306 205 34 206 35 206 306 206 306 207 35 207 36 207 306 208 36 208 305 208 36 209 37 209 305 209 305 210 37 210 38 210 305 211 38 211 304 211 38 212 39 212 304 212 304 213 39 213 40 213 304 214 40 214 303 214 40 215 41 215 303 215 303 216 41 216 42 216 303 217 42 217 302 217 42 218 43 218 302 218 302 219 43 219 44 219 302 220 44 220 301 220 44 221 45 221 301 221 301 222 45 222 46 222 301 223 46 223 293 223 46 224 47 224 293 224 293 225 47 225 48 225 293 226 48 226 294 226 48 227 49 227 294 227 294 228 49 228 50 228 294 229 50 229 295 229 50 230 51 230 295 230 295 231 51 231 52 231 295 232 52 232 296 232 52 233 53 233 296 233 296 234 53 234 54 234 296 235 54 235 297 235 54 236 55 236 297 236 297 237 55 237 56 237 297 238 56 238 298 238 56 239 57 239 298 239 298 240 57 240 58 240 298 241 58 241 299 241 58 242 59 242 299 242 299 243 59 243 60 243 299 244 60 244 300 244 60 245 61 245 300 245 300 246 61 246 62 246 300 247 62 247 313 247 62 248 63 248 313 248 313 249 63 249 64 249 313 250 64 250 312 250 64 251 65 251 312 251 312 252 65 252 66 252 312 253 66 253 311 253 66 254 67 254 311 254 311 255 67 255 68 255 311 256 68 256 310 256 68 257 69 257 310 257 310 258 69 258 70 258 310 259 70 259 309 259 309 260 70 260 72 260 309 261 72 261 71 261 399 262 95 262 398 262 398 263 95 263 99 263 398 264 99 264 397 264 93 265 77 265 73 265 93 266 73 266 115 266 115 267 73 267 74 267 115 268 74 268 114 268 77 269 93 269 79 269 79 270 93 270 89 270 85 271 78 271 89 271 89 272 78 272 80 272 89 273 80 273 79 273 81 274 85 274 83 274 83 275 85 275 84 275 83 276 84 276 82 276 95 277 399 277 401 277 95 278 401 278 92 278 84 279 87 279 88 279 86 280 87 280 84 280 85 281 86 281 84 281 85 282 89 282 86 282 86 283 89 283 90 283 86 284 90 284 87 284 87 285 90 285 91 285 87 286 91 286 88 286 88 287 91 287 92 287 89 288 93 288 90 288 90 289 93 289 94 289 90 290 94 290 91 290 91 291 94 291 96 291 91 292 96 292 92 292 92 293 96 293 95 293 93 294 115 294 97 294 93 295 97 295 94 295 94 296 97 296 98 296 94 297 98 297 96 297 96 298 98 298 99 298 96 299 99 299 95 299 105 300 400 300 103 300 103 301 400 301 397 301 103 302 397 302 99 302 101 303 112 303 107 303 101 304 107 304 104 304 115 305 113 305 97 305 97 306 113 306 100 306 97 307 100 307 98 307 98 308 100 308 102 308 98 309 102 309 99 309 99 310 102 310 103 310 113 311 112 311 100 311 100 312 112 312 101 312 100 313 101 313 102 313 102 314 101 314 104 314 102 315 104 315 103 315 103 316 104 316 105 316 105 317 104 317 107 317 106 318 107 318 109 318 109 319 107 319 112 319 111 320 108 320 112 320 112 321 108 321 110 321 112 322 110 322 109 322 116 323 113 323 115 323 116 324 115 324 114 324 268 325 274 325 276 325 250 326 256 326 258 326 223 327 228 327 231 327 205 328 211 328 213 328 187 329 193 329 195 329 158 330 289 330 290 330 272 331 157 331 273 331 156 332 269 332 270 332 254 333 155 333 255 333 154 334 251 334 252 334 153 335 206 335 207 335 173 336 152 336 174 336 164 337 169 337 170 337 163 338 117 338 160 338 160 339 117 339 118 339 160 340 118 340 130 340 119 341 163 341 121 341 121 342 163 342 161 342 121 343 161 343 120 343 122 344 284 344 123 344 123 345 284 345 286 345 123 346 286 346 150 346 149 347 124 347 151 347 125 348 126 348 127 348 127 349 126 349 149 349 127 350 149 350 128 350 128 351 149 351 148 351 159 352 160 352 131 352 131 353 160 353 130 353 131 354 130 354 129 354 159 355 132 355 165 355 165 356 132 356 164 356 169 357 133 357 175 357 175 358 133 358 173 358 190 359 134 359 187 359 187 360 134 360 135 360 187 361 135 361 193 361 193 362 135 362 136 362 193 363 136 363 191 363 208 364 137 364 205 364 205 365 137 365 138 365 205 366 138 366 211 366 211 367 138 367 139 367 211 368 139 368 209 368 227 369 228 369 140 369 140 370 228 370 223 370 140 371 223 371 141 371 141 372 223 372 226 372 227 373 142 373 233 373 233 374 142 374 232 374 232 375 143 375 238 375 238 376 143 376 236 376 254 377 256 377 144 377 144 378 256 378 250 378 144 379 250 379 145 379 145 380 250 380 253 380 272 381 274 381 146 381 146 382 274 382 268 382 146 383 268 383 147 383 147 384 268 384 271 384 291 385 148 385 288 385 288 386 148 386 149 386 288 387 149 387 286 387 286 388 149 388 151 388 286 389 151 389 150 389 180 390 184 390 174 390 152 391 188 391 174 391 174 392 188 392 189 392 174 393 189 393 180 393 180 394 189 394 186 394 180 395 186 395 178 395 178 396 186 396 185 396 198 397 202 397 192 397 191 398 153 398 192 398 192 399 153 399 207 399 192 400 207 400 198 400 198 401 207 401 204 401 198 402 204 402 196 402 196 403 204 403 203 403 216 404 220 404 210 404 210 405 225 405 216 405 216 406 225 406 222 406 243 407 247 407 237 407 236 408 154 408 237 408 237 409 154 409 252 409 237 410 252 410 243 410 243 411 252 411 249 411 243 412 249 412 241 412 241 413 249 413 248 413 261 414 265 414 255 414 155 415 156 415 255 415 255 416 156 416 270 416 255 417 270 417 261 417 261 418 270 418 267 418 261 419 267 419 259 419 259 420 267 420 266 420 279 421 283 421 273 421 157 422 158 422 273 422 273 423 158 423 290 423 273 424 290 424 279 424 279 425 290 425 287 425 168 426 166 426 162 426 159 427 165 427 160 427 160 428 165 428 168 428 160 429 168 429 163 429 163 430 168 430 162 430 163 431 162 431 161 431 172 432 171 432 167 432 164 433 170 433 165 433 165 434 170 434 172 434 165 435 172 435 168 435 168 436 172 436 167 436 168 437 167 437 166 437 169 438 175 438 170 438 170 439 175 439 177 439 170 440 177 440 172 440 172 441 177 441 176 441 172 442 176 442 171 442 173 443 174 443 175 443 175 444 174 444 184 444 175 445 184 445 177 445 177 446 184 446 182 446 177 447 182 447 176 447 178 448 179 448 180 448 180 449 179 449 181 449 180 450 181 450 184 450 184 451 181 451 183 451 184 452 183 452 182 452 194 453 185 453 195 453 195 454 185 454 186 454 195 455 186 455 187 455 187 456 186 456 189 456 187 457 189 457 190 457 190 458 189 458 188 458 191 459 192 459 193 459 193 460 192 460 202 460 193 461 202 461 195 461 195 462 202 462 200 462 195 463 200 463 194 463 196 464 197 464 198 464 198 465 197 465 199 465 198 466 199 466 202 466 202 467 199 467 201 467 202 468 201 468 200 468 212 469 203 469 213 469 213 470 203 470 204 470 213 471 204 471 205 471 205 472 204 472 207 472 205 473 207 473 208 473 208 474 207 474 206 474 209 475 210 475 211 475 211 476 210 476 220 476 211 477 220 477 213 477 213 478 220 478 218 478 213 479 218 479 212 479 221 480 214 480 222 480 222 481 214 481 215 481 222 482 215 482 216 482 216 483 215 483 217 483 216 484 217 484 220 484 220 485 217 485 219 485 220 486 219 486 218 486 229 487 221 487 231 487 231 488 221 488 222 488 231 489 222 489 223 489 223 490 222 490 225 490 223 491 225 491 226 491 226 492 225 492 224 492 235 493 234 493 230 493 227 494 233 494 228 494 228 495 233 495 235 495 228 496 235 496 231 496 231 497 235 497 230 497 231 498 230 498 229 498 232 499 238 499 233 499 233 500 238 500 240 500 233 501 240 501 235 501 235 502 240 502 239 502 235 503 239 503 234 503 236 504 237 504 238 504 238 505 237 505 247 505 238 506 247 506 240 506 240 507 247 507 245 507 240 508 245 508 239 508 241 509 242 509 243 509 243 510 242 510 244 510 243 511 244 511 247 511 247 512 244 512 246 512 247 513 246 513 245 513 257 514 248 514 258 514 258 515 248 515 249 515 258 516 249 516 250 516 250 517 249 517 252 517 250 518 252 518 253 518 253 519 252 519 251 519 254 520 255 520 256 520 256 521 255 521 265 521 256 522 265 522 258 522 258 523 265 523 263 523 258 524 263 524 257 524 259 525 260 525 261 525 261 526 260 526 262 526 261 527 262 527 265 527 265 528 262 528 264 528 265 529 264 529 263 529 275 530 266 530 276 530 276 531 266 531 267 531 276 532 267 532 268 532 268 533 267 533 270 533 268 534 270 534 271 534 271 535 270 535 269 535 272 536 273 536 274 536 274 537 273 537 283 537 274 538 283 538 276 538 276 539 283 539 281 539 276 540 281 540 275 540 285 541 277 541 287 541 287 542 277 542 278 542 287 543 278 543 279 543 279 544 278 544 280 544 279 545 280 545 283 545 283 546 280 546 282 546 283 547 282 547 281 547 284 548 285 548 286 548 286 549 285 549 287 549 286 550 287 550 288 550 288 551 287 551 290 551 288 552 290 552 291 552 291 553 290 553 289 553 301 554 293 554 389 554 308 555 292 555 363 555 363 556 292 556 307 556 389 557 293 557 385 557 385 558 293 558 294 558 385 559 294 559 380 559 380 560 294 560 295 560 380 561 295 561 377 561 377 562 295 562 296 562 377 563 296 563 373 563 373 564 296 564 297 564 373 565 297 565 370 565 370 566 297 566 298 566 370 567 298 567 390 567 390 568 298 568 299 568 390 569 299 569 393 569 393 570 299 570 300 570 393 571 300 571 313 571 389 572 387 572 301 572 301 573 387 573 365 573 301 574 365 574 302 574 302 575 365 575 342 575 302 576 342 576 303 576 303 577 342 577 345 577 303 578 345 578 304 578 304 579 345 579 351 579 304 580 351 580 305 580 305 581 351 581 354 581 305 582 354 582 306 582 306 583 354 583 357 583 306 584 357 584 307 584 307 585 357 585 359 585 307 586 359 586 363 586 363 587 337 587 308 587 308 588 337 588 315 588 308 589 315 589 309 589 309 590 315 590 319 590 309 591 319 591 310 591 310 592 319 592 324 592 310 593 324 593 311 593 311 594 324 594 327 594 311 595 327 595 312 595 312 596 327 596 330 596 312 597 330 597 313 597 313 598 330 598 334 598 313 599 334 599 393 599 317 600 314 600 319 600 314 601 315 601 319 601 314 602 316 602 315 602 316 603 337 603 315 603 316 604 336 604 337 604 317 605 319 605 318 605 319 606 320 606 318 606 319 607 320 607 324 607 324 608 321 608 320 608 324 609 322 609 321 609 322 610 324 610 323 610 324 611 325 611 323 611 324 612 327 612 325 612 325 613 327 613 326 613 327 614 329 614 326 614 327 615 330 615 329 615 333 616 328 616 334 616 328 617 330 617 334 617 328 618 331 618 330 618 331 619 329 619 330 619 392 620 393 620 332 620 332 621 393 621 334 621 332 622 335 622 334 622 335 623 333 623 334 623 361 624 338 624 363 624 364 625 365 625 339 625 365 626 340 626 339 626 365 627 342 627 340 627 340 628 342 628 341 628 342 629 343 629 341 629 342 630 345 630 343 630 343 631 345 631 344 631 345 632 346 632 344 632 345 633 351 633 346 633 346 634 351 634 347 634 351 635 348 635 347 635 351 636 349 636 348 636 349 637 351 637 350 637 351 638 352 638 350 638 351 639 354 639 352 639 352 640 354 640 353 640 354 641 355 641 353 641 354 642 357 642 355 642 355 643 357 643 356 643 357 644 358 644 356 644 357 645 358 645 359 645 359 646 358 646 360 646 359 647 360 647 363 647 363 648 360 648 362 648 363 649 362 649 361 649 372 650 370 650 373 650 390 651 366 651 391 651 366 652 390 652 367 652 390 653 368 653 367 653 390 654 370 654 368 654 370 655 369 655 368 655 370 656 372 656 369 656 375 657 371 657 377 657 371 658 373 658 377 658 371 659 374 659 373 659 374 660 372 660 373 660 375 661 377 661 376 661 377 662 378 662 376 662 377 663 380 663 378 663 378 664 380 664 379 664 380 665 381 665 379 665 380 666 385 666 381 666 385 667 382 667 381 667 385 668 383 668 382 668 383 669 385 669 384 669 385 670 386 670 384 670 385 671 389 671 386 671 389 672 388 672 386 672 389 673 388 673 387 673 559 708 557 708 593 708 595 708 6 787 26 787 3 787 6 788 22 788 26 788 8 789 22 789 6 789 8 790 20 790 22 790 11 791 20 791 8 791 11 792 18 792 20 792 25 793 0 793 2 793 1 794 24 794 4 794 9 795 19 795 10 795 7 796 19 796 9 796 7 797 21 797 19 797 5 798 21 798 7 798 5 799 23 799 21 799 23 800 4 800 24 800 5 801 4 801 23 801 10 802 15 802 12 802 18 803 13 803 14 803 11 804 13 804 18 804 3 805 25 805 2 805 26 806 25 806 3 806 16 807 15 807 17 807 162 808 13 808 161 808 161 809 13 809 75 809 284 810 76 810 16 810 284 811 16 811 285 811 285 812 16 812 17 812 285 813 17 813 277 813 277 814 17 814 404 814 162 815 402 815 14 815 162 816 14 816 13 816 4 817 76 817 84 817 84 818 124 818 126 818 107 819 117 819 119 819 75 820 2 820 120 820 120 821 2 821 107 821 35 822 111 822 36 822 36 823 111 823 116 823 78 824 81 824 40 824 63 825 224 825 209 825 63 826 209 826 64 826 75 827 13 827 11 827 2 828 75 828 3 828 3 829 75 829 11 829 3 830 11 830 6 830 6 831 11 831 8 831 12 832 15 832 16 832 16 833 76 833 12 833 12 834 76 834 4 834 12 835 4 835 9 835 9 836 4 836 5 836 9 837 5 837 7 837 9 838 10 838 12 838 85 839 81 839 78 839 92 840 401 840 1 840 92 841 1 841 88 841 88 842 1 842 4 842 88 843 4 843 84 843 105 844 107 844 2 844 2 845 0 845 105 845 105 846 0 846 400 846 111 847 112 847 113 847 111 848 113 848 116 848 209 849 224 849 225 849 163 850 119 850 117 850 126 851 124 851 149 851 210 852 209 852 225 852 550 859 548 859 407 859 409 859 544 860 543 860 402 860 403 860 545 868 534 868 570 868 581 868 423 869 420 869 561 869 564 869 590 919 588 919 552 919 554 919 558 920 556 920 415 920 417 920 530 921 385 921 380 921 530 922 337 922 363 922 530 923 354 923 351 923 530 924 390 924 393 924 530 925 334 925 330 925 530 926 363 926 359 926 530 927 327 927 324 927 530 928 357 928 354 928 530 929 324 929 319 929 530 930 345 930 342 930 530 931 359 931 357 931 530 932 377 932 373 932 530 933 319 933 315 933 389 934 530 934 387 934 530 935 365 935 387 935 530 936 373 936 370 936 530 937 330 937 327 937 365 938 530 938 342 938 530 939 380 939 377 939 530 940 393 940 334 940 337 941 530 941 315 941 530 942 351 942 345 942 390 943 530 943 370 943 530 944 389 944 385 944 395 947 574 947 538 947 531 947 414 948 412 948 553 948 555 948 1 949 401 949 542 949 531 949 536 950 535 950 19 950 21 950 560 951 558 951 417 951 419 951 541 952 539 952 397 952 400 952 25 953 26 953 644 953 535 954 532 954 10 954 19 954 476 955 477 955 567 955 566 955 422 956 423 956 564 956 563 956 406 957 404 957 545 957 547 957 552 958 550 958 409 958 411 958 416 959 414 959 555 959 557 959 531 960 538 960 24 960 1 960 537 961 536 961 21 961 23 961 562 962 560 962 419 962 421 962 401 963 399 963 540 963 542 963 408 964 406 964 547 964 549 964 554 965 552 965 411 965 413 965 400 966 0 966 479 966 541 966 533 967 534 967 17 967 15 967 418 968 416 968 557 968 559 968 23 969 24 969 538 969 537 969 475 970 476 970 566 970 565 970 421 971 422 971 563 971 562 971 546 972 544 972 403 972 405 972 404 973 17 973 534 973 545 973 410 974 408 974 549 974 551 974 556 975 554 975 413 975 415 975 532 976 533 976 15 976 10 976 420 977 418 977 559 977 561 977 409 978 475 978 565 978 550 978 477 979 478 979 568 979 567 979 548 980 546 980 405 980 407 980 412 981 410 981 551 981 553 981 587 982 585 982 624 982 626 982 605 983 608 983 569 983 394 983 602 984 603 984 642 984 641 984 621 985 619 985 580 985 582 985 598 986 599 986 638 986 637 986 595 987 593 987 632 987 634 987 581 988 570 988 609 988 620 988 573 989 572 989 536 989 537 989 562 990 563 990 599 990 598 990 582 991 580 991 544 991 546 991 566 992 567 992 603 992 602 992 394 993 569 993 533 993 532 993 551 994 549 994 585 994 587 994 396 995 577 995 541 995 479 995 592 996 590 996 554 996 556 996 561 997 559 997 595 997 597 997 537 998 538 998 574 998 573 998 584 999 582 999 546 999 548 999 571 1000 394 1000 532 1000 535 1000 553 1001 551 1001 587 1001 589 1001 594 1002 592 1002 556 1002 558 1002 564 1003 561 1003 597 1003 600 1003 580 1004 579 1004 543 1004 544 1004 565 1005 566 1005 602 1005 601 1005 569 1006 570 1006 534 1006 533 1006 586 1007 584 1007 548 1007 550 1007 555 1008 553 1008 589 1008 591 1008 550 1009 565 1009 601 1009 586 1009 596 1010 594 1010 558 1010 560 1010 577 1011 575 1011 539 1011 541 1011 644 1012 22 1012 20 1012 563 1013 564 1013 600 1013 599 1013 547 1014 545 1014 581 1014 583 1014 567 1015 568 1015 604 1015 603 1015 572 1016 571 1016 535 1016 536 1016 588 1017 586 1017 550 1017 552 1017 531 1018 542 1018 578 1018 395 1018 557 1019 555 1019 591 1019 593 1019 598 1020 596 1020 560 1020 562 1020 542 1021 540 1021 576 1021 578 1021 549 1022 547 1022 583 1022 585 1022 607 1023 616 1023 577 1023 396 1023 631 1024 629 1024 590 1024 592 1024 597 1025 595 1025 634 1025 636 1025 623 1026 621 1026 582 1026 584 1026 610 1027 605 1027 394 1027 571 1027 589 1028 587 1028 626 1028 628 1028 573 1029 574 1029 613 1029 612 1029 633 1030 631 1030 592 1030 594 1030 611 1031 610 1031 571 1031 572 1031 600 1032 597 1032 636 1032 639 1032 619 1033 618 1033 579 1033 580 1033 601 1034 602 1034 641 1034 640 1034 608 1035 609 1035 570 1035 569 1035 625 1036 623 1036 584 1036 586 1036 591 1037 589 1037 628 1037 630 1037 612 1038 611 1038 572 1038 573 1038 586 1039 601 1039 640 1039 625 1039 635 1040 633 1040 594 1040 596 1040 616 1041 614 1041 575 1041 577 1041 599 1042 600 1042 639 1042 638 1042 583 1043 581 1043 620 1043 622 1043 603 1044 604 1044 643 1044 642 1044 627 1045 625 1045 586 1045 588 1045 607 1046 25 1046 644 1046 395 1047 578 1047 617 1047 606 1047 593 1048 591 1048 630 1048 632 1048 637 1049 635 1049 596 1049 598 1049 578 1050 576 1050 615 1050 617 1050 585 1051 583 1051 622 1051 624 1051 606 1052 613 1052 574 1052 395 1052 629 1053 627 1053 588 1053 590 1053 396 1054 25 1054 607 1054 644 1055 615 1055 398 1055 398 1056 615 1056 576 1056 614 1057 398 1057 575 1057 398 1058 540 1058 399 1058 644 1059 398 1059 614 1059 398 1060 576 1060 540 1060 539 1061 398 1061 397 1061 575 1063 398 1063 539 1063 622 1065 620 1065 644 1065 638 1066 639 1066 644 1066 644 1067 614 1067 616 1067 644 1068 633 1068 635 1068 625 1069 644 1069 640 1069 644 1070 611 1070 612 1070 630 1071 628 1071 644 1071 642 1072 643 1072 644 1072 644 1073 625 1073 627 1073 479 1074 25 1074 396 1074 606 1075 617 1075 644 1075 632 1076 630 1076 644 1076 644 1077 635 1077 637 1077 617 1078 615 1078 644 1078 624 1079 622 1079 644 1079 644 1080 613 1080 606 1080 644 1081 627 1081 629 1081 0 1082 25 1082 479 1082 620 1083 609 1083 644 1083 634 1084 632 1084 644 1084 637 1085 638 1085 644 1085 644 1086 619 1086 621 1086 641 1087 642 1087 644 1087 644 1088 608 1088 605 1088 626 1089 624 1089 644 1089 644 1090 616 1090 607 1090 644 1091 629 1091 631 1091 636 1092 634 1092 644 1092 644 1093 621 1093 623 1093 644 1094 605 1094 610 1094 628 1095 626 1095 644 1095 612 1096 613 1096 644 1096 644 1097 631 1097 633 1097 644 1098 610 1098 611 1098 639 1099 636 1099 644 1099 644 1100 618 1100 619 1100 640 1101 641 1101 644 1101 644 1102 609 1102 608 1102 644 1103 623 1103 625 1103 26 1128 22 1128 644 1128 644 1129 18 1129 20 1129 543 1130 14 1130 402 1130 478 1131 14 1131 568 1131 568 1132 14 1132 604 1132 579 1133 14 1133 543 1133 604 1134 14 1134 643 1134 618 1135 14 1135 579 1135 643 1136 14 1136 644 1136 644 1137 14 1137 618 1137 18 1138 14 1138 644 1138

+
+ + + + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 +

453 674 526 674 528 674 453 675 503 675 524 675 453 676 449 676 503 676 503 677 449 677 466 677 529 678 528 678 520 678 523 679 521 679 522 679 483 680 481 680 468 680 467 681 469 681 457 681 430 682 432 682 439 682 439 683 441 683 430 683 466 684 456 684 468 684 426 685 424 685 441 685 441 686 424 686 430 686 520 687 514 687 522 687 497 688 524 688 503 688 498 689 515 689 500 689 505 690 516 690 501 690 501 691 516 691 508 691 501 692 508 692 491 692 491 693 508 693 493 693 491 694 493 694 489 694 489 695 493 695 487 695 516 696 518 696 508 696 508 697 518 697 510 697 508 698 510 698 493 698 493 699 510 699 495 699 493 700 495 700 487 700 487 701 495 701 485 701 518 702 522 702 510 702 510 703 522 703 514 703 510 704 514 704 495 704 495 705 514 705 499 705 495 706 499 706 485 706 485 707 499 707 483 707 472 709 487 709 485 709 472 710 485 710 470 710 470 711 485 711 483 711 470 712 483 712 468 712 506 713 507 713 517 713 516 714 505 714 506 714 506 715 517 715 516 715 516 716 517 716 519 716 516 717 519 717 518 717 518 718 519 718 523 718 518 719 523 719 522 719 464 720 472 720 460 720 464 721 460 721 451 721 451 722 460 722 444 722 451 723 444 723 446 723 446 724 444 724 436 724 472 725 470 725 460 725 460 726 470 726 458 726 460 727 458 727 444 727 444 728 458 728 442 728 444 729 442 729 436 729 436 730 442 730 434 730 470 731 468 731 458 731 458 732 468 732 456 732 458 733 456 733 442 733 442 734 456 734 439 734 442 735 439 735 434 735 434 736 439 736 432 736 490 737 488 737 492 737 492 738 488 738 494 738 492 739 494 739 502 739 502 740 494 740 509 740 502 741 509 741 507 741 507 742 509 742 517 742 488 743 486 743 494 743 494 744 486 744 496 744 494 745 496 745 509 745 509 746 496 746 511 746 509 747 511 747 517 747 517 748 511 748 519 748 486 749 484 749 496 749 496 750 484 750 500 750 496 751 500 751 511 751 511 752 500 752 515 752 511 753 515 753 519 753 519 754 515 754 523 754 447 755 446 755 436 755 437 756 448 756 447 756 447 757 436 757 437 757 437 758 436 758 434 758 437 759 434 759 435 759 435 760 434 760 432 760 435 761 432 761 433 761 480 762 474 762 473 762 488 763 490 763 480 763 480 764 473 764 488 764 488 765 473 765 471 765 488 766 471 766 486 766 486 767 471 767 469 767 486 768 469 768 484 768 448 769 437 769 452 769 452 770 437 770 445 770 452 771 445 771 465 771 465 772 445 772 461 772 465 773 461 773 474 773 474 774 461 774 473 774 437 775 435 775 445 775 445 776 435 776 443 776 445 777 443 777 461 777 461 778 443 778 459 778 461 779 459 779 473 779 473 780 459 780 471 780 435 781 433 781 443 781 443 782 433 782 440 782 443 783 440 783 459 783 459 784 440 784 457 784 459 785 457 785 471 785 471 786 457 786 469 786 529 853 527 853 453 853 450 854 429 854 453 854 528 855 529 855 453 855 429 856 427 856 453 856 525 857 504 857 453 857 504 858 450 858 453 858 453 861 425 861 424 861 453 862 428 862 449 862 453 863 426 863 428 863 453 864 424 864 426 864 527 865 525 865 453 865 453 866 524 866 526 866 427 867 425 867 453 867 503 870 466 870 481 870 529 871 520 871 521 871 424 872 425 872 431 872 424 873 431 873 430 873 469 874 467 874 484 874 484 875 467 875 482 875 522 876 521 876 520 876 468 877 481 877 466 877 432 878 430 878 433 878 433 879 430 879 431 879 440 880 438 880 457 880 457 881 438 881 454 881 457 882 454 882 467 882 438 883 440 883 431 883 431 884 440 884 433 884 438 885 431 885 425 885 438 886 425 886 427 886 438 887 427 887 454 887 454 888 427 888 429 888 454 889 429 889 450 889 454 890 450 890 467 890 456 891 455 891 439 891 439 892 455 892 441 892 455 893 456 893 466 893 455 894 466 894 449 894 455 895 449 895 428 895 455 896 428 896 441 896 441 897 428 897 426 897 481 898 483 898 499 898 514 899 512 899 499 899 499 900 512 900 497 900 499 901 497 901 481 901 512 902 514 902 520 902 512 903 520 903 528 903 512 904 528 904 526 904 512 905 526 905 497 905 497 906 526 906 524 906 497 907 503 907 481 907 525 908 498 908 504 908 504 909 498 909 482 909 529 910 521 910 527 910 527 911 521 911 513 911 498 912 525 912 527 912 498 913 527 913 513 913 498 914 513 914 515 914 515 915 513 915 523 915 523 916 513 916 521 916 498 917 500 917 482 917 482 918 500 918 484 918 462 945 489 945 487 945 462 946 487 946 472 946 472 1062 463 1062 462 1062 463 1064 472 1064 464 1064 645 1104 450 1104 504 1104 504 1105 482 1105 645 1105 482 1106 467 1106 645 1106 467 1107 450 1107 645 1107 646 1108 452 1108 465 1108 489 1109 462 1109 646 1109 646 1110 506 1110 505 1110 646 1111 465 1111 474 1111 463 1112 464 1112 646 1112 447 1113 448 1113 646 1113 646 1114 492 1114 502 1114 646 1115 490 1115 492 1115 646 1116 502 1116 507 1116 646 1117 448 1117 452 1117 646 1118 507 1118 506 1118 446 1119 447 1119 646 1119 462 1120 463 1120 646 1120 501 1121 491 1121 646 1121 505 1122 501 1122 646 1122 451 1123 446 1123 646 1123 646 1124 480 1124 490 1124 646 1125 474 1125 480 1125 491 1126 489 1126 646 1126 464 1127 451 1127 646 1127

+
+
+ 1 +
+
+ + + + 7.481132 -6.50764 5.343665 + 0 0 1 46.69194 + 0 1 0 0.619768 + 1 0 0 63.5593 + 1 1 1 + + + + 4.076245 1.005454 5.903862 + 0 0 1 106.9363 + 0 1 0 3.163707 + 1 0 0 37.26105 + 1 1 1 + + + + 0 0 0 + 0 0 1 0 + 0 1 0 0 + 1 0 0 90.00001 + 1 1 1 + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/Coordinates b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/Coordinates new file mode 100755 index 0000000..6fba9d2 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/Coordinates @@ -0,0 +1,20 @@ +========================================= +Location Coordinates (x,y,z) +========================================= + +Chassis : -0.045 0 0.148 +Top : -0.045 0 0.234 + +Swivel : -0.185 0 0.055 +Center Hubcap : -0.211 0 0.037 +Center Wheel : -0.211 0 0.038 + +Right Hubcap : 0 0.158 0.091 +Right Wheel : 0 0.158 0.091 + +Left Hubcap : 0 -0.158 0.091 +Left Wheel : 0 -0.158 0.091 + +Front Sonar : -0.2 0 0.209 +Back Sonar : 0.109 0 0.209 + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/back_rim.stl b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/back_rim.stl new file mode 100755 index 0000000000000000000000000000000000000000..09587a53524cc452d6be26ba9db18babc677dd54 GIT binary patch literal 1094884 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 literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/back_sonar.stl b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/back_sonar.stl new file mode 100755 index 0000000000000000000000000000000000000000..9153bc5ebf0a9adb93de31251286f3f6d832f377 GIT binary patch literal 12084 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 JgWTCz?0=HXoMZq1 literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/center_hubcap.stl b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/center_hubcap.stl new file mode 100755 index 0000000000000000000000000000000000000000..c9400f7d232673f850e9af32d221b1686a2c1c6c GIT binary patch literal 1684 zcmaKsyGjE=7=>deHeRBIiev=^3w3n`iMj{|OG%?e2#5xaw`ex*#SpZ2vaTt@hMe=y_pvh*T298yj50Yjp%{*xa%^S6G}e^R zYCJg~H-{B<$ykf4t1C-}Y8sYm*|E8Vr8?GJ5C7SdN-V0j=_C_sO5^|XFU42!sTtIZ zo$IU+3F^}Yf0>?pqd9%+z+divIAgovHeHcR(7;sf{oM#P#?p@?awB-+FMrHz>fL;< zkGJVL&)1{IMCL*t__u+n!()G$8apm3WUoFQX2PkX@#*GoDr{g1on()CK3A}#lQ$JM zFxAJY{x(PUWOkdC`1|O1E^2lA0Y)AJ=LJos!Um?$Np8^Gcm57W-@7y<^rpfFrf5C# z7|(|)sF0o3xaJ;CB*>^u9$y=eH*P9niz#%H8#MQgd!+eXB=n}j2Bw6Qn+n;h`R*f+ zKs3i*kABXF6K-Q}Dq)K$bdnokK9@Y&`CKIQroslM8h+15+C_!zbOr^XIJItbY+wqV zWDlAv-UkwTQ(*&B;>^3Lko`r=>a=5;W-qlWU#m|0s^xaCVkcq)Q|Kgn&|EqnSEXhR y3B9SXfhk&#&c|nLsDcXFX$^5-2`cw3iVaMmlk7or#eIc@-c;DYlyLgFslNdQ?I~*j literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/center_wheel.stl b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/center_wheel.stl new file mode 100755 index 0000000000000000000000000000000000000000..c8b857dc5cc08bc87d1d651414b1b8f4a941637c GIT binary patch literal 11284 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 literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/chassis.stl b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/chassis.stl new file mode 100755 index 0000000000000000000000000000000000000000..13aa2cf73d764137c73956909ece7214bd890cd3 GIT binary patch literal 11084 zcma)=Ux-yz6vit^Y{VfjqY~jJrqMXwyfp*q+@lNzDGFlci<->X*x0Bu%^&CwJs49^ zOcY2jgM=VNgpwpgkoQ2L5Lp_8f1(~t3hKciG9l@q^KJHL-#Y7@@%SLCv%lZ^*4}HK zeXjNH-q$z!Qtip7Hq?eE#z!W`Yr95=_ttv%4D5S$V02}zJ~+I0puXq%!QuMo@K}9p zyl>~wSbbt_XJ_`Gog+if)yGFC_6^lX8rf?0*H5?DKVNmWCrA5dr@!^x*KFP~H_gX8 z)*oxtYRVK5Q1Q7ZR_*UfHuW58!GkJ|s}WE!lP4DSbtMmU9BCjgRT@_#phBisYeyQM z_;TU$^oQf$wvJ7|(c)P_#Tb6}tVm#mvC`!PR3y~HS5?1#c{;WFV5o`&@-98vnZCAg ze>jois?-C7X0n8?XkNtAckOQ=lOSYX-W-2FC1^V8V2U~vUORjdLXO^CB-Jf|N z{$>4ih%f!vkv_g@y7iB%N(oi*c{zcVSDu)YZvA9dNiSHdt<9oLRCCNzw*q?RFFz%mF}n{XbRXrjt8b2aXeR5S1iHo^ly@*saK_ZndgzMg<+=HuE1@cO z(7#c7?j-V4X{%C#Re|8Q#CK3vlt9e4z#34$evu+p4G{K@|x+x5VJDhnrL(h9B}GJ|DejCa7Yj3Fo2isw(%$6ZFvi z*{XC!^CIS+W+td&rt;I}`H=%HL5`!6V+(p<3&qD@ri-RVksjwt8C+=3?#Hx3-B`GnEsnVkTczyu+J| zv%HM|%}zAl`Ax*ugDMcJ!t?CQ88Q_U$fb1rG9<`UPN<6UJ%zu0vTt946;(0z9`T!D z2&nkHnBX@9s@&H(WU~9vZwB+CLdM>MokE}WtjbR}Pp}7g&WW*ADWUI2`B^EUDy`6Z z)&vWx0N~lWxtcP}u_cgOG_QVfl(t0t(kEl__f__FHu3qg-&an>OrD6p z4HB#{elhbyoc*c^nQT>5k)R6CvtJw`lO^J>i5pcxg*}yfD4{BPqeAb&yt><&t0JK) z^(*$k&RHQ(0lh(7POx?o#b-5owmW@i?%7s0ea*>ro6}R@^qcst>+_n{qlkct&polK zr#(HqcTNfqsx+=fK*da+!23ZDs^G!68UYnEdE&M&x|6ARR#d@*aWw)eX7a?mRhyF& zu?JMagK;$iDrWM8_W3~jw)E}pWes>Ru0}w`OrFScB@eH?5c0ATcrdO;K*da+;4EQ9 zD=FWH5~}+BP;MjZjtZn)bAL>dgWVogek9MyP7_n)c+e>B9vcIzQ@H zjZjs#r=)ARRp6m3+O_hYE1@c_w($08X8%8dcS&>d|Ne)#oQP9m2xPKE>_LJR#_)*! zFYur$Ulj@O5ql6k7{h~^5ZkJ#%2!3gd&E-=XT=zKnaO)lg^)-Ff(K*dWhU=I z6>_PHvG-utu)-L5^$oUXMHL8DF~&_~3C?T02gBWk+kn;jeJG(S#(p212ISJ4fmQk2 zM+sGNf4(YC16K5AP(QnKB~+!}mf$qNLvIH4D<@Q?-j?7r#Iw3_d7JLV(!ZcjmwlUc~wY}Mw#S5-&NiKf&efU1ws+3R_Jql;{#y9-wYg^J= z7j%TY%ZE0mW6{rgaF&ouRh%n7ySk#p^#hG`UGLXnPu4>TRdKGohps5G_RqHT(MM({ zI5+E|gsM1K-a}WExN^BIX%u=Wp(@Um_s|t3K6t&6tSvk%B~-G1D_*qd~~c_^VO^|KzDH=cCxh`lNB zP(oGeXFW7;Jn698*qeg0QbJYgXFW7;>{{@M-7Gj=B~+z;) z&s5>87*`{pDxZ>g?%|utcv(iE=Y!ez9I>5ts_=zWRh*cDuX8;2@J(fmyv*c1sDg*8 z82hhtJon(i7TL;~2Az_d-icx7s?r literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/front_rim.stl b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/front_rim.stl new file mode 100755 index 0000000000000000000000000000000000000000..c3074d5c0873cfce0755b5c5cd21b411a7e533d8 GIT binary patch literal 1094884 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 lv_u%GAePjoC< zsP9}hUn9&>NvQHWo@-rsBi{8xUI9p`%6I6U2N&x1ipxx zbB6pK*v=UX^Ht4XNxcWi1o{Dq_5duIvXJLlg-@@!$DerMEtjW9W<=+@_4wvo`s+`+vIsB!+-n&!@-=&`YlFf%NUUT}e??=YJMC0B` zx<{yTPgTp|y^MwWjS=&8w96x$gerg2q?W_esD=7%K=XBHk#`dks{Ad&S`L2+(-Y5p z$|<2L|8}P99qAsS%5~7(6@l z@YOYM9`5&*$;`LC`3lZ1--=@fYkgtlIl^!v&u`ZPn}t%Z3%7I(%69+jNaeLX~%BDq+68 zIZDDgO26u{-Gz4;u0HwW!)~XXF!K$6eycB`>M1weeb{698NbV^dbkIa?h&fo8&(h3 zZLVtaN=8DJ>$&RT`v_|~*RF&r-&0f%`-E>|^V?SmRrZzY;XcZ@a`{c1gsQxc@;Q6j zl22G9RQddCIXu(#v_7BEOQ`a!w|dx0dTSpE*FL#jIcN0N?Gmorol9yt%(vG+BZc;>fEE3001d*~1>3d#xU-vWNNh)>jg)uk@?sFyCHXNmy6< zRS)NLTYhfs5~}iiZoa)SQNl4%zgiC0hK>?>WROthnz4GgZgWJfs96_bvI2iG-@Wrgl8qf=BOl8=~q2mE%nyB60Udi z`pOk@uN)GVBd@8=*9db|5~}p8b>-~5P-|+>EL~;hm8FELd}e9BmMO0?Bvk2F>&n@A zq4sL#+go2rxW004Sj%DkSf;$nkWgj4RS%=`^edluNvO)@kZ^UDS7Z{ZvWFwJCsX+} zNJhF6dMf}`*~5HIOV@HFRgdVM0qEfwK=v?S)6%sZ zN!24frN}1}dZ@}C=4)EImLsWpgr{Hm#7hrV*~5HIOV@HFRgZAK$}^50sHKN(r0NkV z!umY)F!t=>XNgSviJ|I|RGBdLL{|?9^R-NsFkfq-S8`SQRS#RAX+Hs+300;SiZH^S zNB)Kl^HP=1OC&69{$!YhD$i$fIUEhVxt#DD$|*;9KG6= z=y|9zoue`m-`!?HmGzbhpMmL282kK*Ub|9dI!C3-cAN=Sy>jSbpU)nuY%!V8!#0G-;We?7Ts@^lV9GS57*>-JXHL67T z_e`iV-6M>!N7&~xp~`e7T!rP;k|k8tt6e?JDMzKsbdTtj+CkD$_l}_w|`jHMBkl`Y)AXAko=oe4eituWnH^*n4P{^~}KN>$Ip zayUw44^>833EPivd;EKk@Q!#UROMUVy1TpU5thSrj!KoEOU{HU`(q`{*LQ;cy+`C* z-sYt$-`SS%dGrX&VY*k2{L5KJrOKMF9=iMH*uVFP{Fxu~Qk6f!BjNMt5thSruN-~{ zNG4QS)0NQO`vv~JM|cB26RPqZdfmM>>9ffm<|~~EOK!SH_+4?CQ023!gzny3@$Wst zTmG3)mG9~6?hVr(;WL-cQCV`+J;L94%7iMPO(k^qK9qm&5q^>&6RPrO0dzl`JG(u? zXD*$ivgD?FguhFd2~|FuO6cyI%D?vrKh>HERrxc#x_fiENBGR8b5xexbdPXdnh8}t zn@Z?zUAexlgu4`P_U99N303(VPC}LYog9_>Oe4&MD!*Yq6RLVqsd87GJycnyO1S6n zsrk)_nNa0kBonGULCAzEPeLk@R$=+qZX{IY->8ys9ql*XpB= zCR7<=C0y6~eHnR0CZQ^SyO@M3pG}TRRsQA{Jycny>S4XRkMbL|Goi|-nF&=sn@p(k z`Bx&v?yaXxsLK0uck#Ysk**#Rs^;(EIG;UKIhRzzdD|J;Z`RF(s{A`9#bdZ(w&f=; z8lLf!7wqD<*k=z_*~8dfW%w&W)k8v+WvYbvy8iSVh%%u{ze+eSxyrB>GNH=(suITT zs@QMV&4en;R0;ES749#sWI~mGl}P#KUuu$2m3Mdki#s}h*`r1!p-R6>n6EoXe;Fzh zs`RUb`Fd)Qe{o7em44O36NuhCDB(Ql_h)7gRYsTzRn|f!jNRGNSu_)>EK?<1-MQ-X z8|*Tn%J*NDaMbUu+a+ALJC{@s^L6FziaZml^s9vVT3Tx%6RPy9gll!*E||`QPq0U* zGMznCna+eWfP36bsLCGxizTquvqk*%G<4P^Lgma&CChQZYE8#l99erLisPa8me#auAYW^Pi zyd=#TjuN%x5esXonGatT%XRl>2)k=k@7e9q>S302v{f3eq^t{#c-@0IXe%u}`8YgL(V zj!Ht+{5_m^YdOr<)^55-m{TRp%hqnXN0?J3-0Pcf-k(c2emJgV4^{eALU;RiCejYV z9$Y=_okr!~Goi{pUkT&Y!*nJRT?t2nl&*yCmczeSBF#Ady%H&sO!zN}t{xJmr5B3O zuX^a7(wQ({(>+4JOsJZ_M~_$x4%1AuX$sVd~F_|zD&r36*$_O)IB%U*7LX{C#!dBgDB@*U) zw`H3T8{KyL@a)%rc#=I_i<<5c-cQbis$Nv8ys45sR5?mi!WuQ5*9@xcQT{!9n6K#` z;VLQ>o(WafbS2E!y_$dT5$Umgl(>W?t z-eS*$DxXay%-6lFfA0~VYh*%|ry`l~T%$+$%%!u3B{$t8yv3dgRX&?a=-xYLNQCcR zvWF_)y=203@gCtbm(CuR+;ord7JDXC`D`koyDKvP-XnUaYN|XV&mNx2_XwZ4boQ|1 zrhA0z(oCrG*;GPz>&o?YCEREDhR-*DnNa2ZnM|m1zmo}fsYaLy^YxBSCREMe!(DOq zP-U4a;hw{%=H19lsB$lo300mTWI|OwXK>}^ip;z9)k8v+ceyj+8)erhnNa1ew@j$& zMWxEyblF3dWvYZV>JGwpVVSUYz4x98Rr+PZNb+rU%c05$tB3CHqrCT?300OU6RM0b z6RNC*N*KF4?0h3$LX~Bz9_H(g-rM+@P^DibQofG!nNa0iQVHkna-V+d+h*6_dFAk^ z_w72%gm>NZe6EKxr}xm;;=#>+Bdmn(t}?t^p9xi#sS+t)@4aV2RbIV1FZJq5!WwnH zs!{3gs@S{rnNVe!Dq+5^!o4Y<303-4!hGGIc~d?Us`RUb`MRU?ZhaXBxBZ{ue|mFF6na1M8F&x9&h9F@@BsH}xdsIsOj;p)y+ zpZCx+q00APm2lK|~6RlCxxpr0gmc(?e zD+z1VbdNBnOsJZ_M~~3MbdAb-_nGJU!+&uU&1c9Gs`RT-xoh-YLEaTfIA=JQ^gN6( z6RPy9gz@(FQHjX!qa;*WZ#62{pRU#OshWf;&*ZX)YurqvNb*YGeV_ZY+|MOcS#Px* z5@Lz0KrmIIH{Cg#AKj!OhvJ(D_ zd#CInp-R8%k@`d)+a*+aepx-v4&Rt$gq1K}d#dRkVNR7ubB1g9N?2Ocx#X%+I(wL} zbSA8y9-)Wpx$I%S(mf)t0L)jF>7IuW?|y&4`1U5lmmYrFaPwv3x-u$NMwmTp zueRe%sLCE&Zur>YooDPnT({K;7d+unli{`l4jxuN|HKQv@bkh@P@}uzP9OOhd=+u z5yJtmdF-gyN~rqolPAM-mLEKvb-*?k)RH?IT($j=XO~_0nc91E-LU-Gef6s&}(>+4JN?1bE*(0ek;TUDQN2oGg%aQVR zB+7)UJYFRaYb1N9a>bDeOKZAE7;PpTQG0|c)7e9newDCs?pNnNXGcpzf+%KV%P8t{*C4>$6Yf(MLj+V^{WY zwd7hW6RM0b6PDIm$b_ow;flqTjO(E4A)(4OQ6*frxjM@$G6_|#=cIZAS+CeUJwlb~o`-EA z6RM0b6GmdXNBm(uj5qbiS`JU>(kWgg(k$allnGUN|6wi8{|QPv&ey1tDidjRc66;C z5~?gyC7dl)NoPWpb8se7Eo8#_$sVpCZI!Nxs)vLs*Qk|n1?kGtb!jG4xvH&1irres zgeq$~6TM!W=5U{X^^j2I`XLjk7Bb-z%pUV!>Cd0Av_22hwH%8d^Oh}tv zS3>uct{zF{-z#Cf*B|%5+5g)6=hIV;TG6a43DecXf7#^v_s`b6{o3iB|6=*XzxN2~ zO877LdHU(INAGpjblKJipYPv$gmfkRmxrAAzS+YsxpsP|`#*8!-+P2~CH$Aizhb-D z+rRPi>7ECEc;?@GgmfkRmv?;p_zOO`(H-VCJ?29*|K1~{E8)LfyTLD(p81Q7=l=60 z%Vz$)M@Uz~e|h*`51G8@m`&$C`}R|o`1c+mT?zliUgY0)(5XbS3;3)91Y42`g7UZq0PXA%8cz$)UUH)epOJ>Cc|I@!ah%S~eo= z&tKno#q6y+te)<5-m>#geAbHDBkr?$deEs~*ri70C^P;0cgor@r_xvl`XW%O1V-V;8PJx8D(m6vCV;vE*^vOm4Y)ler^* zbJ7x9_(MOp&E(wgZ8EpThTmOMi7o&0-YXw-#G2{VXB=1h_L-BbF8GH_)=XEPdfX_g z!*@P+)k!D)YI?)=#}~q!s>lEH%57%Xzxc-KIjfH=W7K|kzt8O2qi>u(=dH(&JRHfS zFS%l$+0`5WXu8Mi_8Sq7uV-!g&e>xhfBkgFrMt}bzUi3RCwISoy5;I!MugAVmhrQT zkDYD!o$pL%+kb0mEr+e|PWQfY=^?*ueIGb-*(A3_qdNL0$IP~V()H6%|6*-X*|qPnFFy|nRk?pS-`Q*Jo3$Jgs&bFAwM*O6 zs)vNC+@oxX(!Cy~%643%aujt8ws&Phm3^}kj=TExMru`#+SSAMs$U-4B~;nds)y~> z7XI@ezijEg`)@F}a;t;a(xX&45>*eMfzRJ@B@?O~l`3J6a`wrynuIEQSM{*2?6p@P zwbA5`7jHOs`*X)D00~t~_P*=n5l`M|Zl}$kI;vftnl0lSm)>!<&ngsLZe;%|1n@^iOOSDrbZ zoo$JZq7ON3_g!y%`0djbuN|+iBvgI-@rUlZ!MkstUjE9Dj7o0nv+eG?-3xcUanIYQ zH(xTI4J1^3WjNgPTOFUxqtby4~|w#5~^~$a#iHh%ui54)xX~9HM_p@^|w#2 zK70Jktsi^st3Gz<>{UB|XS(C^@!Cg1mGxHZ%5{`8zvKoA%YSyq$%B5j;oQgna=g-)Q1$1hZ8W*=D;v%|_{^P0 zBZG6FbJR@_yvyua&$(fG$`LC@y;efi=4T!?+v!cKr+0q#@)6-I?5g-z$G&6sxNlxP z9X1=UkR?>T|BHvsPF#J>^w7PRj69r|oUb0V#Rq3EfBF^E?YBOB)N3VFJ^ICOpY8j( z)zeLPeB!9C+(EcPI()@?vwI%))9G{mdc6OTP<6*!)}L*;*H5SCTtDuE#%@jL+Lcgc znQ9+&mD-yJC7cKE@u!cOeD%e5oV)kuuN#eU=4gsPo>`sUf}rfa5aZkbG~hi%CooO`W=D%)7~aJ}R1CGS`y zRJjhS9Z>;RIWi z?YMe44!WwzD;Wt@j*r#DeP-{OOZd#)e^!sOZsP)UTKp-R6> zxO#Erom--Ws@w-{;f`v#B}%B$ua-l?(MP{Z_%9Onn@p%O!b*6CV&|%lrvx`%3ljU*=Cp+vlr?|1y6`7h^6!-}-d<}@gmm@rU*_LyB}`Wj|7HH8kA&&!;lIp(6qPVt zJ^YvX&ju2vtB3zG|5;7KboKCG=07`2n64iF%luav5~iz%|6(ul?>$1g68?+5%fI&s z=^pX>^w8b3tMeR{k+=h>gniK6gu9GNI5N0naVJv=$16{!JpHPK`z2eY`>RU0CzCLz zO1ST{^|?>1gnLW-qkGXxxPO%}r%Jd-c3g2!T?tjv?%ONjnCKaRCl;0PIomQkf2f45 z&$Eo&5{=69k{p%o)pB@NQ=_sMdG3>Ylq%1bGU2~Sc&=5WvaXEKoHC&*d)UJD%g;kX zRqh|QaQmQrvz9|bRqj!?c4>QB^^j1Ndz39vy4Ryr*^X;ej-rmi_O48*vTs(xaaX_I zNUh3IyL#AO^~+%L6Z)K~8J=K}hH_Dk%<=f>- z*i&s8z8TMiD&MPD!j@sX@(q6`RQa~Q5{>|l4Bk}8geq?>RKoG2_sk`H=H9-j9*#1O zKHeP3geq^5RKj`5`NJD9nNa0zm`eBzoB_PalL=Kmn@YI4vmNJ_D51*RN!7zy-?h3o zt1_X=TUM2@Pq=#VhFB(4*;gvzIOyu$n{Js<<@i_$M}6B^ZY2_`yuDXFT(LMl<`GUp zmA4S9hke_*-5ZpdP-UO5g!!75&V(w{m9THSX7EO9CREwyE8)t!R}Kkd_m*z;aFt<; z$*n{}mA8$nhr2jeOWu^ugeq@MSHhCJ((}f5CRF9Ra{SP*N2qdKsZqHWb=~d_{7k6w zHhv{s@3@}JD>4aHu7j$FeZn&3s3cU`SE`3|pR-S%aU@hZCsq%ifh&%@%8*dyv#B0s z?&A|Rc||6n$~m!mxF2vGlvgqms@x}35Br@vFF*N|303yTN;sA{`{Wr%LRB71JVWY@ zR}zj_ek!e&!*zlu9)6-O6RKQ4RKhvKQ9F;+5~`d_s)zd;Yay3hLY4cS>S0@QkDGU? z5~^%t)x&j(yUDzRlu(t|B|c}@zIpX3p~~l9%i+GpeOumnNvLwaQ$1`Yy?Ic=c`&yt zR~C+Nc@-|9%644KVT-fZ<{3vqmGf2ga3r(!*(x)kD%X{xvro<0r+P@J%5B${;jS^y zY7(mSt5G=%yMxTNE1^oi>fsFFjwP?cB~IGS~|;p-R6> zxJvEyS_#{0?t`}Q-Y6iD;8U2ZizlM zN1|L;u8Qr0_Ou+8<;YRl@7zJ;)^3kdC0(O(Rb&gdKUTsXC1FmLu(jL5oqa0d`rJNf z53YoBpM*J8!WqCZIFGxI=RW5=irO-4ua3brDqEth&vYg1gZ3iRmGECoXAl3SN2oGw zPBkk3W&VV;ZLE6uFY_m)ZDZBLf0;iaZSSfc{>%IcX-A3b;lIqEkj^8V|1y6q_X}YgejFn^TR- ze@W?eC5$Act4C7#_evOhZ@f}v+MKF~s@}M(%CtFE4^_SSLzQWBsvfF(^Pnoz=2SgY z_2zR`rp>8(sOqgtRGBuX>Y=K)zEWk{oT`Va-a1j0X>+O`s_aGny%MTS_XvBDboEeW zIurg&k5FaWoN83_-$%`VuQvbv;QaTT^WWFbfA8$B+SZr%=kq@UnEyG0ClL0#e3mi) z^OE_W$#@#oJNKFY*^(`>cYbA5y)&};pTpUsdS`tSz4OF%JF}es$l&;)cO6T79uj#J zl~85BsUG$<`=Bj96RPZKm9XbXXT6AX=L?qY?rVdXF`?zu@dR+o9#FgsvLbVltsBw=18NPta9V^^j2I9i2*~TS2ZRGNH;ktVFuq z|l46flbp~}xRRl?cJSDtE7y za3pht%O_qEs$APu4_EZA^z#X%gerH))x&mW%gD2VgsQwQaRuO7%l1~Il2Db`qL$EI znCr*tA)zX-85{u|iSpb#N(ReD##`NN)?S27Z+ zYzx)HnZ@3fdz6GKy{m^U+*#jKkxZ!4yArlISKh9PGNCH>L0g=on!TWUNT@Q}N|>)B zk#r^O6B6cB38RwEgyV;!Pd;0+#n}?`?#?=KEb(d9a@dRPgL&0wRF)%0Wvh1HwLjLV zR7u-cDq+8~g}Y~{g#RL8U#WyMjxF4lUkQ7vJ=h&UCHxl&=fp}l_W3j&wJYJcYpeA6 zSHgB>I=3tPhw0ou%vZv6j!Km|^$6)6kv(h~s!UgpMELhg*fLa^?h)ox3HyX9(>=nR zDq-JNWx7Y0Qzaa)RGID(=2QuLlq%Cb!kj8$KUZbCN0?J3T&t-v-6PDY681G!rh9}r zRl>fO((6j-p3>DLsr-8;dgU-L3ICowRC!8~300;u(ThrzX(P-Ys!XpdVI(PCJ(9}5 zSHgJh6aKvts!aC?`?hrTP-VJDI7UfV4^^gngk!CA^-yKHM>uClR}WRDdxUeJboEeW zx<@#NOIHt7rh9~I5$Woo%5;yg7fDwSRi=A{y-2!xs4|@i|D{K$GHp&ZDp%VQrYqr! z-h540!d-*AiQJ>ynYd%g{oGTo-r17-CEJqwt6C2KMZ!H?CEWMfmfR;+!o8)v$h~MK z{1*xLyOnT{>}cSgx)ScgRY_OEy}oAvd4%&k!4~85uO7BU&oXjLG%C+aa#WtZSPt89 zjmjS7xlis<5}qwdR}asrB+RK2{)>_1x{^?(clGdjNZ9f-p~`+!3HzFT(3YPGRra(> z*mERuYnM=EPpcmGD2dz>B~;mttB1YFu{MvQ5~^|^bflKZt3C-;j@q>xj_ne*<4mZ^ zJ<2yRws6~V^^j2INK^^O51*jVCKIai=;N&BEMxDg9ulhTU6t?+pQDfUmI+n9`KyF) zD(zjlM@gvi4QBOlH)< zo>mEOw7Kece9VL@$I43B8f+zbHjq%|jlJsONahHaS27Z+ym?qXyn*TL>^PqZRgM^$ z(8F|(FxpCZbJaD2eLfSa95E`PyRo~T&x9&(=2pViU@LLOkqK4aFs_83+H$Sst}hd+ zyeVA?Z+5%VvlcR;D%X|&BH_4FJtR~)DpkUp_O9DqWoAN^H}EUr%F7j*>!3`iaurnx z-Hpn=k_lDzv`RR$IO8}cWOERI#nWz$$(2~2~$%HC*OOMqqbmI+n1&`P*dbO-5*BNM9fy2Mqg zt5=_Y^^j0y>#2l0EO%b+cQT>My-y{a)tm=yF_}=6+m)+r$4A#I)k8v+y`U1#EcW2s z5+zhQ+f@(SuB|VRa1yF=T{%bj)Ex6`R1&Ik+jaJG*JyjI9ulhbu7tJd{xi?c5~}pB z9%nAh$8i-dDx^>BQ3 z+;wKCgrlX;-*LVYj=Q#FTTCTviKcT)v`3lFJ<5C~Oy{UnnNyFD?h)C;wxr5*^+<$& zuY_$$mFXT~PL;41sWROo%&8KN2C7W=2y?20Bb+MJJ;IzSVUJQ}x<{B(CG6*_O!o+L zs)VDDD$_l}oGM{oQ)RkGm{TR}Ybm|1gzhO_J(9}5XQEdQ^OErI)x&c!)9ybrp~`e6 z+?krzFB7UvS3-Bw`ej0u=}PF{^RV7cf8(V4FWvrxTc(%4`XiI-kyM%R{KE9^JHBn{ z^Zw?h>E*8+dn8pRjLLTPqWvE-x$qeq%sqOWr>>bc7>Jcfz9F?(W5A!uGT|JVjMgDer z^n+Cg?DNCvDMzhX%b2Jt_Yd>cuSclTuRcLNO!o*?rnARll*1M4ZOaavJ^ScyPw)H} z%SX?{(yGekFkk5&p-R76S9+N45vojQkHsj5yOevp`+c*cp8xODxvdXAKS!l1m&1H} zbtPfG`qii;O!o*?rnARll*66r^dDa{JL1xBPw#a9C(d$Is&YBZw^vsZ=Br0!D@s4|^B7NZ=VG|ye}g2`hy-FWV^Z$D*8j!IQ7 zhxzvEO2T~gt5Hdq?h&d?XOG1wN7{wusNA3Ba+q(gt|ZJ?zZ#XqVtDlSA4cUqDwo52 zrF(=b{c2tPv3U3%&@$zcOQ?GALHAm^*^*nPD-QX)NvfsyE-ZPi*nXh-^ zwv!XSw*K6&U$ksg4)c}n5vug7KAsY9_HIyQ%krv(64%!uMy^`Bvk2FJ$$q78~49F_hqy5estyZ&{r%OJwXXo zce?VWv#aiK)pX7J(-C35z5Sqs`&#{KIn37xb5s(l^s64;Tkt-^^A26T>akb+aC*k- z6GtVNP<8l*-(L09t$s8;@aB_7g!%T)G9)~c(XW=ne2p+iC80{c>fx=B-kL$ewa;y9 zwws*$%k}3z{^G~Xs)zY{JLS#iZ#y~g8|%+KXvNNJAynyCJ5$32QROwgC;ccVd+DF3m)sp4Un7rua8_jL8;de)? zaP#%n)6*_^`s5?~Y&7@Q-<-4-LY02C9Oi3;IVuTN`c)6_a`pB&67JQ86+0}w_0n6W zD^ERc)Jn|PJ7v#!_x+as^^vzsuRddKgev`NIn37xb5s(l^s640!`pOc{O|j(`pL;R zPH))$__dT=RW6758ext~LY02C9NrP^oij*yUUJrbzrO0x@A%R5Id2`8+N!+eb}M>ioTSoIPTb>!y3WZog40vE=&o z2vxbRynE`M)a8G>@9Z7RuA1(+beB<75~|L4)xNWho_N)C%hhATGsK>UgdU!e*5_eV z(mg^|E{8XJd+S{Z*SlZ7*CDgLuDxP9+x}ZiYdOrf=BOl8=~q46 zJ9(e_`1fu*x!-ShUdJ9e-g!x=a!*w~%-4Ne-g!x=(yw}$uMy^`Bvk2FJ#4$)R=@Q* z`_A@z@>SDM|6<&uBvj?LYrehyAz}Z}ua?96_`QBEVL!k0vNz4Pc;OY()2{o_s_J3B z?pX6KRYH}1)x&&^Fh?b!O26vi8Ht~Q*k|J}ul$Rr|6+Rb!6#2Lp~|z9N|m zgsOADcAuqpeeo^Ro4>KPlIzzaROPyIgzI@o=#j@n_cgt7SHf}E{Z4%z?g!jW<{hMj zD)$N1!}X^t^4=<3mFv>#;Yi(ECrY?Z%wxN!IKA^L3D2+cxsUy>ckUzMxsUy^)|HBf(neBx>A&Hehh<5iy{gP(VP$~C)9zV&bG%{_Ya@m*&LRe3BiUn9&>NvP7V)|EHZ zZTY#iOQ?F&$^W?ORhNEmdd3xNJFWHJ{6`;n`l`2V_WkLBzZ{>|+KW`#S86%T*9db| z5~}p89)6;~H||O}?q0az&z4^Dy4$Avy>om5=}7JO0qpdszh1iI7jBxaJac@`AfYOc z?dEHQIVuTN`qjGf8x~v#<=I(6)x|r#Vd=6*-ZWkD+O@sAOP^M#QMrcma}0S6XTC<5 zqmodiUyaIdyy%VX5{~Wrz5lSK%bs`B^yW*(>nq1|zc1s>KV5&a{NHb%uH0-q8%PvY zoIlLh2y;{ts*2xs|9!LlzyI$yko5LA67F%n|FW0Pp7gA5PEWgOyjOEqXV%rjd>v8q zC@P^!zv|(sf#1Zo=k`yYt$f@S(;b(O&txQ2<#PtxYtKVM58H7qhu{3ZcFh*XCh_y{J@W57+H}$JX0_v-4!h zZ&$C!9x`6NN~p@~cJp=A&Lg#iD*fs+_gl-{A?00>gsQEtdDi*weZtSDC+|O=2R*;= zJI~I!`SnZx_Q5wz54(76geuQ9YB|i;2y;{ts`RTKev6ztq`WJVQ1zn&mP{^v&3bbm z`^(3S-kA74+wY+J%ZEO0@~&sBH}{}3$M*mvRQaB}mcx9FFh?b!O26viCvv@Uk#AW@ zsQS|K^HzOy&+ko7Ib!^&EpNT}oq%`!#`9-Kzxnd%U7kJuT#b3d{N~rqUWW}mi9RB_3bN+h#j^6j#euwGz zZ}{k{S3Upx({rvLui+$A`JTI$!+eb}M(X0ouqq&D)&^iuB=^mVR`2zp(;NQ@0a*J+lT$= zA6ISqsQO+x7GLF6-oH6=;9yTbM~^|te)=imhrtM_h-^QLY4crS`NS2-}`s@2Azbe z**o90^rH2DHQn?*<4+vgx21c8D*JpbhwlXaeS_~m<*h5Xeg99VH#~SeJ4>kYU19Yw zUr$2v>4$_W{i=uWp!_X}ogen{$*Lgev{2hv)e2 zkn*lbLY3$H)x%#2@%C1}u_dAEQU83%?A*;Sn;v!QMWfGuxK@|$5vp9n*K+tC*xyRo ze!r*A?t1gLrfY7QjP@TAs(e3OJfv72nIX>x5~|$eRuA6^TGP39B~VP?g)2`MOWYD}4!7`qgrnZ?Aty*gy2E9`4V2>vjp(?e5#MN3Rd+VIRyM z=Iic0@8~5|=~v5PzP-AVu&(s09`4C|djkpg2JY3XhxyvOa*vWwrC;@M#_7$263&Bp zj&kPgjfoPDiFvLyUn9&>NvP7V)|F>gy}4Gxxz@9+>f!9%D~E*T$n&}R8ext~LY02C z9QG(@>O4D3sLFlNe0ytA3D=_f)pD3`udXDlEB&g6`C1FPducj=Y95Un9&>NvP7V z)|IOzciwroEuku}ue?*zD~E*T@UBTMhxr;|j!Ht6e$~U-+0)^CA}paQ&*z@QxXR2c zO9@q;&(w05uMy^`Bvk2FJ)E80A?00>gsMEBn{RJ@CE@x?zgiCK#|U#&5~{4X>S0v9 zy_$r3wOkGfS7&)eCZQ^OI8ytjDZgEkP?g7aN4VY@fP`lNc}#R<=$-FMc)pv*633|C zxu}HaqK;j)UD*;%=a!gMnXpfow&mBTk}4BMmFVgrVZMLZau~Z2_M%c{nQF-w!^7B3 z8)1zqsWM?XO!rEz%5;s&d{cy(F!tnf?ThxKFHTBsgL)guzUt{#@W=OJP2xvsoT z)$@?h;}3iP%98iWAz?XkU74?G>EGuwH^LlMQuT;lIrOl!*~5HIORsBPnXl>p@%X=g zEzKurIzPdr>Jf>q&pfIA_&sc|&eVB!mQa;jyZK7@2vz#kC#Z+%9-+!~_E?N^xB~30 z`c&m|m~XGHB+OU8T2~ULdxR>}*<&%v;m)GBn^2X@VZOb(k}zNWYF$Z~?h&d?XOG1w zhdb8ZE>%@7hxzvEO2T~gt92z|x<{xoojn$#9O<+rN97qwE{FN{>Po_V^{Y`ynC=m( zOlOb9C`UTQ%Tamumdjzjy}FVxU;S!S5~h2ED%06xG0KrnhjUb(>E?2nZ?CQ-%vZk} zm4xXYp~`gjSd4P`Mxgf=Kvgb>`S$8c!hH3sbtPfCN2oHLJr<)JX&08Ga(|Y~VZOb( zk}zNWYE%-7;nCZF7?t~|Tn_Vm-!GBKZ956%A4f9J&uHXwcg$Hg}N_lzDAg% zl2GOS)LK{8&q94}!hDS|Mfsq;&qG2F&q%9>QAzg*Rk<9C z@m&_Kqg`d@m8FC#*VnbK%-1sIZ`hDfrC;@M@8l*rB`MI)M4nJ!r-6K@_8NBLYUFp{&RQYVGha+6iLqd-{ zCc3Zbjk^+#yY6>tIouDpo6I{%303YBs)y@OSLD4_xGLAB)x(jxw@#FBotVdVPjPzZ zR}!9I<#QkVUGLmS!gC+{W34N{>%7-?C2YHX2YU5zl_A|DRONMvXFcxj^NwCZm1jV; z9EOO;o`mGf6wM_XN-z8M}+bp%N{5Hg9Ki~P>RVSVFtKa=9v;91Of1+c_LVf45 z`C6tNm4qt4%l&_s$t4JZH$? zf$f~JP~XLBzDAg%l2GM$zt+0)S9@HM=T*3bs{A`Y?zR`|J2TDK2y;{ts{D@5T33GS zX>b0JaQ?{Olj@AKP`_zmzDAg%l2GMuXwP`}M#zP)i*!g1H%0;%Qj7Ylo9Q3=b-ZC@V#^XO(f427V39K&DRKXR1&KEUDH}u z{$hxyE%}5+LRJ2a5$AB}9-+#)y_UmY`s=+*mGE6^{%t__PSQO>m3yjM4)0|w)NhQK zucKWa;UrY~ni28S*O4fXJ`$?@z1&(3-zfTPtN9mJB~;~ikbB>B%uG&H zp_fqQS#R~QmGss=60Uu6yK>Ixt=lDBw>y{Aa+q(ge@NIr^s64`>seMljgnBMU-fVt zbj6WZ84{`-AG3!&IQLpTRAmqI?X9mQTwm!|%VEB~x{|Q2^s64u=eGRZ+9g!w`P_Va zW1@s(qJFg;t_>X}^2i{e$~9y4aNXvJnnzIyRj%i%hxr;|j!Ht6e$~SjvhQ2+8xsjt zc}?wj-YbWM<#3#@EJt2bo39b( zs3cVBSL@2zd7;+So>{ue%qvR?Rr$=)d@WO6Wk{&fuhx~b^Fr;_%(u6`l5l^;G@sd!L%OT9^t6n8>v-g5A!uGUCWVFJ;E8TH>;`29_DLW zx|SoUdW5Ti-U>if_Ap=5(zP5()gyXm0D5=^kUh-Tv~(>;QuPQ=De}pL9;&j3`I?rl z-_`N!23~UF#~TvWN9!+FGa{ zN!23~y{;aXyyqcd?76P|%#Z2(?R!a;2|piYI)9oxsd_|;us#nxj6Hk!St8SZVyJo~ zRVIu*(bYr3d@WNY%-34zm0Xp6)x*|j+D`yyLY3)-B8;%-k-uTXyj11$5(!JYmTy8h z>HbT%KjD_?<*)w8M3v_=xg3rL-dxXwDkIE zGM%F`65risLY4KF37>)KOc?w8iC()>WjaTt%66OyRlRcPVV}<)s%$Zt(8E5T301b3 zO!x#%_lRCyS=#w~^avyA5%!55G5>NHmFZl&Mr9AqgsR>%w;Y+U_1Si9V>PNo`1eex zGTkGLut(VEGoi|KCR~N()siJt)vH}S%qd5u%5;zDmE3$y|2{o@&hz)^5tg<`tlRUj zOu4R%%5)}-$~Kk>RlSyI?3r+UbsY5XH7fr_!gMC2O=rSzqdH4;F zxg4tW%S4GJetN*D{5*~=rsv@&95bP+SG%hG*23(eDwo4nZ7t|mJtS1+c~HXDtLf}v zzRp*fP}TFWpF3Y=4^>8332W4Je$T1O7Vh7(hxwY$gdX`;nC_~29<~yHbt6Zms^?)j z93`@cDkH3f?Z>x0{=G+dM?4d%@-1)O-QD#F%V9c4rOMAGXF`?zu@dI%J3;^6Bl0b8 z^HP=XY)kk&dW7XL-781_!WEV=0(;qN?ULY2>^61saI%D?vrKS_`YRr#|3x_cY9NBGR8 zb5xexbdT_N=`x|pXHyB?T~qn@9^t22GodPfhF5oQF82tZxpa=olAG=ku1hna%4bsv z-K{Iv*OhRW;?4eiLNB2zpTkM0a=(+Ka-V60nNZ~~Vq`*9FDg~;inE6*%Tx*X96mL_ z88H*8+>2yFl_v<9P*qMswz~uWrB#^Upj|yAROR2Ol5idEH{N6q^YuGZGoebqOc;s3 ziIoXeMpy~gwSHelUXe+t%HJ*~p~`2Iqf(W>xkV3EmZ^GJ@9v}g2JK9!@@Zy5mCq&< zs(k*HNU?kCDHE#l{@h)>?^vX(hlHy6dpOQ#4^_@3m2lp6M)sR^GodQ~j)@-5oPLXa z_E42QjNMg+zY+fPrrdE6RPy9g!59bt|Y80=d0>r?5>LaX5CDvvP_jQ zUsvJ&(n=;&=~s!AZ~mnw2~~M_=fAk4^OrqpR1&K6tAzQwgY=i7GNDSpN|>*w2Kg7K zBvk2FJv@Qv&4UuogMNQz_E2SnnNVddRKnPuEuBR(p~^B{VHL;zU?cuQ0huTm44O3wYqN?OlQI;*dtV#&K{~v zXTll4J#HpcWe@+wl3UZ&Lqb)49ulhD8)gqx`E8#bDV;sc*L082uSYDDhmn}hQK`yN zxyJR4lB?zFA)(52k1(f9xMRt0Wz0*JWy&7XJwlb~>S3LzGTkH0sS>VIUFqdBO9@r^ zR82xvUWKPf@;cGcz*)v|rIuX6xlcM1_6gIKaGl_eKCc;6`JOAkW06obe~)}#lI9FY ziCS_ApSgd}gsSY}znIR?BdIcBi?g-6d#UBH-hCdfWGmr{b=`>k=0^`zd8O|@+$WfO zt%SQ&pJpw&gev_i;n?R$Z8{S^XLHJgs_fyv*lSH!k3{(QN_Z~jsao!}s?0Y>C828m z9?rY99Oi3lH{B!5sS@U8Yd75^%&8LY_02c$&m|l`99Oc3D*Y;WP-UO5gz@TOIunVmgrh-9S3-Bo;omEfW*q-si4;jD{Fg*m4++!K3q|NxJ#nM!k*IRzoa;)JIaR_)Qo2WYx|0c2`ej0ucWyJG%5)}- z%F~t};XCh4sOm*!B%bJG4^_69Oc;r$pP5i)gqbiBPYpAn$_OiAtM0WD3G?+fe)e!J zYPv^wKRFYsdQqwJrb_lu%c*a+uB@s=URX302l~CCt}7pnvZXo(E+@l_z?c@OktI%V9cusPYzj zCRAC|l`voTYW}@PxW~9y+?Si zkqK3vimZjW;iIcw_5ANo&$<4%SUdn%GWEV=0(;Vt$|sPfrVLigS|Ln3_ll08)U z?j;kRi}whhxpelhhbqfd z3HKa6HE%j*LX~@wOsMh%Arq?dIfE-NS7hF;uO1Sryvv;l-zd9A$%HCzy=6jGFDg~u zrpq3xEK?<{QFjo&3(JJH>%I3(sM0SJMv`xeYFvS633&mGf1NN_SVq-mTAsD$7&}^K}*O zP5Dfy(ytQc>;BA}@|jSjUnR`f9i4aUGoebqN|>)ZNN>t#LY01%Fkep!@@;hqRr*zr zH0ygCKNG4v*T{r(xO00ZRJr1)gziRVEo4HKHC+i;cdq)phn@*lzW=I(qrNL|SLB&c zYxR7pCZWnRx$NN@Hxnt6ywZ2y=l(4Ba|u<}TP=r#PcRcH5_gl;BSn%u zBur<*zUD}6x<(~oYxnP&P?bIW7u%KT>X8WlUJ2We`MR5|g#Y5+DSJq$(yw}?K9R?E z300n7Ru5<4UO9}{o@%;!B*MQ}BF!1D;VWTjP3MxUO6lxjzS5bnetLu+uII9c`AYYQ zyaF&^Ri=9$=9CHZ&4eS4Gns#{9{!7IN1{sj)J*57oayz*ZPyXma+t1BCBnZ~!n};i zzgNN%_MV3-)8VJqQppPBZT(=wsTbSC`ecl|P9zNUM`{5`(?_(ONy;N7=R zFMs7nCfP&PlD+RbdBl@9n%imfr>=!ClKGdTN6f!=?{x1gmmc!Wjpsga@hix=@ z|CcwM`@kW~)=~~ty^^cice@wvdgGqAPj9~Dh^RP}*x<~kH?F&WNVzP%S z)0y!1=r4ZSQ&vru-84OU|8ebFKdO2j(mg_z=~@o!{UN9AzUz$-zkRymwSPA;!c3^L z7BX?4Wlvgpmq)Id9`?19Cl?O8?Yi58Zl4}@@wl#xN|h0258JElI1{R}$JaMrF?;I{ ztEYRNx9t2YFFkhlsqL_$>jZCJZyI2>T9Nl?!9E(Yavvv*!sBH zOYeT=^r%xW+NDP2XmIsW8%^$b@rHA^KX=*0zh^>~bdSg_(R@{z&K{~v_Xxc!;qOfP z`;-29WhHdCE&2CMs50Fn^s9s=G@U(?Die-Trh9}c)3qEaUq_-$sLJD2@~}p-hbmVb znXt5`dxX(u!V$Gcs4|^BROwd_%4R5^BK4_8aBwKAc~2s2@6t%Xde z${wy*T*zIVc&LSu>WU5 zRUR2qX|0j!;lDVFItFJ#m9>xwTSi_17?rB*kw#}n@EVnbDrbgDI9uB9oKZ8OD$lig zsInHahbn8j68?+j@b8&WrC%mgnXZJ9SXZt%GNH;9M<#l$-KcEsMp!-4`ZKrP`4hTZ zqo!+Ai$PdI(>bdDm%V!r*S{+3eJ|iCL$PcxOEXVfJ6S6a6!4p9SU}jp6S_TR2TMat zG13apNiLxyzvzkSIl`PeVP2-^2vw%%Y}ghu zp-K-kp(m#2h_9{<{Z0L`m%|;pw2Rk?G|M;>WkOY6e^`s_-$7}|`R-LxWg?Bvj;`H? zgeuF_31>@H(wR`@9Gr<%3z@KfvJE3hTct5kw;`d*7_}2dkVclqrI}D=RNINUXF}Eb zHZtKarnT3-N~%nJ{82x6=r{f4{`dWXlg`?B%O5^*GyVC89vM#3C;a7!e}2o&`*GDnU$gM~93kBa ze|gZ`4%@Wx#$(T3czuqL?u5U*_@rYuZQS!a4_|nFj*#wzzkJ_!KjYB4=TANE)PuY} zM@V4y%4{rR3(|MBKn^5ft3lJnkl>UHUpuesHE-780#%U|@)&5>c_ ztOGZG|4x@|rZ3txo-c9i`Gbu`;uF2di6KAIeqZzXD+_Z-^V@SkcBP$ z?*Huqq-PkQ;H6L;9S+oo41-{ka0m{TXd^|%8zi3eTy@-{}j zHRDQnmZruj_Z0eQGPhyd=)~)9dI*TrswG>q-yJsh2}S zRkmRZm(KS?LRIb`&Uf}&`(`hPgsR-5Z0*wav~EK}Rqj!?MCrL6rOI~Py>b+F47PV= zLX~~96OOyun;WTBIcj$swpZ=tv0XxyJ+0fYz1qSrJ^JCBJ@}aqddfy7R5=oL!h7KT zcU;MYDo3SG*rS|%@~kGI%HGv&SXcJizdHOE4n6Q2?6n8I?cJMob?5Jddh31A zILaB|l7GF<#^){?ZAhqk=m)PO9`Z*c;YenS$*n{})fex7-N^8;H;p5M(Tk(=mp=Ag zn=SE6Cy#AcLe)d}#6Hy$KlHJYFg|yLyWlp*Y!a7$-x%pjsQO$l%=P z9Cg;G_TRK|?eCm9^jZm3|NV%+*lZ=2oHYJ-jkB;(@mqiPqD|t5o-;byOc;&q0eD#z2yZvz+$EJ-VK6lhmSFRw8kbd$hx8AI)&mJ?b zKO|KB@io_t?GOBmu@CCIHJxi$LX~Ceeb6X%ZXT3y9(>C`{L1DC_nC7aJgf)J*WQ(T zl!Pkn^>R2e%#BwPj#qgsaXdG&xZ8hu(&jzC=e-XfT8V@z$N63kOYY2&X9EdUxvq@W zZTY#iOQ^c`!PiAHS3cr3L&^2sv>x`7CsihlG7{ZwNSJSqOPrTnu{`|D&uxwjCm%lU z8c3*ezUp4tmRzg-^N-zsvt7O6xU+}al~83H>o#1`84ctJKtk1<-*LB1uTHwfIKmmL zJ4)n{K|7vtR|t#*tge}^O7sb5B$OZ*qlF}_snk?<_`%~ z&R5-rt43$IJgZ5lde6b{+H8pz-E-Vev@O|#bFY<9WgF||Fy3*!lUFPfs*HoW4Py~| zaPGAds*F*(4cBMZbgo?qRj%8*4dXUjes1j&s*LBl4cn`$m%L(;P-Q#rHXH|yYH}na zp~~^G+i;yZch4of=dM4y4dXUPyF9{4s4|}GHeAaZ_2)=mLX~UWZo^UEmSKy@gsL2u z*fNZkj0U<52~{~3HPUnCl}j$6%DKIJo(l+aMriqWI~npI$`u;kk0+wU)Cq2a}4J%>l4!U zu71z`Wsa~HrF6HER9^3dUZwQj5?VK{y=-HSNGsE9BN1NTTd%ZkIZS68(x&&8(0WRD z8%gE$PU!DkYfpr9x8X1A_gV?l-G;xcKl(_R?l$~o{ZUlHbhqIz>(2%frn?P)S$|fO zFx_qV%lfmkgz0X>U)GN@BusZ3{$elk`WzwM34gJ7d3}zMo+G}JHneWq=sbI+C$0cG zVIOog;VPpOjts6?T*-98@yeYkcfUH}ddXJl`l=JI$t29F6R!JgeXbKb;o8#v=vuTB zu3sh0sS~b|9amgacS4o4>-J7KCb|dUjzuTD&$bNrA39;{b1x&eM7?sqBzt9hwH)r% zbg%41?)&5(rOLgfO!$k0`&!*A>q-yJDHE!)4O_VO^8JudmHUS++&*aE?B$S9m3x$} zUD}@3ZAhrfJ<66SJ=ddD*^awcj-rmi_O48*vTt_6aaVhDBeg0=?QX;Ns=Yk6OQ^D^ zbsM%IPnSDkPqk(EWIPk9d`jL4TZZk* zC;XXE<4f*d8Nib~nNa1u>4edp?KrnY300m>>NcG9jnzF_l?hdzvg(9=!sx{lVwq57 zU+IM7pwYc2-7=xd@v#$*`nIv$N+eWydav6sVsU)TBbl$kzms~=X>z!`Hw&WT&uTmvc*~YpJ;}Tbsc?Bt zXJg+Sy-KL^{`YdYu5sO#S6&jTT<>%nwvxGdP{MgIw<{wHN4Ok?OQ^CP_j1_c?6rBu zkx=D))onPE+4^jinNXGM%F)@o=Ik@r;H?^}a@)0KxN6L^nuIFtb+4R-T|wsBl~AR< zZo?VC6-$o7B~*F;yA2~GS9GqzGNDR)op1zjWUv=xLY4M9VU#-8Yb9*2xewaH=SEQp z+pG3^IV6l;wATrLk+7#_LX{qN!nx1U$1$c8Ml80<+!DQOjzqbxjEe1p_O$Gk<;Y&y z?_5FT)^3kdCEdL;Dzb&!A3I@>k}#)E*xGI3&OV(mKDQ6rgFE5eCt*&Va0YM;&f~7* zx%WAbqP7g%t7CBY%9d#BGu;XMpuNa+C;Y{9w&5>xgeueK)V=bT^$BU)ShwLX>l4zp zv2Md()+eOxUEPMitWQWgN^~3kvOXc5M>v03pODTy%3szeq;o&_m-PwhJo@;{`h>K- ztKV~fnIr5)Dcx-(mDf9=S1G->gw{=KFWZnu z({qG5%@Nrv?^H^68%gE$PPmtm(tAs2eXd=pGHp)XD}PDpy(RP{rMr!!@_HxqeQvx` zW!jv&4OMgFt}4^!)NQDmn?F>UHm7bw)!aO&%CtFk8>;5!b5*9zsoPLB7ni6qZBE^W zs=4?|m1%S8HdM{UiK1t-lXvkDA--lbG92+`B!?^+yKB4{i6c#QPzUM^On?_M2|QzGfe^o;jHFPv%M=5s_b2zNKbXGg-odO$!{lIRogOb z3z<;0#cG@PP&=;Vk-_Kks(cdPy-KGAY?YZ%<;uGg>C}U5Iuoiq8PSP!dLy?)300o( z=r+$4YLsjL;({96Bw050EGoi{F=|q|bbMz{q%Cp1WhCRm~ zW#pU*Rod=E8m}BBGNCGuCF%6I5l6Qnp~_jJ6OQ`M2G&9*ROPy|RomK);kyk9RsN4a zCsH{q(;Q(=bA%B`CRF9PB>k62Ua?51a<=PUrT=!x(W`_i+grEcOm76>sxK3&{9m9> zI085_7{g~mmH*S!31=^7HDljQs4@=jMEY+qcXu+O%DJl(&R))Ht}HX5%Kw$?guT;V z>wZ8cRN3A-;mX7nOJ1c)s4|M`Hte1DT4R( zmC;})T$#9HaaSZ0s_X@wFk&&1ad#&ZsvIjjk?y(sjG0j7>a`P&WR7sgbD2_&>yRv2E*+4>7j!TRHjJ0fU-75)IITp2quELBTyA26dIc9JKa3sp3 zkAx~)X!pvv-Ek$43=*oe-ECNl_EhJUOsLX!C!9a*sX3C7P-R=_Hk?`PkGV%lsM2<~ zVGDQGcUL46sqsQs3HyYEIdwv>q%-08 z;pmh1mTYmh#Jsw*P8>_To4p+NBKu&D`t-_jWUp-1&b#)7 z3HwSXoN;X7w){@mQ|-a706O6>63&U8aP0GLI%;>qao1Mq{qKbB%5-j5_7Bs!f0(a? z>Fkv%bDATh=ZI{>mZ8dYw~+|1cfyvT%JdvzPMxq%s4_iAm{TY0+p0{@5$4nh$17E) z=LmD^ggr`?={drjI$=LoWqOVzSAl^xhJBlG5EqQhB`-`fH!?dM8wwo+Iqr z(%ptC({qGllytYD%JdxJSS#Ias4_iAIA=(A8>&pt5zc+m-G(aDbA)rabhn|(^c-O< zBHeAMGCfDwi=?{^Ri@_%dy#avp~`e7{AG?%W!jv&S4P_sraNIoZ@#8G;i|#aMD9_p zOkA<#e(o;U+}@JwCEJqgt6mO&k#G&y3Dgmjs~u& zJK;K9m2@Xu>$?Y#M>zKrY%$*dZo`)7UPf+-dgXpe_R75%%V9h2UfHAE_sKml33KX%zvxM>D+yKF?l!z161MzIsIuR5!oFr7wB=_)l|8K!_8f`a+9g!k)4C0N zltgZc5~^&+-G;r$u{MvQ5~^|^bflKZQJ;h=N9|q?$94(ZaVAvd9_5o5Te$7G+mKM@ zNYn|(5AUG&CKIai=;N&BEMxELHY8NpyE@?$K1UzxEfcDI^4AHURNA|8kCIU36U=VI z)u^q+kuMXfd=lFUpBy`L+M6?>$|uU5@Cmpr!`_?;RX!Q-girEqSGJx^sPYMaCp?kh zD3M17300m{=r+7sLnNa14q)vE(${5~QA`_}SS=9+of*HNoS2Cf>p4JIZv>Ej~K4wCd zV`V374Yraz8%U_~#9p`INahHaBN+)*o;>U}Jb~%#>^PqZRgM^$(1z(bLT@|a$yH+p z`+O!;Ibw7|>-ugyp9xi-%YuyW+qg50>2YRUPffbL77lx6x9i>>y>>a6RPZKop5Gx z#&J%}geqs$P8dxXWq5Bgp~^ek2_r8fGUvohsB%W_gb|C8jO&C3IB7>9S`G&OsF#Y=!7G(Beio$CR8~S zb;1%_a@RYVP~~c=6Rt*GrP{_ap~@E830I1)AdNUOp(@8EMyW=x-v4exLY1wj6Rxma zdAZ)ngeuoQop4rj9<;?|LRD^8M%#{$#w*>1gerSMC!AUA!MP<$sB*UJHf+1LzC6N7 zsLFNa9OYee%=ao#TvMqGN zm6t0zV$nw zmFYRcoH}7&OXGNHDS!;=J!45q_Z}?l=AA{`dWXJ@+8nNS?I$G|98~Y==*lukFOOQ-oY`w9qsBrZPch%weaO@*LG#}Qt2YDJ^Rcp#za+>)2cuA zUTePEnmMm1(7` z7LNGWqZYa3s&YBZcdo8RVpUh#>t0EW=`UZ7q?)s_6XkF>qS954DSRkxm9BEU;n=f>`(Zg$<#L#>^gOYuQSJ5np^Y*9 z<;#&&b2fIO9PT<+y2^3S?>v0CAC^N^E{FL_&l9T})n30J+8EPcz8pz4XJaSI;ZAd< zYt;Uw<4!#&mt0jYhxw*j=r%@TRioO=g!DYID(xJx6Xlp&t65stHMtz-D?LxF>Pmb4 ze(bc3x%G!$x!TI*Fkk6;qS|h)Ikng8>TAV@&jBq{F8N4QUDfVsU9a?hFFj);*Ol}< zvC21l>m5v2T0HuvQz1m8z~+ z`s8bFH4x@I7gLW!%ozzd~3%edu6_Qn7tZ_mG5UZaqT;$<>C5ka(4yNg zUr(o0x`@X;;gB03R;tQrWv|;XUp>rTjl|0LIj=mIQ|Y4Lc*F@?ltWc6hxzJZ_G%w2X>deG4acN^yGsi#U8al)gYJH+iHu~Oxz&wTYTdo>a( z-?LYq<(gaLj6~g!TE*A(Ns;*c1A-^{g?jg?E7>SjQypyU|((^>ws9pJ74o~*Z#k(U><8H<3 zb-nD}|E2HR)!VN58fE6lawIC>ii&d-ZoYb$y&8#?@7XKYPM)W(bkPqxZ(Mne#7dP{ zUgqn%Ew8*rqHNS2K=#Uf^)P!i5@n;-nb|AbuBX*2UG(S99edPBtW>$}n(tiy7>Tk` z{UdwjdHlJ4J`!c4Mx44{={q0y`U`shFke@!d6ha6)dy>ZUDsFkx()Ny!|c^atbEU2 zxkuuEK~%cvFa7qo@*0ViD(|qE@7%u6NR*A*_sL$FuO4QvMxt!gep24|F<<}3q|!xy z=u=zOm8$HO`C1FPOWf;mb)Q%CBeB|N$U8;;$MRes9EmDN^})JcXPw`A${6)IGWh?_l`i7*M~!El zM`ESQV~P3dVfJbyR=#JiJfUvO&#iqVs;+8>wyu}G{jc6?x7Ks>l`i5vw;E>ydy%TV zlWM+tn7tZ_mG9c?{low0pBr~aqUx%~-MU`(-uR$#2hx$+_W@M8h)29=+-Dexl`4hUtBSAcdfD6WMO!_)OaHCV@1QZ9|HqJHIP=xR?A1uD zeAiz0$~RujjqM{*byZ_~T`zl&{KVL!9M64UMx~2*<`Ls;FcK?Oo(;@b53^SzvGP58 zo4^KFC9Ct@zrOG?o=Ie->N70ce8#M!DuiQ28O>C7e`k4L4J(-bMsq#L9 z?RCz^NUUt+*6y31jQVq=KN8i?YX_>Xm%YzjG?qNQD=P0sjYQd~edD@bHXiavTiMXV zIj>Y@8^-OvW2@5T)x+L2Mz15WQsubad>ys(NIeo|qh^`xm2WL`g_KuCBT@IGcA)Bd z+56JT<2>m8h3`D8bP*r=*bNaYRo?wDUp>rTjl|0L?3HhkbA^;wMI%vlRnPwGdfB`D z`^IwsKF{_Ybd@gRaZer30gS{-m7j*2uO4QvMq=fA_R9ar^~6O!Wib*}S9SKIu9v-Q zf9K3$?d+)+-w9ahA}%>;{J)}+SgGlI(U z?&LFu$kJyXzB9AZ<>3*Z8~-0?Bvz{YMA3ZpFncu;E8nwMzJ=7i#k@N>64kEixqMx( zGJW=#@fp3(vweqYrHgprUyL!_NUT)(X}J07VfJbyR=#Jiya)E++-paoY}AO8@1VQR zzPGm0bvHkK?t_ODLL;$K<$Y@No!h?}i7H3!y=AY=*N7uW86#0PDniP;YDRr?@$N{J zjf%W;4CkAfJ%5)^o{dEHk2=>^*UR2L?>+wKi)$z8d195XYpTBHw02#E<(1b+l#N;s z=KJCK65q33>7uWE#P~mPBe7ED^Cjl%XqQL0ktiEAI%luO`nln?^GK}fD%b9~<5f25 zT_1TjY9z`=5p#QF$-~}C+#}QX?3Hh;pLVE0xa* zdtI5YJ0W@ZVBElKNUT)(36}Xf!{u3RBvx~6_R4*H zS4eqPG!j);wW7;U0sKmcr?>Knt&ymBx6YB(^(xb^Kl2-gc-L56dY)M2n?phbkFfWEk#KY}869du88t_Q^BONR*A5E%V6W{)JD> z@>8;rC>!;JFYkW1mUU*xv%yG|jhdtKO4w(D)^x7jktiG0GV&8e_b=?hxz~=wYAngS zANC2K2;`>#BT+W$2}bTw&V8<4@``07s;+9am1j<$rOn;*kyzdH{3OoxnKMJ44Mw7D z)J&FFcRuHG7ccMJjYQd~UB~>C%vR#uo@eKgC>ymN$nDB}T_@y7eOIX5Pb zMA@i$FweE-tB2XEktiFr|6SKt_Ih2pXEit1jzr~Kb8X)7a(138$4IQok>_*s)x+%7 zNR*A*hs(8Vk8-BYv-3z)Kd(4C_d)ZWi$zDG%2Bas_R4(c>S`obb(JGz^R*Uo$wy)} zCgwY69BovSBbkw?a@5{Jj>6q%m>YLTqHNS0mG>FUR}ZsSBT+VLZBW-&_If{eH8B@o zjYQ>J@l{@b7?I7DVS6Y3B+5qZ!{pjET5{!`SKA{|HtM`!j;}mZGFOg~ zSd}B6NHJeM%wCN|*{E1F*RHd(yTf@$cqGb3JvYenx%)6inK`l?i5g2P-p#u>=BtO< ztC6U3RP2+za&~rwlvhO~Q8wyqWuDK?cP_pfiLz1gRrbpI(ZlT3NR*9=eRA#U)!bTb zB+5pu)p9u`jLvdIHWFo{&aGq{j?_MB%1@U@qHNSzr98Gf!p-dgj6~U}J%BtWIx@`d z?~X*-sQukMmN-Vu?Td~?*{FTdJi^%$$8^!vgZs>xRJrYred30n-EvrRJ)HAOm1XL8a3^exzHi6#LCZ0wS1l%&-1;${iLp#yzJKV+-2E_LXVE-! zj>Kv{*IqBjnD4oJo~1s2PXv%{jKs>u9N|cmM;~pd$~MM)t6fz@Cf!Ru5_Q++2}kX@ zky=&uYRtFFQBk;bFULq!IpzsxxVc$PRrYGkx5`l~FX>*6k*IRa6Gj7b5rC@f)tGOU zqgJWXy&NM^<(Mbt_5ifuPC@o+%(wb^?W9Wga*V`kpJ9%0mm=>>XhT)DG3HzMqjsaD zdpSm;?#Ddg?pNON(uS(+)tGOUqjn&rdpSm;$}vwk`{Y?o8>+Hb&NySbJp4+;iDSN1 zSCwy`)kb3FNhZenDH~fymLpL%)+4sVh9yrP_I5QAt8(PJ8c$Q*a5+X|W#g-R{%S1w z4VPmiR^`ZbHQs|8wlNYb8+Cn^&Ua7`vsXzqM&c;rZBkd07lDnsy%VEB$7P^g*SkMPL7a6h~sEs_QFzeZ2Dj7(5-H zPsEQzNB&zH@srBT+VLA1-@kzIvFw8i}&8_5Ws!|4~)_eCw!hB+5n+bN_?2 zU1!zIR}ZsSBT?n3cSY6pN?-piP{vf-b=KK@^)P!i5-Z>H3GDI2?+u^#8HrVVHFrjM zyZ$H6eDyGUH4;^hdLv9-uk`i*D}FplUj1Y1lQknz_oIlpv*+7&UetW`Fncu;RgSIS z(db%syZ&#&eD$!><>B?;XE_opRb8+2_21|){-;IV^Q})IjYQ>J#N7X8Y}Ywt^VP%b z)ksu1>U~soz0%iz)0F>9Bt1{8@}2)rq`DvVpGfmW+1UDjmppIof3@cSWF3jJvGu!< z+(VqRF%l~qb-mKp-*wh2>3L$6Z$5Ru6YsJxjyB57k>yBKIp+Vj&obpVZ0L!q?3F7o z{{uMx*Y8MFIktX}m-)`E2S=i8)E+?g%6#?kE4d!D?fRdA`M&{2qRLV4!_95ieCPVd zNR*B0ciF4)t-v*2)yR;?l94DIMdbGgJASxg&8yUrsCcK=&e<#T)x+%7NK`rMJ>=Od z_ei$u|BB4l{h7S)GZIyf+V{!-?PR`|=_|SKW4_z8)_Sh8L3TsB`l z%wCN|)lYqCI==~eJP}`YHJ;4vbu|)IS4HGA^v;9Z^}QnV)x+%7NK{?bcP;Z*l*Tt& zS6$U^MBZl@iK?q2@;k7dGq&qptmdnS*{hMLx~i{o*Y!$Y|2x$?@tq%6+uQZdO!Ku& z`RhX?QSarfZ_DO4d5&*At-bKu?s+$Ao#LD;lH9?=m zZP&Ls%y(|w9f>MOjl21aA>$VdYuv5KGCzYHiMr=S{VA=KQ|bO^1X=s{&t_SY}b3X%~ubz zS0hn%b>%}}v&e7%9>082byd5yc_(!ws;-L2-%7D>OV1Nkj*YVp++w_P-*~&eD`URS zaCuf6iPih5>w1-`zGKrP%kc|GbwBC}cz*6Y5_La{$lpYAZ(+N>Gittin7tZ_s-MR_ z;gCgLuXKIawAa=6#gK{_KC|a3a(?bS5*0JlbLaex5$AB}d7|$5M-Mvs;2Z&rU;3+i zUe8bSv(%BOdtOBTHlS-K>3O2=!3n3le2ev<=Q6hI8zbiHXqQL0k*IRi_YLxwPuz{# zu5SaHuPckZniz>H$JXB_AHRfI?P}})=NyS@S4HG+XBzKF&l6RS&p-5tE!NKF>(1>K zyS0D##LeiX@>P|+(#DuxdDusvq{=qNFK5;L*!pcGBT@IGi2SWB;{@q>qDp(jzaF(k z?Bo9Tc76Zcd{a&L`!N!$yH?jLUEf>pglF2f>-)9l>qwMGpOGlv>$^+&tGYf>^lPj6 z3#%hhHjdeMt0$xN&C*&AtiDECZMWX=m!I&CM77-_^4Cu#=E^Y=t8!!;3O2c@v!p_-N0ulB%Zu(Ix&xheokyZ<)b|JT4y5C`9%ipbqGHkd9%P;k zT%Wmm$t#wTsB+Z0Ca>YnGP8TJXE#O9~3BT+W$8Ex)SuA_V^m!HIqMA_Ky zrDtrhj`BXc+md%!Mxt!gK1^;U?&-Q)pLgg-qHOH{#nZOfr?!>M#XciZHY)bX?aDc0 zE^Z%*vQcq+o^i}~u78Zgs(;L_Cfv))yHR?gD)(B)K_iYFWsF4CRjoPedZlZ8?BkV$ zJvjH;k*K<=XOP*3`Od{xBe9CFvRCFiS63sks;eCJIiK6|b88=ovQc{{c|JGaxiN7h z%0`We*(+m1M~VEbXe7!;JuAwQrE!}hYNd;=r*gd|j>JlpqdxQ1!|c^al#PmavsXsQ zK5xm-Qb(d})N|k*Q#+o|m187U<;b&v`RZZzY9z`=t<`ev+N0*4<}c3(rqRU31Kh zyCYFHYL3b)7W37^?A1t=je1^N*H`xX=;JdFpXucDa3fLq)_J)6#KirJxpIuesvLRu z!+iBHdo>beqn_jB+BI65i+4w&Y*f6P<0~WNxpIuesvJ3{HeWr=UX4WAs8}@DuCw!Y z#nkRu8fE6lawKXjsr6vqvov4Jl%tH1sJg1yCwt}Wyj^QG^PP*YMxx45@l{?yT0fR4 zM;RkgHY!5OwX0X|e&rpnktiE=);X6$!sskVWFt{FY9B7!aHMu;D(^;(MA@jPCwXjl zgmZT|?+A}X*{CzAc}#R0$S3Bv!326P9C4uUbsEkyLg4hKb~1wxRFYhWR>+=9zOOR`a>`x>sYq-?-;~Jatb5 zkZp{_%ElbwNR&q(ZK%pN#(b+?RYWG;OFj~HpXUij?YWU!RrYGkx61LxJyE!HFULq! zIVx_SBb?#pW;IpW#+YxF*6k*IRiT5XOn8kma!RAn1uzEzG|rAqg5j6{`V zo|xMM(1tq&*{d<%>gV;OTDq5GBv$(jbA-DTd1pc!snf7F;RqTX8AZ6sA)zhNSI zm~H5LwlV%+d!04d`u~bXqI}<)(Dy|5a*V{vhGpu6`KFrQnpoX~%4ub<6Siv8`TZqH zwG)K4b2;=Rzaz!GROS5=32o&643kimcX1?YTv?6hp7_osSEYxUu(aCFgepDEgfp3R zCRCZugyop4U5Pmxs!V6E^dvvwH7`}xTejgnFr5kQtxwFgD^;emSE_8snNT%X4sF=y zvkg_Ym`rHHKA#CywwO$K2Tjirb9H5D*S9f8=*b*mpO_=oFNa>4&b6yo_TWsYn!D$g zBNMhh+pcY_dzA>UXF`?fIYJNT2>W~{RGH3%QCN)V(kEbSbzclX0G<+{=<)0xmK+gK)4&9y{*&xGTv-By6Z)Idneac(q%)yP zdXC5=gZZj5oo(pJ*5_Wo+&VMAe^;+mX)k-FC;7hzw4urtGiM|JAEY)^&DE|d-?*8* zQkBbLtJXv9bsG|@@;oSE^lCcWFkk1ZOsJZ(VLx}i$~IK#VJECn)A>24DqFbMvkmh# zoe6E^Q(;-mtY zyE(#gn4T*~{$7#gP-TDYHni?DL9fpd`INVLsoMI?cGYe@Mf85m5thUBTsi9hx$CVu zuRHmS^D?2zn(lZ~az;@5`W%t}zt+4|ZT-IhbwBC^ zm1lP62=BS{Tsf?TIU;|#*OII9-gFyUH>UFX9N~YpW@0?Z(?Oal^%A&xYoC7i(08MZ{4F5~RhFsOmH8Tf=JymysM21y;k-0gR}$8h^HsN@??%P> z{ksyXEK|2(zDD8sdn^*FwAXEU zQzwk>jQa97sw7nT{A;kmcMRs@cIOG>cIT3A!+edrjmR^hN_(9!UrTE(WI~npI$^Bt z(*@I+@D9!qs!V4as!V6X8NfAeCRAk`{$k0k>25;ftK5e9Qwqd@e z=Lqf15!+=$PfTa8RAsM>aebm>wA^h-s4_iAm{TTPvE-*R=B3IqWgF6SgeueBhIOLK z^c-PM1F?9>=6{BaU)aohmd3TJ@~)bMsvLzIb7~{UiH-)&GL9>~p(@+(7kjPg zZX*$1?}Yne?yBWptIB+{R}!k$x8c0o%VEB@cGGi&Id#IkZ0)A!2y^O$Ykl+0>vIXm z566{kLzVVAp>_LqCejMR9^7r%JN3%znNVe)?}Ywp!*nJR-3dp7l~!rh%rsM200RCyjY6RJ#SLa*FynIn9Hoe5QQUg?QDI@yLQTTCYO#NE$KsM5ns z=!yG`nNX#Nov>BUwGs*Q^)!CAVJvETj_@RKCRELNrOGoQ*@h}diB4FfrgO}o${ywQ zY{Ps_&k;sZnNX#Nna~qYCuKsFZ7dUd;wX^`RoRAZ)b)qgyA6Ml$g2qnRqn}U8}5tE z5qf1h+fe1X_e`j=KX$@=T?u)8j>xM!^HSwHG28Hd%n_Eubhe?&^WvFMWleX&d|d;2 zeU5NHC=;sO(aVJQV~(&Krn3!Ip8n2+Dr>qE=IdI`>vM!_+)Su)CoB`*kGylIzpCbJ zSaQ?ZD^;HU&V(xOO()FPwXE0Y2=_HIp~_v6Ot`NxM|jVrvkgmbdXDh)cP3PMZ#tp% zxqXI2`0ORyQ023iOt>#TM|jVrvkgmbdXC6v=&dVN-kWYi>qcZ=pCjgW)l|7ho^7}* zKSy}arLzr7ZhDR|F3p50?@cGPZe1B)cfxgsPxyTDmkCv#pUH$O*E^YTm8yrCFkjE; zWJ1;YHe3~F8>%c*CtP!Q*F5Q%301B|GNH;HgiNT)`wT{2Mr59Q?=~bNd>R6}_kNGoea*ok;mQ&SyfEb4e$hw>=&2 zDfUdL%JaE4oH;#*o^7bo!%k@3D8rNTnNVe!I+61A6niFA<>=LUX|Ap$tSjfM?v>V! ziajZx300P<6Xt6a?n(JfsM201%-8jqC*?DtN_(9!UsrUVl+T1J?RCO@T|s(MJ`<|6 z*9r4=ry!qJmr$j>ZX?b5p2p9FD)%)q;T-PVo(WY(9G%d*URev7P-RVb!syPZ&vWRR zQ04QlPB`itc^i>uLX~q#C(PH#+lV|9sMcsM200EV*qg6RPyE6ONXSYI$!-LRH@VkWiIpgXBpb6RlCxxpr0gl*DweD+z1V z^c-PMnNYR9jX6Rarn^_xyZ1cLAO7Mfn)i?;RB5k!<*LzV1$k8@;hf=IGG{{%Goea* zozUO8byOnq^C$^b)?4?=_|sTD@2W|ta!)SXFviV9@+3$4uKQe{<$f-q%6jYNknj#> zB6;F!vfD_WWE&EuGhttIq&D5XlCZUVJrk<34S%s+neH|c;q^|~e$3a^WGDQ^wNths zp-Ow*M(PuJY?n~w{$;n}EId~Z{k5l>?luzP^-iQY!x+93mezDGxvG@THq2K#6V}fh zp$+4?Y{Pt|=ZG8un6E0+b2iK=6Xu%NVs4{I%-G=9{(mre_Dlfk#w@R12O4rwjGoi|KCaM=zzHdGK z(9JL2uIy#Pd`-_0mT!)zQ=#>ZvV%_Cs^qHbL}L-3KkA0Q2)!!p`sJ7-*00?f2g|F6 zopd~x47r3=1Q)rb}Y)qBR_Ha7B*DXO20gO#GWtB_d95vr1Tt7>)Nuh z?@P~^w6Q*6i^*Q8GM$OqRVm-UxaaHgwXapR`=yh&sw-7^l;*t}PoUUvsPTYUNd`jk6Bi zsOO($W8<^~hyEd%AQQVp@8R$Su))RhiB< zRGFS5wB3oC!>fMkTc7pJv(oh?%$nybef{r@YTdTv^=`voQhJWiUMDP}Y3*e~mFZ46 zMwy-?RGH2;R5=o5LRB8GlJC}AwxKG=KFNk<$~IJ)Qzjfy=Ll7%vkg_+>x90i^c;~} zyZNf}dbZ&mG(AVm*-*8V^pQ~I*p+PD=0r%IjZAuk`(^ zYeP@wT1gtu9l?8DNvLuz>4bgTk-`3-2~~MyNTsz#x($DE6m<;Fgeq$x6Sj;T0qB*g zY$J`%j^N!Z302Mvop83a-#MdZLRFq?wV}#d$Tn12)1B}a%i;A*sM200RGIFCo>*5# z9GOsM#F2@))~;8!c0KGiQv8|Q?)rq*tx?n6tDPV$q3P^ZQtbqx?Os>@q9>;32y^O$ zd6}LgRGFT$VOz+ADm~1Eo|v8^zPdK_H}%I}4tMC%E?y_nEaOa+2~~OhVJ)tI2c;e7 zyH`n-i8MMpx^^29sw`6{oGn#JXF`>8a3)eMWWxH%HjE%`mBvKfhJ-3()J_;d8d(~b zW$PbP_x^Vq5~_?JGLdQ_6W+mWWBo{feZtauKTP*>>;z%` z=!xm>RU*8e303Rc$b`R`)?W82sWNfs#n0OH$tPaDeAkm+v$5;o`)=Iz+&7%(A@cJAf-3fnL-0j50(f9b9<)`m{{JCDABcwawFHgAq;fn{n_Pxt*zRM8{ zug?+Eo$!})?)AqPob|?!E+2K=Sqrbv5z?LTms9Td-*!Fx@~fA(e&Lx5ug?+Eo$!|r zUh;z*=U%$c?)`rDu!Yy>2HmM{=8Qo?DaW9x)c6lFY@{vA>9do zu|Il!j*#wzznHJr=LqRe_>1{^eU6asguj@6$*Ygs^}btPy?n*fUpbuQ(7Ndl{mg+I z*Br9X?oU7Vuz|2YU;egVS^Vye{&soo+YdYU7mxnc#X~;(p5-0R{PTmlSB^3-`qv*@ zJbU@R<*|=Hc;mkw@MDYD|NZ-xSMEEWJagCfoxbsoC;!0(xB1jZ zm&g3?GX}4Ye*S?Q@7>sE_km}B|H2mjw}15m8{hJi`|SSHpSsVYdv(V7|GMjO5B<{e zgy%fH5$4p1|NZ>OZG7E3_S=2VHD?@b3;);wKezE0@7izoefRyy!JT;hpPjJlfe*WS z`H|m$S?k+h|1ZD3>+P?-dU@gNUN(4j<}bbI{QvpnPc5&y^J$GRr*7jm-~ajx{{6sz zUY>i|%i0+AA1`?A1^@o&e_lTFd8Z9F9Lc0V{G0#B;@>X4Z26d9e&RqlzCQ6Uj#@nU zzr25W$gYDHm%RF@#k+6!{^eaSJ7^%h&$f&!9`I9(JN?hUU!HyE_wDNCu=V}YBM;m- zaZl@e{&Nr8$SqN??)bu^76;zp{mYB5+{!E4tL6B@&3|t3q3`|s<=Zbm^MdY`z36_= zyu*2SyYpw3ryl=`johPDJ^gV{+4UVaxqA7ucW*_Qm&6^fdD^ZI-23X~XW#RRjqa6o zrHAH}302vKEnIu~en_aw{lodrUTfd%<&aR7dz7tR+Md>JNT|v^%9bcS*P~R~j=NWm zqK?7#u1u)1Z+60QS9^0KwJJyLZo~Gfy*#!{sIsSZ8@5+l__0UsvvKL0uUVdR+vB(B zQK}q?x()Av_up|P6RI4QI$@7;_Q|uFgerSiw_#n`Ywy2tr;Vq5X5ZbPK6;D*BvhSs zoA2Cs)v^2SzRNc}V5nX1nl0mRzxN+5xbik1U%vMJ<7r$8RbM>s?=QIdLqEPe=BhCQ za0GBGh|y6fTR|Htx#lb$}zQ4*@&eBeEIz2z4Fw!HA1adx&PI*Q)oX5YH&uYUOp z%U3>ijIShAz5jc@bJsup%@>yMdctdly0Z1zcF+I$JMa3xU-^aQXWu!_1`?`X`$O;F z^|AeLwELV}j;-Am=iK*_@BOvKyH9)n^6giT^Pq&P`yKy+#pzFY@A4nt{-fvSc4e!4 z@UtGZ@y*|U)7_sw>{UawWV=$8+m%s~cQfBX303#M)7^Ld@Zt;0kNnYi&#fPO?S7wn z?Ba-LeQ1?f#Qv#zikzdd2zsnA6WkTgAN}EXJMn_7asS^i`#tb2bO2wa*U8A zRDJsaKf5^o|NP+c*vA|^*l=EQzIx%gFIpV=(!X2&)!m;p^jZm3H@exA7Kh&AAC|Yh z#}Pwaxq>i4y61b|dBGJIeSG=I7mVu<2~~$b@7)(%^{S6A&;9V&2ld^W&b2F{$};sn zXp}lP4@x)>{@5peV&ey&f0NxmbkXI*2xq?buH2&}RB5l5!;xWbypnLd%43P+xsk=8 zzyIAE_j>VuyZ3w2VM8mCP~|w^%VEi#8S-o(p(@vvvAQikw{{6tmp3*LTx;*h`*NnJ~&obhja4zBw*&UUJ3qjQ{ani%gV&nPGxXJE6TAV(NCC0eUaCugfP-X1f>&kh_7358pFIfEW|MlMGJaMkDxmuEEzRqwpd&n#ZC@xkSlU)b2_Hf&4w;M{8^RN2P54dWeGFL}ix zp~^U@+b|Zf2j^ZZp~@Jg+i-nmP3PK`Q02O<+c0jk<>%Hep~`r!+pxX5ddVvm301b^ zZo_fVs3u1;5~>^@yA9WwbN5`rd+z$P+c0i(w96x$gev2?Zo{>#QGbr~B~-b_?KT|s zZ5g(hOsL9ni7mru$!MV4kWiIlQ6oK9Ub*BFs+`-qSB^4{K6zx2P-PqIHXH#Q8H~s? zp-Ow5a0ala=Gv7|rM+&$h{c}j%#aCH-v3V6bL>%h#*t8^y>7!D4`+S*O(s-nuMF$-$y)E4S*a>@-ggJG>)@}=T_UVMNx_!_d z+zIDC33KX%qqBD{kBQ!ATc0Cpw_&@oEt&3wJ<2{|x)c6lI@|Dm-Pv0TTHj%FY6Q1_LXkKU)Cq2?epD+zpPJ4=kdy4)+eNMkMfuG3F+L={bhYZ zI>&JSvOXbg@9Ov5U*-sVQA&3kN#*rU=v7MZEunSO+RHZPh_o`zHWK0Wz4c1#mcw+m zA#HkZ39YAew~2AYc)*nSBOm`dpvi@u! zVY=J!m-S~g3Dez%zpOtyOPKC9{AK+pL&9{o;VS}+bthCwyKe78DNcz&M<1X3 zWkQut0Xt#Ou}Ap?GZU(On%N0QHCs$xrAnysscg4lPj%+>iE<`X`E0>gC`X-p~_PWopAh^yXO+#b5CD%8;&xLKAs%Ogep&w zbi#Sb`NI=1nNa0vm`->PoB=$^lL=Mcn@$+r*^YBdlu+gAq;A7m-&oy~RhdxbDXUJ{ zCyZV^A(jbM_LWXJ4jSEi(k&CJ93MO3sBas~twchVr}w%IBNoTUJiv@c#_gWK&x9&Z<9EV%$9OJB zWD=^3gSrj-gk{QJNvN`~bQ{in&OUj@kx=EF*llCv+S3J6B%*=TjzB*&jRMSmNxHXB-Jtc`R`cX>PodaJ=%r(t0_J z6WsCeKk71}%J`uZ&KZu{d8C$5*rBx!&nEY)h_j^D0$Bm2IrsFfMU5 znOBe!s&ZW7eKz*Z(W`_i?|(0c>l)W>dF3Uc%JojSVJn%N2PK>bbGtIKaD>ZIxP&U( zaW980&R&~m90^sozc5NB18uP3sp-Ow*D`#O> zkhyjxRB5l;;)nrM*rVrOx$Q3EOM# zgSPOwQB=bAs=Zzg38NS7b;4gH>^GTErH7qx?sN2UjOm0Ci>)%ZMDLm-QLZbaV*8*y zEqi4-vRC#yR}i_i+oM!Tcdv|!Y~l9DPS~R)%&8N$c3Zf!PbZAe?SuBy!6EM9AQp#ME1%%mD1ftQhB`-?q#I(-V$1$YgejFn^X77Us8H+2|Y>aZX>C@ z-U)r58?RKEHm7bw)!ewN%CtFk8>;5!4^^hksoPLBHxH^ZZBE^Ws=4`Gm1%S8HdM{U zC8|uDQ@5dNF1}J_+MK!#RdaEoD%0lFZK$#rdA$>=OwSSaBI#~JmFZ0Q%N(J~v^jOJ z)?Y`hzgAm+J-GgwbNzMg`fF!b)waI8K3{(iVEugtcOdL{c`sxA{gU>grrWTu*#~X; znNVd<>x4Z=BF~%>s_bdqhCNCmM*tG4Y{%V(cKXh300nq=tMfbkz1mK zDo=QH8|f5^EhZDHa=Y?Qc?XT6x(x|cp3&(X~tVL_rGG#)Q=Tke8=D{4jN~rSeaJOO4 zu}2v>XF`>>JCVjKM~O_R%4117J#NI&ZAhqcmgt0|zO#X~kO@_}u58t|c4PQ%Lqe7R zBhZOd4$Cx0nA03##E}VAIW9^6C6ZSx5~`f-x>xDHU2^m)q008wZ8*~#0l4bRgew0R zs1uF=jts`|nNa2bG zp-S7`hArG#-(8VRsM2;PY;i{3#zdJ=mHVJA&QZ-?&}~Sl(%Vj$uOpFkC+rgv=F|zj zlFo$Vhoev4Te8L367%ZLI&m!VZuWB6i|m6r>eDOBk-f52JMY>byH~2D?JJ$I-`T=l zGjzgVB8RZa$6Z^c_rDXiE7Q4M**{F@ z{$ainrn6V7%xR90o+GjiTZSsr-9{q3-U(ZVD${d>Id#H5q000eVNRW}Z>usrN0?J5 z9IsTFo+Heu6ZR-orsoKA>V*AVmFYRcoH}8wrpojjVNRW}uc}x5#w}jSH zy4y%9uV-Se9OfnA^=w0xyA+vFWjYgcUa2yzhuMZI(|b$kNlJGcN#*rU=&yak>zz<# zdXBJfOLrTpOwSRHQPSOpD${d>W36zLMcN?lq&k@ey(%ptC z({qHeh;+B1%JdvzFOu#yRGFS5>_yVuhAPvU@RvD4m1%S8UKwpmnC^rTz4@B%gsTQu z6S+sZGI7O{`?XrK?*(>*6EQjs5du5Mu-zWDd z3HO$yyAAiLB+RK3{-P(jt|U}xyW8-7NZ9f-p~`;K3HzFT(3YPGRra(_*mERuYnM=E zPwO`9Q4+Z&N~p3OcN_L1$J#uKN~p?x(2-gqM|~2i9JPBn9NQ&q$C*%-dz4RNY~i-! zZbL$qBT*+DKfHt9n@p(6qmQ$ivy8o~+mKLY@9Kn4_#Az#w@j$=$zLaYQfcqXJxW5A zPcXX;SEIHPN4`v`@=0tbd~)o}X>ZPiDxWBK!YAOi4104XRQY7Q6F$keUDSWK}0T31;+SU&(|jds-(v(Pq@| z_?QV*j+LFTHP}k>Y#^b^6MNl;Bbg&yj$|ZMdGfH^@C2r_v*UawR5@Z~LK~*%2)*ru zCs&Ob?DLsW<%rP_Qvf-nVC@K3H(kNc^Q!z2W3K)QB)_iu2=SzOsKM_ zb;6m&8OJ#>6RMn1J7F|ol;OR}gevcBCycy|$ea^1p~@Mx6GkjXGOiOcp~_W8C;Sg5 zS7G+YOsKLqcfy&)8OKo~6RPr9lEy3doVpDORsJVhC;ZPjcRY+AGNH=oqZ5wEj?~U2 znNa0S)Co&y$zAVcLY1qfPPiI%m1-NygeqHTCtNAIf;8gDgsL2u7^ND$djGo(301b9 zPPoEy<>h)O6RKSMbi!H9dC(S<301jW8Erd08n1L45~}P4op5Hc2j`Y3p~~5=+pz80 z`nDM1u6f$758V6ea^=F=) zB~)p<+c4U8_2Rse301a*PPp=NMQ7ZV2~~RA30t_ML>?I=ROxNEVT-fR=jc^JRqlhf zILBc7P4`Mdm9{%!zD6(7ov=?xm{TY8N;(scAC5lGsNIGw&X$-X8SBKc#JkyT*o*9g z#@e0GE6b6+vQ@i+us?Pis-*2Jov`28!gI9bFB0~ZZo?VJ7H-S$ggw>%nB#VTk#J7z zHXL6acbyqJ;b`gocbxBpV*AV zmFYRcoI2s?qssIgVNRW}uc}x5#w}jSHy4y%9uV-Se9OfnA^=`v`G1IO; zGoi|KCtR7D)?Ox5neK$vO=~X`s!Vr6>vJ}&chl!w@z_INam+Q#cRlGf8{I}yWy1Xn z(|_}~|8m}o-hJ)zT~8QoBvmH#%69b~Z`pt2*M8t8yYG7Y2W(LeRk3j#1YK};BzaL5U zwQs}rYV>mRzq;k(W8e45<;zbzdy6qqRqh|=tGziwmG=4_)Q0IfLY3)kV<*aC#Cpav ze`E2EM_ji2_eUK*+z(5uDwo52rRNA$+Us?t4byXkD%07QzF{r=@A z?|%Hb*(+7K9OgS$R}$u{z3!ES={Z7`>1<;s%Hhg%anBPMUwF-B%iG@Nh(-2FRW3)% z_iiUHj=sm=EI+;HKF<-VwAa1ThUqy%mFa9_?w;$(`sHvp;^%+o>lQ!$hEFaZb=+CQ z{m_Q0Tn_VpjW=Ll7%vyGi7 zM_PqtuUwzya+vR2T}ha)_PSRRJ7HsP{h?Q`qjEXSS9*?6rM+HPUn@3z4rrNj$t6_% z+tJ^3$Zza_&GHpbf8|E5E9p5xmG-&~pMcKYa|!SHU;pEN8xKAI#=AfB*u#c$n6LC4 zp-Owb96tN?nea1S^RmT*uKmFBnztV|tkon`9rnqWEpBwh2bSM@=AR$bZJ6&|Of6wd zt-Wr;eDyGUC80`t-G)!red2!BvCm%IWAUNov5!A^xPua^e)uKNS{(g%A6j0y@1X-> zzH{qA3D>pS>*X+CJU$^+fKltSGwU?bflw3m9FCTof#f6{v z*X+CJBe!F-gx(){M3CG z-G=#kI_0o^ZoF}i#f^90=j`v_f>5QsZo_=_FncATN_*XgZ1*2rbH)~gD(&@hn6DmYuOw7yuiNk}*W4OM!nNAN4tUNXPyO9%mKVP6WkV}5 zU(b|1=)8v<^6wA5X8Dod--=MBydvQa zQF2we9OkQs*((WE+Uw=;jNsfpgM|AfFFt&~#UDKCQ_Dv_Z!Ed_dRFmvufFl(5AO4+ z<++!Q_gq4i_If$YR}ZsS5~{SZdlf85Cu7vUKb07c0#U+1o>GI4wzi(GBhxr<1=Ezb)mG-&~^VP%bm4qtobsMgo zJWu`8@7r(VgXi6N_leIPS6&jTTvK%$=IgpGue>BwX|LNbUp>rTNvP6Zw_)4$wEDeo z@r=bsZvT(Vi?1Ael!U6>cFlLLe@NIrwAahwdHlJ4E@3}E@y}0Q{MPqey1e-EGcV{i z%-0obUZqN?(q6Y=zIvFwl2E0+Zo@qi{|n+K|Mb8M{`QVnFHb%G6&smQ<=#mr%y(|z zN5Xv=?R6XGYnifF5~{S4cir!h-?-N`oB#RNZCF>@nUHIR zEYI~p3H#tr|MF$K-ua6+-Tj%P$EeSd!T)!@-CeKP_4!ZSboX7qVLa9h=BtO< zD+yKF>viP`bz6RJ?Gmb<{fci}ob`=YEMNQnt#)fYH~)=4^{tCPd+-&@W3C!^Ywbm< z>?^$-=BtOo)w4{<(2i!g2S6_a3zC*Du|7_X#JBJCKglz7Jr((_Vkxn{Rxh z-4~uS?lVZJ%456v>S6XuLY4MthhA;)m$tB2Vu302zbUirq0xv^csvHfRG{>Jl9c*V8L&%SevEFI5%U&f7}^Tb{E z{jL3WpL5G`Hjq%|IN!@*zIvFwl2E0+Zo@Z_%&l=GT;n|W5vMJl{jz^tzWwTPt>&u8 z_m>=bpR*Q+KmM}iWpDq{;W?*-s=SUeUp>rTNvP6ZuPfgOS6XuPgH5I*OhzIzI*34e(>7!t~&qPI^}Vf?K*l-^m^jc$LLi;RgT-u*HJr<)Do(+*YCM+EpvsGS49%44%~I>1@Cyl z7nY|!d7KB`zwn)B`+fQz=fC5L*Djy-*IN;)+}G&kFkd~)UP-9ZUbo>}+>UP-9ZUbo>}NZnh^ zyMq#{zUSC)UcCCkE0&LZ!T5~c=h?o)^iMAOmc`k>bH(!9505dNgesqN_i~u89%ip3 zRB5lCqBRHn8hpa z|MBHxo;{vha(yN}N2qe$*303W{XKt|PtZxIdfUGpcHT4YdZXR9K4tumL;JS$9HGiS z-^<}MLBDUX->3fgf`|Xz|5{#k_i=WXQ0242Zo_=t3CX)35~{S9=lt z;EOlk{iem~!#pUV%4bvEhWR?f8*TXOG4GH zpMBQis)t>+{N6L)HvIpGvAXmep~@J(m&514ekO!x<@4cg z!+c#?x5~^I|b{jqu zw5D_IN~rQ#VYlJ_g*`a;S_xI|Yjhj-37-h$rvMVF>?_@dbDyi1yke11<($}U_$+Pi zo=bSoea6;pxIS}c$g_cjD%Wk@hR?a&#mhT)5~_Uu)os{HoZIv4ETJm5EAw@okRyEw zRod(2FyFcUAz}Z}Ubo@;Y%Xq>Fm89Po`8 z(q6aWntX0;AmQ4;wR*QT(q1oztBJYzO2YUmuRn~)=E@;qIdTkVzIvFwl2E0+UROp-uDtVVTS8TiuRK#S zR}Klw;aQVj4)fK+?3IKn?R6W@&h8H99bpMoc|La^#wasKmJ+JmpXuc=Up>rTNvP6Z zx8dyU3MsFOBvj@3+-E!!=9?p5C$};tm?}QC~H?4==tE9?=p=qI+E>RkmUMn6?(Wjij0*61}%JEcu)b34PCXYl%{ zd`D+%+}Uau<&({qF>)7i#Olq0Q*vsbQV zb2(bR+q8DphG{+Q*~U(kBkkg4 zuiSgf_j`Oejqg!yW(*Oi3nIYO1`Y-1ssw~8|JHr*((WE+Uqv_KL$_7=M(V~s{H?kZo_=%_A(^glhIzc zVZM5py^>I+y>7$*sG5rzB#eFL{s(Kj&Z?QO9%ip3RCzY8*Om3NU1y!mR}ZsS5~@5~ z-OJ&L-?`XF!uV?LjPQ2-Pn`McVfIQwmH&g+>&lblb88$4*J^WT&$sKmsQKz)_DVvP z=Tm!KSwGwLe-q}bhuJF$RsNqwFNgnWF}Kek;eN^7|7L90Ib`$I!|auWD$hOly7GUC zq~{1#{*O_&;XTma9HGj4(`|U(-2ZCL|H&$$%5&)5hI@!}HYBv+9%;9sSJHEYs$7np zc$bB7v{7b`EG1MKU-!B)U(1x=upyyJd)C;tOD|JSdCD%VuqhWWZ~%PTJlRod$| z%vTSyR}!kU*KOE#{m;Ps-+&UTa@#fEx&9$x|Il79hi?U*>*o^o^ZXuR^L53VSE&-J zwAagFzIvFwl2E0+Zo@s2?fSnW^L2kF@32Uy^8c86In38GxucT_Rod%>`EJ+$d6}=Z zkV`J1%Kt0t`&W72$9^}r?<3*9 zkNvUNmG3&AYr7J*UEhJ;Z5U-p&k?F}T;g7jtNXm7mr&&%P%p<$yj$ISuwCCuF<;A+ z-}o+}%5Ssuy7Fy^bNyVxexBc-=vcB{?_4%tJz$eAtB2Vu301zMv)7exJ)N6BB%D9;ds3Zow(FY~=BtO)RaWJ2&o1IPUr_kX{bISU4Ap zN*IggZyXxEZrAs5%vTSyR}!lH9#5|;-^T8qb>4NBP?g``?lYF{de64`>S6XuLY43J z?sestPux|_JE;$aB+-=D_EE1~nH%6SprRNA$&h5P%e(7)SS*nE3 zQuDU~T{}t75vp8M^>TPFW4pdFV!n=cd4!WtBC;W2O+%qo;pLykPZ5by>&k?GO zA9^|5|K6_epPTR8{gCh;_`UUB4$oX|*Y|79*O4fXJ`$?@UT!akPZa&yYW~8igsS`u z@{(5{wRrdK-oL!-Wd|*M+MA#7N~rR?ro9{zbLEh*9NC6nCUsvt?`%t`%HJ}zB}&f` zs&d;k7SY}up~@Jg-w(ea>FM8m;#Wdd{^q17u(#_Qhvut?*((WEep9j6m3xTpK<8a& z303Ybb{lOxzuSq6qwn!I%TM3^_;a&Y5~>{MyA9W8u3qwrMM9P9wr<0F;7&;1{g6=Q zz3DbwbGXBnchw|Rxfba*e0Jk5Mc$c^P~|h7ZsXV^_u07g&DSi?x$W^AbIkRzkK`UXI^mP zpP#(=t?#*XdGVff_ew&QXJ$HKzH@VwgmaYkx{a^@mtWuY_Sas$yzq4|Tlj=OKh>8| z^{@k;bI4PF_nOU|x((NW(sP6=*M{AOahp+1j$|ZM8P9baK98`bbL~o~@;ODfVW03x zY<~JGp~}9}ZMcr|sa$>%C!s2@qrA`Vw&Wca302+LpdC3CTl zgt1RGx)fReQ%&06}sgEh9MlPu6e=jNoFL(w9( z%oT}l10z#QES3`5s!LlIhnrJyf=K0V#j4DR0&|JDVccA@6bMW=sdTKfyRYw^ck;N- z-PfnrCwIT!F2?^(-k;a=T-Q18^W!?_eLnBEbH*%gmoRR3F6rek-&y~VuzzT;+c01E zvhr?}gevWI8;*lU968F6Q04fTZP?I=R2egN8^&#psCg8XP-Q&VZJ4hfX0Iev zX|LNbLiTw}eqth_D#z50=d*H1SPsYeUJmos!|auWD(!U}_Ndu&90{M}3ZJRXz*pHr&6Ml|#aExUbP|n6DmYuOw7yuiG$Mn#H>k#=AMb zGD4n}L&9?8nA&{xFncATN_)MooSly9A!wT(q6ACXXm3@ ztC{aCzLGG$a&6elVf|R99A!wTvfjE4y>j;}?|4b5%H@zSI?EB6gsN=Ak=mW9yc;E< zDv#}saPAK09bpMoc}#RM&V(w{nQ$b^qmQ1b$~Mf`v~>3>sb++u_H3k9m2H@>Y3W{$ zq?!@VaI;xWRkmTirlos1l4?d64a_0{RoRC5nwIY6NU9-mM9-bwTQKboLN7;B%?NiX z^3H@dRAn3HYg)ROBdKPDyI*<7OB<@P4f8cE-OG_wGs5{Q&p6spm2EiVn9eg!Qq71& z_qs}|Y{U97Z7p;gNi`!9eYQ3%`OJodzUR8~KR>4P+xL6<y|M>qLe=b^TaHZF`fR(lvF=qOyq*bF zre}m6&ItQ_CRCZugi%FHEW6bo(acS$3d@mulz;AbS9)tXTp3<&xn}~Rr}k>guj^9UN48L zlCkD$_H<=k=LTjP{Qcdbhcr>&R3aGHM3zqcfQItROw+StWneXIj1UHxYx4{^EI6bZRAs7T30o* zVJq>g8`&#WGaHt}Q6k$=rH7rc{rI%U>odYL;+asDPkC$I)!mG+9Hz5Zs{CJaCREuU zJ7K;)6ZHCw$fvx`OI1FzE#du`5thUBtQ`5vS$d_)n(j8V?$c?n&xrh=AM;X`|G^{S z{g@G!!}P2iz5^r^s;ucwXx;M#UY`-3z|VxLe1=}@o|^RDWE z-gH9io?G$yjPR6yCRF8f`dasd>5TB6OJ}bvx#=0odZC5@bSE z{x5*mJ&ijfyyw!{D@$&AM)+O2OsMkSbVBRKR9>GE{;M?;s`7t$weHE~8R0#b&R$t^ z(=)=jG!v@4H=WSBb!B|r30Ene?9V&&5~}h(oP;XZJJ~DOnR=KBRelj86RKujsd81E zZK$$Lop88x>j`oc=*@pT0&eTk( z(q1O?#BX9{LX{qN!noG=W#ouVLREgdn1m|tP4-Gvesha9R9U8O!+Lie?%OsKLhleDnNa2P zuTD7X&*F9o<96qgZo_T`(=$SQGvcUh=!xmre}mXb;2msNH6bMN~p@a zY7(k)6rMcEaiXJvvy9_PFS&$spL8bd6Q(<1oZyN+#|)}`&Xu3BNT}N1M&2(;bB3ct zFS&&G-0PW8m2LQo>3lzuDigLiTf3{5UJmQs`(Y&82_x3CBl43UZK%qTzUy%BVD7aN zu2Q|5z2p+AwATs8K1XWPneaZFQzlep8~$RiHQj9_!t0%IU(8*#+-p^tZ}v(;)&4e| zcY8U^*Vb-&MwnA4%*)npdPbO2CtT~BZ(g5EIDR;;WE-lq*9ooLw=78JBCjSSRJkXYZMZKsBlOC2wxP=N;+arof9!<$x)SpGjL54y z^HSwHG28Hd%m~Y2I@?g?DfUdLvZgy>zODhiJ|o-@%7iL+^fKZ7m=Tu4bhe?&Q|y^g zWleX&d|j(~eMY#(&4emM$lAF$6sqz$iCRBNEI$^%9WxYNl+}Fs2 zDtARP;l9R<@SaO&8@|Ou!o}bBtD%U%iaFwcunJ{0^=ww3G{x)0{XB(<4Qzu+=c-K7Xm0!5_b=Ogzd(VU_%ajRKdYB1S)x$mf_?b|py-uWj9p^Kl%DJQy&fA`+_Y`|3ROR_x8_t}bL(eu;>0u|dZj|BK`b?;@ zOr1#idhR_Fs&e$|yfmvT3G2%Fs(Yn%qhin2XF`=_>V)|kg?myy6RNb=3G;P*=1KWX zsM201%-0p2XX`VeN_(9!UssTxl+T1J?RCO@-6_bY)g@GEuiHqozNhgsp~`)YOgM)- zw`W3?5l1Jqu2hm0WCRF+Ss}qj;M&3r`nNa0i(h2i5@-`yRgevWI z!h9{QwU7x_+UtbYRk_~DgsNOu=Iav-pJsI%5~{S92}^Dp%Y-UD?1ZDGqgviul2Da* zKO|J;*&un6$3$z?bgo@hJ|!{T>q^2JH9aHDDHE#pw=pBMVY+)|y?f8|{NXQ-qInNl zLY4NqSFRd;R*+Xk63!XUB{Lg(mxBN!)=`Pb&!Z$%S#RAd<4vs^v0Xxy`zzn*hB166EUoEWa#bmvZJ4igCaj+sp$+4?Y{Pt|XGD$w%vY7^nGJKwg!yK|5yzR# z>)nRGn06%Ugm=w!_R5)F8@cT|B3lmA-K#`+y%Xl8S6=UgC7j(4Ri@3U+wlBV+K26g z-##<#m(wz#%5*0D^1JpjVZNqk#QrvZ``ORD zT-DEi(_gye*MH=}d;Z`zet3rsReqbk-w*2~rDud+YdzZ0KkGl< z^YAZS`tIj_$M>DQ?Pb4p&wu%)uYLCuKJk*1m;cj`-1FSaE;`w5NT|B@eOH`(;TQb& zJ&k5}M97k}4C9QKn~vD$~6jDPKpT zOsLA^RkC4?WE-lCI5J^rP0t9u&4eTBj8J7d+fb#wPFTW}o)NjVo3ARbXB*x@(=%db zL)HE^j)Ty{UUIFQp3MfTq_Yj#B?&vJF+n51p{}*(dVoBcaN%E88$y zGS!nn=oEJtJ#s*LBl4aY&-mFXE_PMJ`( zzl}`z%l_-y{R!<^re5--%7nj|Hm7bQsb++9ZtY3s^~cgHeSdsy=*g^=r19Jlyw{b4 zD(8|;*tZ=S?Ejfil}CnDT5F`+@E1o>$KXt;vKBI7%g7OcUa879(&+36-o27g<;>6t zXG{B?GioMO<+)ZHs;q@3A z%!Hnpo)M3)4gF31v6sUgy0nYei8RYN6JF-ZiTJMMHUXJ4+tRFow-MvbL*E6ANe;b+b z7t`A7UL{o~KKggR^2B8ioO|yDH{N;hb3b|QVfv$2U4G#8Zo^+BOlLyc^w|vPknV)Pyx_f; z9@==@%kMhr^%)`E34giy#+M)3IPuKOPI`StNO!_t&j0f7K2i7lrPtnak=JL0bSM19 zUgY%|A>9dou|Il!Mo4$UU(DC*GeWu({$jpfpApiX@E6k$T>8AjHulghw=X9-v~K#s zyI*!lyyLbL3t@l0;DMh$97{g*^f%u9_FGP;Z+`f^ySrD8GQanR-#8o@&cE}*gMahI zA2>|E>yq_+iDTc7{^sd^e(q=9d~nVi&pY(${ZF}V@#-J^@@apsd)aeO+QPr|`@iLo z_~e(ar(VuE|H{K(-g)_VHNu>FIbQMf?>y{9-}d6yUStdZD}U?s_20elMHhGC?SJv~ zT>CvY-P-#0t3T)TxN^;nx1Q|8(+;8s z(=WYkvEfK2{T2WGe;wYBTQB+cg>Za5@5euQsJh{tgOks??{xYlKX$MX-e+6Jtylcw zA^og3eejZA4qM+hzw7kfyyET?2e~Ec)sKDXv?mY0dzV+XSIhC#r{8<%)kW98^*!Ay zd(k(4{j&~h`cpr2+d=M8s_y-=)BWzlpV&p1m&8xJ^E7?s@2{=hy3#{)>gAA7m2KF< zrStueP?h_K^PRoczS+wmp(^(%Tf4M9t=o`Lm3x#eQF_*+RN0QZSB|2N!S=39sIqT% z!f{u7vyobrqjtApd(~bZ+a*-l)4C1Yt1bL@UUc|Nc4b!D&pwadQc#2rul+d#IQ4*>??@gB;64$(8 zotTbBrbT}olD7WeYV}_U3!|h^5bjCB~-og_pUy) z@yg5B)^3Y)?z`-wUpT0H{x@E?&Vv%FzW%(QIk@W-@&0RWS)x8$iLLUNf9|_a6!EHS zZ(7a>OQ_22%BaY@neU*4s;_?Q>DqnmE$cnEe(bduz4t?hb#=p&*4RfvmG##9pmCHl zzz05d+Q!58tu`c7UGXArPoTR`l-v`ci2kqyK((@jkB;(@h^PieTT%Czh;e)B~<;nfBk_&;`}#X zxOnBf$?7s zQ1#OfogUk-e&5;$_1&7zwJV{@GW9-alscOSC7cI;?mvI$;RtvC&%SV351OyNEB7b~ zRod(2aAcT`R}zj_c`R`}H?sJWFZi~@dw$|Mmo2SCLY3ouFNY;}X2`RFgsNOu#_G2G z+}b5nJ^aGck<5c%_m-vP`fgeed&!e36Gj<{?lvUMH^(K;ORiY1zT*!MM}}K3TXzj4 zR5@RDuWU=M)&BeQzv{4Ez3uwDmfDq2WgF`@T+tZ~geqg-URTabt|0%@zx{WI^T+qU=E=+aA)(6o zs@rhY=nR)g^_exDYga;*>$YygxXqTITf2lRq*p#&g|e>*bJe^wC}?{6)fklL=LN*a`QL9DN*PI^inLcAQ(Hcg=An*Ok$oebAnk zy|NtHEBl=@XKwBG4^`6LE2Dc`xc#vc_9zK+>V&P`7VhlR31fBppgp(~&V3T*)Cost z?^+%cz0bBjN7Qb^c4b>K-3fb?eZq7n{Ka&(;V&~nm1%S8Uir)ZgtRTD+whnD329qQ zx8X1Q6VmpTZo^;pC#3E3-G;yHPe|wS%3t;;q;rq*m;DLp+|T`Ge?mIPaQ?DCA#LyK z_uOA*guN)GyN#ssdMETMrO%eox@qlY8#5xUOtXzdc>Qd>(z@j^ooz^)K3hWTDcx-( zmDf9=zq8h!29dov3GfWMo7nHL~N1YwAv@l6KwR3CBeD0NkG>Y<=!!QK=L5C}*EMt4XM`cXb=qkE4%I{xYG;r+}TX=h&ls zf|&_bKF#ceqna%yuTmvc`Bb*su%|k6`b0Sss(iZK345w7!zbgJP~}tdPS`SRS3cp- zgesr*cft|Ck-?J+nNa1ag-$qr%|d{!-&Q4F^_N(syv0*ZP>S++dV;<303y_PMEK0 z=}f3H-3j})F@q;sGoi{p-w7k{Sve&1-BY^VhEawsCbtp^Rh~BPHeAISEqPKp6RJEl z-3d!>r00q6OsL9r<@lk!8KKH?rF&&8YTWJ#{7k6wG=3+HcZ}z9L?)riIH=pOPgthx zm4qt$O1I(M=j@Yb90^s*rBx!&nEY)h_j^D0$Bm2IrsFfMU5nOBe!s&ZW7eKz*Z z(W`_i?|(0c>l)W>dF3Uc%JojSVJn%bsNqA zu2^yuE}_c%-)$HnxuSCwmI+nb>x3hKBZIvl6RNb=38U0mua&U9=00c(pN*mtwpZ=- za!44xXs;9gB4JOgeueK)V=bT{RwH?ShwLX`xDZ(v2Md( z_9vw6UEPMi>`zELN^~3kvOgi6M>v1kpODTy%3t;;q;o&_m;DLpJo@;{{)Du>tKV~f znGyD)lz&Z|*?6VOv^jMf zs%GP^D%0lFZK#^fAF527Q@5dNHV>*YZBE^Ws@Z(5%CtFk8>(h;i7M0P)NQDm#aF6K zn^U);Y8EG|GHp)XhAMlJ*E^xg^o+0E(pe;WWs_bcl7uSv{kjcDYKa{6NvLu+vfFTMm#`gYLY4io6Y1%j z?Kl&v9Em!S#zF5*CRDkr+6iYhcbe^8nNVf#>O^{~Yb|6#l}~;<;i}q}VOz+AsvWCs z-b3xUl1B!g%d7H9eD^Ay7O+)jLX|7;PNY*0w&_f$@?=CO(&>%d5+zi5!lT<3=3ahJ-3-iB34`I~!OFnNXGM%2sV_H-_&vBvknyflj1ySf&|a zPBX%YBNM7}T$27Jl20>gE4$2 zRQaE#PB?oxs~P)dLX~lFC(^&c+}+89D(9|FID0v(xw6cJD*r3j345o#*8PA?sIt9v z!j*|Dmb^-pP-PU=ZP+{QwZr2s^hWx52U0?n zE97p&c4f=Rvw?)F9G4gY7;D+yx>pjaax7{IU4h886;F`yW6l9?WxWynNX$ePB?$qQ*$IEp~|+oA9IhAP^Il|!xrwW@2*HD zRB5{twm2hiW1>u`%6-rl=cr~c=r$x&>1`*>*O5rN6ZQ!SbLxa%NoT_G!_g=2E!pC1 ziFtKroj8_wH+wnkMfSlQ_34%6$X?m1op>s9c|1e(()7dLk<}@Ru zXGFGP%TQ&y+en1hJ7LREWqL-KQzz^bs!Y!abLxbBTb1b`|&r z&j@qsg#BEV=^0^8oiJ8YWqL-KQzz_es!Y!abLxbBEv3(v(0WRD8%gE$Ow7t*UJ_o< zHdMJwkqK3%Gcof@m1#Z9HdL8DTS8A#y4y%9uXjR!?Gs+_geucB!oDrtZKyImBOIfo zyA4&QXM|&|bhn|(^o(%MknT2AnVu2OebU{AD$_Hh`E8>&pt2z!xq zx1q}PjIb9;cN?lqXTo1*geueK)V(s=mN4B3BYN{S-3eC>t|oGia%JL*CHHf8xn_Gy zu9s{}uCIDI{6)ewTqj)j*_K=CzBRd+nrtXC6a8=TsaINni zKpx@TPq4*!|GN!aqI(&+CF+&?CD|+YUMz?0xO-)fa^ENSC<*tLq`M9GsU*y)6aJzn zxvnHsX}jC-en{BzGoi|U(+T^UebAPl303yAPS|rKa%-1RWl!ri>`@ZAB}%BW9d{e{ zBFEZ1ib|-;ebA9wB1e4^svNa@IUL(1Y{!{Um3x#=Vr=2I<8DJjl_OCn96!8+-kVIQ z%A=37nzM|(tJ{!JW$)^QPxu^tthY?4^2uK(d{Sxe$~{U#l}|9c4OgSK5=XvFsPai{ zCwy}3%xQ1VgespXcfu#&whVi7CRF)kyc0gjw_VwKGNH;R{GISbf}=zp86;GBQlZ;O z_uO$M6RJFM(Fsq8ICkaHM?#e+N4gD9x;TG0Uu8m-Cty0^i5+JE?@cCDd7nCAi?byf z4Q4`>Cz3kh2`XcFV~I?t@?=#fJPBs>VqeLGDtlTdJke&<@A#MrRgRUNur=69@@ycX z$`gCth9j9HT#jTURC)5S+wcUYv$NxTCR90MWI`LJXN2B%!jr4U4EFg)VJek`GTZ65{h$9oKJYn1k|FvbT<*F|esyr#(2~Tz#=~)YzP?hV-UnCq?x(x|c zj!K>Iq`h&wQD!Doc>=!^MqWl_#zC1-Wfav3t?QM2B@?RbX`OIpamH~@%!Ddu)J_;p z7-e{GGNH;l+X*8tBQod2OsH~3?Sv7Fk&NqvOsH~|(FyR9Wp~`=vb;5tnx#MB{kO@^rADwVScBFPL$%HCrqE1*sOYV9n6RKP- zb;8xCt5n-qCREu%JK;*v6{HbICRF9P#3(301kSoTI#Jj``gy z301l6I(xZlw7qp35~{S_32V{yXP%uURB5~0FxqzY;=GaxRknprxbkvEXWW$uReIYA zTezb{9vLK5>20@Ri?h$?=v6{h?t`{C$6$Lw_ew&QwmV_IMlaHxuun*sQz!IFIuni` zjy}$)-G(jBmY5?M>%_6dyV-5ni|m8O+MUoV%aOgZRl9<)KXx0cr0px6u;1CjbF}0y z684pD!x_gGZp-h4J=Ol0<92_Ma8B$t9A6!Gof$geXzBfTobQC=uI<D&_S zQKoZ`GG7VP*(+7%G$W*EM7CjDQf0c^NQBorVOvsVdPbO2C+tP4OwR~&>V%_#D$_H< zoI2qMr^@t5lFI9un3co4B)r~jxG!ef^=BqjneK!uQ`6eZgeudW(7I{uWkQwdPH25*!+KxS zci;8IdoQ^0&Vz0vsp|S86YgKE>8JerC*AwkU$@#ws=EHjgkIUMDqUWE^s38ultWc6 zhxux6PHgp~z1_8Y*#qYu-h*r-d6Egsv8Ernu97O3Ln3+DOTH5Sf7I3L`%&DFKPfi6 zgKPRI+SQ-hs8OwI;gM_Cc4hQZ=^`Gy>y8~`qN>Vi>yN$Hny>ce#Fnr2vJLIciLJCV z;yB7-#9Ha{@V+-)y4(*-t16ene5L2aR#)2V_d^?N`jN|#R5KgLQ4Uurm445u`|<4O z-*$H{xvE?a^G&tTZLGvrquR@a^qkmAJ0p&x9Ii|&UA1uK$F4Y;ORg%H!+d9TwGvxh zX|H=Fv8Ern97#2^aUA7vH=@#2jt8%L%W^*~hpJo-^Oc?xTa9Y3-w$o9=|?U{Qq61} zM>*Vqs&tj(Z7;uTxgVB8RW675O3#U{Mzz=Phc?#qBbOtoW;Twa9PT<+y2^3lnU^j1 z!*Zy~4$E){UFzs^qko8&0hHgbau~IV!P*cz0&Wv?Zi?J z^Oc?xTfVs^`s~+d!j-Nb{K2QcaapUa#HOn2mA?7m^A^HfL-*i@C%X0O{YUp>rT zt;FX0%q!33RJ!PQUjAJ>%AqQk!+iBHd$kf1%Ghb!jE$ z>zT4j7x6teJsPp8@(R*?^)P$25}WTcuRKjx>7s8w_qH7+SCz|QzIvFwT8XW$wAb6N zX9Q>a3@cGKYA3C(SNhX0T}y7ho>i=L5m*1>de2v4Q`Pm&UN49F>S6Y3B{tu)SDwI> zo)cR+DyK@{ddasht;CXRZ%%Ca=DPCisb^9vUGxp-94ua~#HOn2m43;Ot%Q4sGaD`B1R-$aw-do=HvER-1eO97u)SgxDwf?ho z)^=B-Y*fFi>y^I#1=k()er}W@Jtww&b6nzHkE{EpWNdYHXhiOu)yl_%6~`MI^PMAcR8(AM>` z_c;&j+O756e5H%{_4C%*z+R*(@1&Zq9%iprV)I>ly?^+R{@J*@5>;0psIuY^prAo39>buU2C7J$vOF7L0@P?7R|HR~28?^|JSWZ@PUM zuZ+mjzZLo&T#3rJ{`rt&IP=xR?A1zazUTi<_{NLb*uD}~S2ecR^|E)>$JZX^c<%c$ zDqX}YFJEVamDp5yHZWg3%wDa;=6m+aH;~NMI4eYp=I<-w5Mwecqv8iJEKcxj|j8lE3=eo0g{l>#TOi zQ$P1`?#naIN>n*&ww%p_dYHX(9#oaRa&Ovq?^L=xe9bNExVsXYD(`HYuOn(6MOUJ1 z)C`cla@W8&u~oY08=kc8$*jbt%KHqq*O`r#*lgt1?wg;C`g5ee64lRZ2db`@y@&5x zOP<~pm3O07qHNT@aa}JPFL~Q88+thNN>#RD-0nNJDqUV(@%A-(U5QPV<973P)XpRI zN|cS7WwKYkwagV#UKOoG-H+OVs_SL%f!D9|p!*lT^Q_WE{Pz8iMr^9Q`(eI%n7vww z&G+n;Z;^9_lvhP7QFT?%{_A?#`{eoSIRKw$`wqHF7jfMy*K+_Xv8nRYaP!r}?A1za zzGtueN3JI>@+pgzsJg1NA9cO#{qG;WV~IsQ_2N4LD_z8WH?IFHT8T}S&&imt9%ipr zV)H$FZ+a()%CLXtk*vwe&MUFiRj%E2$E$2yaB9aZ??$ae*_iKYe)gt*k!u3!IgXy2Be6I;G{ zWbm1w-#4gq(LeOWb#`8fP35z~URUPpPDtMUSc$SxJ2%-YpF#O8h)UNC_s2i+s%6J( zB{o%lf@QwWaCuf+iEXaUUb&C&3MsFOR-)>vR&@C(fL{sm^j1ExwGtKY);Y4eUS;}$ z*F1TNca7Dh=fsw8j`V#F?6*=XUA6G83)X*Hti-0u|AH`IR~C6Su@YsYRzle;`?j-B zo^e*9Y}9O-M+WyVd}5ZLlC4D9s3&}R_rtZUGee#YR-$aw9F@7%3K*{EH|{FKaA;@qBR=ancMwI0ar%6wfX zJu`PL(qmC)oY_3M z5@n<2!8}JfbI!)Zl_(oE59YbneDyGUwGw5c_P^`;X0O+kdsef#b|os`nrripm$UP% z94oPvBhTmNtB2XEl_(pv50`7#9_37(XXllueqM2O?t|t#i$zzW%2Bas_R4%`b+r;( zUF8Vbe659C@|D=e#C!*hqm62EB(oA#j@nzuQMmgIvvGGN%0|smd7r_2^)P$25@n;- z26cV2*ZaAviCKKL5|wYoS9$$mL^dnON^IrGF`W78VfJbz%0}(Obzi%uRK#SE5}M~<;W*e%vTSyS1VCADi+PP>+J0AaNZGKiLz184f1^MK8#Ujjx1NA z#*&J6^Dd70>S6Y3C8``1`(&@2on0a2Rnbb6jXGPI=X3L&#aAm)HY&c#URghSn7vww zvQe>5u3f#Ft<_edY}8sUmqWtnEJtK3Q8wz_O19xh?USbbbZI5ZMx9m4W4j~VY!6^1 z%0}%0{a}@qEy7tm&=A5=<~ zp3Lrt`8tc{nR6w!`CNOw9BaOJoqCq~s#6g_wy_eMjTzxclt&+JsLD3he5+kmL?+!! zz7loU=7gj6Y@}9|y;}3Fa=h(S6fWJ%u@Y5|irZ&|Gu&)eQ>XhT)DvF2O%qjsaDdpTC3?#G;P_bcysX+u@^YR&hsf1KKZlCDwjhdd6;eJd$zIW`{?&$CARylz3$aY{HcvxSKjkAeH88LPi^d; z)oi=Y)OmJZiMngMpL3e8bZ#XpvGu|1mBgCfJnX$Tsb)5gqZ~$nv#3v1E{FN1TIhAP z5?hUGFB8&pqHH|=F}1$CvY4$VROOPJulDA|R#)2V_d^?NdRv9piw zy67|iE0a_+8^=+Ow2PNZ?%rE2hxw*j=r&ejt5NM`LV8Y=jmLk_Qs2|=a4xxfy1C@$ ztGzj~)s^N!+d9TwGvxhX|LC=#G0*`O6 z4Ns(4rd;xssJg2C-F$|{e5L0^+1Pz<$+Kg#d%hCeJ)fUEt39$hc{V4?#_qFfp2qc* ze?Hm264lRl|L4biXEF6kY-@w;mHFynK2^LDWn=eQXV05^!Z@EQUWvLNyZ?7*zO(h< zN|cS-1IS*PuO3#q=rjMLxDuPHu5b4Gc;){XJRP4;#IHon7vwwDo4F5s;*c1%(p-p zQytY=XYxth-Kku^=TYNP;BYafva$PJNbVudY^=m)qpnx_%w1=_lAaS=zWLPs zalFgIINB&PN0uv5<(U7s&obpVZ0L!q?3F7o{{fu;^}7;Pj@|F^GT+&Ha3#t{?a5@X z%vTQ|%k`jb*MA1)e*>;Wm80H=o7=AW&icnnl#S|l*{k)fz%^dg$dJd9l_(oUwa!|c^cR5|KB6tNRH}%Mds`NOy2idi7H3!`{aK+nXhGf zEcboP_o)8oWxm!zF8NASUDf}*>UyQmeDkpXwUeF`TfX^C2-cPM=0w?;|F>^u!%U!C$F}Uw#xUQLvyDL%o?ta&#>j77jc?G!=WuyMXn^zOYpGM@fC|p&JULC28OLLsK z5><|h6Z6>aF3xQKY9-3X?)NR(?`HcxD^WIfznjW;ozL3tN|cT2AM-b**F0EnN}m&D zWB0q&-Rp66pI7uNv90^_PSJ6^TittbRNqQ5U(1x=_`VW#PP@MDSJx|j=J)Q_w;|R& zzxmXg5bVKygjbuU4Y!r@l0u-vqs$h_AZZ{eOd%sJg1S zB%h&o9z3e=6`8LdX0KLaJO7`*qO`uzy6WocQ~$!w`wS~lbyfQp`5oBK8AtUlR`b=v z?A1zCUDa2)>w2Zn{7&_8eCNm2_EEhv(|j#c{`$~L)O$JW+p_shp6gprYcKqvQ}0I2 z^T$eT^GAM9sx!_}ebd5x^)P$25>;2Pc=2m5%3s=8-xgYZup*iK>~1Bh4;GQ%FKV=O zRNw70Up>rTtwi;^-QUjiN!(F=o5Or(?y65jd^|rVC400vvo>wfI zzj0{vdQ{)XF<(8*Uadsc)$VVZu5V+ny4wBRU?r-q>bXIFf4k3Ej_N(z=BtOOV5ca$N6_&xMRF>-}tD$D`URSaCuf+ ziS7N=b-l_|-?8aY`1*yTx*zofJU@3{iMk&}t`Zv(n^lAaTF55DK7TX(DnJ(qD*-xx7pN4q@2twfchzHgAfeBy4@QGFZG zd|g@O)x=6vId*@WeEkw;wX5C#YFvqGS4HG+XBzKF&xtC>N3Xhk$J*I^-MQVdTlVE8g8_7!4{U{=TYs)x6dQMbnul(2*J7ORA zzmMws=jNMgy5EnL*zQ_guXKHHy%U~kKdSH7ny({K9(`7#e6Q~=<*(}cMA5IU<}a+S zMA^9EoLx^w>zk$3qqeV+R@<#N{N*RSD^YE?i2U_aiCH;TVk<|sv3{Af%27}C^Aq=# zsB#pMzh!Dml%5k+jw|jyagf`tv55BOMA@i5kt3P)3zAh=yZ>3d5>;149<@}hf)?m*{V=ancM_5H!T1L=6KhuN!@s93bV2bpIB*JrL? z@``08svNbh$*Vi>fjc32_hTi>Mtv_e-$Bh!${`(7o2`xSAB5zv%8h3K3GIuFME|!_sTI!dQNQl<`K@3+DNw2 zMc0?KyH_i*sq)zF*_fw3{ocd*>Z0r4`kqP`eetPux3LnNDxa(|-`O0s5@n<2+U(V< zKj+fJdw$K0w;n#puX}#YsjsrU!C$oO;P!14_?{E#JI?G;TAh$&t)T z)Ohtx*WPkbj;VbfVNK`SU5V|U=cgI=37^E~r>`qfHtHE|?oqCzd@7fp#H~cxc<7ef zcdVnl&+fM59hQ|S8?_IUTZwzR?$%ej=yN~w=4JF*iA|Mvgl#3W*k>imM#Vn4T{&mW z;`Ws&8x^YELH5=jJ;b6IbG} z9H+*_?3J;hqeLDVR-$awv!WbX8n-#3R=Vgj--fsnn<__r=BtOta?~@g{B+5DXLYp_TU}+Z%-34TC0~hcOw4!CJ!;>wytmX`aI|}51;Ae^KdIs`PO;3{KUlli&;5VVk<}9{V-oW z%wDZT*{J6@xps|~X7TPyl#Pmab9`llJS)daY~{!?wfX8{_G%@{M#ZAJcAcG%DyDYN z(kL@WmMc+XNv#L-o~8L(rW|FgMAcQrKG`d0=c8JyneQyVT8S!0tvT}w()zJXIm%dx zvQZIIu3f!y_bcystwhX# zc}I99%0`_@&10e?gL^=E7iT5PMx6u5V~JywyQ+C7btTG1o&CrooGo!p7hOHL&zwn> z+wR&Y>iJi-_S`>KqCDA6=vAU~IrQZ5Er-5arkPi&EK@J}aoAXW-%b(eVfSh!w$_&k z%dw`n7SnAcRb78{B6*l?=zF$dzRsd~=3I$wKG$CNYR&g+PW8c;o{9jnjg{DJ%m_!K zJo;!uRkpF_TkWbMGU;COm8knXCmgkBBekmR)tYaWqoQ!>UXGQha?A;5xY?|xDtoo& zTji*gmvk@3N>n-Kgwen(0#KE`TJx=P)GAfFmt!TW9CKo}2cQji3bI#gzSYm`Nwst@ z$4YGb3^T%Aio7$S4OQ93ns42Y+KrO#4OQ8zHQ&SjacT!rx|d@m z4*SQLNHbiv;k=Z+a>iNH<>6xyC$9NcT~)q$R$Gb9lT57jQ#N)-mMc*<_9KqMh9yrP z_Ith(TRC!F`JbOPT~EgAZGYWHQq}cGCj5WYnl7T=TG(wQRb78{B6*l?=zF%Y{;$2x z8tndG(Mpu>^}nM0Pb7U$bT7wBY&I-YC(Jk1^loCi2e}-MIHvRaOOon12yOS0`-`6B zcce(D%KIe}+Q{!Okx-R)aU>iKJn@}Nu1XIxVQICU2~~QS31>3tOsF!Q3Cl67U5S|u zRi?97dXk^;nwKi;E!*%On9hXu_9tfTN|ovCl`7kDCREMJp$+?dwxP-vlL>9u=QE+o z7Ly6@py?Sgt1C;pzl|B8Co{r6F(dXbhhCY^wX0Y5;7q8R-E+&430t3S*EZI@N`%)l zq001((8C#FpU;FU)0r>|%h8f0R5hzzZJ1N`N|osuF)O+Gntm*8c%S#TF(WMPj5xdd zVVQDW>6PhB=#_0O6RKt{QQtG+`06<5_3o9wNSMxqwCPNkujv^vv!QB#8=3GI)7tCh zP?gf1FfY^6nNVeVM&y&^dZNl1F56ILPMy%-l+J|zIFrtVD(M-KM+Wm%Wjfo?lilZD zx7|AP&F|mUD^=RdUg=5x_kcE3*%}l7u<*-%jq4v5B2~~L> zlrVZVoo$$}^HnBP&1~4uov*SDReIP7Yt(dp&Z){4?)7ZLd`)LU8~Ie2)>X}H*h=!Z z&$OXxX2WtgO5~EO(!);Jetg>F^%;>*lAD*R-KV^36s^8LSGeNJoX$1v&Ots?LI?aZMRM& zc(&4elf5!u=}cI1(=#G}>(`R2^4@eCTKC+F*JnijFMxTe+I>#{aHKwUHpX+PGs1f= zJu8Q`FeCDpdo8&t?@hO%b#6S~H<)_kVcne$>f4&o|Eq@40mL%95L&5yqvNQ02Yp zgx0MqCUb)WH!%V2k-_6h~RWq+txhl?Hsj^I+aLwUe z%kNK=P~}=A+fd~WLMBwX6Vizkh2^i^NT|wRij^>q&hN#MFyH)URS8wv%O%$nzloIz zReIP7<67UUks~q*Rrw1?5~{p6*(+7~%`MtcWtqAS>)mx!e$TdqD(_~tp~`!c302Mfgkn7vYEEp$TPoh_Y3Goi{db;9V*s4st`NKa&4GxsLD_Kw2{);hWVPF5!#y(M`c4#OlPlD zWv`5JeWGNv+-*pxGCd>ADHE<(@>3b}Qe~O44e1%7%5=A3ov1QBBg|iIQL0s!aiZT6UGUy=yS}V%I9498HAMd14(47f;VRX;+3QL|mG(N}*yl)XIuqV!bIOFOY{OsdwWhm`M0mXu?u)srmV2!# z^UYpKsM_C#^KLJP`P$k|&j@qsgn8N8P0t8(>V#{3^UdpX3C9n|m25+m_Bx?;`*tSM z3c?=TZP+{Y%Ild>WuNba{%XT?CKBBVM}w5^gw`#G*E^AB9ItmGd6Ef#Np!a%VOsjA z2<>$nT2JXrn6K#>p}kC~+TX^EI1U?nk|Sh2QDx+u>q?b5bwW>4dPcarlL=MY%Y-V= z!)8L2=}hRAyDc-qC)k-#HSJ#m!CgsN=AHtPDr>)nRGNaWRogev#svJLmeW`tgu&Nfte?mZK#?2nx= zUspn2pAmU=XI`pYCuSSoj~QV(OlKRaJTIOJRn~MT%-1!b*Jp(LL77nHj$S6bA2Y&o zn9ep-dHOpOs;ucwn6GO!ug?hAxS3GpPFNwqQ01;jCfwJU5#Dp@Y{Qb9o)Mn@&V(xOO((QI+h<6G&t9?(RX%&kg!|$% z!h0^AZCG;CGa{d%x2{xqZ@LYw8R~3#*E2eqP_@4eSH;4fvPr{g`vo(WZXKG%jbr{~bK4OM#B z39TDtcv3zSsw`6{Qof#I&xEQRy*e+=>Po`8a=z+bY2B#Ulk%BRWtlo*zDD7ml+T1J z?RCO@U7vYUJ`<|6*9r4=MdwNROsLXcC(PFsq$lMwp-Ow5Fkg2H@@aJmRod$|(yZ@k z{7k5FUn3LF;m+-uP-Vo?39ajuwU7x_)^sO~?u`08hn@*lKL6^3qrQ>15qTz5IhS<8 ze2u(~$TOizdz~;}OKUA;LY4M9p>*bK}4rU^G;%c(nNS2 zD~JBtQ%!dpiST+S(wt!o-w8`=I+t8kN@pA9E1e1JXGUnlcrM#8U+Ec!-chqaJx)LvHA)rUWE+d=Km zmAwz&zt)vDROw;1VSBY5XF^rBQLF9xX6=Wb{>HoOsr6l_e1HEnx7=NO%TKFI@VEgsOVRS{{D?Yo5Hk zrP~@3`s2f!BLE{Kd5NjL0p~d{vpwHdL9O5!&uV&EZu)=brl3XFc<*bbULs z=J`rLc*b`|wQgJTdbi;(DLo^!*9l8#T6>vLWx5lNQKn~vD%079Do3JBsLJD2^4)sN zHdGm}WWsWoo)LPR2}jf!p~`f&p-Ow5u!Jc+BXVmuUsYbuHoSwTXT;2gs{L&o2cd_( z);SI$`UxPvp@@LX~4zwqdkntd$8>dYB1I zYb|6#RkmToVkBc6)NM$pGA8PTahuUuj>sfb8P9baj)S%<(=)=HGNEdJ8=3Hz{nxeo z6WX&(z2r%i34bwdPTfXQ%?Rn-+LOxbkEK`o{`lI^lUXZCqE{$e@2o(Waj%Y-V^ozN5O%7`Nqs*E@?F>CF5Woy^NZX?B?x$W*x zXx$n$-Mu;v!V;R!UM1CW5Zdl_UXF}EfHZtKarnT3-N~%u$ EKP^P9ssI20 literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/front_sonar.stl b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/front_sonar.stl new file mode 100755 index 0000000000000000000000000000000000000000..82b9ce0d98d523138c7391851e7ebe82ecca0b37 GIT binary patch literal 12084 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 d3D$r}>x5J5QEM{%by0Yk{vXJk3UdGe literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/left_hubcap.stl b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/left_hubcap.stl new file mode 100755 index 0000000000000000000000000000000000000000..01bd2f93f2d579c977a534930c04280626b268ce GIT binary patch literal 7284 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 literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/right_wheel.stl b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/right_wheel.stl new file mode 100755 index 0000000000000000000000000000000000000000..c518c0eb5da524069efdd0f7a6e1942c79563e22 GIT binary patch literal 28884 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 literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/swivel.stl b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/swivel.stl new file mode 100755 index 0000000000000000000000000000000000000000..03797a26a294cd6ba05601c79293de2a4f4499bd GIT binary patch literal 10284 zcma)>Yiv|i7ltvGC@Lc2E#PJB4-Lj9*GP zbbCkLoTm14XZxHA`Ok{^O%J9!+B#dB((}hjtNh>2A@+YCRD2hVsLh7?o=<{TZ|bV7 zdFJu!H2$V`cvZ#gQ=)%QrO2>_M5g|Ns$lFB5p9XGEBA$ye_s`~keF~!K1}vt3yIdJ zyTjopM{7OULgKeuhK93;9ZmQSwvc#MW?|QovR<79>%kThO{YE;+?VJ<6=&K{WDEHS zTn?^zeM%IwCp#+5hf^^JeuDX!BsoxecTxVW2UQ(~91KEGb)=AkK?tf=7IIKE@TjP2 zEaYI2xuS|Q?Vl^oC}&#Z8kx7tChsX)CB=kO>Ax=-y70O~N9ZTGy8_vdx68VUe+NfJ6-Q`2xX(3S{c&fs`bhf;syISRaJ6%V z>q?v`_eXrSlb}lDeZd{0H-t3{mshTtbU65}BOPw~b4BG#5`Qjnb#1=rydptWxAZhg zdWsY5_r$lSR84#F?#)Af=&ICs#(B#&4^B80{p@#)7~Y+|aCU$A<3%IGS3YU4d~f`| z@OaPH@9+Aw5XU`8P_^=`?rgdA6erm4(#CngT|4vP`~TEcZj-o1;(-aO=x4u!{c@)L zvrB?1`dN>2zV8oCuO1VP_cV#iCDxp0_P-T0HFrg8!B0^2ju3N%h=2K(JAMf+K5cQ7 zTaCZ?W@eOg`dJSWRB^PHI9xR=+kLbzaz9W#E88Wp=70T!Vd2~58^brRUmp4is#=BE zE=2r0dSv}P_T`SKWu2@mjdfko&w7xcileo}!ErN#-iB=C@utK(B-V9BKR-bgy)D5^ zF@yB;6I5}umZ+<`JbX02C7O5cF8_`qK~;tH^pf-x&j&Nb43_`Y99EsNFh5bT2SUWXq=ZY;PK3(@& zIHNxkN_|!2L4vBKR}Am16Jo`TD~brVkhuEbiEwXUCVc+g-2)I*)l9vh_ka+m&RA4L zu!Tg=^0Rvv^kl*#Beo7eP$hL&L~PB!Rz&nj%NrxNhT5Wp#@es?mF>zUd>j@_ z;X6oBrPYTLd*$}A9&90@6+q+8e1ZoFsV5T8b5|7WeYHknT?>AKDy<({q^Ee!S!K|#G=eHtHFi{b(}zd!CM&=F1&Xzw|4Opi1ip?J2&l^rqj_kc~X(R~kW;)(?M3 zPw{odJkzfSN*Qtl?#?iWue4X634%T1Xb#%JtdFI^{eyt!kS!gTq+Cw z^3@W@^TCl&ML+u;>{s)DY+5d8mC8ahxL@M%nzJztRbJKJo;&9$c^VE1huX zJnt3j!Bx%G?!R$JP^JH#e5-MHk}jQa{c2Ciw;E3w`jt+&ezm9MTaBkB{YocXzuHss zt;T&$ztRcUFHZ@ZbLN@V3oAfBK^60F3I096zo}R)`w6Q2H5~ipUt9hvoCH<$v!mkt z@Gm4*vVMXp&YLCJFaIiHCF>`sqMs$$FLUFcT@qB$&wA(??p{(fcCSNvGw7`rf5jm| z6>m}Np=Y>zNzvH7a?#IEP(^P`=o#+bOEh+`b@cNSRB^PH&@9qH#MsN!fX z!Iu=h0o-dg{rm(~9IYkv40mrx8oT#aJsFbU+euKRr;>XqwjO$hySFfn-Fqwj`~+3> zwuGMH?oCf)_ufiBKS32oYY9EW-P@$b?!A?Meu65F))IQ^ySGq{T{THRKS32oYYAqG z8PpTb{odjysM6Eb{X%C6J)_)jkb3&K-=OrQcE3&e399tWcfVj-f-NL?Gx!Orc>7p_ xU&t@lliK}m$2 literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/top.stl b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/meshes/p3dx/top.stl new file mode 100755 index 0000000000000000000000000000000000000000..302ed5f4b6c10a849e2374bb2820a6fd85fef780 GIT binary patch literal 30684 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 E4=m-BU;qFB literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/camera/camera.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/camera/camera.xacro new file mode 100755 index 0000000..b736e81 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/camera/camera.xacro @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30.0 + + 1.3962634 + + 800 + 800 + R8G8B8 + + + 0.02 + 300 + + + gaussian + + 0.0 + 0.007 + + + + + true + 0.0 + ${name} + image_raw + camera_info + ${name} + 0.07 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/laser/hokuyo.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/laser/hokuyo.xacro new file mode 100755 index 0000000..61e4964 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/laser/hokuyo.xacro @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 0 0 0 0 0 + + + + + 1 + 2.0944 + -2.0944 + 683 + + + + 0.08 + 5 + 0.01 + + + + + + ${name}/scan + ${name} + + + + 1 + 30 + true + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/laser/hokuyo_gpu.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/laser/hokuyo_gpu.xacro new file mode 100755 index 0000000..520ec08 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/laser/hokuyo_gpu.xacro @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 0 0 0 0 0 + 1 + 30 + true + + + + + 1 + 2.0944 + -2.0944 + + + 683 + + + + 0.10 + 140.0 + 0.01 + + + gaussian + + 0.0 + 0.01 + + + + + ${name}/scan + ${name} + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/materials.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/materials.xacro new file mode 100755 index 0000000..311c3cd --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/materials.xacro @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/battery_block.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/battery_block.xacro new file mode 100755 index 0000000..c14674e --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/battery_block.xacro @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/inertia_tensors.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/inertia_tensors.xacro new file mode 100755 index 0000000..d33f1ca --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/inertia_tensors.xacro @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx.xacro new file mode 100755 index 0000000..50be732 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx.xacro @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_body.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_body.xacro new file mode 100755 index 0000000..c2a3a16 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_body.xacro @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_chassis.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_chassis.xacro new file mode 100755 index 0000000..4daddb6 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_chassis.xacro @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_plugins.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_plugins.xacro new file mode 100755 index 0000000..08efb04 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_plugins.xacro @@ -0,0 +1,39 @@ + + + + + + + + chassis_swivel_joint, swivel_wheel_joint, left_hub_joint, right_hub_joint + 10.0 + true + + + + + + + + Debug + + false + true + true + left_hub_joint + right_hub_joint + 0.3 + 0.18 + 20 + 1.8 + cmd_vel + odom + odom + world + base_link + 10.0 + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_sonar.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_sonar.xacro new file mode 100755 index 0000000..5bdf7a8 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_sonar.xacro @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_swivel.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_swivel.xacro new file mode 100755 index 0000000..1cba807 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_swivel.xacro @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_wheel.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_wheel.xacro new file mode 100755 index 0000000..9c0f87e --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/multi_robot_scenario/xacro/p3dx/pioneer3dx_wheel.xacro @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_3_double_pendulums.launch b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_3_double_pendulums.launch new file mode 100755 index 0000000..479629b --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_3_double_pendulums.launch @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_3_single_pendulums.launch b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_3_single_pendulums.launch new file mode 100755 index 0000000..8f43f58 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_3_single_pendulums.launch @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_double_pendulum.launch b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_double_pendulum.launch new file mode 100755 index 0000000..37ac18b --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_double_pendulum.launch @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_link_pose.py b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_link_pose.py new file mode 100755 index 0000000..ced3717 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_link_pose.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python +# Software License Agreement (BSD License) +# +# Copyright (c) 2008, Willow Garage, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of the Willow Garage nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +## Gazebo test utility +## check a link's pose against some reference pose +## good for unit testing proper behavior + +PKG = 'gazebo_plugins' +NAME = 'test_link_pose' + +import math +import roslib +roslib.load_manifest(PKG) + +import sys, unittest +import os, os.path, threading, time +import rospy, rostest +from nav_msgs.msg import * +from geometry_msgs.msg import Pose +from geometry_msgs.msg import Twist +from tf import transformations + +class LinkPoseTest(unittest.TestCase): + def __init__(self, *args): + super(LinkPoseTest, self).__init__(*args) + self.success = False + + self.link_error_total = 0 + self.link_error_rms = 0 + self.link_sample_count = 0 + self.valid_sample_count = 0 + self.link_error_max = 0 + + self.min_link_samples_topic = "~min_link_samples" + self.min_link_samples = 1000 + + self.min_valid_samples_topic = "~min_valid_samples" + self.min_valid_samples = 0 + + self.tolerance_topic = "~error_tolerance" + self.tolerance = 0.01 + + self.max_error_topic = "~max_error" + self.max_error = 0.02 + + # in seconds + self.test_duration_topic = "~test_duration" + self.test_duration = 10.0 + + # test start time in seconds + self.test_start_time_topic = "~test_start_time" + self.test_start_time = 0.0 + + self.link_pose_topic_name = "~link_pose_topic_name" + self.link_pose_topic = "/model_1/link_2/pose" + + self.valid_pose_topic_name = "~valid_pose_topic_name" + self.valid_pose_topic = "/p3d_valid" + + self.link_pose = Pose() + self.valid_pose = Pose() + + def printLinkPose(self, p3d): + print "P3D pose translan: " + "x: " + str(p3d.pose.pose.position.x) + print " " + "y: " + str(p3d.pose.pose.position.y) + print " " + "z: " + str(p3d.pose.pose.position.z) + print "P3D pose rotation: " + "x: " + str(p3d.pose.pose.orientation.x) + print " " + "y: " + str(p3d.pose.pose.orientation.y) + print " " + "z: " + str(p3d.pose.pose.orientation.z) + print " " + "w: " + str(p3d.pose.pose.orientation.w) + print "P3D rate translan: " + "x: " + str(p3d.twist.twist.linear.x) + print " " + "y: " + str(p3d.twist.twist.linear.y) + print " " + "z: " + str(p3d.twist.twist.linear.z) + print "P3D rate rotation: " + "x: " + str(p3d.twist.twist.angular.x) + print " " + "y: " + str(p3d.twist.twist.angular.y) + print " " + "z: " + str(p3d.twist.twist.angular.z) + + + def linkP3dInput(self, p3d): + #self.printLinkPose(p3d) + self.link_pose = p3d.pose.pose + + # start logging after we get minimum valid pose specified + # todo: synchronize the two input streams somehow + if self.valid_sample_count >= self.min_valid_samples: + self.link_sample_count += 1 + tmpx = self.link_pose.position.x - self.valid_pose.position.x + tmpy = self.link_pose.position.y - self.valid_pose.position.y + tmpz = self.link_pose.position.z - self.valid_pose.position.z + error = math.sqrt(tmpx*tmpx+tmpy*tmpy+tmpz*tmpz) + self.link_error_total += error + self.link_error_rms = self.link_error_total / self.link_sample_count + if error > self.link_error_max: + self.link_error_max = math.sqrt(tmpx*tmpx+tmpy*tmpy+tmpz*tmpz) + + def validP3dInput(self, p3d): + self.valid_pose = p3d.pose.pose + self.valid_sample_count += 1 + + def checkPose(self): + # difference in pose + print "error: " + str(self.link_sample_count) \ + + " error:" + str(self.link_error_total) \ + + " avg err:" + str(self.link_error_rms) \ + + " max err:" + str(self.link_error_max) \ + + " count: " + str(self.link_sample_count) + if self.link_sample_count >= self.min_link_samples: + if self.link_error_rms < self.tolerance: + if self.link_error_max < self.max_error: + self.success = True + + + def test_link_pose(self): + print "LNK\n" + rospy.init_node(NAME, anonymous=True) + self.link_pose_topic = rospy.get_param(self.link_pose_topic_name,self.link_pose_topic); + self.valid_pose_topic = rospy.get_param(self.valid_pose_topic_name,self.valid_pose_topic); + self.min_link_samples = rospy.get_param(self.min_link_samples_topic,self.min_link_samples); + self.min_valid_samples = rospy.get_param(self.min_valid_samples_topic,self.min_valid_samples); + self.tolerance = rospy.get_param(self.tolerance_topic,self.tolerance); + self.max_error = rospy.get_param(self.max_error_topic,self.max_error); + self.test_duration = rospy.get_param(self.test_duration_topic,self.test_duration); + self.test_start_time = rospy.get_param(self.test_start_time_topic,self.test_start_time); + + while not rospy.is_shutdown() and time.time() < self.test_start_time: + rospy.stdinfo("Waiting for test to start at time [%s]"% self.test_start_time) + time.sleep(0.1) + + print "subscribe" + rospy.Subscriber(self.link_pose_topic, Odometry, self.linkP3dInput) + rospy.Subscriber(self.valid_pose_topic, Odometry, self.validP3dInput) + + start_t = time.time() + timeout_t = start_t + self.test_duration + while not rospy.is_shutdown() and not self.success and time.time() < timeout_t: + self.checkPose() + time.sleep(0.1) + self.assert_(self.success) + +if __name__ == '__main__': + print "Waiting for test to start at time " + rostest.run(PKG, sys.argv[0], LinkPoseTest, sys.argv) #, text_mode=True) + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_single_pendulum.launch b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_single_pendulum.launch new file mode 100755 index 0000000..20d205e --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/test_single_pendulum.launch @@ -0,0 +1,6 @@ + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/3_double_pendulums.world b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/3_double_pendulums.world new file mode 100755 index 0000000..f0c83b0 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/3_double_pendulums.world @@ -0,0 +1,459 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.2 + 0.0 + 1000.0 + 0.0 + 0.0 + + + + + + + + + + + + + + + + + 0.2 + 0.0 + 1000.0 + 0.0 + 0.0 + + + + + + + + + true + 1000.0 + link_1 + /model_1/link_1/pose + world + 0 0 -2.1 + 0 0 0.0 + + + true + 1000.0 + link_2 + /model_1/link_2/pose + link_1 + 0 0 1.0 + 0 0 0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.2 + 0.0 + 1000.0 + 0.0 + 0.0 + + + + + + + + + + + + + + + + + 0.2 + 0.0 + 1000.0 + 0.0 + 0.0 + + + + + + + + + true + 1000.0 + link_1 + /model_2/link_1/pose + world + 0 -1.5 -2.1 + 0 0 0.0 + + + true + 1000.0 + link_2 + /model_2/link_2/pose + link_1 + 0 0 1.0 + 0 0 0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.2 + 0.0 + 1000.0 + 0.0 + 0.0 + + + + + + + + + + + + + + + + + 0.2 + 0.0 + 1000.0 + 0.0 + 0.0 + + + + + + + + + true + 1000.0 + link_1 + /model_3/link_1/pose + world + 0 2 -2.1 + 0 0 0.0 + + + true + 1000.0 + link_2 + /model_3/link_2/pose + link_1 + 0 0 1.0 + 0 0 0.0 + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/3_single_pendulums.world b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/3_single_pendulums.world new file mode 100755 index 0000000..86e8a72 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/3_single_pendulums.world @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.2 + 0.0 + 1000.0 + 0.0 + 0.0 + + + + + + + + + true + 1000.0 + link_1 + /model_1/link_1/pose + world + 0 0 -2.1 + 0 0 0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.2 + 0.0 + 1000.0 + 0.0 + 0.0 + + + + + + + + + true + 1000.0 + link_1 + /model_2/link_1/pose + world + 0 -1.5 -2.1 + 0 0 0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.2 + 0.0 + 1000.0 + 0.0 + 0.0 + + + + + + + + + true + 1000.0 + link_1 + /model_3/link_1/pose + world + 0 2.0 -2.1 + 0 0 0.0 + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/double_pendulum.world b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/double_pendulum.world new file mode 100755 index 0000000..03b1abd --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/double_pendulum.world @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.2 + 0.0 + 1000.0 + 0.0 + 0.0 + + + + + + + + + + + + + + + + + 0.2 + 0.0 + 1000.0 + 0.0 + 0.0 + + + + + + + + + true + 1000.0 + link_1 + /model_1/link_1/pose + world + 0 0 -2.1 + 0 0 0.0 + + + true + 1000.0 + link_2 + /model_1/link_2/pose + link_1 + 0 0 1.0 + 0 0 0.0 + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/single_pendulum.world b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/single_pendulum.world new file mode 100755 index 0000000..e05754d --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/p3d_test/worlds/single_pendulum.world @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 250 + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.2 + 0.0 + 1000.0 + 0.0 + 0.0 + + + + + + + + + true + 1000.0 + link_1 + /model_1/link_1/pose + world + 0 0 -2.1 + 0 0 0.0 + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/pub_joint_trajectory_test.cpp b/gazebo_ros_pkgs/gazebo_plugins/test/pub_joint_trajectory_test.cpp new file mode 100755 index 0000000..3c8b0e3 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/pub_joint_trajectory_test.cpp @@ -0,0 +1,80 @@ +#include +#include +#include +#include +#include + +int main(int argc, char** argv) +{ + + ros::init(argc, argv, "pub_joint_trajectory_test"); + ros::NodeHandle rosnode; + ros::Publisher pub_ = rosnode.advertise("set_joint_trajectory",100); + ros::ServiceClient srv_ = rosnode.serviceClient("set_joint_trajectory"); + + trajectory_msgs::JointTrajectory jt; + + jt.header.stamp = ros::Time::now(); + jt.header.frame_id = "pr2::torso_lift_link"; + + jt.joint_names.push_back("r_shoulder_pan_joint"); + jt.joint_names.push_back("r_shoulder_lift_joint"); + jt.joint_names.push_back("r_upper_arm_roll_joint"); + jt.joint_names.push_back("r_elbow_flex_joint"); + jt.joint_names.push_back("r_forearm_roll_joint"); + jt.joint_names.push_back("r_wrist_flex_joint"); + jt.joint_names.push_back("l_shoulder_pan_joint"); + jt.joint_names.push_back("l_shoulder_lift_joint"); + jt.joint_names.push_back("l_upper_arm_roll_joint"); + jt.joint_names.push_back("l_elbow_flex_joint"); + jt.joint_names.push_back("l_forearm_roll_joint"); + jt.joint_names.push_back("l_wrist_flex_joint"); + + int n = 500; + double dt = 0.1; + double rps = 0.05; + jt.points.resize(n); + for (int i = 0; i < n; i++) + { + double theta = rps*2.0*M_PI*i*dt; + double x1 = -0.5*sin(2*theta); + double x2 = 0.5*sin(1*theta); + jt.points[i].positions.push_back(x1); + jt.points[i].positions.push_back(x2); + jt.points[i].positions.push_back(3.14); + jt.points[i].positions.push_back(-10.0); + jt.points[i].positions.push_back(-0.2); + jt.points[i].positions.push_back(-0.2); + jt.points[i].positions.push_back(x1); + jt.points[i].positions.push_back(x2); + jt.points[i].positions.push_back(3.14); + jt.points[i].positions.push_back(10.0); + jt.points[i].positions.push_back(-0.2); + jt.points[i].positions.push_back(-0.2); + // set duration + jt.points[i].time_from_start = ros::Duration(dt); + ROS_INFO_NAMED("joint_trajectory_test", "test: angles[%d][%f, %f]",n,x1,x2); + } + + // pub_.publish(jt); // use publisher + + gazebo_msgs::SetJointTrajectory sjt; + sjt.request.joint_trajectory = jt; + sjt.request.disable_physics_updates = false; + + ignition::math::Quaterniond r(0, 0, M_PI); + geometry_msgs::Pose p; + p.position.x = 0; + p.position.y = 0; + p.position.z = 0; + p.orientation.x = r.X(); + p.orientation.y = r.Y(); + p.orientation.z = r.Z(); + p.orientation.w = r.W(); + sjt.request.model_pose = p; + sjt.request.set_model_pose = true; + + srv_.call(sjt); // use service + + return 0; +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/range/range_plugin.test b/gazebo_ros_pkgs/gazebo_plugins/test/range/range_plugin.test new file mode 100755 index 0000000..3e1ee96 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/range/range_plugin.test @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/set_model_state_test/set_model_state_test.cpp b/gazebo_ros_pkgs/gazebo_plugins/test/set_model_state_test/set_model_state_test.cpp new file mode 100755 index 0000000..754d799 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/set_model_state_test/set_model_state_test.cpp @@ -0,0 +1,110 @@ +#include +#include +#include + +#include +#include + +#include + +double curX_; +double curY_; +double curHeading_; +bool vehicleSpawned_; + +void modelStatesCallback(const gazebo_msgs::ModelStatesConstPtr &msg) +{ + // Find the robot's state, update pose variables + size_t modelCount = msg->name.size(); + tf::Quaternion quat; + double dummy; + + for(size_t modelInd = 0; modelInd < modelCount; ++modelInd) + { + if(msg->name[modelInd] == "pioneer2dx") + { + vehicleSpawned_ = true; + + tf::quaternionMsgToTF(msg->pose[modelInd].orientation, quat); + tf::Matrix3x3 mat(quat); + mat.getRPY(dummy, dummy, curHeading_); + curX_ = msg->pose[modelInd].position.x; + curY_ = msg->pose[modelInd].position.y; + + break; + } + } +} + +TEST (ModelStateTest, FrameTest) +{ + vehicleSpawned_ = false; + curHeading_ = 0; + + ros::NodeHandle nh; + ros::Publisher modelStatePub = nh.advertise("/gazebo/set_model_state", 5); + ros::Subscriber modelStatesSub = nh.subscribe("/gazebo/model_states", 1, &modelStatesCallback); + + gazebo_msgs::ModelState state; + + // Issue commands in the chassis frame + state.model_name = "pioneer2dx"; + state.pose.orientation.w = 1.0; + state.reference_frame = "pioneer2dx::chassis"; + + // Wait for model to spawn + while(!vehicleSpawned_) + { + ros::spinOnce(); + ros::Duration(0.1).sleep(); + } + + // First, turn the robot so it's going about 45 degrees + state.pose.orientation.z = 0.04018; + do + { + modelStatePub.publish(state); + ros::Duration(0.2).sleep(); + ros::spinOnce(); + } while(::fabs(curHeading_ - M_PI/4) > 0.05); + + state.pose.orientation.z = 0; + state.pose.position.x = 0.1; + + // Now, stop the robot and drive forwards about 5 meters + do + { + modelStatePub.publish(state); + ros::Duration(0.2).sleep(); + ros::spinOnce(); + } while(::sqrt(curX_*curX_ + curY_*curY_) < 5.0); + + // The X and Y values should be approximately the same, + // and should be roughly sqrt(25/2) + EXPECT_LT(::fabs(curX_ - 3.535533906), 0.2); + EXPECT_LT(::fabs(curY_ - 3.535533906), 0.2); + + state.pose.position.x = 0; + state.reference_frame = "world"; + + // Now, send the robot to (0, 0) in the world frame + do + { + modelStatePub.publish(state); + ros::Duration(0.2).sleep(); + ros::spinOnce(); + } while(::sqrt(curX_*curX_ + curY_*curY_) > 0.1); + + EXPECT_LT(::fabs(curX_), 0.01); + EXPECT_LT(::fabs(curY_), 0.01); +} + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + + ros::init(argc, argv, "set_model_state-test"); + ros::Time::init(); + + return RUN_ALL_TESTS(); +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/set_model_state_test/set_model_state_test.test b/gazebo_ros_pkgs/gazebo_plugins/test/set_model_state_test/set_model_state_test.test new file mode 100755 index 0000000..1ced8a2 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/set_model_state_test/set_model_state_test.test @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/set_model_state_test/set_model_state_test_p2dx.world b/gazebo_ros_pkgs/gazebo_plugins/test/set_model_state_test/set_model_state_test_p2dx.world new file mode 100755 index 0000000..80f9df0 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/set_model_state_test/set_model_state_test_p2dx.world @@ -0,0 +1,356 @@ + + + + 1 + 0 0 10 0 -0 0 + 0.8 0.8 0.8 1 + 0.2 0.2 0.2 1 + + 1000 + 0.9 + 0.01 + 0.001 + + -0.5 0.1 -0.9 + + + 1 + + + + + 0 0 1 + 100 100 + + + + + + 100 + 50 + + + + + + + + 10 + + + 0 + + + 0 0 1 + 100 100 + + + + + + + + 0 + 0 + + 0 + 0 + 1 + + + + 0.001 + 1 + 1000 + 0 0 -9.8 + + + 0.4 0.4 0.4 1 + 0.7 0.7 0.7 1 + 1 + + + EARTH_WGS84 + 0 + 0 + 0 + 0 + + + + 0 0 0.16 0 -0 0 + + 5.67 + + 0.07 + 0.08 + 0.1 + 0 + 0 + 0 + + + + + + 0.445 0.277 0.17 + + + 10 + + + + + + + + + + + + -0.2 0 -0.12 0 -0 0 + + + 0.04 + + + + + + 0 + 0 + 1 + 1 + + + + + + + + 10 + + + 0 0 0.04 0 -0 0 + + + model://pioneer2dx/meshes/chassis.dae + + + + + -0.2 0 -0.12 0 -0 0 + + + 0.04 + + + + + + + + 0 + 0 + + 0 + 0 + 1 + + + 0.1 -0.17 0.11 0 1.5707 1.5707 + + 1.5 + + 0.0051 + 0.0051 + 0.009 + 0 + 0 + 0 + + + + + + 0.11 + 0.05 + + + + + + 100000 + 100000 + 0 + 0 + + + + + + + + 10 + + + + + 0.11 + 0.05 + + + + + + + + 0 + 0 + + 0 + 0 + 1 + + + 0.1 0.17 0.11 0 1.5707 1.5707 + + 1.5 + + 0.0051 + 0.0051 + 0.009 + 0 + 0 + 0 + + + + + + 0.11 + 0.05 + + + + + + 100000 + 100000 + 0 + 0 + + + + + + + + 10 + + + + + 0.11 + 0.05 + + + + + + + + 0 + 0 + + 0 + 0 + 1 + + + 0 0 -0.03 0 -0 0 + left_wheel + chassis + + 0 1 0 + + -1e+16 + 1e+16 + + + + + 0 0 0.03 0 -0 0 + right_wheel + chassis + + 0 1 0 + + -1e+16 + 1e+16 + + + + + left_wheel_hinge + right_wheel_hinge + 5 + + 0 0 0 0 -0 0 + 0 + + + 350 317000000 + 101 310248604 + 1411160586 171302518 + + 0 0 0 0 -0 0 + + 0 0 0 0 -0 0 + 0 0 0 0 -0 0 + 0 0 0 0 -0 0 + 0 0 0 0 -0 0 + + + + 0 0 0 0 0 0 + + 0 0 0.160002 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 -0 0 + 0 0 0 0 -0 0 + + + 0.1 0.17 0.11 0 1.5707 1.5707 + 0 0 0 0 0 0 + 0 0 0 0 -0 0 + 0 0 0 0 -0 0 + + + 0.1 -0.17 0.11 0 1.5707 1.5707 + 0 0 0 0 0 0 + 0 0 0 0 -0 0 + 0 0 0 0 -0 0 + + + + + + 4.41021 0.618362 4.61186 4.45496e-16 1.53964 3.0162 + orbit + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/spawn_test/parameter_server_test.launch b/gazebo_ros_pkgs/gazebo_plugins/test/spawn_test/parameter_server_test.launch new file mode 100755 index 0000000..f4c697e --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/spawn_test/parameter_server_test.launch @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/spawn_test/spawn_robots.sh b/gazebo_ros_pkgs/gazebo_plugins/test/spawn_test/spawn_robots.sh new file mode 100755 index 0000000..4e8526f --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/spawn_test/spawn_robots.sh @@ -0,0 +1,18 @@ +# Required: rrtbot_description package + +read -p "URDF from file:" +rosrun gazebo_ros spawn_model -file `rospack find rrbot_description`/urdf/rrbot.xml -urdf -y 1 -model rrbot1 -robot_namespace robot2 + +read -p "URDF from parameter server using roslaunch and xacro:" +roslaunch parameter_server_test.launch + +read -p "SDF from local model database:" +rosrun gazebo_ros spawn_model -file `echo $GAZEBO_MODEL_PATH`/coke_can/model.sdf -sdf -model coke_can1 -y 0.2 -x -0.3 + +read -p "SDF from local model database with Deprecated tag:" +rosrun gazebo_ros spawn_model -file `echo $GAZEBO_MODEL_PATH`/coke_can/model.sdf -gazebo -model coke_can2 -y 1.2 -x -0.3 + +read -p "SDF from the online model database:" +rosrun gazebo_ros spawn_model -database coke_can -sdf -model coke_can3 -y 2.2 -x -0.3 + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/bumper_test.world b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/bumper_test.world new file mode 100755 index 0000000..109a5bf --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/bumper_test.world @@ -0,0 +1,257 @@ + + + + 0.500000 0.500000 0.500000 0.500000 + 0.700000 0.700000 0.700000 1.000000 + 0 + + + 0.000000 -1.000000 -10.000000 + + + quick + 50 + 0 + 1.300000 + + + 0.000000 + 0.200000 + 100.000000 + 0.001000 + + + 0.000000 + 0.001000 + + + 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 + + 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 + + 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 + + + 0.000000 0.000000 1.000000 + + + + + + 50.000000 + 50.000000 + 0.000000 0.000000 0.000000 + 0.000000 + 0.000000 + + + + 0.000000 + 100000.000000 + + + + 0.000000 + 0.200000 + 1000000000.000000 + 1.000000 + 100.000000 + 0.001000 + + + + 0.000000 + + 1 + 0 + 0 + + 1 + + + false + 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 + + 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 + + 1.000000 0.000000 0.250000 0.000000 -0.000000 0.000000 + + 0.100000 + 0.000000 + 0.000000 + 0.100000 + 0.000000 + 0.100000 + + 1.000000 + + + 1.000000 0.000000 0.250000 0.000000 -0.000000 0.000000 + + + 0.500000 0.500000 0.500000 + + + + + + -1.000000 + -1.000000 + 0.000000 0.000000 0.000000 + 0.000000 + 0.000000 + + + + 0.000000 + 100000.000000 + + + + 0.000000 + 0.200000 + 1000000000000.000000 + 1.000000 + 100.000000 + 0.001000 + + + + 0.000000 + + + 1.000000 0.000000 0.250000 0.000000 -0.000000 0.000000 + + + 0.500000 0.500000 0.500000 + + + + + + 1 + 0.000000 + 0.000000 + + + 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 + + + + + 1 + 10.0 + box_bumper + world + + 0 + 10.000000 + 0 + + + 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 + + + + + 1 + 10.0 + box1_bumper + box1 + + 0 + 10.000000 + 0 + + 1 + 0 + 0 + + 0 + + + false + 0.000000 0.000000 0.000000 1.570800 -0.000000 0.000000 + + 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 + + 0.000000 0.500000 0.000000 0.000000 -0.000000 0.000000 + + 10.000000 + 0.000000 + 0.000000 + 10.000000 + 0.000000 + 10.000000 + + 100.000000 + + + 0.000000 0.500000 0.000000 0.000000 -0.000000 0.000000 + + + 1.000000 1.000000 1.000000 + + + + + + -1.000000 + -1.000000 + 0.000000 0.000000 0.000000 + 0.000000 + 0.000000 + + + + 0.000000 + 100000.000000 + + + + 0.000000 + 0.200000 + 1000000000000.000000 + 1.000000 + 100.000000 + 0.001000 + + + + 0.000000 + + + 0.000000 0.500000 0.000000 0.000000 -0.000000 0.000000 + + + 1.000000 1.000000 1.000000 + + + + + + 1 + 0.000000 + 0.000000 + + 1 + 0 + 0 + + 0 + + + 0.000000 0.000000 8.000000 0.000000 -0.000000 0.000000 + 1.000000 1.000000 1.000000 1.000000 + 0.100000 0.100000 0.100000 1.000000 + + 10.000000 + 0.100000 + 0.200000 + 0.000000 + + 0.000000 0.000000 -1.000000 + 0 + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/elevator.world b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/elevator.world new file mode 100755 index 0000000..d30f20f --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/elevator.world @@ -0,0 +1,334 @@ + + + + + + + model://sun + + + + + model://ground_plane + + + + + + + region1 + + 1.5 -1 0 + 2.5 1 1 + + + + + + region2 + + 1.5 -1 3 + 2.5 1 4 + + + + + + region1_event + occupied + region1 + ~/elevator + 0 + + + + + region2_event + occupied + region2 + ~/elevator + 1 + + + + + + 0 0 0.075 0 0 0 + + + 800 + + + + + + 2.25 2.25 0.15 + + + + + + + 2.25 2.25 0.15 + + + + + + + 1.0745 0.5725 1.125 0 0 0 + + + 0.1 1.15 2.25 + + + + + 1.0745 0.5725 1.125 0 0 0 + + + 0.1 1.15 2.25 + + + + + + + + + + 1.0745 -1.0625 1.125 0 0 0 + + + 0.1 0.125 2.25 + + + + + 1.0745 -1.0625 1.125 0 0 0 + + + 0.1 0.125 2.25 + + + + + + + + + + 1.0745 -0.5 1.125 0 0 0 + + + + 0.08 1.0 2.25 + + + + + + + 0.08 1.0 2.25 + + + + + + + link + door + + 0 1 0 + + 0 + 1 + 10 + + + + 2 + + + + + + world + link + + 0 0 1 + + 0 + 10 + 100000 + + + + 50 + + + + + 1 + + + + + + + elevator::lift + elevator::door + 3.075 + + + 10 + + + elevator + + + + + + true + + + 0 1.25 3 0 0 0 + + + 2.5 0.15 6 + + + + + 0 1.25 3 0 0 0 + + + 2.5 0.15 6 + + + + + + 0 -1.25 3 0 0 0 + + + 2.5 0.15 6 + + + + + 0 -1.25 3 0 0 0 + + + 2.5 0.15 6 + + + + + + -1.25 0 3 0 0 0 + + + 0.15 2.7 6 + + + + + -1.25 0 3 0 0 0 + + + 0.15 2.7 6 + + + + + + 1.19 0 0.075 0 0 0 + + + 0.12 2.5 0.15 + + + + + 1.19 0 0.075 0 0 0 + + + 0.12 2.5 0.15 + + + + + + 1.19 0 3.075 0 0 0 + + + 0.12 2.5 0.15 + + + + + 1.19 0 3.075 0 0 0 + + + 0.12 2.5 0.15 + + + + + + + + 2.25 0 0.075 0 0 0 + true + + + + + 2.0 5.0 0.15 + + + + + + + 2.0 5.0 0.15 + + + + + + + + 2.25 0 3.075 0 0 0 + true + + + + + 2.0 5.0 0.15 + + + + + + + 2.0 5.0 0.15 + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_block_laser.world b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_block_laser.world new file mode 100755 index 0000000..905b3fc --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_block_laser.world @@ -0,0 +1,660 @@ + + + + 0.5 0.5 0.5 1.0 + 0.5 0.5 0.5 1.0 + true + + 0.0 0.0 0.5 0.5 + linear + 2.0 + 10.0 + 0.5 + + + + 250 + + + quick +
0.001
+ 20 + 1.3 +
+ + 0 + 0.2 + 100.0 + 0.0 + +
+ 0.0000 0 0 +
+ + -1.5 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.05 0.05 0.05 + + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.05 0.05 0.05 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + + 300 + 1.0 + -0.5236 + 0.5236 + + + 100 + 1.0 + -0.5236 + 0.5236 + + + + 0.05 + 50.0 + + + + + 0.00 + true + 20 + test_block_laser + base_link + + true + 10.0 + + false + true + false + + false + + + + + -2.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.05 0.05 0.05 + + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.05 0.05 0.05 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 2.57 + + 640 + 480 + R8G8B8 + + + + + + 1 + 10.0 + /test + image_raw + points + camera_info + base_link + 0.5 + 0.00000001 + 0.00000001 + 0.00000001 + 0.00000001 + 0.00000001 + + true + 10.0 + + false + true + false + + false + + + -0.5 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.1 0.0 0.0 0.0 0.0 + + + pr2/gripper_v0/l_finger_tip.stl + 3 3 3 + + + + true + 100.0 + + + 0.0 0.1 0.0 0.0 0.0 0.0 + 250 + + + pr2/gripper_v0/l_finger_tip.stl + 3 3 3 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + 0.0 -0.1 0.0 0.0 0.0 0.0 + + + pr2/gripper_v0/l_finger_tip.dae + 3 3 3 + + + true + 100.0 + + + 0.0 -0.1 0.0 0.0 0.0 0.0 + 250 + + + pr2/gripper_v0/l_finger_tip.dae + 3 3 3 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + false + true + false + + false + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + -0.1 -0.5 -0.5 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.1 0.0 0.5 0.0 0.0 0.0 + + + 0.1 0.25 0.5 + + + + true + 100.0 + + + 0.1 0.0 0.5 0.0 0.0 0.0 + 250 + + + 0.1 0.25 0.5 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + true + true + false + + + 0.0 0.5 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.05 + + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.05 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + true + true + false + + + 0.5 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.05 + 0.5 + + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.05 + 0.5 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + true + true + false + + false + + + + 1.0 -0.1 -0.1 -0.1 -0.1 -0.1 + + 0 0 0.0 0 0 0 + + 0.012 + 0 + 0 + 0.015 + 0 + 0.011 + + 2.0 + + + + + chair/models/Chair.stl + 0.0254 0.0254 0.0254 + + + + + + 0.0 + 0.0 + 0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e10 + 1 + 100.0 + 0.0001 + + + + + + + + chair/models/Chair.dae + 0.0254 0.0254 0.0254 + + + false + + + false + + + 0.0 0.0 10.0 0.0 0.0 0.0 + 0.5 0.5 0.5 0.5 + + 1000.0 + 0.01 + 0.0001 + + 0 0 -1 + + 1.57 + 1.57 + 1.0 + + true + + + 1 + 1000.0 + +
+
diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_camera.world b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_camera.world new file mode 100755 index 0000000..f4fe440 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_camera.world @@ -0,0 +1,146 @@ + + + + + model://sun + + + 0.0 0.0 -9.81 + + + quick + 20 + 1.3 + + + 0 + 0.2 + 100.0 + 0.0 + + + 250 + 0.001 + + + 0.0 0.0 1.0 0.0 0.0 0.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.5 + + + + 0.03 0.5 0.5 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.5 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + 0.0 0.0 0.0 1.0 0.0 0.0 + + 1.57 + + 256 + 160 + BAYER_BGGR8 + + + + + + 1 + 1.0 + image_raw + points + camera_info + world + 0.5 + 0.00000001 + 0.00000001 + 0.00000001 + 0.00000001 + 0.00000001 + + true + 2.0 + + false + true + false + + 2.0 0.0 0.0 0.0 0.0 0.0 + + + 1.0 1.0 1.0 + + + + 0.5 0.3 0.5 1.0 + + + true + 100.0 + + + false + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_depth_camera.world b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_depth_camera.world new file mode 100755 index 0000000..522a742 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_depth_camera.world @@ -0,0 +1,223 @@ + + + + 0.5 0.5 0.5 1.0 + 0.5 0.5 0.5 1.0 + true + + 0.0 0.0 0.5 0.5 + linear + 2.0 + 10.0 + 0.5 + + + + 0.0 0.0 0.0 + + + quick +
0.001
+ 20 + 1.3 +
+ + 0 + 0.2 + 100.0 + 0.0 + +
+ 250 +
+ + 0.0 0.0 5.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.5 + + + + 0.05 0.3 0.3 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.5 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.578 + + 640 + 480 + R8G8B8 + + + + + + + 1 + 10.0 + image_raw + points + camera_info + depth_cam + /base_link + 0.001 + 0.00000001 + 0.00000001 + 0.00000001 + 0.00000001 + 0.00000001 + + true + 10.0 + + false + true + false + + false + + + 5.0 0.0 5.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1 2 2 + + + + 0.00 0.9 0.1 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 1 2 2 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + false + true + false + + false + + + 0.0 0.0 10.0 0.0 0.0 0.0 + 0.5 0.5 0.5 0.5 + + 1000.0 + 0.01 + 0.0001 + + 0 0 -1 + + 1.57 + 1.57 + 1.0 + + true + +
+
diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_gpu_laser.world b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_gpu_laser.world new file mode 100755 index 0000000..4de0d73 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_gpu_laser.world @@ -0,0 +1,646 @@ + + + + 0.5 0.5 0.5 1.0 + 0.5 0.5 0.5 1.0 + + + 0.0 0.0 0.0 + + + quick +
0.001
+ 20 + 1.3 +
+ + 0 + 0.2 + 100.0 + 0.0 + +
+ 250 +
+ + 0.0 0.0 5.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.707 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.05 0.05 0.05 + + + + 0.03 0.5 0.5 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.05 0.05 0.05 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + + 640 + 1 + -1.396263 + 1.396263 + + + 1 + 0.5 + -0.7854 + 0.7854 + + + + 0.080000000000000002 + 10.0 + 0.01 + + + + 1 + 20.0 + 0.0 + image + laser_scan + /map + 0.001 + + true + 20.0 + + false + true + false + + true + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 3.0 0.0 5.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1 2 2 + + + + 0.5 0.03 0.03 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 1 2 2 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + false + true + false + + + 3.0 -0.5 6.8 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 3 0.5 0.5 + + + + 0.03 0.5 0.03 1.0 + + + true + 50.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 3 0.5 0.5 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 50.0 + + false + true + false + + + 0.0 3.0 5.0 0.0 0.0 0.7 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 2 2 2 + + + + 0.5 0.5 0.03 1.0 + + + true + 1.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 2 2 2 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + false + true + false + + + 2.0 -2.0 5.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1 + 2 + + + + 0.5 0.03 0.5 1.0 + + + true + 70.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 1 + 2 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + false + true + false + + + 2.0 2.0 5.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1 + + + + 0.03 0.5 0.5 1.0 + + + true + 35.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 1 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + false + true + false + + + -2.0 -2.0 5.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1 + + + + 0.03 0.03 0.5 1.0 + + + true + 35.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 1 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + false + true + false + + + -1.5 0.0 5.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1 2 2 + + + + 0.5 0.03 0.03 1.0 + + + true + 150.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 1 2 2 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + false + true + false + + false + + + 0.0 0.0 10.0 0.0 0.0 0.0 + 0.5 0.5 0.5 0.5 + + 1000.0 + 0.01 + 0.0001 + + 0 0 -1 + + 1.57 + 1.57 + 1.0 + + true + + + 1 + 1000.0 + +
+
diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_laser.world b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_laser.world new file mode 100755 index 0000000..6ab1d46 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_laser.world @@ -0,0 +1,445 @@ + + + + 0.5 0.5 0.5 1.0 + 0.5 0.5 0.5 1.0 + true + + 0.0 0.0 0.5 0.5 + linear + 2.0 + 10.0 + 0.5 + + + + 250 + + + quick +
0.001
+ 20 + 1.3 +
+ + 0 + 0.2 + 100.0 + 0.0 + +
+ 0.0000 0 0 +
+ + -1.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.05 0.05 0.05 + + + + 0.03 0.5 0.5 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.05 0.05 0.05 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + + 641 + 1.0 + -0.5 + 0.5 + + + + + 0.15 + 30.0 + + + + + 0.005 + true + 20 + base_scan + base_link + + true + 2.0 + + false + true + false + + + + false + + + -0.2 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.1 0.0 0.0 0.0 0.0 + + + pr2/gripper_v0/l_finger_tip.stl + 1 1 1 + + + + 0.03 0.5 0.5 1.0 + + + true + 100.0 + + + 0.0 0.1 0.0 0.0 0.0 0.0 + 250 + + + pr2/gripper_v0/l_finger_tip.stl + 1 1 1 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + 0.0 -0.1 0.0 0.0 0.0 0.0 + + + pr2/gripper_v0/l_finger_tip.dae + 1 1 1 + + + true + 100.0 + + + 0.0 -0.1 0.0 0.0 0.0 0.0 + 250 + + + pr2/gripper_v0/l_finger_tip.dae + 1 1 1 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + false + true + false + + false + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.1 30.0 30.0 + + + + 0.03 0.5 0.5 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.1 30.0 30.0 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + true + true + false + + false + + + -5.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.05 0.05 0.05 + + + + 0.03 0.5 0.5 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.05 0.05 0.05 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + + 1021 + 1.0 + -0.5 + 0.5 + + + + + 0.15 + 30.0 + + + + + 0.005 + true + 20 + tilt_scan + base_link + + true + 2.0 + + false + true + false + + false + + + 0.0 0.0 10.0 0.0 0.0 0.0 + 0.5 0.5 0.5 0.5 + + 1000.0 + 0.01 + 0.0001 + + 0 0 -1 + + 1.57 + 1.57 + 1.0 + + true + +
+
diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_range.world b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_range.world new file mode 100755 index 0000000..8083ed7 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_range.world @@ -0,0 +1,231 @@ + + + + 0.5 0.5 0.5 1.0 + 0.5 0.5 0.5 1.0 + true + + 0.0 0.0 0.5 0.5 + linear + 2.0 + 10.0 + 0.5 + + + + 250 + + + quick + 20 + 1.3 + + + 0 + 0.2 + 100.0 + 0.0 + + + 0.0000 0 0 + 0.001 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.05 0.05 0.05 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.05 0.05 0.05 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + 0.25 0 0 0 0 0 + 5 + + + + 5 + 1.0 + -0.25 + 0.25 + + + 5 + 1 + -0.25 + 0.25 + + + + 0.01 + 0.75 + 0.01 + + + + 0.005 + true + 5 + sonar + sonar_link + 0.5 + ultrasound + + + false + true + false + + false + + + + 0.5 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.05 0.05 0.05 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.05 0.05 0.05 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + 0.25 0 0 0 0 0 + 5 + + + + 5 + 1.0 + -0.25 + 0.25 + + + 5 + 1 + -0.25 + 0.25 + + + + 0.01 + 0.75 + 0.01 + + + + 0.005 + true + 5 + sonar2 + sonar_link2 + 0.5 + ultrasound + + + false + true + false + + false + + + + 0.0 0.0 10.0 0.0 0.0 0.0 + 0.5 0.5 0.5 0.5 + + 1000.0 + 0.01 + 0.0001 + + 0 0 -1 + + 1.57 + 1.57 + 1.0 + + true + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_trimesh_collision.world b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_trimesh_collision.world new file mode 100755 index 0000000..c17d93f --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/gazebo_ros_trimesh_collision.world @@ -0,0 +1,552 @@ + + + + + 0.2 0.2 0.2 1 + 0.5 0.5 0.5 1 + false + + + 250 + + + quick +
0.001
+ 20 + 1.3 +
+ + 0 + 0.2 + 100.0 + 0.0 + +
+ 0.0000 0 0 +
+ + -1.5 1.8 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.05 0.05 0.05 + + + + 0.03 0.5 0.5 1.0 + + + false + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.05 0.05 0.05 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + + 300 + 1.0 + -0.5236 + 0.5236 + + + 100 + 1.0 + -0.5236 + 0.5236 + + + + 0.05 + 50.0 + + + + + 0.00 + true + 20 + test_block_laser + /base_link + + true + 10.0 + + false + true + false + + false + + + -1.5 1.8 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.05 0.05 0.05 + + + + 0.03 0.5 0.5 1.0 + + + false + 100.0 + + + -1.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.05 0.05 0.05 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.9 + + 640 + 480 + R8G8B8 + + + + + + 1 + 10.0 + /test_depth + image_raw + points + camera_info + /base_link + + true + 10.0 + + false + true + false + + false + + + 1.4 1.8 0 0 0 0 + + + 0 0 0.0 0 0 0 + + 0.012 + 0 + 0 + 0.015 + 0 + 0.011 + + 2.0 + + + + + chair3/model/chair.stl + 0.008 0.008 0.01 + + + + + + 0.0 + 0.0 + 0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e10 + 1 + 100.0 + 0.0001 + + + + + + + + chair3/model/chair.dae + 0.008 0.008 0.01 + + + false + + + true + + + 1.9 1.8 0 0 0 0 + + + 0 0 0.0 0 0 0 + + 0.012 + 0 + 0 + 0.015 + 0 + 0.011 + + 2.0 + + + + + chair3/model/chair.stl + 0.008 0.008 0.01 + + + + + + 0.0 + 0.0 + 0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e10 + 1 + 100.0 + 0.0001 + + + + + + + + chair3/model/chair.dae + 0.008 0.008 0.01 + + + false + + + true + + + 1.6 1.5 0 0 0 3.1416 + + + 0 0 0.0 0 0 0 + + 0.012 + 0 + 0 + 0.015 + 0 + 0.011 + + 2.0 + + + + + chair3/model/chair.stl + 0.008 0.008 0.01 + + + + + + 0.0 + 0.0 + 0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e10 + 1 + 100.0 + 0.0001 + + + + + + + + chair3/model/chair.dae + 0.008 0.008 0.01 + + + false + + + true + + + 2.1 1.5 0 0 0 3.1416 + + + 0 0 0 0 0 0 + + 0.01 + 0 + 0 + 0.01 + 0 + 0.01 + + 1.0 + + + + + chair3/model/chair.stl + 0.008 0.008 0.01 + + + + + + 0.0 + 0.0 + 0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e10 + 1 + 100.0 + 0.0001 + + + + + + + + chair3/model/chair.dae + 0.008 0.008 0.01 + + + false + + + false + + + 2.3 1.8 0 0 0 -1.57 + + + 0 0 0 0 0 0 + + 0.01 + 0 + 0 + 0.01 + 0 + 0.01 + + 1.0 + + + + + chair3/model/chair.stl + 0.008 0.008 0.01 + + + + + + 0.0 + 0.0 + 0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e10 + 1 + 100.0 + 0.0001 + + + + + + + + chair3/model/chair.dae + 0.008 0.008 0.01 + + + false + + + + false + + + 0.0 0.0 10.0 0.0 0.0 0.0 + 0.5 0.5 0.5 0.5 + + 1000.0 + 0.01 + 0.0001 + + 0 0 -1 + + 1.57 + 1.57 + 1.0 + + false + + + 1 + 1000.0 + +
+
diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/test_lasers.world b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/test_lasers.world new file mode 100755 index 0000000..0397531 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/test_worlds/test_lasers.world @@ -0,0 +1,443 @@ + + + + 0.5 0.5 0.5 1.0 + 0.5 0.5 0.5 1.0 + true + + 0.0 0.0 0.5 0.5 + linear + 2.0 + 10.0 + 0.5 + + + + 250 + + + quick +
0.001
+ 20 + 1.3 +
+ + 0 + 0.2 + 100.0 + 0.0 + +
+ 0.0000 0 0 +
+ + -1.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.05 0.05 0.05 + + + + 0.03 0.5 0.5 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.05 0.05 0.05 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + 0 0 0 0 -0 0 + + + + 640 + 1 + -1.3962634000002327 + 1.3962634000002327 + + + + 0.080000000000000002 + 10 + 0.01 + + + + 0.00 + 1 + 40 + tilt_scan + base_link + + 0 + 40 + + false + true + false + + + + false + + + -0.2 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.1 0.0 0.0 0.0 0.0 + + + pr2/gripper_v0/l_finger_tip.stl + 1 1 1 + + + + 0.03 0.5 0.5 1.0 + + + true + 100.0 + + + 0.0 0.1 0.0 0.0 0.0 0.0 + 250 + + + pr2/gripper_v0/l_finger_tip.stl + 1 1 1 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + 0.0 -0.1 0.0 0.0 0.0 0.0 + + + pr2/gripper_v0/l_finger_tip.dae + 1 1 1 + + + true + 100.0 + + + 0.0 -0.1 0.0 0.0 0.0 0.0 + 250 + + + pr2/gripper_v0/l_finger_tip.dae + 1 1 1 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + false + true + false + + false + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.1 30.0 30.0 + + + + 0.03 0.5 0.5 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.1 30.0 30.0 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + true + true + false + + false + + + -5.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 1.0 + 0.0 + 0.0 + 1.0 + 0.0 + 1.0 + + 10.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + + + 0.05 0.05 0.05 + + + + 0.03 0.5 0.5 1.0 + + + true + 100.0 + + + 0.0 0.0 0.0 0.0 0.0 0.0 + 250 + + + 0.05 0.05 0.05 + + + + + + 0.5 + 0.2 + 1.0 0 0 + 0 + 0 + + + + 0 + 1000000.0 + + + + 0 + 0.2 + 1e15 + 1e13 + 100.0 + 0.0001 + + + + 100.0 + + + 0 0 0 0 -0 0 + + + + 640 + 1 + -2.2688999999959423 + 2.2688999999959423 + + + + 0.080000000000000002 + 10 + 0.01 + + + + 0.00 + 1 + 20 + base_scan + base_link + + 0 + 20 + + false + true + false + + false + + + 0.0 0.0 10.0 0.0 0.0 0.0 + 0.5 0.5 0.5 0.5 + + 1000.0 + 0.01 + 0.0001 + + 0 0 -1 + + 1.57 + 1.57 + 1.0 + + true + +
+
diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/.directory b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/.directory new file mode 100755 index 0000000..b0371cd --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/.directory @@ -0,0 +1,4 @@ +[Dolphin] +Timestamp=2013,11,4,9,14,4 +Version=3 +ViewMode=2 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle.gazebo.launch b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle.gazebo.launch new file mode 100755 index 0000000..4e79e58 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle.gazebo.launch @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle.rviz b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle.rviz new file mode 100755 index 0000000..49c0fc8 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle.rviz @@ -0,0 +1,237 @@ +Panels: + - Class: rviz/Displays + Help Height: 84 + Name: Displays + Property Tree Widget: + Expanded: + - /Global Options1 + - /Status1 + - /Marker1 + - /Marker1/Namespaces1 + - /LaserScan1 + Splitter Ratio: 0.590385 + Tree Height: 690 + - Class: rviz/Selection + Name: Selection + - Class: rviz/Tool Properties + Expanded: + - /2D Pose Estimate1 + - /2D Nav Goal1 + - /Publish Point1 + Name: Tool Properties + Splitter Ratio: 0.588679 + - Class: rviz/Views + Expanded: + - /Current View1 + Name: Views + Splitter Ratio: 0.5 + - Class: rviz/Time + Experimental: false + Name: Time + SyncMode: 0 + SyncSource: "" +Visualization Manager: + Class: "" + Displays: + - Alpha: 0.5 + Cell Size: 1 + Class: rviz/Grid + Color: 160; 160; 164 + Enabled: true + Line Style: + Line Width: 0.03 + Value: Lines + Name: Grid + Normal Cell Count: 0 + Offset: + X: 0 + Y: 0 + Z: 0 + Plane: XY + Plane Cell Count: 10 + Reference Frame: + Value: true + - Class: rviz/TF + Enabled: true + Frame Timeout: 15 + Frames: + All Enabled: true + base_link: + Value: true + r1/base_link: + Value: true + r1/chassis: + Value: true + r1/front_steering: + Value: true + r1/front_wheel: + Value: true + r1/left_wheel: + Value: true + r1/odom: + Value: true + r1/right_wheel: + Value: true + Marker Scale: 1 + Name: TF + Show Arrows: true + Show Axes: true + Show Names: true + Tree: + base_link: + r1/odom: + r1/base_link: + r1/chassis: + {} + r1/front_steering: + r1/front_wheel: + {} + r1/left_wheel: + {} + r1/right_wheel: + {} + Update Interval: 0 + Value: true + - Class: rviz/Marker + Enabled: true + Marker Topic: visualization_marker + Name: Marker + Namespaces: + {} + Queue Size: 100 + Value: true + - Alpha: 1 + Class: rviz/RobotModel + Collision Enabled: false + Enabled: true + Links: + All Links Enabled: true + Expand Joint Details: false + Expand Link Details: false + Expand Tree: false + Link Tree Style: Links in Alphabetic Order + base_link: + Alpha: 1 + Show Axes: false + Show Trail: false + chassis: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + front_steering: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + front_wheel: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + left_wheel: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + right_wheel: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + Name: RobotModel + Robot Description: r1/robot_description + TF Prefix: r1 + Update Interval: 0 + Value: true + Visual Enabled: true + - Alpha: 1 + Autocompute Intensity Bounds: true + Autocompute Value Bounds: + Max Value: 10 + Min Value: -10 + Value: true + Axis: Z + Channel Name: intensity + Class: rviz/LaserScan + Color: 255; 255; 255 + Color Transformer: Intensity + Decay Time: 0 + Enabled: true + Invert Rainbow: false + Max Color: 255; 255; 255 + Max Intensity: 0 + Min Color: 0; 0; 0 + Min Intensity: 0 + Name: LaserScan + Position Transformer: XYZ + Queue Size: 10 + Selectable: true + Size (Pixels): 3 + Size (m): 0.01 + Style: Flat Squares + Topic: /r1/front_laser/scan + Use Fixed Frame: true + Use rainbow: true + Value: true + Enabled: true + Global Options: + Background Color: 48; 48; 48 + Fixed Frame: r1/base_link + Frame Rate: 30 + Name: root + Tools: + - Class: rviz/Interact + Hide Inactive Objects: true + - Class: rviz/MoveCamera + - Class: rviz/Select + - Class: rviz/FocusCamera + - Class: rviz/Measure + - Class: rviz/SetInitialPose + Topic: /initialpose + - Class: rviz/SetGoal + Topic: /move_base_simple/goal + - Class: rviz/PublishPoint + Single click: true + Topic: /clicked_point + Value: true + Views: + Current: + Class: rviz/Orbit + Distance: 7.43455 + Enable Stereo Rendering: + Stereo Eye Separation: 0.06 + Stereo Focal Distance: 1 + Swap Stereo Eyes: false + Value: false + Focal Point: + X: 0.351517 + Y: 0.0334811 + Z: 0.722431 + Name: Current View + Near Clip Distance: 0.01 + Pitch: 0.234797 + Target Frame: + Value: Orbit (rviz) + Yaw: 4.99819 + Saved: ~ +Window Geometry: + Camera: + collapsed: false + Displays: + collapsed: false + Height: 1054 + Hide Left Dock: false + Hide Right Dock: false + QMainWindow State: 000000ff00000000fd00000004000000000000010f0000036bfc020000000bfb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006d00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c00610079007301000000450000034c000000ee00fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000c00430061006d0065007200610100000397000000190000001900000019fb0000000c00430061006d00650072006103000003360000023100000250000001b3fb0000000c00430061006d00650072006101000002c5000000c80000000000000000000000010000010f0000036bfc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a0056006900650077007301000000450000036b000000c100fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000068e00000046fc0100000002fb0000000800540069006d006501000000000000068e0000038b00fffffffb0000000800540069006d00650100000000000004500000000000000000000004640000036b00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + Selection: + collapsed: false + Time: + collapsed: false + Tool Properties: + collapsed: false + Views: + collapsed: false + Width: 1678 + X: 1920 + Y: 0 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle.urdf.launch b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle.urdf.launch new file mode 100755 index 0000000..6325c8b --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle.urdf.launch @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle_drive_scenario.launch b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle_drive_scenario.launch new file mode 100755 index 0000000..cd5691b --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle_drive_scenario.launch @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle_rviz.launch b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle_rviz.launch new file mode 100755 index 0000000..d2d5b2d --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/launch/tricycle_rviz.launch @@ -0,0 +1,6 @@ + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/.directory b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/.directory new file mode 100755 index 0000000..b41f2a1 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/.directory @@ -0,0 +1,3 @@ +[Dolphin] +Timestamp=2013,10,18,16,23,17 +ViewMode=2 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/materials.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/materials.xacro new file mode 100755 index 0000000..311c3cd --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/materials.xacro @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/inertia_tensors.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/inertia_tensors.xacro new file mode 100755 index 0000000..ed07e4e --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/inertia_tensors.xacro @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle.xacro new file mode 100755 index 0000000..0434552 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle.xacro @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle_body.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle_body.xacro new file mode 100755 index 0000000..a6ea3db --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle_body.xacro @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle_chassis.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle_chassis.xacro new file mode 100755 index 0000000..bced5fa --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle_chassis.xacro @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle_plugins.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle_plugins.xacro new file mode 100755 index 0000000..cadd1f4 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/tricycle_plugins.xacro @@ -0,0 +1,36 @@ + + + + + + + + Debug + + false + true + true + front_steering_joint + front_wheel_joint + left_wheel_joint + right_wheel_joint + 0.135 + 0.135 + 0.548 + cmd_vel + odom + odom + encoder + base_link + 10.0 + 1.8 + 5.0 + 0.05 + 20 + 0.4 + 0.02 + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/wheel.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/wheel.xacro new file mode 100755 index 0000000..3738ee3 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/wheel.xacro @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/wheel_actuated.xacro b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/wheel_actuated.xacro new file mode 100755 index 0000000..1ae0f39 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test/tricycle_drive/xacro/tricycle/wheel_actuated.xacro @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/CMakeLists_tests_pkg.txt b/gazebo_ros_pkgs/gazebo_plugins/test2/CMakeLists_tests_pkg.txt new file mode 100755 index 0000000..95c9869 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/CMakeLists_tests_pkg.txt @@ -0,0 +1,44 @@ +cmake_minimum_required(VERSION 2.4.6) +include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake) + +# Set the build type. Options are: +# Coverage : w/ debug symbols, w/o optimization, w/ code-coverage +# Debug : w/ debug symbols, w/o optimization +# Release : w/o debug symbols, w/ optimization +# RelWithDebInfo : w/ debug symbols, w/ optimization +# MinSizeRel : w/o debug symbols, w/ optimization, stripped binaries +set(ROS_BUILD_TYPE RelWithDebInfo) + +rosbuild_init() + +#set the default path for built executables to the "bin" directory +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) +#set the default path for built libraries to the "lib" directory +set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) + +#uncomment if you have defined messages +#rosbuild_genmsg() +#uncomment if you have defined services +#rosbuild_gensrv() + +rosbuild_add_boost_directories() + +rosbuild_add_executable(spawn_box test/spawn_model/spawn_box.cpp) +rosbuild_add_gtest_build_flags(spawn_box) +rosbuild_add_rostest_labeled(gazebo test/spawn_model/spawn_box.launch) + +rosbuild_add_executable(check_model test/spawn_model/check_model.cpp) +rosbuild_add_gtest_build_flags(check_model) +rosbuild_add_rostest_labeled(gazebo test/spawn_model/spawn_box_file.launch) +rosbuild_add_rostest_labeled(gazebo test/spawn_model/spawn_box_param.launch) + +rosbuild_add_executable(contact_tolerance test/contact_tolerance/contact_tolerance.cpp) +rosbuild_add_gtest_build_flags(contact_tolerance) +rosbuild_add_rostest_labeled(gazebo test/contact_tolerance/contact_tolerance.launch) + +#common commands for building c++ executables and libraries +#rosbuild_add_library(${PROJECT_NAME} src/example.cpp) +#target_link_libraries(${PROJECT_NAME} another_library) +#rosbuild_link_boost(${PROJECT_NAME} thread) +#rosbuild_add_executable(example examples/example.cpp) +#target_link_libraries(example ${PROJECT_NAME}) diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/contact_tolerance/contact_tolerance.cpp b/gazebo_ros_pkgs/gazebo_plugins/test2/contact_tolerance/contact_tolerance.cpp new file mode 100755 index 0000000..f9d6f40 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/contact_tolerance/contact_tolerance.cpp @@ -0,0 +1,135 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of the Willow Garage nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*********************************************************************/ + +/* Author: John Hsu */ + +#include +#include +#include "gazebo/SpawnModel.h" +#include "geometry_msgs/Pose.h" +#include "geometry_msgs/Quaternion.h" +#include "std_srvs/Empty.h" +#include "gazebo/GetModelState.h" + +#include +#include + +// Including ros, just to be able to call ros::init(), to remove unwanted +// args from command-line. +#include + +int g_argc; +char** g_argv; + +TEST(SpawnTest, checkBoxStackDrift) +{ + ros::NodeHandle nh(""); + // make the service call to spawn model + ros::service::waitForService("gazebo/spawn_urdf_model"); + ros::ServiceClient spawn_model_client = nh.serviceClient("gazebo/spawn_urdf_model"); + gazebo::SpawnModel spawn_model; + + // load urdf file + std::string urdf_filename = std::string(g_argv[1]); + ROS_DEBUG_NAMED("contact_tolerance", "loading file: %s",urdf_filename.c_str()); + // read urdf / gazebo model xml from file + TiXmlDocument xml_in(urdf_filename); + xml_in.LoadFile(); + std::ostringstream stream; + stream << xml_in; + spawn_model.request.model_xml = stream.str(); // load xml file + ROS_DEBUG_NAMED("contact_tolerance", "XML string: %s",stream.str().c_str()); + + spawn_model.request.robot_namespace = ""; + spawn_model.request.reference_frame = ""; + + // spawn 10 boxes + for (int i=0;i<10;i++) + { + std::ostringstream mn_stream; + mn_stream << "box_" << i; + spawn_model.request.model_name = mn_stream.str(); + geometry_msgs::Pose pose; + pose.position.x = pose.position.y = 0; pose.position.z = 1 + 2.0*(i); + pose.orientation.w = 1.0; pose.orientation.x = pose.orientation.y = pose.orientation.z = 0; + spawn_model.request.initial_pose = pose; + ASSERT_TRUE(spawn_model_client.call(spawn_model)); + } + + // get pose of top box, check for drift + // setup the service call to get model state + ros::service::waitForService("gazebo/get_model_state"); + ros::ServiceClient get_model_state_client = nh.serviceClient("gazebo/get_model_state"); + gazebo::GetModelState model_state; + model_state.request.model_name = "box_9"; + double test_duration = 10.0; // check drift over this period of sim time + double LINEAR_DRIFT_TOLERANCE = 0.0105; // linear drift tolerance of top block + // given contact layer is 1mm, 10 blocks leads to 10*1mm and .5mm of numerical error + ros::Time timeout = ros::Time::now() + ros::Duration(test_duration); + // get intial pose + ASSERT_TRUE(get_model_state_client.call(model_state)); + geometry_msgs::Pose initial_pose = model_state.response.pose; + while (ros::Time::now() < timeout) + { + ASSERT_TRUE(get_model_state_client.call(model_state)); + geometry_msgs::Pose current_pose = model_state.response.pose; + double error_x = fabs(current_pose.position.x - initial_pose.position.x); + double error_y = fabs(current_pose.position.y - initial_pose.position.y); + double error_z = fabs(current_pose.position.z - initial_pose.position.z); + double error_linear = sqrt(error_x*error_x+error_y*error_y+error_z*error_z); + ROS_INFO_NAMED("contact_tolerance", "error: %f",error_linear); + if (error_linear > LINEAR_DRIFT_TOLERANCE); + ROS_INFO_NAMED("contact_tolerance", "box stack teset failed with this linear error (%f): this means the top box in the box stack is moving too much. Check to see if surface contact layer has changed from 1mm, bounce parameter has changed, world time step, solver has changed. You can reproduce this test by:\n\nroslaunch gazebo_tests empty.launch\nrosrun gazebo_tests contact_tolerance `rospack find gazebo_tests`/test/urdf/box.urdf\n",error_linear); + ASSERT_TRUE(error_linear <= LINEAR_DRIFT_TOLERANCE); + + // FIXME: do something about orientation drift too + geometry_msgs::Quaternion current_q = current_pose.orientation; + geometry_msgs::Quaternion initial_q = initial_pose.orientation; + } + + + SUCCEED(); +} + + + + +int main(int argc, char** argv) +{ + ros::init(argc, argv, "test", ros::init_options::AnonymousName); + testing::InitGoogleTest(&argc, argv); + g_argc = argc; + g_argv = argv; + return RUN_ALL_TESTS(); +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/contact_tolerance/contact_tolerance.launch b/gazebo_ros_pkgs/gazebo_plugins/test2/contact_tolerance/contact_tolerance.launch new file mode 100755 index 0000000..97ca241 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/contact_tolerance/contact_tolerance.launch @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/large_models/large_model.launch b/gazebo_ros_pkgs/gazebo_plugins/test2/large_models/large_model.launch new file mode 100755 index 0000000..e33de64 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/large_models/large_model.launch @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/large_models/large_model.urdf.xacro b/gazebo_ros_pkgs/gazebo_plugins/test2/large_models/large_model.urdf.xacro new file mode 100755 index 0000000..1a48120 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/large_models/large_model.urdf.xacro @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${material} + false + + + + + 1 + 1 + + + + true + 100.0 + ${link_name} + ${link_name}_pose + map + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + 1000.0 + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/large_models/large_models.world b/gazebo_ros_pkgs/gazebo_plugins/test2/large_models/large_models.world new file mode 100755 index 0000000..e88a47c --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/large_models/large_models.world @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/large_models/smaller_large_model.launch b/gazebo_ros_pkgs/gazebo_plugins/test2/large_models/smaller_large_model.launch new file mode 100755 index 0000000..cde878b --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/large_models/smaller_large_model.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/large_models/smaller_large_model.urdf.xacro b/gazebo_ros_pkgs/gazebo_plugins/test2/large_models/smaller_large_model.urdf.xacro new file mode 100755 index 0000000..a4caa13 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/large_models/smaller_large_model.urdf.xacro @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${material} + false + + + + true + 100.0 + ${link_name} + ${link_name}_pose + map + + + + + + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + 1000.0 + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/balance.launch b/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/balance.launch new file mode 100755 index 0000000..010eb4a --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/balance.launch @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/balance.world b/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/balance.world new file mode 100755 index 0000000..e1e08ed --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/balance.world @@ -0,0 +1,186 @@ + + + + + + + + + + + + 15 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stack.launch b/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stack.launch new file mode 100755 index 0000000..964e2cb --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stack.launch @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stack.world b/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stack.world new file mode 100755 index 0000000..802ff23 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stack.world @@ -0,0 +1,111 @@ + + + + + + + + + + + + 15 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stacks.launch b/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stacks.launch new file mode 100755 index 0000000..57363ab --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stacks.launch @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stacks.world b/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stacks.world new file mode 100755 index 0000000..1cc37f8 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/lcp_tests/stacks.world @@ -0,0 +1,243 @@ + + + + + + + + + + + + 15 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/meshes/cube.wings b/gazebo_ros_pkgs/gazebo_plugins/test2/meshes/cube.wings new file mode 100755 index 0000000000000000000000000000000000000000..fced73630a6438dae11a13b86bd28d55c62f77c0 GIT binary patch literal 580872 zcmY&4*nCdh+^7t<(dOxp{G+lkf&2u@`|ve6`5Xh6bqvBRPjqbgcJJ-lI2rri*Aed)1#N z@A%*N*v#iPY|f``l@ydL2+TS)UJ1_rX&j{aR%cti>aiL*HCZ6zAZ1VLSc>A-VM`r~s(w~(miCWlK6E|X%RxU`ONrDn zVt>kbBn%%{$O{SM^zE#Tza{ol?jOxF1dA~heH*6ex%#kTP zgbbixk0WzMyKEFP&34dC{MtAqAL$V;)X}MsNgJnSJdS-us)Jf#EX1j(4d2X`xk5dN z;!vfyu5BdD^wVy*YCNQfD0xU49M-q4KI510M~l}AVnt@HyP8>5N=W9KS)Pm?$wzeIQ!X6~B0N271r*`%sT>)~ zBgn>BV97~l8G(d9W_&^jC33iLr)&JJ38d}qM*xF8NLe~|M|jHB@+)eEOa8NQ@@cYBtn-IT_>IL~J{%4~)uuZ2T?uow9leW$bJ)m%D(me8XkpIiEpc+Y2!p{12cy5UiCa{+}|D^oWfk zF9!Z!AsJ&8e98I1S#s@@Z?W7P-Tge+26W-k*)p?tCjR&WOdKnt)~&~JdgCE70EesO z%81@&#t%T6&vKfEeR;9O9qu78paUPykrBOvIRhA<&NLSLa_CP9p2o);ETsu*nFe=B zUnU?iC5hoD+a(JYBfo_{l z(~PAMHzk-qvVUhkBPfex4yuTFyTDz_X8isyQ~&Y_>_?sq6Ti3`BrWOD(XkRyUy9wrd(gZad5C05RpsweQHoY&{gsfz>KqcE zJVbSXv*#BGr@{=!YPU)?;D^0diq?R{g-+E#OlUOGOcb!FZxT~>-$FN1PHl{6{Nri% z)^=)LcFvFc3%R#nNq@_mjFypD7(~jck4fec|4|s@7YS@?M;U+4!ySkF zlZh<+;yQO`vGdkY`B3&B?t(yPCNrBn}ZMOV9p$dEjF^ zKsLEKP{eIwbs<~z-PiKMI%$hB$2nx|=jrWFY#(Y$-cVd&1?z#-?7;c#(qpd zykI<(ii-Z^Loa6kNgX8H4A2T}Dwc5jTY07Hjx_VlE1HLdZOy&6pQZhYEk;0r9psp5 z&QJ1MY5&fnFU-Tjw#0T@ANUQSNf?kk)N_JQYCq!_H-uQ*we=cViP*Om*`W`|qGX_j zhZGB6Td^f4!}B1sYgSS@`O`R!ZbSk?JKnWSGa{=~OZnp!l{hsavu7P*5|f8$xzuUf z)UDoO8ko$KiRYR{nyHT|+}Z7xik*|w@-VR?YKe|}snn>mjDFKGl30DL|1Mm3sbV=f z*yxG}G6!EM4le7hrjy31x(f2Qh^?eAM_rhP2-L?g&?a5zJx*}W26cIN`_2ta2FFiW zAdlB$GsWd^y+nyEA`rX0@4+cBiQC{zF{LfY-y{Pu+v}<`v8s1y{bG8+*%Mke{baY- z)6gVv{6ypqjmeafzx8z4OWPN(t)r$~ZaQVGp$nG3g?p!(bBI}eOd1(kc7Yne>_;Eu zD@1D(G=2iR3pJ(kOZBnN_QA3XLGS=7!Fn%I%r&p3GH-C!|B{l_RVL!0Os9as>!&qCFa{d-Ir1<3d&z zw8k(@2Yfy^?3UH5@^U>ZuLLO6*X&Hi`CDqscG|w!?=QcXYY7F7b#%e=x5V$zMng*K zW7(Z)g4@T|BWY9ek+nHA1|BN3WjX21c9n|4`(oTwI&j%9Q=hlG|Had`Egc-mOTaZ# z-)GVw1BO~n3+imn1(i+F&M0NaCE?2Ed6FS6$nxdiMD0bU*_%~WBrjCnNOEgHmU2fe~-sJ#;yHIqLgb=QE&L2oPOP@Yg7-a&UMfGGq`taC;RxWjHo zlUy_T`*bc3mlGZQglZaxR3!asuMWC3T^+4X9zfmN0*8Sg&$Nz~E%-0iT%S1<5?!COp#@>QJRkjQ}nW{DahJTOT=vbYcC2rU)8P-E9%_{Jf&Lp&^_?5*YTE@M?uNCwje81`eg#(t z1xKq5{jBFgJu$Z9dXntahhsT1D&=9`XM%hA{$f$se1A)ZUw3;};4B7&=Ur*^c(3p8 zw;g%$@p~mh!-dyZFkG=}J2{+tEwjs?1A7T4{mTig_#j14DKi1X&G;{Q;=pNgzrMlESo$$s|!$olM+2aMk< z{!U3FP-5GeB*~h5DRfnLCFsL)CCq=pdpAj$g4~#u+cn~A0HI|H@dMpx#;Q1gve4{~1U#G10EKTy^Bd z%J230j$;+zIM2|suQD1v)Lh0nBg8+>zE-8ZMJ==C&Y85Jm?}#(KdHS!?u^by3oe-@Q+hYcE<#hfDAxDo ztzW_RjUx|kv0YY~l2lr-OY@;Y=QiZFJ_l3b%8sw624~g1AHbr>JKT2{-CZ-K$m%F@ zkAl}9Rb%&O%am#aKD#t@W4$W1b9sj5E$shKKctc_Nlp|4uBE4j%BMuQ#C88%#6j1+ zwlepYL2xUlmC{N<{$0ErDisHTES7Qz@gqANR-m98ZE(fU!gc9^43%tPEP^qJ5-FcQ zLV37!R9osveI_0li=i2h;k!{$B6zO)ura?n3;lNzL+fY4yi^*4@1zOv9D-Qd+*Unk z_4iQ$K z>xp(})*h<&s3`g+quLj;Go!%xOB*QV$95~caAvf_7}g-12qv;P+S9t?g5iOxhb*WqZ$RD#CD^;*AG*wCna>`d77 zVQfZjYXh`WFK`h)A=d`lr>O6iPt=nYV^R0>fo?zZn0rj}C%UNf2X<1Ej$XXppLSz_9$pCgO2G8Q9wpVn1hA{Dw6#hfGP@-nPG(e$0%H z7#sh+f4H>q;Zj7FS|}U~Q&=-s*nAH+D23uU@rniG<{Joh;w%HokonOIOx0_=%;E?0 zd>gzvTo@8+Aj<}v+m%NhEaeC2N-F^ zA+o{M2eVIk>1|RddnY_G>RNpxi`b!7}Tf zA!JPxf~eIq{k!J1>23;pb(eWIzMpUhZaWVRMkHz|##nBdE%QQ=>I0DyR@avKVbDI* zV~8c1E0fVVugwTBsh1DU8&0^rw~)7^Ms5QXu-=osj|ZF(Xd8eSV@+j_E!#_aK4CTF z$lQKxD3`g?imltx7|7i+N&jWh7?Ekv&5#5$AeMj%zsNS`o)#~z1)mAiZWL8&nYY!6 z=Uk-gN=xzpO6lha>Q_~m120S>Ym8NOUfRlG9azVr*J={_GB7>c4P(nFv#>gm zo{Rju3Lx1fCd&WO+9%#zl^H#@Hi=!U@-;ZCff9@!VBl(D3_H(uBgMX#xm%s=*HTh; z`|~Ho&b1b0N?-_!RYG*@pJFzzJ zM|7Ng;Sv4s{GM_1Qar3T*jIW@vSyF&D`WENk4f|2)7f z_U^uZ7LU7wUhEpKqr#akAX648hdRfCr4^GxjQ6}+L+ACkNO*E0A^-s(w5e(yeqsL5_=XgXKnk~i=pI57xVg3Ib$#X)}od$IlEY1+zl2Q zqnNYnB!BVrWTMCB{;@#_4o!MC`V?7*ObW~-1{zCUL8Q|F*5e&CCBhxdL&N2Fw#I!6 zrWKe!>iogFYrU1@sb9HT_~ppVmDdp$@63E-X%?m4B!_h;OiCxxDcVnB7G_Q2uhI*( zq$s>h{3~mChF}@&AXUyW*-)Tx&Xe!s8qTMjj44hy`A+j~RIxFyaxbobziQyZA#VIa z)#nvGI(2elF#ndJgj#meSwb()xc+mV7A-mQ4OnDQFREXPQZsp!rX?(0PB)r%<6&&l zUsaa;zZnMvqW7j8h<4t?e5<<)_=qytldvFUcU~4wY?vPvNldD^*JYHJC2T=LSA}fy z0d~?~M*t)``+ycqR1>D59_#m0GLMf)@>x$nx$_@HAE6SrrdUDGw>_( z%AH=0h>9iwmv6j@4f2!`oeaKh=x+NN=~*w&>u3^_q(6xD@K`qP%Zqeu@or)GLt*&S zLE*#2p*NN=VRqA;H_id=so!FFdIG*-)&;(BU2?TP>h!Lb=k4X7vk>L%8@oP}g+{Wgv>Umh~HP-+Aq zPOBgb=ZKMv?ybrE;>JK=bEGv$Jo~@_&O2dY7ET2-#TmEz^61W?w^C`FE1+Wi+}sYL zQpLg?ID;ZSBdpmf9Qj+c_64vOuV)|^vKG#0_G#;Rv>T@LG2W3>ihkT82)5?B>4p}t zXf6-9ozCdhx5zlhlwo+upuMUk%-Wd;yFmB_!cJ3;d~dW3nUAd{70r9E#LHgY5>^Q3 z!On+-8bHY1?)0R)olbT^H`aPl^i6W_uY`f`R?7b+&T6QIh-Pt_?Jr@>v~gDVYOEWu z44P`lnR7$trm-+1uMHf&*BlDYQsGa<|I6cxtzt}KgowHWqVPSJS@-g_UB|8-##LXy z)Ap4)GX!h`Jjr;|c7%~eiA8*M_q?BHC)HB-uoXf?4MA9D@f2$CnsKN}a8`JB=|DhX zPky9A0eunoWf}fLXnwY~)RygMivFP3_ff@D^Upe}P;QpV_c`R!!)Xi@Nxbzf9F&d| z<#}ghWy~2NrJ2B5-()hsp~vD;p@jk68p*vSEIfsfhic`hRld9Z$Bh>{lBmLK<>=b^eY4CrCa{;)jT;jBob{^3}2&yWV6kTOce-=vZpwW^4*BJmgiIb|J_T&%3V$QIHJBnn>>Gp2j+QDWS zbk;YghHO0sw)Sut1E4I$f%l;0x&q4}w!XPIBnt=m-a-<9DZXLi=-9ipV5pItP&;q| zg{uX$gDJ$baIOGOM^C4Ja{d%-RuD?_P|x=K(Qi`%p`;ki z5;NNzi1#kuIXg9PENWUV?D4EZ%YQKSHu))Aw0kU2cFyj$S z+`}cq-JspDKJ<+g_ zxy3sQ<;DB{?3=?N^*Wv@-NK5v*?zfebhQBrlIO5+tH;uQpvb zyhA8{v&Jdf`*}C>$g${@zZ)nqmw3-@n9P8avUJ(_(30zuYA{pG*CqT(<%yco6}Rob z^_6ilXcY}NI24V47L%{s$*NNb8YoX`iSSLNlp?=55W=OUw__d9+`=3F+0G5s;K9gu z-DD3ktt_-rn4#@yI12wZfh^kThlZ($*?iJ5GosUM zYT9;>hiFp4a!pnMzybhs9mwfNf7mn`5iH@N{M*4CxU;-_rUW&boR!~jdvkET2!3BM z&GP0?`El8BGIpFlFS1@i*yIUP(8m5uly0Q>8~hE$yK{c0^UpZ8+4R(ha-IvLg9Ce> zAiid~CbvL@H!EEUr7=B>X0pcLBz!>bzoG9okr&3}WlgKfQM5pfI|BFcQj|2oS*a@y z#+RR9$h9F@agoxWNSoq;lS1athxd%`dH62>HpYM8<~A`(iA+$fR1LAHaUXqijiR=< zr;`Ep_ZL>zF1^BraAeYShsiX$p#+J?m&8mA0?NPJTp@pWbG&0alqM7uwOQxlkr-mu z`A?F^Qs=VZH?3v9ai4^qmiH=(Mc^t4QEYvAlH18a={gmJa@jSXB4(EhXAMw#?q_Vv z#gD?Bw($n`_v!tRKe<62hG9yUz!4vM%ScS(_H-L7Roz3$stxCQ^H(OfiD`@Iazut@ zLSM!TV~iz_TR$QH(Q-y>&TCFV6pbK?jgWC+Otj|yCDY^)g>o6aHC^dQ|Mw&A)#alQ zH;Y`sZ(%*k&N8uH-_T6(9&I9by9SI_xNT5d8d-wa_EE7h1-IjZaYT(2|CvXm6p(%@ z(>$OqMr|aVtunIB+*54#H@P4ev&0}d$5_RQ$R0LVTl|TbelP!t*hZ5Ge^ut`l~KdV zJLle@=PJ&4u@@V7NIbQGBBLKE9%QkP$+W7qD}%nVm(1l|HsOeJH8cL`G%4IC9zn>t z%sd?>jHv$YlnLkTEel-Hr+>k-ng5M8HjL*S4L zN8$U}gA}*36=M%KiP#Gm0n#rQ67e5$!F;*=?6}>rYV@ueRZAyLr|nnucvQfO=|t2d znZGsG3g-Svi#1@NxfT(N^RgSex?7d9W_c#P*ca7v3q6N(qm@gsA~gOv4k zAb(#QRijv=jUfk*8RPl$rzrV%xfpvMR!4+|a=!>We-tl8w?!0>Kaw|v!n^zPES`-z z+SU>iS(ZqwYNqy@FxX6*Z#%9ZN0hCZvA@ftkkoAg;kc*T`q{8GkeMmD$fn|gYu5o< zFeWV2k)AGn#=wtzt6&xDX(7m_QVO>qU`Jt;(jk|fk?BI{`p4JFAJ%>Owx!2#M8%pJ zS-Va2X4-1gKF`p`b3g5U8h<^Kr{%@F`{69Uh$6ZezNQ)4+4vc??F%Z+GOS%Nras39lF-3$+SY;7DG*jT&v`h%BVGpF$?wYN%`x zIP#B&jkPG5R*uJ|MiO_-V-p>YNH0e*WK@KGZ~fu)Hio~e_CT~HGG%lF^${X%Lk50tynlcX-90%aaoqZd!mSd}o1F$RRsG;87Jo@^DH-2AmY1-~ zyPJ0wZ}T|XmL7A}P1F2X`~D|}TWtZAOt{R?vdmSz3OTWAuR{~+_%)Qa!kMmzS-nh1 z64)#bGD;PwTLlDWJ`LPA=I1qcIk;?$lWUSFM|4Bn*p2&*FCv$^CbBh! z_S%Oan4lz|2lmg@5A3y@HXt7e%;^m_DV|b?T)zPO$RE(B=8gxic>8r?UHJPYt;csv zDcoNAD4c%it_}_CmHFpr!aK!aIau+N;%{Gi$TeLvqc^1M!4!hqzqpmN&M1P$dT8SY z)W2&I{aKW!QMOPC(T=@1Fl^LK+NqOAT}(zF|J{kp0%!%Zm{|u zF&%cuJ|jspdxHm~yzY)1{299@)?aNc#)l)y+{}pCWg_~sjf-t#i`Zj)Ud^tgeDs3|rk-Ith zDBwkQYf28Ng?1LTvk=hGHGVF(*pRK*nDu{97oNC=`*)3><6%9Bk;hp`=@qou#9@V7hvU zn9e_B7lzU3UAL-G$D69?c4af@>7JUd_9CV&frNu*))7y}9Y=Ej!|xl$CW&I7I zT`t1^4M-2BBoDGx*n>Tn*k zou*yYb8-Uh@mrnav!V;V8Xh zu@k30+y`@25?bMN&s>|sHYXX}av-aQfmNaRdy6$*7Ol1GI$3A>;bb8!y3)iX?FNsH zo%L`FqqydywoK;uT+72YFX-Lk0jdEs<}8oy+H$$t7=LT5s>qABFCl5f?nf)N{KI4Y z#bOR|Cpyvr-T4k^6K1ey9C)zO|A)5+8Gt3ku9=A4RY`)*fzi?WWeoYIPQS(nygg zz3=}XZDE{Y**B-{nijTcPUltvSvc8&^kAdnu`NKi=(VjjU6;B3ppG1h6!kQiOWxEl zk;kXfLn|u2FUFIYQe+2|5p)be^(_b~vj@uZb&vAdU(~Bgx=fTEuP84(uG#QRubqg< zpU@`4|NR6pG-eB1a7vp#hlqh4*u>xoVSEp}@Lc?tc@J+gH@~^w*_BDLeVqQ?*7LFM z$lu2c&c_o5u!WfTX$%OXOoSi1!oS)Di&j{uWegBppbjy3V2}l}f`$)d#R9LLO-$ojw_dwzXEyeIM>^~GTAus^f+j_a%WZb*Cywe z^HY^%4|N;k1gK##DT*n6B#oqOAb);}qHXNIx{8=)bY#ki&^y+AGeFc;P#jGvlQAq} zH|I6kkz!2L@CMYpxXB7aOeQ7;%LXlASG;TxJ@R5?Jj8&){b&Xdn`o6 zqIiZ8HxQ0R)Sw8#N>_{(8#Zp-Hav|qlez0}V&pfZr@{=NN`Sv{2_J^il(;qa$ok2I`u=uNa@ab?|R66={w77BZ#5!%3mAdmnVi)8vogBf~x>9#NNF zyfV`ZZ+aUaP`*!Tr(~O^Yo!Fr9$XGCd+xm(Cd=^AV?17oMYqE${qZLBo_&7pJ?C*U z`jxcKIWd!gEd!uUn4m!k(v}Ix{W7BpUZl7}vxrz|Dvj|R5jA#)oc!;Ne#CjDdx)rZ z3(Vxzh7>^cJgQ|C8ys~(_4&Gj8nHW1y=N+&6oD7-pJxge3vU%))``z2TG|J;h^coy zJ`3fR8zRd*(`Gz2e%!GKHjmP*(3=q5`NsovAmPoM-Z6F!DJ;^T`g z+YZppI#`>XsSo-Wnl9`y8b?EWGbdo-9eRMXzcMq1d`yS*xAx19@w^QCAf5vP*bD-= z5zW;U;n|odVO|t?94Wu?hl1`DnvgDaJ3DIw9~^h$(NIy}#OrAN(Tf|H?S8Q<2L*$c zm~>T{CS>4~%bO?nGq@#hT3C`2T2yw)Az>OY>2UaFnPBck1NlEPAK+E;za8lszyr7H zj@({O%c`~}a`RpPSOQIWD2KC}(Z zoWOCdYhEJJvuc^#ay2b=+24#P(LdF>mV*IUIj~_QWG6S$-RZupy1?f<;d@9J286j-i-jBuW8&!LJOg$Wa*ARWIOX_p zPgtirfYLO{#LvXjP5+f?=|54jS`jw+;0rY-KP#};I|gCtVmi0uEfkV3^v!h&FvL~l1fTTb$7)N#paw4f~F+@GiEmB!j%vRX9 z!+fF4$pP(dBYG)#WTON7COpFWC|{}ZHAy+=7hudVaB7O`xod~@_t0~huDJ6`7~Cdo z8a$!0PV)gn*>nebex;tbx5PNA3N?k1@;^DP0t{1zz|0yQZn3%?Jd5<9U)^<(AsUVz zE=VVW5}904Y!~Ox+JlN`_s=HGQ!R#VRy-%ed^3S9=3qm%>uJBTM-RV7@slMtME{XI zK0L#>s|T?N2P`N_HvE0rj4!q6E%bK>?bIYK$IEV^RcF9n=}pOXyMrY7Da-d{^~hQ| z_F^V6#J3czyTJvLN*`L6ZUANDANi)WbJDm9rbdJ`;cHNnq<{*Sc(WRPQAZHDdlzHh z92mXWaIK+r4Z(1ZHht!J%1!s@cz#eC*$DefB#vthO+%hQ=X>XY+l$0cr^}2zLXjDZ zS$=z2h+xPE(4g>~__zgS_+wi`Zs+1QDogQ2Z%T+OAN2LUQOQoge#4&!j5D?1ZbL&t`k0r^G{zxF?f>U3j-6Q?Qat_!}apC zL^o(d9s2PCl|H~Na8!!T)FkobxJfEMdHmxDDF!EiisFYwojMF1#wf8l3Ea-bRhq6& z#kExzSen27TfK0g!cQGMyKgw01#h4BIvsOh8;&7{y2qzMrLSx;^e?Eed-R0pz^p6QOlE|mmy@UxcA>!3dQ1EKy8)_ zP+I}i=BQwJK11}&jI-le@ED!<8>Y+M2xBw>ZosXBk0L4N>lcjV6|>d`{0^NMWN3G&ROIWCxFM z{GqD(uasm+5)ZNV2~WCXn-{(Q$Gp;Zw=i?pkywm`Un-&@$s^ImJ3u>C?d2B|2OBSP z_J6w88cgoddW9LSX1MdTB{+@v`qcZjYNcZN&yP0|7Bu_MTH!F7Cn?cSNU-9bh?L2y*H_PUk)^9VL}JO>HKi zLtaV^Ys6*zl2Gx>TtfaTvbSS}0p}kgi|e6d-mzP-V-2BH?pYeK3%+xKe;%Z7?2jds zG<2X58K^x-bE_LpAo6(?T!B<-{9~Y)kOB=D zohS}_AqlThi@KyP>Cz=iuBo}jSS%v~7&8Re10N2(h%0DC4`$hHEiAnJ4u#30(?qnt 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
)4*pWJ+1?}b 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
tOP4F|R^sczxl}~VwNNVMj-B~MJ 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
    HM9v_wG+j3 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

    L(T}rCnN%sR);?bcFD!JX! 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 literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/meshes/cube_30k.stl b/gazebo_ros_pkgs/gazebo_plugins/test2/meshes/cube_30k.stl new file mode 100755 index 0000000000000000000000000000000000000000..3b3fd1003368c03fa924452a8770dfb0e2f44776 GIT binary patch literal 791784 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�xjYUx+V7SCk3&&hLCQF5{NYr(k-zB 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 literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/check_model.cpp b/gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/check_model.cpp new file mode 100755 index 0000000..60d9008 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/check_model.cpp @@ -0,0 +1,112 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of the Willow Garage nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*********************************************************************/ + +/* Author: John Hsu */ + +#include +#include +#include "gazebo/GetWorldProperties.h" +#include "geometry_msgs/Pose.h" +#include "std_srvs/Empty.h" + +#include +#include +#include + +// Including ros, just to be able to call ros::init(), to remove unwanted +// args from command-line. +#include + +int g_argc; +char** g_argv; + +TEST(SpawnTest, spawnSingleBox) +{ + ros::NodeHandle nh(""); + // make the service call to spawn model + ros::service::waitForService("gazebo/get_world_properties"); + ros::ServiceClient check_model_client = nh.serviceClient("gazebo/get_world_properties"); + gazebo::GetWorldProperties world_properties; + + + bool found = false; + + // test duration + double test_duration = 10.0; // default to 10 seconds sim time + try + { + test_duration = boost::lexical_cast(g_argv[1]); + } + catch (boost::bad_lexical_cast &e) + { + ROS_ERROR_NAMED("check_model", "first argument of check_model should be timeout"); + return; + } + ros::Time timeout = ros::Time::now() + ros::Duration(test_duration); + + // model name to look for + std::string model_name = std::string(g_argv[2]); + ROS_INFO_NAMED("check_model", "looking for model: %s",model_name.c_str()); + + while (!found && ros::Time::now() < timeout) + { + check_model_client.call(world_properties); + for (std::vector::iterator mit = world_properties.response.model_names.begin(); + mit != world_properties.response.model_names.end(); + mit++) + { + if (*mit == model_name) + { + found = true; + break; + } + } + } + + ASSERT_TRUE(found); + + SUCCEED(); +} + + + + +int main(int argc, char** argv) +{ + ros::init(argc, argv, "test", ros::init_options::AnonymousName); + testing::InitGoogleTest(&argc, argv); + g_argc = argc; + g_argv = argv; + return RUN_ALL_TESTS(); +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box.cpp b/gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box.cpp new file mode 100755 index 0000000..bf32a56 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box.cpp @@ -0,0 +1,163 @@ +/********************************************************************* +* Software License Agreement (BSD License) +* +* Copyright (c) 2008, Willow Garage, Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of the Willow Garage nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*********************************************************************/ + +/* Author: John Hsu */ + +#include +#include +#include "gazebo/SpawnModel.h" +#include "gazebo/GetWorldProperties.h" +#include "gazebo/DeleteModel.h" +#include "geometry_msgs/Pose.h" +#include "std_srvs/Empty.h" + +#include +#include + +// Including ros, just to be able to call ros::init(), to remove unwanted +// args from command-line. +#include + +int g_argc; +char** g_argv; + +TEST(SpawnTest, spawnSingleBox) +{ + ros::NodeHandle nh(""); + // make the service call to spawn model + ros::service::waitForService("gazebo/spawn_urdf_model"); + ros::ServiceClient spawn_model_client = nh.serviceClient("gazebo/spawn_urdf_model"); + gazebo::SpawnModel spawn_model; + spawn_model.request.model_name = "box1"; + + // load urdf file + std::string urdf_filename = std::string(g_argv[1]); + ROS_DEBUG_NAMED("spawn_box", "loading file: %s",urdf_filename.c_str()); + // read urdf / gazebo model xml from file + TiXmlDocument xml_in(urdf_filename); + xml_in.LoadFile(); + std::ostringstream stream; + stream << xml_in; + spawn_model.request.model_xml = stream.str(); // load xml file + ROS_DEBUG_NAMED("spawn_box", "XML string: %s",stream.str().c_str()); + + spawn_model.request.robot_namespace = ""; + geometry_msgs::Pose pose; + pose.position.x = pose.position.y = 0; pose.position.z = 1; + pose.orientation.w = 1.0; pose.orientation.x = pose.orientation.y = pose.orientation.z = 0; + spawn_model.request.initial_pose = pose; + spawn_model.request.reference_frame = ""; + + ASSERT_TRUE(spawn_model_client.call(spawn_model)); + + SUCCEED(); +} + + +TEST(SpawnTest, spawnBoxStack) +{ + ros::NodeHandle nh(""); + // make the service call to spawn model + ros::service::waitForService("gazebo/spawn_urdf_model"); + ros::ServiceClient spawn_model_client = nh.serviceClient("gazebo/spawn_urdf_model"); + gazebo::SpawnModel spawn_model; + + // load urdf file + std::string urdf_filename = std::string(g_argv[1]); + ROS_DEBUG_NAMED("spawn_box", "loading file: %s",urdf_filename.c_str()); + // read urdf / gazebo model xml from file + TiXmlDocument xml_in(urdf_filename); + xml_in.LoadFile(); + std::ostringstream stream; + stream << xml_in; + spawn_model.request.model_xml = stream.str(); // load xml file + ROS_DEBUG_NAMED("spawn_box", "XML string: %s",stream.str().c_str()); + + spawn_model.request.robot_namespace = ""; + spawn_model.request.reference_frame = ""; + + // spawn 10 boxes + for (int i=0;i<10;i++) + { + std::ostringstream mn_stream; + mn_stream << "box_" << i; + spawn_model.request.model_name = mn_stream.str(); + geometry_msgs::Pose pose; + pose.position.x = pose.position.y = 0; pose.position.z = 1 + 2.0*(i+1); + pose.orientation.w = 1.0; pose.orientation.x = pose.orientation.y = pose.orientation.z = 0; + spawn_model.request.initial_pose = pose; + ASSERT_TRUE(spawn_model_client.call(spawn_model)); + } + + SUCCEED(); +} + +TEST(DeleteTest, deleteAllModels) +{ + ros::NodeHandle nh(""); + // make the service call to delete model + ros::service::waitForService("gazebo/delete_model"); + ros::ServiceClient delete_model_client = nh.serviceClient("gazebo/delete_model"); + gazebo::DeleteModel delete_model; + + // model names to delete + ros::service::waitForService("gazebo/get_world_properties"); + ros::ServiceClient check_model_client = nh.serviceClient("gazebo/get_world_properties"); + gazebo::GetWorldProperties world_properties; + // get all models in the world and loop through deleting each one + check_model_client.call(world_properties); + for (std::vector::iterator mit = world_properties.response.model_names.begin(); + mit != world_properties.response.model_names.end(); + mit++) + { + delete_model.request.model_name = *mit; + ASSERT_TRUE(delete_model_client.call(delete_model)); + } + + // should have no more models in the world + check_model_client.call(world_properties); + ASSERT_TRUE(world_properties.response.model_names.empty()); + + SUCCEED(); +} + + +int main(int argc, char** argv) +{ + ros::init(argc, argv, "test", ros::init_options::AnonymousName); + testing::InitGoogleTest(&argc, argv); + g_argc = argc; + g_argv = argv; + return RUN_ALL_TESTS(); +} diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box.launch b/gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box.launch new file mode 100755 index 0000000..6123c56 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box.launch @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box_file.launch b/gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box_file.launch new file mode 100755 index 0000000..de46c64 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box_file.launch @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box_param.launch b/gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box_param.launch new file mode 100755 index 0000000..6713191 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/spawn_model/spawn_box_param.launch @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/trimesh_tests/test_trimesh.launch b/gazebo_ros_pkgs/gazebo_plugins/test2/trimesh_tests/test_trimesh.launch new file mode 100755 index 0000000..50b73c0 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/trimesh_tests/test_trimesh.launch @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/urdf/box.urdf b/gazebo_ros_pkgs/gazebo_plugins/test2/urdf/box.urdf new file mode 100755 index 0000000..0a03771 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/urdf/box.urdf @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + Gazebo/Blue + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/urdf/cube.urdf b/gazebo_ros_pkgs/gazebo_plugins/test2/urdf/cube.urdf new file mode 100755 index 0000000..527ae50 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/urdf/cube.urdf @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + Gazebo/GrayGrid + false + + diff --git a/gazebo_ros_pkgs/gazebo_plugins/test2/worlds/empty.world b/gazebo_ros_pkgs/gazebo_plugins/test2/worlds/empty.world new file mode 100755 index 0000000..b290d8c --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_plugins/test2/worlds/empty.world @@ -0,0 +1,130 @@ + + + + + 4 + 5 + + + + + + 0.001 + 0 0 -9.8 + 0.0000000001 + 0.2 + true + 10 + 1.3 + 100.0 + 0.001 + + + + 37.4270909558-122.077919338 + + + + fltk + 480 320 + 0 0 + + + + 0.3 0 3 + 0 90 90 + + + + + + + + 0.5 0.5 0.5 0.5 + + Gazebo/CloudySky + + false + 10. + none + false + + + + + 0 0 0 + 0 0 0 + true + + + + 2000.0 + 50.0 + 50.0 + 1000000000.0 + 1.0 + 0 0 1 + 51.3 51.3 + 10 10 + 100 100 + Gazebo/GrayGrid + + + + + + + + + + 0.0 0.0 8 + false + + point + 0.5 0.5 0.5 + .1 .1 .1 + 0.2 0.1 0 + 10 + + + + diff --git a/gazebo_ros_pkgs/gazebo_ros/CHANGELOG.rst b/gazebo_ros_pkgs/gazebo_ros/CHANGELOG.rst new file mode 100755 index 0000000..cbe3963 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/CHANGELOG.rst @@ -0,0 +1,409 @@ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Changelog for package gazebo_ros +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +2.5.15 (2018-02-12) +------------------- +* Fix last gazebo8 warnings! (`#658 `_) +* Fix for relative frame errors (`#605 `_) +* Fix gazebo8 warnings part 10: ifdefs for GetModel, GetEntity, Light (`#656 `_) +* gazebo8 warnings: ifdefs for Get.*Vel() (`#653 `_) +* Prevents GAZEBO_MODEL_DATABASE_URI from being overwritten (`#644 `_) +* Fix gazebo8 warnings part 7: ifdef's for Joint::GetAngle and some cleanup (`#642 `_) +* Contributors: Hamza Merzić, R, Steven Peters + +2.5.14 (2017-12-11) +------------------- +* for gazebo8+, call functions without Get (`#639 `_) +* Fix gazebo8 warnings part 5: ignition math in gazebo_ros (`#635 `_) +* Fix gazebo8 warnings part 4: convert remaining local variables in plugins to ign-math (`#633 `_) +* gazebo_ros: fix support for python3 (`#622 `_) +* gazebo_ros_api_plugin: improve plugin xml parsing (`#625 `_) +* Replace Events::Disconnect* with pointer reset (`#623 `_) +* Install spawn_model using catkin_install_python (`#621 `_) +* [gazebo_ros] don't overwrite parameter "use_sim_time" (`#606 `_) + * Parameter /use_sim_time is only set if not present on Parameter Server +* Contributors: Jose Luis Rivero, Manuel Ilg, Mike Purvis, Nils Rokita, Steven Peters + +2.5.13 (2017-06-24) +------------------- +* Quote arguments to echo in libcommon.sh (`#590 `_) +* Add catkin package(s) to provide the default version of Gazebo (`#571 `_) + * Added catkin package gazebo_dev which provides the cmake config of the installed Gazebo version +* Contributors: Jose Luis Rivero, daewok + +2.5.12 (2017-04-25) +------------------- + +2.5.11 (2017-04-18) +------------------- +* Changed the spawn model methods to spawn also lights. (`#511 `_) +* Change build system to set DEPEND on Gazebo/SDFormat (fix catkin warning) + Added missing DEPEND clauses to catkin_package to fix gazebo catkin warning. + Note that after the change problems could appear related to -lpthreads + errors. This is an known issue related to catkin: + https://github.com/ros/catkin/issues/856. +* Use correct logerr method (`#557 `_) +* Contributors: Alessandro Ambrosano, Dave Coleman, Gary Servin + +2.5.10 (2017-03-03) +------------------- +* Revert catkin warnings to fix regressions (problems with catkin -lpthreads errors) + For reference and reasons, please check: + https://discourse.ros.org/t/need-to-sync-new-release-of-rqt-topic-indigo-jade-kinetic/1410/4 + * Revert "Fix gazebo catkin warning, cleanup CMakeLists (`#537 `_)" + This reverts commit 5a0305fcb97864b66bc2e587fc0564435b4f2034. + * Revert "Fix gazebo and sdformat catkin warnings" + This reverts commit 11f95d25dcd32faccd2401d45c722f7794c7542c. +* Contributors: Jose Luis Rivero + +2.5.9 (2017-02-20) +------------------ +* Fix gazebo catkin warning, cleanup CMakeLists (`#537 `_) +* Namespace console output (`#543 `_) +* Removed all trailing whitespace +* Contributors: Dave Coleman + +2.5.8 (2016-12-06) +------------------ +* Workaround to support gazebo and ROS arguments in the command line +* Fix ROS remapping by reverting "Remove ROS remapping arguments from gazebo_ros launch scripts. +* Fixed getlinkstate service's angular velocity return +* Honor GAZEBO_MASTER_URI in gzserver and gzclient +* Contributors: Jared, Jon Binney, Jordan Liviero, Jose Luis Rivero, Martin Pecka + +2.5.7 (2016-06-10) +------------------ + +2.5.6 (2016-04-28) +------------------ +* Remove deprecated spawn_gazebo_model service +* Contributors: Steven Peters + +2.5.5 (2016-04-27) +------------------ +* merge indigo, jade to kinetic-devel +* Upgrade to gazebo 7 and remove deprecated driver_base dependency + * Upgrade to gazebo 7 and remove deprecated driver_base dependency + * disable gazebo_ros_control until dependencies are met + * Remove stray backslash +* spawn_model: adding -b option to bond to the model and delete it on sigint +* Update maintainer for Kinetic release +* Allow respawning gazebo node. +* Contributors: Hugo Boyer, Isaac IY Saito, Jackie Kay, Jonathan Bohren, Jose Luis Rivero, Steven Peters + +2.5.3 (2016-04-11) +------------------ +* Include binary in runtime +* Remove ROS remapping arguments from gazebo_ros launch scripts. +* Contributors: Jose Luis Rivero, Martin Pecka + +2.5.2 (2016-02-25) +------------------ +* merging from indigo-devel +* Merge pull request `#302 `_ from maxbader/jade-devel-GetModelState + Header for GetModelState service request for jade-devel +* Fix invalid signal name on OS X + scripts/gazebo: line 30: kill: SIGINT: invalid signal specification +* Fix invalid signal name on OS X + scripts/gazebo: line 30: kill: SIGINT: invalid signal specification +* Restart package resolving from last position, do not start all over. +* 2.4.9 +* Generate changelog +* Import changes from jade-branch +* Add range world and launch file +* fix crash +* Set GAZEBO_CXX_FLAGS to fix c++11 compilation errors +* GetModelState modification for jade +* Contributors: Bence Magyar, Boris Gromov, Guillaume Walck, Ian Chen, John Hsu, Jose Luis Rivero, Markus Bader, Steven Peters, hsu + +2.5.1 (2015-08-16) +------------------ +* Port of Pal Robotics range sensor plugin to Jade +* Added a comment about the need of libgazebo5-dev in runtime +* Added missing files +* Added elevator plugin +* Use c++11 +* run_depend on libgazebo5-dev (`#323 `_) + Declare the dependency. + It can be fixed later if we don't want it. +* Contributors: Jose Luis Rivero, Nate Koenig, Steven Peters + +* Port of Pal Robotics range sensor plugin to Jade +* Added a comment about the need of libgazebo5-dev in runtime +* Added missing files +* Added elevator plugin +* Use c++11 +* run_depend on libgazebo5-dev +* Contributors: Jose Luis Rivero, Nate Koenig, Steven Peters + +2.5.0 (2015-04-30) +------------------ +* run_depend on libgazebo5-dev instead of gazebo5 +* Changed the rosdep key for gazebo to gazebo5, for Jade Gazebo5 will be used. +* Contributors: Steven Peters, William Woodall + +2.4.10 (2016-02-25) +------------------- +* Fix invalid signal name on OS X + scripts/gazebo: line 30: kill: SIGINT: invalid signal specification +* Restart package resolving from last position, do not start all over. +* Contributors: Boris Gromov, Guillaume Walck + +2.4.9 (2015-08-16) +------------------ +* Import changes from jade-branch +* Add range world and launch file +* fix crash +* Set GAZEBO_CXX_FLAGS to fix c++11 compilation errors +* Contributors: Bence Magyar, Ian Chen, Jose Luis Rivero, Steven Peters + +2.4.8 (2015-03-17) +------------------ +* Specify physics engine in args to empty_world.launch +* Contributors: Steven Peters + +2.4.7 (2014-12-15) +------------------ +* temporary hack to **fix** the -J joint position option (issue `#93 `_), sleeping for 1 second to avoid race condition. this branch should only be used for debugging, merge only as a last resort. +* Fixing set model state method and test +* Extended the fix for `#246 `_ also to debug, gazebo, gzclient and perf scripts. +* Update Gazebo/ROS tutorial URL +* [gazebo_ros] Fix for `#246 `_ + Fixing issue `#246 `_ in gzserver. +* Fixing handling of non-world frame velocities in setModelState. +* update headers to apache 2.0 license +* update headers to apache 2.0 license +* Contributors: John Hsu, Jose Luis Rivero, Martin Pecka, Tom Moore, ayrton04 + +2.4.6 (2014-09-01) +------------------ +* Merge pull request `#232 `_ from ros-simulation/fix_get_physics_properties_non_ode + Fix get physics properties non ode +* Merge pull request `#183 `_ from ros-simulation/issue_182 + Fix STL iterator errors, misc. cppcheck (`#182 `_) +* check physics engine type before calling set_physics_properties and get_physics_properteis +* check physics engine type before calling set_physics_properties and get_physics_properteis +* Fixes for calling GetParam() with different physic engines. +* 2.3.6 +* Update changelogs for the upcoming release +* Fixed boost any cast +* Removed a few warnings +* Update for hydro + gazebo 1.9 +* Fix build with gazebo4 and indigo +* Fix STL iterator errors, misc. cppcheck (`#182 `_) + There were some errors in STL iterators. + Initialized values of member variables in constructor. + Removed an unused variable (model_name). +* Contributors: Carlos Aguero, John Hsu, Jose Luis Rivero, Nate Koenig, Steven Peters, hsu, osrf + +2.4.5 (2014-08-18) +------------------ +* Port fix_build branch for indigo-devel + See pull request `#221 `_ +* Contributors: Jose Luis Rivero + +2.4.4 (2014-07-18) +------------------ +* Fix repo names in package.xml's +* fix issue `#198 `_ + Operator ``==`` is not recognized by sh scripts. +* Add verbose parameter + Add verbose parameter for --verbose gazebo flag +* added osx support for gazebo start scripts +* Contributors: Arn-O, Jon Binney, Markus Achtelik, Vincenzo Comito + +2.4.3 (2014-05-12) +------------------ +* added osx support for gazebo start scripts +* Remove gazebo_ros dependency on gazebo_plugins +* Contributors: Markus Achtelik, Steven Peters + +2.4.2 (2014-03-27) +------------------ +* merging from hydro-devel +* bump patch version for indigo-devel to 2.4.1 +* merging from indigo-devel after 2.3.4 release +* "2.4.0" +* catkin_generate_changelog +* Contributors: John Hsu + +2.4.1 (2013-11-13) +------------------ + +2.3.5 (2014-03-26) +------------------ +* gazebo_ros: [less-than-minor] fix newlines +* gazebo_ros: remove assignment to self + If this is needed for any twisted reason, it should be made clear + anyway. Assuming this line is harmless and removing it because it + generates cppcheck warnings. +* Contributors: Paul Mathieu + +2.3.4 (2013-11-13) +------------------ +* rerelease because sdformat became libsdformat, but we also based change on 2.3.4 in hydro-devel. +* remove debug statement +* fix sdf spawn with initial pose +* fix sdf spawn with initial pose +* Merge branch 'hydro-devel' into ``spawn_model_pose_fix`` +* fix indentation +* Merge pull request `#142 `_ from hsu/hydro-devel + fix issue `#38 `_, gui segfault on model deletion +* Merge pull request `#140 `_ from ``v4hn/spawn_model_sleep`` + replace time.sleep by rospy.Rate.sleep +* fix spawn initial pose. When model has a non-zero initial pose and user specified initial model spawn pose, add the two. +* fix issue `#38 `_, gui segfault on model deletion by removing an obsolete call to set selected object state to "normal". +* replace time.sleep by rospy.Rate.sleep + time was not even imported, so I don't know + why this could ever have worked... +* Add time import + When using the -wait option the script fails because is missing the time import +* Use pre-increment for iterators +* Fix iterator erase() problems + +2.4.0 (2013-10-14) +------------------ + +2.3.3 (2013-10-10) +------------------ +* Cleaned up unnecessary debug output that was recently added +* Fixed issue where ``catkin_find`` returns more than one library if it is installed from both source and debian + +2.3.2 (2013-09-19) +------------------ +* Make gazebo includes use full path + In the next release of gazebo, it will be required to use the + full path for include files. For example, + `include ` will not be valid + `include ` must be done instead. +* update gazebo includes +* Fixed a minor typo in spawn_model error message when `-model` not specified + +2.3.1 (2013-08-27) +------------------ +* Cleaned up template, fixes for header files + +2.3.0 (2013-08-12) +------------------ +* gazebo_ros: fixed missing dependency on TinyXML +* gazebo_plugins: replace deprecated boost function + This is related to `this gazebo issue `_ + +2.2.1 (2013-07-29) +------------------ + +2.2.0 (2013-07-29) +------------------ +* Switched to pcl_conversions +* Remove find_package(SDF) from CMakeLists.txt + It is sufficient to find gazebo, which will export the information + about the SDFormat package. + +2.1.5 (2013-07-18) +------------------ +* gazebo_ros: fixed variable names in gazebo_ros_paths_plugin + +2.1.4 (2013-07-14) +------------------ + +2.1.3 (2013-07-13) +------------------ + +2.1.2 (2013-07-12) +------------------ +* Added author +* Tweak to make SDFConfig.cmake +* Cleaned up CMakeLists.txt for all gazebo_ros_pkgs +* Cleaned up gazebo_ros_paths_plugin +* 2.1.1 + +2.1.1 (2013-07-10 19:11) +------------------------ +* Merge branch 'hydro-devel' of github.com:ros-simulation/gazebo_ros_pkgs into hydro-devel +* Reduced number of debug msgs +* Fixed physics dynamic reconfigure namespace +* gazebo_ros_api_plugin: set `plugin_loaded_` flag to true in + GazeboRosApiPlugin::Load() function +* Actually we need `__init__.py` +* Cleaning up code +* Moved gazebo_interface.py from gazebo/ folder to gazebo_ros/ folder +* Removed searching for plugins under 'gazebo' pkg because of rospack warnings +* Minor print modification +* Added dependency to prevent missing msg header, cleaned up CMakeLists + +2.1.0 (2013-06-27) +------------------ +* gazebo_ros: added deprecated warning for packages that use gazebo as + package name for exported paths +* Hiding some debug info +* gazebo_ros: use rosrun in debug script, as rospack find gazebo_ros returns the wrong path in install space +* Hide Model XML debut output to console +* gazebo_ros_api_plugin.h is no longer exposed in the include folder +* Added args to launch files, documentation +* Merge pull request `#28 `_ from osrf/no_roscore_handling + Better handling of gazebo_ros run when no roscore started +* gazebo_ros: also support gazebo instead of gazebo_ros as package name for plugin_path, gazebo_model_path or gazebo_media_path exports +* gazebo_plugins/gazebo_ros: fixed install directories for include files and gazebo scripts +* changed comment location +* added block comments for walkChildAddRobotNamespace +* SDF and URDF now set robotNamespace for plugins +* Better handling of gazebo_ros run when no roscore started + +2.0.2 (2013-06-20) +------------------ +* Added Gazebo dependency +* changed the final kill to send a SIGINT and ensure only the last background process is killed. +* modified script to work in bash correctly (tested on ubuntu 12.04 LTS) + +2.0.1 (2013-06-19) +------------------ +* Incremented version to 2.0.1 +* Fixed circular dependency, removed deprecated pkgs since its a stand alone pkg +* Shortened line lengths of function headers + +2.0.0 (2013-06-18) +------------------ +* Changed version to 2.0.0 based on gazebo_simulator being 1.0.0 +* Updated package.xml files for ros.org documentation purposes +* Combined updateSDFModelPose and updateSDFName, added ability to spawn SDFs from model database, updates SDF version to lastest in parts of code, updated the tests +* Renamed Gazebo model to SDF model, added ability to spawn from online database +* Fixed really obvious error checking bug +* Deprecated -gazebo arg in favor of -sdf tag +* Reordered services and messages to be organized and reflect documentation. No code change +* Cleaned up file, addded debug info +* Merged changes from Atlas ROS plugins, cleaned up headers +* Small fixes per ffurrer's code review +* Deprecated warnings fixes +* Cleaned up comment blocks - removed from .cpp and added to .h +* Merged branches and more small cleanups +* Small compile error fix +* Standardized function and variable naming convention, cleaned up function comments +* Reduced debug output and refresh frequency of robot spawner +* Converted all non-Gazebo pointers to boost shared_ptrs +* Removed old Gazebo XML handling functions - has been replaced by SDF, various code cleanup +* Removed the physics reconfigure node handle, switched to async ROS spinner, reduced required while loops +* Fixed shutdown segfault, renamed `rosnode_` to `nh_`, made all member variables have `_` at end, formatted functions +* Added small comment +* adding install for gazebo_ros launchfiles +* Formatted files to be double space indent per ROS standards +* Started fixing thread issues +* Fixing install script names and adding gzserver and gdbrun to install command +* Fixed deprecated warnings, auto formatted file +* Cleaned up status messages +* Added -h -help --help arguemnts to spawn_model +* Removed broken worlds +* Removed deprecated namespace argument +* Using pkg-config to find the script installation path. + Corrected a bash typo with client_final variable in gazebo script. +* Cleaning up world files +* Deprecated fix +* Moved from gazebo_worlds +* Cleaning up launch files +* Moved from gazebo_worlds +* Fixing renaming errors +* Updated launch and world files and moved to gazebo_ros +* Combined gzclient and gzserver +* Added finished loading msg +* All packages building in Groovy/Catkin +* Imported from bitbucket.org diff --git a/gazebo_ros_pkgs/gazebo_ros/CMakeLists.txt b/gazebo_ros_pkgs/gazebo_ros/CMakeLists.txt new file mode 100755 index 0000000..4859288 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/CMakeLists.txt @@ -0,0 +1,109 @@ +cmake_minimum_required(VERSION 2.8.3) +project(gazebo_ros) + +find_package(catkin REQUIRED COMPONENTS + gazebo_dev + cmake_modules + roslib + roscpp + geometry_msgs + std_srvs + tf + rosgraph_msgs + dynamic_reconfigure + std_msgs + gazebo_msgs +) + +include (FindPkgConfig) +if (PKG_CONFIG_FOUND) + pkg_check_modules(XML libxml-2.0) +else() + message(FATAL_ERROR "pkg-config is required; please install it") +endif() + +find_package(Boost REQUIRED COMPONENTS thread) + +find_package(TinyXML REQUIRED) + +catkin_python_setup() + +generate_dynamic_reconfigure_options(cfg/Physics.cfg) + +catkin_package( + LIBRARIES + gazebo_ros_api_plugin + gazebo_ros_paths_plugin + + CATKIN_DEPENDS + roslib + roscpp + geometry_msgs + std_srvs + tf + rosgraph_msgs + dynamic_reconfigure + std_msgs + gazebo_msgs + + DEPENDS + TinyXML +) + +include_directories( + include + ${Boost_INCLUDE_DIRS} + ${catkin_INCLUDE_DIRS} + ${TinyXML_INCLUDE_DIRS}) + +link_directories(${catkin_LIBRARY_DIRS}) + +set(cxx_flags) +foreach (item ${GAZEBO_CFLAGS}) + set(cxx_flags "${cxx_flags} ${item}") +endforeach () + +set(ld_flags) +foreach (item ${GAZEBO_LDFLAGS}) + set(ld_flags "${ld_flags} ${item}") +endforeach () + +## Plugins +add_library(gazebo_ros_api_plugin src/gazebo_ros_api_plugin.cpp) +add_dependencies(gazebo_ros_api_plugin ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) +set_target_properties(gazebo_ros_api_plugin PROPERTIES LINK_FLAGS "${ld_flags}") +set_target_properties(gazebo_ros_api_plugin PROPERTIES COMPILE_FLAGS "${cxx_flags}") +target_link_libraries(gazebo_ros_api_plugin ${catkin_LIBRARIES} ${Boost_LIBRARIES} ${TinyXML_LIBRARIES}) + +add_library(gazebo_ros_paths_plugin src/gazebo_ros_paths_plugin.cpp) +add_dependencies(gazebo_ros_paths_plugin ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) +set_target_properties(gazebo_ros_paths_plugin PROPERTIES COMPILE_FLAGS "${cxx_flags}") +set_target_properties(gazebo_ros_paths_plugin PROPERTIES LINK_FLAGS "${ld_flags}") +target_link_libraries(gazebo_ros_paths_plugin ${catkin_LIBRARIES} ${Boost_LIBRARIES}) + +# Install Gazebo System Plugins +install(TARGETS gazebo_ros_api_plugin gazebo_ros_paths_plugin + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + ) + +# Install Gazebo Scripts +install(PROGRAMS scripts/gazebo + scripts/debug + scripts/gzclient + scripts/gzserver + scripts/gdbrun + scripts/perf + scripts/libcommon.sh + DESTINATION + ${CATKIN_PACKAGE_BIN_DESTINATION} +) + +# This one is a Python program, not a shell script, so install it separately +catkin_install_python(PROGRAMS scripts/spawn_model + DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +) + +# Install Gazebo launch files +install(DIRECTORY launch/ + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch +) diff --git a/gazebo_ros_pkgs/gazebo_ros/cfg/Physics.cfg b/gazebo_ros_pkgs/gazebo_ros/cfg/Physics.cfg new file mode 100755 index 0000000..ca4ae0e --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/cfg/Physics.cfg @@ -0,0 +1,59 @@ +#! /usr/bin/env python +#* All rights reserved. +#* +#* Redistribution and use in source and binary forms, with or without +#* modification, are permitted provided that the following conditions +#* are met: +#* +#* * Redistributions of source code must retain the above copyright +#* notice, this list of conditions and the following disclaimer. +#* * Redistributions in binary form must reproduce the above +#* copyright notice, this list of conditions and the following +#* disclaimer in the documentation and/or other materials provided +#* with the distribution. +#* * Neither the name of the Willow Garage nor the names of its +#* contributors may be used to endorse or promote products derived +#* from this software without specific prior written permission. +#* +#* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +#* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +#* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +#* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +#* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +#* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +#* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +#* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +#* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +#* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +#* POSSIBILITY OF SUCH DAMAGE. +#*********************************************************** + +# Author: John Hsu +# Gazebo ode physics configuration + +PACKAGE='gazebo_ros' + +from math import pi + +from dynamic_reconfigure.parameter_generator_catkin import * + +gen = ParameterGenerator() +# Name Type Reconfiguration level Description Default Min Max +gen.add( "time_step" , double_t, 1 , "Simulation world time step size in seconds, smaller time steps producesslower, more stable simulation." , 0.001 , 0 , 10) +gen.add( "max_update_rate" , double_t, 1 , "Simulator max update rate, -1 unlimited, 1 restricts to real-time if possible." , 60 , 0 , 1000) +gen.add( "gravity_x" , double_t, 1 , "Simulated gravity in the x direction." , 0 , -100, 100) +gen.add( "gravity_y" , double_t, 1 , "Simulated gravity in the y direction." , 0 , -100, 100) +gen.add( "gravity_z" , double_t, 1 , "Simulated gravity in the z direction." , -9.8 , -100, 100) +gen.add( "auto_disable_bodies" , bool_t , 1 , "Auto disable of bodies in simulation if body it's not moving." , False) +gen.add( "sor_pgs_precon_iters" , int_t , 1 , "Number of preconditioning iterations for SOR PGS LCP as implemented in quickstep." , 0 , 0 , 10000) +gen.add( "sor_pgs_iters" , int_t , 1 , "Number of iterations for SOR PGS LCP as implemented in quickstep." , 20 , 0 , 10000) +gen.add( "sor_pgs_w" , double_t, 1 , "Relaxation parameter for SOR PGS LCP, usually set to 1.3, but reduce to stabilize simulation." , 1.3 , 0 , 5) +gen.add( "sor_pgs_rms_error_tol" , double_t, 1 , "The number of scans to skip between each measured scan" , -1 , -1 , 10000) +gen.add( "cfm" , double_t, 1 , "Constraint Force Mixing per ODE's users manual." , 0 , 0 , 10) +gen.add( "erp" , double_t, 1 , "Error Reduction Parameter per ODE's users manual." , 0.2 , 0 , 10) +gen.add( "contact_surface_layer" , double_t, 1 , "Margin for penetration for which restorative forces are not applied." , 0.001 , 0 , 10) +gen.add( "contact_max_correcting_vel", double_t, 1 , "Maximum contact penetration correction velocity." , 100 , 0 , 10000000) +gen.add( "max_contacts" , int_t , 1 , "Maximum number of contacts between any 2 bodies." , 100 , 0 , 10000000) + +exit(gen.generate(PACKAGE, "physics_node", "Physics")) diff --git a/gazebo_ros_pkgs/gazebo_ros/include/gazebo_ros/gazebo_ros_api_plugin.h b/gazebo_ros_pkgs/gazebo_ros/include/gazebo_ros/gazebo_ros_api_plugin.h new file mode 100755 index 0000000..b35b008 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/include/gazebo_ros/gazebo_ros_api_plugin.h @@ -0,0 +1,418 @@ +/* + * Copyright (C) 2012-2014 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + * Desc: External interfaces for Gazebo + * Author: Nate Koenig, John Hsu, Dave Coleman + * Date: 25 Apr 2010 + */ + +#ifndef __GAZEBO_ROS_API_PLUGIN_HH__ +#define __GAZEBO_ROS_API_PLUGIN_HH__ + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +// ROS +#include +#include +#include +#include +#include + +// Services +#include "std_srvs/Empty.h" + +#include "gazebo_msgs/JointRequest.h" +#include "gazebo_msgs/BodyRequest.h" + +#include "gazebo_msgs/SpawnModel.h" +#include "gazebo_msgs/DeleteModel.h" +#include "gazebo_msgs/DeleteLight.h" + +#include "gazebo_msgs/ApplyBodyWrench.h" + +#include "gazebo_msgs/SetPhysicsProperties.h" +#include "gazebo_msgs/GetPhysicsProperties.h" + +#include "gazebo_msgs/SetJointProperties.h" + +#include "gazebo_msgs/GetWorldProperties.h" + +#include "gazebo_msgs/GetModelProperties.h" +#include "gazebo_msgs/GetModelState.h" +#include "gazebo_msgs/SetModelState.h" + +#include "gazebo_msgs/GetJointProperties.h" +#include "gazebo_msgs/ApplyJointEffort.h" + +#include "gazebo_msgs/GetLinkProperties.h" +#include "gazebo_msgs/SetLinkProperties.h" +#include "gazebo_msgs/SetLinkState.h" +#include "gazebo_msgs/GetLinkState.h" + +#include "gazebo_msgs/GetLightProperties.h" +#include "gazebo_msgs/SetLightProperties.h" + +// Topics +#include "gazebo_msgs/ModelState.h" +#include "gazebo_msgs/LinkState.h" +#include "gazebo_msgs/ModelStates.h" +#include "gazebo_msgs/LinkStates.h" + +#include "geometry_msgs/Vector3.h" +#include "geometry_msgs/Wrench.h" +#include "geometry_msgs/Pose.h" +#include "geometry_msgs/Twist.h" + +// For model pose transform to set custom joint angles +#include +#include +#include + +// For physics dynamics reconfigure +#include +#include +#include "gazebo_msgs/SetPhysicsProperties.h" +#include "gazebo_msgs/GetPhysicsProperties.h" + +#include + +namespace gazebo +{ + +/// \brief A plugin loaded within the gzserver on startup. +class GazeboRosApiPlugin : public SystemPlugin +{ +public: + /// \brief Constructor + GazeboRosApiPlugin(); + + /// \brief Destructor + ~GazeboRosApiPlugin(); + + /// \bried Detect if sig-int shutdown signal is recieved + void shutdownSignal(); + + /// \brief Gazebo-inherited load function + /// + /// Called before Gazebo is loaded. Must not block. + /// Capitalized per Gazebo cpp style guidelines + /// \param _argc Number of command line arguments. + /// \param _argv Array of command line arguments. + void Load(int argc, char** argv); + + /// \brief ros queue thread for this node + void gazeboQueueThread(); + + /// \brief advertise services + void advertiseServices(); + + /// \brief + void onLinkStatesConnect(); + + /// \brief + void onModelStatesConnect(); + + /// \brief + void onLinkStatesDisconnect(); + + /// \brief + void onModelStatesDisconnect(); + + /// \brief Function for inserting a URDF into Gazebo from ROS Service Call + bool spawnURDFModel(gazebo_msgs::SpawnModel::Request &req, + gazebo_msgs::SpawnModel::Response &res); + + /// \brief Both SDFs and converted URDFs get sent to this function for further manipulation from a ROS Service call + bool spawnSDFModel(gazebo_msgs::SpawnModel::Request &req, + gazebo_msgs::SpawnModel::Response &res); + + /// \brief delete model given name + bool deleteModel(gazebo_msgs::DeleteModel::Request &req,gazebo_msgs::DeleteModel::Response &res); + + /// \brief delete a given light by name + bool deleteLight(gazebo_msgs::DeleteLight::Request &req,gazebo_msgs::DeleteLight::Response &res); + + /// \brief + bool getModelState(gazebo_msgs::GetModelState::Request &req,gazebo_msgs::GetModelState::Response &res); + + /// \brief + bool getModelProperties(gazebo_msgs::GetModelProperties::Request &req,gazebo_msgs::GetModelProperties::Response &res); + + /// \brief + bool getWorldProperties(gazebo_msgs::GetWorldProperties::Request &req,gazebo_msgs::GetWorldProperties::Response &res); + + /// \brief + bool getJointProperties(gazebo_msgs::GetJointProperties::Request &req,gazebo_msgs::GetJointProperties::Response &res); + + /// \brief + bool getLinkProperties(gazebo_msgs::GetLinkProperties::Request &req,gazebo_msgs::GetLinkProperties::Response &res); + + /// \brief + bool getLinkState(gazebo_msgs::GetLinkState::Request &req,gazebo_msgs::GetLinkState::Response &res); + + /// \brief + bool getLightProperties(gazebo_msgs::GetLightProperties::Request &req,gazebo_msgs::GetLightProperties::Response &res); + + /// \brief + bool setLightProperties(gazebo_msgs::SetLightProperties::Request &req,gazebo_msgs::SetLightProperties::Response &res); + + /// \brief + bool setLinkProperties(gazebo_msgs::SetLinkProperties::Request &req,gazebo_msgs::SetLinkProperties::Response &res); + + /// \brief + bool setPhysicsProperties(gazebo_msgs::SetPhysicsProperties::Request &req,gazebo_msgs::SetPhysicsProperties::Response &res); + + /// \brief + bool getPhysicsProperties(gazebo_msgs::GetPhysicsProperties::Request &req,gazebo_msgs::GetPhysicsProperties::Response &res); + + /// \brief + bool setJointProperties(gazebo_msgs::SetJointProperties::Request &req,gazebo_msgs::SetJointProperties::Response &res); + + /// \brief + bool setModelState(gazebo_msgs::SetModelState::Request &req,gazebo_msgs::SetModelState::Response &res); + + /// \brief + void updateModelState(const gazebo_msgs::ModelState::ConstPtr& model_state); + + /// \brief + bool applyJointEffort(gazebo_msgs::ApplyJointEffort::Request &req,gazebo_msgs::ApplyJointEffort::Response &res); + + /// \brief + bool resetSimulation(std_srvs::Empty::Request &req,std_srvs::Empty::Response &res); + + /// \brief + bool resetWorld(std_srvs::Empty::Request &req,std_srvs::Empty::Response &res); + + /// \brief + bool pausePhysics(std_srvs::Empty::Request &req,std_srvs::Empty::Response &res); + + /// \brief + bool unpausePhysics(std_srvs::Empty::Request &req,std_srvs::Empty::Response &res); + + /// \brief + bool clearJointForces(gazebo_msgs::JointRequest::Request &req,gazebo_msgs::JointRequest::Response &res); + bool clearJointForces(std::string joint_name); + + /// \brief + bool clearBodyWrenches(gazebo_msgs::BodyRequest::Request &req,gazebo_msgs::BodyRequest::Response &res); + bool clearBodyWrenches(std::string body_name); + + /// \brief + bool setModelConfiguration(gazebo_msgs::SetModelConfiguration::Request &req,gazebo_msgs::SetModelConfiguration::Response &res); + + /// \brief + bool setLinkState(gazebo_msgs::SetLinkState::Request &req,gazebo_msgs::SetLinkState::Response &res); + + /// \brief + void updateLinkState(const gazebo_msgs::LinkState::ConstPtr& link_state); + + /// \brief + bool applyBodyWrench(gazebo_msgs::ApplyBodyWrench::Request &req,gazebo_msgs::ApplyBodyWrench::Response &res); + +private: + + /// \brief + void wrenchBodySchedulerSlot(); + + /// \brief + void forceJointSchedulerSlot(); + + /// \brief + void publishSimTime(const boost::shared_ptr &msg); + void publishSimTime(); + + /// \brief + void publishLinkStates(); + + /// \brief + void publishModelStates(); + + /// \brief + void stripXmlDeclaration(std::string &model_xml); + + /// \brief Update the model name and pose of the SDF file before sending to Gazebo + void updateSDFAttributes(TiXmlDocument &gazebo_model_xml, + const std::string &model_name, + const ignition::math::Vector3d &initial_xyz, + const ignition::math::Quaterniond &initial_q); + + /// \brief Update the model pose of the URDF file before sending to Gazebo + void updateURDFModelPose(TiXmlDocument &gazebo_model_xml, + const ignition::math::Vector3d &initial_xyz, + const ignition::math::Quaterniond &initial_q); + + /// \brief Update the model name of the URDF file before sending to Gazebo + void updateURDFName(TiXmlDocument &gazebo_model_xml, const std::string &model_name); + + /// \brief + void walkChildAddRobotNamespace(TiXmlNode* model_xml); + + /// \brief + bool spawnAndConform(TiXmlDocument &gazebo_model_xml, const std::string &model_name, + gazebo_msgs::SpawnModel::Response &res); + + /// \brief helper function for applyBodyWrench + /// shift wrench from reference frame to target frame + void transformWrench(ignition::math::Vector3d &target_force, ignition::math::Vector3d &target_torque, + const ignition::math::Vector3d &reference_force, + const ignition::math::Vector3d &reference_torque, + const ignition::math::Pose3d &target_to_reference ); + + /// \brief Used for the dynamic reconfigure callback function template + void physicsReconfigureCallback(gazebo_ros::PhysicsConfig &config, uint32_t level); + + /// \brief waits for the rest of Gazebo to be ready before initializing the dynamic reconfigure services + void physicsReconfigureThread(); + + /// \brief Unused + void onResponse(ConstResponsePtr &response); + + /// \brief utility for checking if string is in URDF format + bool isURDF(std::string model_xml); + + /// \brief utility for checking if string is in SDF format + bool isSDF(std::string model_xml); + + /// \brief Connect to Gazebo via its plugin interface, get a pointer to the world, start events + void loadGazeboRosApiPlugin(std::string world_name); + + /// \brief convert xml to Pose + ignition::math::Pose3d parsePose(const std::string &str); + + /// \brief convert xml to Pose + ignition::math::Vector3d parseVector3(const std::string &str); + + // track if the desconstructor event needs to occur + bool plugin_loaded_; + + // detect if sigint event occurs + bool stop_; + gazebo::event::ConnectionPtr sigint_event_; + + std::string robot_namespace_; + + gazebo::transport::NodePtr gazebonode_; + gazebo::transport::SubscriberPtr stat_sub_; + gazebo::transport::PublisherPtr factory_pub_; + gazebo::transport::PublisherPtr factory_light_pub_; + gazebo::transport::PublisherPtr light_modify_pub_; + gazebo::transport::PublisherPtr request_pub_; + gazebo::transport::SubscriberPtr response_sub_; + + boost::shared_ptr nh_; + ros::CallbackQueue gazebo_queue_; + boost::shared_ptr gazebo_callback_queue_thread_; + + gazebo::physics::WorldPtr world_; + gazebo::event::ConnectionPtr wrench_update_event_; + gazebo::event::ConnectionPtr force_update_event_; + gazebo::event::ConnectionPtr time_update_event_; + gazebo::event::ConnectionPtr pub_link_states_event_; + gazebo::event::ConnectionPtr pub_model_states_event_; + gazebo::event::ConnectionPtr load_gazebo_ros_api_plugin_event_; + + ros::ServiceServer spawn_sdf_model_service_; + ros::ServiceServer spawn_urdf_model_service_; + ros::ServiceServer delete_model_service_; + ros::ServiceServer delete_light_service_; + ros::ServiceServer get_model_state_service_; + ros::ServiceServer get_model_properties_service_; + ros::ServiceServer get_world_properties_service_; + ros::ServiceServer get_joint_properties_service_; + ros::ServiceServer get_link_properties_service_; + ros::ServiceServer get_link_state_service_; + ros::ServiceServer get_light_properties_service_; + ros::ServiceServer set_light_properties_service_; + ros::ServiceServer set_link_properties_service_; + ros::ServiceServer set_physics_properties_service_; + ros::ServiceServer get_physics_properties_service_; + ros::ServiceServer apply_body_wrench_service_; + ros::ServiceServer set_joint_properties_service_; + ros::ServiceServer set_model_state_service_; + ros::ServiceServer apply_joint_effort_service_; + ros::ServiceServer set_model_configuration_service_; + ros::ServiceServer set_link_state_service_; + ros::ServiceServer reset_simulation_service_; + ros::ServiceServer reset_world_service_; + ros::ServiceServer pause_physics_service_; + ros::ServiceServer unpause_physics_service_; + ros::ServiceServer clear_joint_forces_service_; + ros::ServiceServer clear_body_wrenches_service_; + ros::Subscriber set_link_state_topic_; + ros::Subscriber set_model_state_topic_; + ros::Publisher pub_link_states_; + ros::Publisher pub_model_states_; + int pub_link_states_connection_count_; + int pub_model_states_connection_count_; + + // ROS comm + boost::shared_ptr async_ros_spin_; + + // physics dynamic reconfigure + boost::shared_ptr physics_reconfigure_thread_; + bool physics_reconfigure_initialized_; + ros::ServiceClient physics_reconfigure_set_client_; + ros::ServiceClient physics_reconfigure_get_client_; + boost::shared_ptr< dynamic_reconfigure::Server > physics_reconfigure_srv_; + dynamic_reconfigure::Server::CallbackType physics_reconfigure_callback_; + + ros::Publisher pub_clock_; + int pub_clock_frequency_; + gazebo::common::Time last_pub_clock_time_; + + /// \brief A mutex to lock access to fields that are used in ROS message callbacks + boost::mutex lock_; + + bool world_created_; + + class WrenchBodyJob + { + public: + gazebo::physics::LinkPtr body; + ignition::math::Vector3d force; + ignition::math::Vector3d torque; + ros::Time start_time; + ros::Duration duration; + }; + + class ForceJointJob + { + public: + gazebo::physics::JointPtr joint; + double force; // should this be a array? + ros::Time start_time; + ros::Duration duration; + }; + + std::vector wrench_body_jobs_; + std::vector force_joint_jobs_; + + /// \brief index counters to count the accesses on models via GetModelState + std::map access_count_get_model_state_; +}; +} +#endif diff --git a/gazebo_ros_pkgs/gazebo_ros/launch/elevator_world.launch b/gazebo_ros_pkgs/gazebo_ros/launch/elevator_world.launch new file mode 100755 index 0000000..0985392 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/launch/elevator_world.launch @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_ros/launch/empty_world (另一个复件).launch b/gazebo_ros_pkgs/gazebo_ros/launch/empty_world (另一个复件).launch new file mode 100755 index 0000000..7fba552 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/launch/empty_world (另一个复件).launch @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_ros/launch/empty_world (复件).launch b/gazebo_ros_pkgs/gazebo_ros/launch/empty_world (复件).launch new file mode 100755 index 0000000..2abae93 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/launch/empty_world (复件).launch @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_ros/launch/empty_world.launch b/gazebo_ros_pkgs/gazebo_ros/launch/empty_world.launch new file mode 100755 index 0000000..887c71b --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/launch/empty_world.launch @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_ros/launch/empty_world_o.launch b/gazebo_ros_pkgs/gazebo_ros/launch/empty_world_o.launch new file mode 100755 index 0000000..e478d26 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/launch/empty_world_o.launch @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_ros/launch/empty_world_try.launch b/gazebo_ros_pkgs/gazebo_ros/launch/empty_world_try.launch new file mode 100755 index 0000000..13d118d --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/launch/empty_world_try.launch @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_ros/launch/mud_world.launch b/gazebo_ros_pkgs/gazebo_ros/launch/mud_world.launch new file mode 100755 index 0000000..a1bdd9a --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/launch/mud_world.launch @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_ros/launch/range_world.launch b/gazebo_ros_pkgs/gazebo_ros/launch/range_world.launch new file mode 100755 index 0000000..1bff7b3 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/launch/range_world.launch @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_ros/launch/rubble_world.launch b/gazebo_ros_pkgs/gazebo_ros/launch/rubble_world.launch new file mode 100755 index 0000000..a09e264 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/launch/rubble_world.launch @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_ros/launch/shapes_world.launch b/gazebo_ros_pkgs/gazebo_ros/launch/shapes_world.launch new file mode 100755 index 0000000..56eeab4 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/launch/shapes_world.launch @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_ros/launch/willowgarage_world.launch b/gazebo_ros_pkgs/gazebo_ros/launch/willowgarage_world.launch new file mode 100755 index 0000000..ceb0b3c --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/launch/willowgarage_world.launch @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/gazebo_ros_pkgs/gazebo_ros/package.xml b/gazebo_ros_pkgs/gazebo_ros/package.xml new file mode 100755 index 0000000..d4b9f66 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/package.xml @@ -0,0 +1,42 @@ + + + gazebo_ros + 2.5.15 + + Provides ROS plugins that offer message and service publishers for interfacing with Gazebo through ROS. + Formally simulator_gazebo/gazebo + + + Jose Luis Rivero + + Apache 2.0 + + http://gazebosim.org/tutorials?cat=connect_ros + https://github.com/ros-simulation/gazebo_ros_pkgs/issues + https://github.com/ros-simulation/gazebo_ros_pkgs + + John Hsu + Nate Koenig + Dave Coleman + + catkin + + cmake_modules + gazebo_dev + + gazebo_dev + gazebo_msgs + roslib + roscpp + tf + std_srvs + rosgraph_msgs + dynamic_reconfigure + std_msgs + geometry_msgs + tinyxml + + diff --git a/gazebo_ros_pkgs/gazebo_ros/scripts/debug b/gazebo_ros_pkgs/gazebo_ros/scripts/debug new file mode 100755 index 0000000..37cd902 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/scripts/debug @@ -0,0 +1,22 @@ +#!/bin/sh +final="$@" + +EXT=so +if [ $(uname) == "Darwin" ]; then + EXT=dylib +fi + +# add ros path plugin if it does not already exist in the passed in arguments +if [ `expr "$final" : ".*libgazebo_ros_paths_plugin\.$EXT.*"` -eq 0 ] +then + final="$final -s `catkin_find --first-only libgazebo_ros_paths_plugin.$EXT`" +fi + +# add ros api plugin if it does not already exist in the passed in arguments +if [ `expr "$final" : ".*libgazebo_ros_api_plugin\.$EXT.*"` -eq 0 ] +then + final="$final -s `catkin_find --first-only libgazebo_ros_api_plugin.$EXT`" +fi + +setup_path=$(pkg-config --variable=prefix gazebo)/share/gazebo/ +. $setup_path/setup.sh && rosrun gazebo_ros gdbrun gzserver $final diff --git a/gazebo_ros_pkgs/gazebo_ros/scripts/gazebo b/gazebo_ros_pkgs/gazebo_ros/scripts/gazebo new file mode 100755 index 0000000..0e96229 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/scripts/gazebo @@ -0,0 +1,50 @@ +#!/bin/sh +[ -L ${0} ] && SCRIPT_DIR=$(readlink ${0}) || SCRIPT_DIR=${0} +SCRIPT_DIR=$(dirname ${SCRIPT_DIR}) + +. ${SCRIPT_DIR}/libcommon.sh + +final="$@" + +EXT=so +SIGNAL=SIGINT +if [ $(uname) = "Darwin" ]; then + EXT=dylib + SIGNAL=INT +fi + +# add ros path plugin if it does not already exist in the passed in arguments +if [ `expr "$final" : ".*libgazebo_ros_paths_plugin\.$EXT.*"` -eq 0 ] +then + final="$final -s `catkin_find --first-only libgazebo_ros_paths_plugin.$EXT`" +fi + +# add ros api plugin if it does not already exist in the passed in arguments +if [ `expr "$final" : ".*libgazebo_ros_api_plugin\.$EXT.*"` -eq 0 ] +then + final="$final -s `catkin_find --first-only libgazebo_ros_api_plugin.$EXT`" +fi + +client_final="-g `catkin_find --first-only libgazebo_ros_paths_plugin.$EXT`" + +setup_path=$(pkg-config --variable=prefix gazebo)/share/gazebo/ + +# source setup.sh, but keep local modifications to GAZEBO_MASTER_URI and GAZEBO_MODEL_DATABASE_URI +desired_master_uri="$GAZEBO_MASTER_URI" +desired_model_database_uri="$GAZEBO_MODEL_DATABASE_URI" +. $setup_path/setup.sh +if [ "$desired_master_uri" = "" ]; then + desired_master_uri="$GAZEBO_MASTER_URI" +fi +if [ "$desired_model_database_uri" = "" ]; then + desired_model_database_uri="$GAZEBO_MODEL_DATABASE_URI" +fi + +final=$(relocate_remappings "${final}") + +# Combine the commands +GAZEBO_MASTER_URI="$desired_master_uri" GAZEBO_MODEL_DATABASE_URI="$desired_model_database_uri" gzserver $final & +GAZEBO_MASTER_URI="$desired_master_uri" GAZEBO_MODEL_DATABASE_URI="$desired_model_database_uri" gzclient $client_final + +# Kill the server +kill -s $SIGNAL $! diff --git a/gazebo_ros_pkgs/gazebo_ros/scripts/gdbrun b/gazebo_ros_pkgs/gazebo_ros/scripts/gdbrun new file mode 100755 index 0000000..9a50384 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/scripts/gdbrun @@ -0,0 +1,25 @@ +#!/bin/bash +extra_text="" +if [ "$1" = "--break-main" ]; then + extra_text="break main" + shift +fi + +EXEC="$1" + +shift + +run_text="run" +for a in "$@"; do + run_text="${run_text} \"$a\"" +done + +TMPFILE=/tmp/gdbrun.$$.$#.tmp +cat > ${TMPFILE} <||] - source of the model xml or the trimesh file + -model - name of the model to be spawned. + -reference_frame - optinal: name of the model/body where initial pose is defined. + If left empty or specified as "world", gazebo world frame is used. + -gazebo_namespace - optional: ROS namespace of gazebo offered ROS interfaces. Defaults to /gazebo/ (e.g. /gazebo/spawn_model). + -robot_namespace - optional: change ROS namespace of gazebo-plugins. + -unpause - optional: !!!Experimental!!! unpause physics after spawning model + -wait - optional: !!!Experimental!!! wait for model to exist + -trimesh_mass - required if -trimesh is used: linear mass + -trimesh_ixx - required if -trimesh is used: moment of inertia about x-axis + -trimesh_iyy - required if -trimesh is used: moment of inertia about y-axis + -trimesh_izz - required if -trimesh is used: moment of inertia about z-axis + -trimesh_gravity - required if -trimesh is used: gravity turned on for this trimesh model + -trimesh_material - required if -trimesh is used: E.g. Gazebo/Blue + -trimesh_name - required if -trimesh is used: name of the link containing the trimesh + -x - optional: initial pose, use 0 if left out + -y - optional: initial pose, use 0 if left out + -z - optional: initial pose, use 0 if left out + -R - optional: initial pose, use 0 if left out + -P - optional: initial pose, use 0 if left out + -Y - optional: initial pose, use 0 if left out + -J - optional: initialize the specified joint at the specified value + -package_to_model - optional: convert urdf i+2: + self.joint_names.append(sys.argv[i+1]) + self.joint_positions.append(float(sys.argv[i+2])) + else: + rospy.logerr("Error: must specify a joint name and joint value pair") + sys.exit(0) + if sys.argv[i] == '-param': + if len(sys.argv) > i+1: + if self.file_name != "" or self.database_name != "": + rospy.logerr("Error: you cannot specify file name if parameter or database name is given, must pick one source of model xml") + sys.exit(0) + else: + self.param_name = sys.argv[i+1] + if sys.argv[i] == '-file': + if len(sys.argv) > i+1: + if self.param_name != "" or self.database_name != "": + rospy.logerr("Error: you cannot specify parameter if file or database name is given, must pick one source of model xml") + sys.exit(0) + else: + self.file_name = sys.argv[i+1] + if sys.argv[i] == '-database': + if len(sys.argv) > i+1: + if self.param_name != "" or self.file_name != "": + rospy.logerr("Error: you cannot specify parameter if file or parameter name is given, must pick one source of model xml") + sys.exit(0) + else: + self.database_name = sys.argv[i+1] + if sys.argv[i] == '-model': + if len(sys.argv) > i+1: + self.model_name = sys.argv[i+1] + if sys.argv[i] == '-wait': + if len(sys.argv) > i+1: + self.wait_for_model = sys.argv[i+1] + if sys.argv[i] == '-reference_frame': + if len(sys.argv) > i+1: + self.reference_frame = sys.argv[i+1] + if sys.argv[i] == '-robot_namespace': + if len(sys.argv) > i+1: + self.robot_namespace = sys.argv[i+1] + if sys.argv[i] == '-namespace': + if len(sys.argv) > i+1: + self.robot_namespace = sys.argv[i+1] + if sys.argv[i] == '-gazebo_namespace': + if len(sys.argv) > i+1: + self.gazebo_namespace = sys.argv[i+1] + if sys.argv[i] == '-x': + if len(sys.argv) > i+1: + self.initial_xyz[0] = float(sys.argv[i+1]) + if sys.argv[i] == '-y': + if len(sys.argv) > i+1: + self.initial_xyz[1] = float(sys.argv[i+1]) + if sys.argv[i] == '-z': + if len(sys.argv) > i+1: + self.initial_xyz[2] = float(sys.argv[i+1]) + if sys.argv[i] == '-R': + if len(sys.argv) > i+1: + self.initial_rpy[0] = float(sys.argv[i+1]) + if sys.argv[i] == '-P': + if len(sys.argv) > i+1: + self.initial_rpy[1] = float(sys.argv[i+1]) + if sys.argv[i] == '-Y': + if len(sys.argv) > i+1: + self.initial_rpy[2] = float(sys.argv[i+1]) + if sys.argv[i] == '-package_to_model': + self.package_to_model = True; + if sys.argv[i] == '-b': + self.bond = True + + if not self.sdf_format and not self.urdf_format: + rospy.logerr("Error: you must specify incoming format as either urdf or sdf format xml") + sys.exit(0) + if self.model_name == "": + rospy.logerr("Error: you must specify model name") + sys.exit(0) + + def checkForModel(self,model): + for n in model.name: + if n == self.wait_for_model: + self.wait_for_model_exists = True + + + # Generate a blank SDF file with an include for the model from the model database + def createDatabaseCode(self, database_name): + return model_database_template.replace("MODEL_NAME", database_name); + + def callSpawnService(self): + + # wait for model to exist + rospy.init_node('spawn_model') + + if not self.wait_for_model == "": + rospy.Subscriber("%s/model_states"%(self.gazebo_namespace), ModelStates, self.checkForModel) + r= rospy.Rate(10) + while not rospy.is_shutdown() and not self.wait_for_model_exists: + r.sleep() + + if rospy.is_shutdown(): + sys.exit(0) + + if self.file_name != "": + rospy.loginfo("Loading model XML from file") + if os.path.exists(self.file_name): + if os.path.isdir(self.file_name): + rospy.logerr("Error: file name is a path? %s", self.file_name) + sys.exit(0) + if not os.path.isfile(self.file_name): + rospy.logerr("Error: unable to open file %s", self.file_name) + sys.exit(0) + else: + rospy.logerr("Error: file does not exist %s", self.file_name) + sys.exit(0) + # load file + f = open(self.file_name,'r') + model_xml = f.read() + if model_xml == "": + rospy.logerr("Error: file is empty %s", self.file_name) + sys.exit(0) + + # ROS Parameter + elif self.param_name != "": + rospy.loginfo( "Loading model XML from ros parameter") + model_xml = rospy.get_param(self.param_name) + if model_xml == "": + rospy.logerr("Error: param does not exist or is empty") + sys.exit(0) + + # Gazebo Model Database + elif self.database_name != "": + rospy.loginfo( "Loading model XML from Gazebo Model Database") + model_xml = self.createDatabaseCode(self.database_name) + if model_xml == "": + rospy.logerr("Error: an error occured generating the SDF file") + sys.exit(0) + else: + rospy.logerr("Error: user specified param or filename is an empty string") + sys.exit(0) + + if self.package_to_model: + model_xml = re.sub("<\s*mesh\s+filename\s*=\s*([\"|'])package://","model://", model_xml) + + # setting initial pose + initial_pose = Pose() + initial_pose.position.x = self.initial_xyz[0] + initial_pose.position.y = self.initial_xyz[1] + initial_pose.position.z = self.initial_xyz[2] + # convert rpy to quaternion for Pose message + tmpq = tft.quaternion_from_euler(self.initial_rpy[0],self.initial_rpy[1],self.initial_rpy[2]) + q = Quaternion(tmpq[0],tmpq[1],tmpq[2],tmpq[3]) + initial_pose.orientation = q; + + # spawn model + if self.urdf_format: + success = gazebo_interface.spawn_urdf_model_client(self.model_name, model_xml, self.robot_namespace, + initial_pose, self.reference_frame, self.gazebo_namespace) + elif self.sdf_format: + success = gazebo_interface.spawn_sdf_model_client(self.model_name, model_xml, self.robot_namespace, + initial_pose, self.reference_frame, self.gazebo_namespace) + else: + rospy.logerr("Error: should not be here in spawner helper script, there is a bug") + sys.exit(0) + + # set model configuration before unpause if user requested + if len(self.joint_names) != 0: + try: + success = gazebo_interface.set_model_configuration_client(self.model_name, self.param_name, + self.joint_names, self.joint_positions, self.gazebo_namespace) + except rospy.ServiceException as e: + rospy.logerr("Set model configuration service call failed: %s", e) + + # unpause physics if user requested + if self.unpause_physics: + rospy.wait_for_service('%s/unpause_physics'%(self.gazebo_namespace)) + try: + unpause_physics = rospy.ServiceProxy('%s/unpause_physics'%(self.gazebo_namespace), Empty) + unpause_physics() + except rospy.ServiceException as e: + rospy.logerr("Unpause physics service call failed: %s", e) + + return + + + def callDeleteService(self): + try: + delete_model = rospy.ServiceProxy('%s/delete_model'%(self.gazebo_namespace), DeleteModel) + delete_model(model_name=self.model_name) + except rospy.ServiceException as e: + rospy.logerr("Delete model service call failed: %s", e) + +if __name__ == "__main__": + if len(sys.argv) < 2: + print(usage()) + else: + print("SpawnModel script started") # make this a print incase roscore has not been started + sm = SpawnModel() + sm.parseUserInputs() + sm.callSpawnService() + + if sm.bond: + rospy.on_shutdown(sm.callDeleteService) + rospy.spin() diff --git a/gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model1 b/gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model1 new file mode 100755 index 0000000..f3f4c9b --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model1 @@ -0,0 +1,317 @@ +#!/usr/bin/env python +# +# Copyright 2013 Open Source Robotics Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Desc: helper script for spawning models in gazebo +# Author: John Hsu, Dave Coleman +# + +import rospy, sys, os, time +import string +import warnings +import re + +from gazebo_ros import gazebo_interface + +from gazebo_msgs.msg import * +from gazebo_msgs.srv import * +from std_srvs.srv import Empty +from geometry_msgs.msg import Point, Pose, Quaternion, Twist, Wrench +import tf.transformations as tft + +model_database_template = """ + + + model://MODEL_NAME + + +""" + +def usage(): + print('''Commands: + -[urdf|sdf|trimesh|gazebo] - specify incoming xml is urdf, sdf or trimesh format. gazebo arg is deprecated in ROS Hydro + -[file|param|database] [||] - source of the model xml or the trimesh file + -model - name of the model to be spawned. + -reference_frame - optinal: name of the model/body where initial pose is defined. + If left empty or specified as "world", gazebo world frame is used. + -gazebo_namespace - optional: ROS namespace of gazebo offered ROS interfaces. Defaults to /gazebo/ (e.g. /gazebo/spawn_model). + -robot_namespace - optional: change ROS namespace of gazebo-plugins. + -unpause - optional: !!!Experimental!!! unpause physics after spawning model + -wait - optional: !!!Experimental!!! wait for model to exist + -trimesh_mass - required if -trimesh is used: linear mass + -trimesh_ixx - required if -trimesh is used: moment of inertia about x-axis + -trimesh_iyy - required if -trimesh is used: moment of inertia about y-axis + -trimesh_izz - required if -trimesh is used: moment of inertia about z-axis + -trimesh_gravity - required if -trimesh is used: gravity turned on for this trimesh model + -trimesh_material - required if -trimesh is used: E.g. Gazebo/Blue + -trimesh_name - required if -trimesh is used: name of the link containing the trimesh + -x - optional: initial pose, use 0 if left out + -y - optional: initial pose, use 0 if left out + -z - optional: initial pose, use 0 if left out + -R - optional: initial pose, use 0 if left out + -P - optional: initial pose, use 0 if left out + -Y - optional: initial pose, use 0 if left out + -J - optional: initialize the specified joint at the specified value + -package_to_model - optional: convert urdf i+2: + self.joint_names.append(sys.argv[i+1]) + self.joint_positions.append(float(sys.argv[i+2])) + else: + rospy.logerr("Error: must specify a joint name and joint value pair") + sys.exit(0) + if sys.argv[i] == '-param': + if len(sys.argv) > i+1: + if self.file_name != "" or self.database_name != "": + rospy.logerr("Error: you cannot specify file name if parameter or database name is given, must pick one source of model xml") + sys.exit(0) + else: + self.param_name = sys.argv[i+1] + if sys.argv[i] == '-file': + if len(sys.argv) > i+1: + if self.param_name != "" or self.database_name != "": + rospy.logerr("Error: you cannot specify parameter if file or database name is given, must pick one source of model xml") + sys.exit(0) + else: + self.file_name = sys.argv[i+1] + if sys.argv[i] == '-database': + if len(sys.argv) > i+1: + if self.param_name != "" or self.file_name != "": + rospy.logerr("Error: you cannot specify parameter if file or parameter name is given, must pick one source of model xml") + sys.exit(0) + else: + self.database_name = sys.argv[i+1] + if sys.argv[i] == '-model': + if len(sys.argv) > i+1: + self.model_name = sys.argv[i+1] + if sys.argv[i] == '-wait': + if len(sys.argv) > i+1: + self.wait_for_model = sys.argv[i+1] + if sys.argv[i] == '-reference_frame': + if len(sys.argv) > i+1: + self.reference_frame = sys.argv[i+1] + if sys.argv[i] == '-robot_namespace': + if len(sys.argv) > i+1: + self.robot_namespace = sys.argv[i+1] + if sys.argv[i] == '-namespace': + if len(sys.argv) > i+1: + self.robot_namespace = sys.argv[i+1] + if sys.argv[i] == '-gazebo_namespace': + if len(sys.argv) > i+1: + self.gazebo_namespace = sys.argv[i+1] + if sys.argv[i] == '-x': + if len(sys.argv) > i+1: + self.initial_xyz[0] = float(sys.argv[i+1]) + if sys.argv[i] == '-y': + if len(sys.argv) > i+1: + self.initial_xyz[1] = float(sys.argv[i+1]) + if sys.argv[i] == '-z': + if len(sys.argv) > i+1: + self.initial_xyz[2] = float(sys.argv[i+1]) + if sys.argv[i] == '-R': + if len(sys.argv) > i+1: + self.initial_rpy[0] = float(sys.argv[i+1]) + if sys.argv[i] == '-P': + if len(sys.argv) > i+1: + self.initial_rpy[1] = float(sys.argv[i+1]) + if sys.argv[i] == '-Y': + if len(sys.argv) > i+1: + self.initial_rpy[2] = float(sys.argv[i+1]) + if sys.argv[i] == '-package_to_model': + self.package_to_model = True; + if sys.argv[i] == '-b': + self.bond = True + + if not self.sdf_format and not self.urdf_format: + rospy.logerr("Error: you must specify incoming format as either urdf or sdf format xml") + sys.exit(0) + if self.model_name == "": + rospy.logerr("Error: you must specify model name") + sys.exit(0) + + def checkForModel(self,model): + for n in model.name: + if n == self.wait_for_model: + self.wait_for_model_exists = True + + + # Generate a blank SDF file with an include for the model from the model database + def createDatabaseCode(self, database_name): + return model_database_template.replace("MODEL_NAME", database_name); + + def callSpawnService(self): + + # wait for model to exist + rospy.init_node('spawn_model') + + if not self.wait_for_model == "": + rospy.Subscriber("%s/model_states"%(self.gazebo_namespace), ModelStates, self.checkForModel) + r= rospy.Rate(10) + while not rospy.is_shutdown() and not self.wait_for_model_exists: + r.sleep() + + if rospy.is_shutdown(): + sys.exit(0) + + if self.file_name != "": + rospy.loginfo("Loading model XML from file") + if os.path.exists(self.file_name): + if os.path.isdir(self.file_name): + rospy.logerr("Error: file name is a path? %s", self.file_name) + sys.exit(0) + if not os.path.isfile(self.file_name): + rospy.logerr("Error: unable to open file %s", self.file_name) + sys.exit(0) + else: + rospy.logerr("Error: file does not exist %s", self.file_name) + sys.exit(0) + # load file + f = open(self.file_name,'r') + model_xml = f.read() + if model_xml == "": + rospy.logerr("Error: file is empty %s", self.file_name) + sys.exit(0) + + # ROS Parameter + elif self.param_name != "": + rospy.loginfo( "Loading model XML from ros parameter") + model_xml = rospy.get_param(self.param_name) + if model_xml == "": + rospy.logerr("Error: param does not exist or is empty") + sys.exit(0) + + # Gazebo Model Database + elif self.database_name != "": + rospy.loginfo( "Loading model XML from Gazebo Model Database") + model_xml = self.createDatabaseCode(self.database_name) + if model_xml == "": + rospy.logerr("Error: an error occured generating the SDF file") + sys.exit(0) + else: + rospy.logerr("Error: user specified param or filename is an empty string") + sys.exit(0) + + if self.package_to_model: + model_xml = re.sub("<\s*mesh\s+filename\s*=\s*([\"|'])package://","model://", model_xml) + + # setting initial pose + initial_pose = Pose() + initial_pose.position.x = self.initial_xyz[0] + initial_pose.position.y = self.initial_xyz[1] + initial_pose.position.z = self.initial_xyz[2] + # convert rpy to quaternion for Pose message + tmpq = tft.quaternion_from_euler(self.initial_rpy[0],self.initial_rpy[1],self.initial_rpy[2]) + q = Quaternion(tmpq[0],tmpq[1],tmpq[2],tmpq[3]) + initial_pose.orientation = q; + + # spawn model + if self.urdf_format: + success = gazebo_interface.spawn_urdf_model_client(self.model_name, model_xml, self.robot_namespace, + initial_pose, self.reference_frame, self.gazebo_namespace) + elif self.sdf_format: + success = gazebo_interface.spawn_sdf_model_client(self.model_name, model_xml, self.robot_namespace, + initial_pose, self.reference_frame, self.gazebo_namespace) + else: + rospy.logerr("Error: should not be here in spawner helper script, there is a bug") + sys.exit(0) + + # set model configuration before unpause if user requested + if len(self.joint_names) != 0: + try: + success = gazebo_interface.set_model_configuration_client(self.model_name, self.param_name, + self.joint_names, self.joint_positions, self.gazebo_namespace) + except rospy.ServiceException as e: + rospy.logerr("Set model configuration service call failed: %s", e) + + # unpause physics if user requested + if self.unpause_physics: + rospy.wait_for_service('%s/unpause_physics'%(self.gazebo_namespace)) + try: + unpause_physics = rospy.ServiceProxy('%s/unpause_physics'%(self.gazebo_namespace), Empty) + unpause_physics() + except rospy.ServiceException as e: + rospy.logerr("Unpause physics service call failed: %s", e) + + return + + + def callDeleteService(self): + try: + delete_model = rospy.ServiceProxy('%s/delete_model'%(self.gazebo_namespace), DeleteModel) + delete_model(model_name=self.model_name) + except rospy.ServiceException as e: + rospy.logerr("Delete model service call failed: %s", e) + +if __name__ == "__main__": + if len(sys.argv) < 2: + print(usage()) + else: + print("SpawnModel script started") # make this a print incase roscore has not been started + sm = SpawnModel() + sm.parseUserInputs() + sm.callSpawnService() + + if sm.bond: + rospy.on_shutdown(sm.callDeleteService) + rospy.spin() diff --git a/gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model2 b/gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model2 new file mode 100755 index 0000000..d64f553 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/scripts/spawn_model2 @@ -0,0 +1,317 @@ +#!/usr/bin/env python +# +# Copyright 2013 Open Source Robotics Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Desc: helper script for spawning models in gazebo +# Author: John Hsu, Dave Coleman +# + +import rospy, sys, os, time +import string +import warnings +import re + +from gazebo_ros import gazebo_interface + +from gazebo_msgs.msg import * +from gazebo_msgs.srv import * +from std_srvs.srv import Empty +from geometry_msgs.msg import Point, Pose, Quaternion, Twist, Wrench +import tf.transformations as tft + +model_database_template = """ + + + model://MODEL_NAME + + +""" + +def usage(): + print('''Commands: + -[urdf|sdf|trimesh|gazebo] - specify incoming xml is urdf, sdf or trimesh format. gazebo arg is deprecated in ROS Hydro + -[file|param|database] [||] - source of the model xml or the trimesh file + -model - name of the model to be spawned. + -reference_frame - optinal: name of the model/body where initial pose is defined. + If left empty or specified as "world", gazebo world frame is used. + -gazebo_namespace - optional: ROS namespace of gazebo offered ROS interfaces. Defaults to /gazebo/ (e.g. /gazebo/spawn_model). + -robot_namespace - optional: change ROS namespace of gazebo-plugins. + -unpause - optional: !!!Experimental!!! unpause physics after spawning model + -wait - optional: !!!Experimental!!! wait for model to exist + -trimesh_mass - required if -trimesh is used: linear mass + -trimesh_ixx - required if -trimesh is used: moment of inertia about x-axis + -trimesh_iyy - required if -trimesh is used: moment of inertia about y-axis + -trimesh_izz - required if -trimesh is used: moment of inertia about z-axis + -trimesh_gravity - required if -trimesh is used: gravity turned on for this trimesh model + -trimesh_material - required if -trimesh is used: E.g. Gazebo/Blue + -trimesh_name - required if -trimesh is used: name of the link containing the trimesh + -x - optional: initial pose, use 0 if left out + -y - optional: initial pose, use 0 if left out + -z - optional: initial pose, use 0 if left out + -R - optional: initial pose, use 0 if left out + -P - optional: initial pose, use 0 if left out + -Y - optional: initial pose, use 0 if left out + -J - optional: initialize the specified joint at the specified value + -package_to_model - optional: convert urdf i+2: + self.joint_names.append(sys.argv[i+1]) + self.joint_positions.append(float(sys.argv[i+2])) + else: + rospy.logerr("Error: must specify a joint name and joint value pair") + sys.exit(0) + if sys.argv[i] == '-param': + if len(sys.argv) > i+1: + if self.file_name != "" or self.database_name != "": + rospy.logerr("Error: you cannot specify file name if parameter or database name is given, must pick one source of model xml") + sys.exit(0) + else: + self.param_name = sys.argv[i+1] + if sys.argv[i] == '-file': + if len(sys.argv) > i+1: + if self.param_name != "" or self.database_name != "": + rospy.logerr("Error: you cannot specify parameter if file or database name is given, must pick one source of model xml") + sys.exit(0) + else: + self.file_name = sys.argv[i+1] + if sys.argv[i] == '-database': + if len(sys.argv) > i+1: + if self.param_name != "" or self.file_name != "": + rospy.logerr("Error: you cannot specify parameter if file or parameter name is given, must pick one source of model xml") + sys.exit(0) + else: + self.database_name = sys.argv[i+1] + if sys.argv[i] == '-model': + if len(sys.argv) > i+1: + self.model_name = sys.argv[i+1] + if sys.argv[i] == '-wait': + if len(sys.argv) > i+1: + self.wait_for_model = sys.argv[i+1] + if sys.argv[i] == '-reference_frame': + if len(sys.argv) > i+1: + self.reference_frame = sys.argv[i+1] + if sys.argv[i] == '-robot_namespace': + if len(sys.argv) > i+1: + self.robot_namespace = sys.argv[i+1] + if sys.argv[i] == '-namespace': + if len(sys.argv) > i+1: + self.robot_namespace = sys.argv[i+1] + if sys.argv[i] == '-gazebo_namespace': + if len(sys.argv) > i+1: + self.gazebo_namespace = sys.argv[i+1] + if sys.argv[i] == '-x': + if len(sys.argv) > i+1: + self.initial_xyz[0] = float(sys.argv[i+1]) + if sys.argv[i] == '-y': + if len(sys.argv) > i+1: + self.initial_xyz[1] = float(sys.argv[i+1]) + if sys.argv[i] == '-z': + if len(sys.argv) > i+1: + self.initial_xyz[2] = float(sys.argv[i+1]) + if sys.argv[i] == '-R': + if len(sys.argv) > i+1: + self.initial_rpy[0] = float(sys.argv[i+1]) + if sys.argv[i] == '-P': + if len(sys.argv) > i+1: + self.initial_rpy[1] = float(sys.argv[i+1]) + if sys.argv[i] == '-Y': + if len(sys.argv) > i+1: + self.initial_rpy[2] = float(sys.argv[i+1]) + if sys.argv[i] == '-package_to_model': + self.package_to_model = True; + if sys.argv[i] == '-b': + self.bond = True + + if not self.sdf_format and not self.urdf_format: + rospy.logerr("Error: you must specify incoming format as either urdf or sdf format xml") + sys.exit(0) + if self.model_name == "": + rospy.logerr("Error: you must specify model name") + sys.exit(0) + + def checkForModel(self,model): + for n in model.name: + if n == self.wait_for_model: + self.wait_for_model_exists = True + + + # Generate a blank SDF file with an include for the model from the model database + def createDatabaseCode(self, database_name): + return model_database_template.replace("MODEL_NAME", database_name); + + def callSpawnService(self): + + # wait for model to exist + rospy.init_node('spawn_model') + + if not self.wait_for_model == "": + rospy.Subscriber("%s/model_states"%(self.gazebo_namespace), ModelStates, self.checkForModel) + r= rospy.Rate(10) + while not rospy.is_shutdown() and not self.wait_for_model_exists: + r.sleep() + + if rospy.is_shutdown(): + sys.exit(0) + + if self.file_name != "": + rospy.loginfo("Loading model XML from file") + if os.path.exists(self.file_name): + if os.path.isdir(self.file_name): + rospy.logerr("Error: file name is a path? %s", self.file_name) + sys.exit(0) + if not os.path.isfile(self.file_name): + rospy.logerr("Error: unable to open file %s", self.file_name) + sys.exit(0) + else: + rospy.logerr("Error: file does not exist %s", self.file_name) + sys.exit(0) + # load file + f = open(self.file_name,'r') + model_xml = f.read() + if model_xml == "": + rospy.logerr("Error: file is empty %s", self.file_name) + sys.exit(0) + + # ROS Parameter + elif self.param_name != "": + rospy.loginfo( "Loading model XML from ros parameter") + model_xml = rospy.get_param(self.param_name) + if model_xml == "": + rospy.logerr("Error: param does not exist or is empty") + sys.exit(0) + + # Gazebo Model Database + elif self.database_name != "": + rospy.loginfo( "Loading model XML from Gazebo Model Database") + model_xml = self.createDatabaseCode(self.database_name) + if model_xml == "": + rospy.logerr("Error: an error occured generating the SDF file") + sys.exit(0) + else: + rospy.logerr("Error: user specified param or filename is an empty string") + sys.exit(0) + + if self.package_to_model: + model_xml = re.sub("<\s*mesh\s+filename\s*=\s*([\"|'])package://","model://", model_xml) + + # setting initial pose + initial_pose = Pose() + initial_pose.position.x = self.initial_xyz[0] + initial_pose.position.y = self.initial_xyz[1] + initial_pose.position.z = self.initial_xyz[2] + # convert rpy to quaternion for Pose message + tmpq = tft.quaternion_from_euler(self.initial_rpy[0],self.initial_rpy[1],self.initial_rpy[2]) + q = Quaternion(tmpq[0],tmpq[1],tmpq[2],tmpq[3]) + initial_pose.orientation = q; + + # spawn model + if self.urdf_format: + success = gazebo_interface.spawn_urdf_model_client(self.model_name, model_xml, self.robot_namespace, + initial_pose, self.reference_frame, self.gazebo_namespace) + elif self.sdf_format: + success = gazebo_interface.spawn_sdf_model_client(self.model_name, model_xml, self.robot_namespace, + initial_pose, self.reference_frame, self.gazebo_namespace) + else: + rospy.logerr("Error: should not be here in spawner helper script, there is a bug") + sys.exit(0) + + # set model configuration before unpause if user requested + if len(self.joint_names) != 0: + try: + success = gazebo_interface.set_model_configuration_client(self.model_name, self.param_name, + self.joint_names, self.joint_positions, self.gazebo_namespace) + except rospy.ServiceException as e: + rospy.logerr("Set model configuration service call failed: %s", e) + + # unpause physics if user requested + if self.unpause_physics: + rospy.wait_for_service('%s/unpause_physics'%(self.gazebo_namespace)) + try: + unpause_physics = rospy.ServiceProxy('%s/unpause_physics'%(self.gazebo_namespace), Empty) + unpause_physics() + except rospy.ServiceException as e: + rospy.logerr("Unpause physics service call failed: %s", e) + + return + + + def callDeleteService(self): + try: + delete_model = rospy.ServiceProxy('%s/delete_model'%(self.gazebo_namespace), DeleteModel) + delete_model(model_name=self.model_name) + except rospy.ServiceException as e: + rospy.logerr("Delete model service call failed: %s", e) + +if __name__ == "__main__": + if len(sys.argv) < 2: + print(usage()) + else: + print("SpawnModel script started") # make this a print incase roscore has not been started + sm = SpawnModel() + sm.parseUserInputs() + sm.callSpawnService() + + if sm.bond: + rospy.on_shutdown(sm.callDeleteService) + rospy.spin() diff --git a/gazebo_ros_pkgs/gazebo_ros/setup.py b/gazebo_ros_pkgs/gazebo_ros/setup.py new file mode 100755 index 0000000..b437c43 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/setup.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +from distutils.core import setup +from catkin_pkg.python_setup import generate_distutils_setup + +d = generate_distutils_setup() +d['packages'] = ['gazebo_ros'] +d['package_dir'] = {'':'src'} + +setup(**d) diff --git a/gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros/__init__.py b/gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros/gazebo_interface.py b/gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros/gazebo_interface.py new file mode 100755 index 0000000..e466b99 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros/gazebo_interface.py @@ -0,0 +1,52 @@ +#! /usr/bin/env python +# Wrappers around the services provided by rosified gazebo + +import sys +import rospy +import os +import time + +from gazebo_msgs.msg import * +from gazebo_msgs.srv import * +from geometry_msgs.msg import Point, Pose, Quaternion, Twist, Wrench + + +def spawn_sdf_model_client(model_name, model_xml, robot_namespace, initial_pose, reference_frame, gazebo_namespace): + rospy.loginfo("Waiting for service %s/spawn_sdf_model"%gazebo_namespace) + rospy.wait_for_service(gazebo_namespace+'/spawn_sdf_model') + try: + spawn_sdf_model = rospy.ServiceProxy(gazebo_namespace+'/spawn_sdf_model', SpawnModel) + rospy.loginfo("Calling service %s/spawn_sdf_model"%gazebo_namespace) + resp = spawn_sdf_model(model_name, model_xml, robot_namespace, initial_pose, reference_frame) + rospy.loginfo("Spawn status: %s"%resp.status_message) + return resp.success + except rospy.ServiceException as e: + print("Service call failed: %s" % e) + +def spawn_urdf_model_client(model_name, model_xml, robot_namespace, initial_pose, reference_frame, gazebo_namespace): + rospy.loginfo("Waiting for service %s/spawn_urdf_model"%gazebo_namespace) + rospy.wait_for_service(gazebo_namespace+'/spawn_urdf_model') + try: + spawn_urdf_model = rospy.ServiceProxy(gazebo_namespace+'/spawn_urdf_model', SpawnModel) + rospy.loginfo("Calling service %s/spawn_urdf_model"%gazebo_namespace) + resp = spawn_urdf_model(model_name, model_xml, robot_namespace, initial_pose, reference_frame) + rospy.loginfo("Spawn status: %s"%resp.status_message) + return resp.success + except rospy.ServiceException as e: + print("Service call failed: %s" % e) + +def set_model_configuration_client(model_name, model_param_name, joint_names, joint_positions, gazebo_namespace): + rospy.loginfo("Waiting for service %s/set_model_configuration"%gazebo_namespace) + rospy.wait_for_service(gazebo_namespace+'/set_model_configuration') + rospy.loginfo("temporary hack to **fix** the -J joint position option (issue #93), sleeping for 1 second to avoid race condition."); + time.sleep(1) + try: + set_model_configuration = rospy.ServiceProxy(gazebo_namespace+'/set_model_configuration', SetModelConfiguration) + rospy.loginfo("Calling service %s/set_model_configuration"%gazebo_namespace) + resp = set_model_configuration(model_name, model_param_name, joint_names, joint_positions) + rospy.loginfo("Set model configuration status: %s"%resp.status_message) + + return resp.success + except rospy.ServiceException as e: + print("Service call failed: %s" % e) + diff --git a/gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros/gazebo_interface.pyc b/gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros/gazebo_interface.pyc new file mode 100755 index 0000000000000000000000000000000000000000..3e5b09a3192972fb7a8786066ddb3558563d5220 GIT binary patch literal 2852 zcmds3OK&4Z5U%#yPO`8|HoI_uffZmZh=n+T5JE%u_PdH%3)1V>!Gb(Y!^GN}a7Nn> zGhZxxtFt6b6VZ5d92#pIEI7z?5=;ZIZGP~-$B+4ei6xrx1{JO9v~#9NVWNT&@8=#S zmfwg{wVY$8XB9ealuJb*OIHnA5v|x38{lbHtkY?;RIJgeNwdNY*ai&_l9#9kmrXkC zQ1(5k(-!BZPOBE}eDZ0c=u1xRpo^II&1*~#{LqHU#2KfVV{~>D2HJVm^v&EqPCPRj zdvQ9_k$IL?uS~welY4#?Vf~-19l)MrtZx_QJ$7L3@!CP*FJK$a*bgH;f~?zOndCf6 z&3tKbbWu79lW}Sh$1#WOalBsP({5hadYGjrOF2IA_&I{Nw^*LL_F`>}Kha{-EP{ZC zVzUV47(@_QWDPZ;IQjTQtSm>;s;?u`AZ}PzHayEnIZ2i;i&7B`!+R1zNcq zAm{{li;2{)i^6wNSuUKph}XRX@*ESX!@T4!qH^y-jN|_|%MD;~Ig+B@UV!MvdINML z5BL`h{)rjjUyi}Gr!cs7j=_aSl?0)yG-DB?E718XSjo$IAh5#;F1>>4_s z)z&bafx7_=E@6DuT7%}cK=Y3b%}s{pCQy7Gnz5aIv&;0RGSoH)WiLpRaX49IJ`l^? z=OulHoNI*{@}lE;n)%t%nfk$@V^gQs8;2*oo@1xldFwN0hD*?4++qMr6DJiUbh@E2 z3++63_nkN1bWEi6yu2^oX4K~xMlj_crQyiQ7(X0LiG|$|x2)+gxvn8@2o<-=KwC$U z7RE02_*X9wX^5vgMZnaC48N!q*@iTaMZvQ>xheM6on7uI={IzgG){gG%zZ}m{Bl75 zNdj|F7v#^!WkOBfc2exu@BP2&z88^@>jNs95HAW+UpeS+sjUL|@2c$zfWHfnu~n!o zjbN0;n_y~O^snTixR7EqF}qBz%$e-S0-z?E?=_n(y;9Rf5xFqu!hwsIG#7{HB9rd( oATKky04(AD`AZT7@jlnVBGMlqC +#include +#include + +namespace gazebo +{ + +GazeboRosApiPlugin::GazeboRosApiPlugin() : physics_reconfigure_initialized_(false), + world_created_(false), + stop_(false), + plugin_loaded_(false), + pub_link_states_connection_count_(0), + pub_model_states_connection_count_(0), + pub_clock_frequency_(0) +{ + robot_namespace_.clear(); +} + +GazeboRosApiPlugin::~GazeboRosApiPlugin() +{ + ROS_DEBUG_STREAM_NAMED("api_plugin", "GazeboRosApiPlugin Deconstructor start"); + + // Unload the sigint event + sigint_event_.reset(); + ROS_DEBUG_STREAM_NAMED("api_plugin", "After sigint_event unload"); + + // Don't attempt to unload this plugin if it was never loaded in the Load() function + if (!plugin_loaded_) + { + ROS_DEBUG_STREAM_NAMED("api_plugin", "Deconstructor skipped because never loaded"); + return; + } + + // Disconnect slots + load_gazebo_ros_api_plugin_event_.reset(); + wrench_update_event_.reset(); + force_update_event_.reset(); + time_update_event_.reset(); + ROS_DEBUG_STREAM_NAMED("api_plugin", "Slots disconnected"); + + if (pub_link_states_connection_count_ > 0) // disconnect if there are subscribers on exit + pub_link_states_event_.reset(); + if (pub_model_states_connection_count_ > 0) // disconnect if there are subscribers on exit + pub_model_states_event_.reset(); + ROS_DEBUG_STREAM_NAMED("api_plugin", "Disconnected World Updates"); + + // Stop the multi threaded ROS spinner + async_ros_spin_->stop(); + ROS_DEBUG_STREAM_NAMED("api_plugin", "Async ROS Spin Stopped"); + + // Shutdown the ROS node + nh_->shutdown(); + ROS_DEBUG_STREAM_NAMED("api_plugin", "Node Handle Shutdown"); + + // Shutdown ROS queue + gazebo_callback_queue_thread_->join(); + ROS_DEBUG_STREAM_NAMED("api_plugin", "Callback Queue Joined"); + + // Physics Dynamic Reconfigure + physics_reconfigure_thread_->join(); + ROS_DEBUG_STREAM_NAMED("api_plugin", "Physics reconfigure joined"); + + // Delete Force and Wrench Jobs + lock_.lock(); + for (std::vector::iterator iter = force_joint_jobs_.begin(); iter != force_joint_jobs_.end();) + { + delete (*iter); + iter = force_joint_jobs_.erase(iter); + } + force_joint_jobs_.clear(); + ROS_DEBUG_STREAM_NAMED("api_plugin", "ForceJointJobs deleted"); + for (std::vector::iterator iter = wrench_body_jobs_.begin(); iter != wrench_body_jobs_.end();) + { + delete (*iter); + iter = wrench_body_jobs_.erase(iter); + } + wrench_body_jobs_.clear(); + lock_.unlock(); + ROS_DEBUG_STREAM_NAMED("api_plugin", "WrenchBodyJobs deleted"); + + ROS_DEBUG_STREAM_NAMED("api_plugin", "Unloaded"); +} + +void GazeboRosApiPlugin::shutdownSignal() +{ + ROS_DEBUG_STREAM_NAMED("api_plugin", "shutdownSignal() recieved"); + stop_ = true; +} + +void GazeboRosApiPlugin::Load(int argc, char **argv) +{ + ROS_DEBUG_STREAM_NAMED("api_plugin", "Load"); + + // Added by zhangshuai 2019.05.10 ----Begin + /// use argv to name the gazebo ros node + std::string gazebo_node_name = "gazebo"; + for (int i = 0; i < argc; i++) + { + std::string tmp_string = argv[i]; + std::cout << "******" << i << ": " << tmp_string << std::endl; + if (tmp_string == "-gname") + { + gazebo_node_name = argv[i + 1]; + } + } + // Added by zhangshuai 2019.05.10 ----End + + // connect to sigint event + sigint_event_ = gazebo::event::Events::ConnectSigInt(boost::bind(&GazeboRosApiPlugin::shutdownSignal, this)); + + // setup ros related + if (!ros::isInitialized()) + ros::init(argc, argv, gazebo_node_name, ros::init_options::NoSigintHandler); + else + ROS_ERROR_NAMED("api_plugin", "Something other than this gazebo_ros_api plugin started ros::init(...), command line arguments may not be parsed properly."); + + // check if the ros master is available - required + while (!ros::master::check()) + { + ROS_WARN_STREAM_NAMED("api_plugin", "No ROS master - start roscore to continue..."); + // wait 0.5 second + usleep(500 * 1000); // can't use ROS Time here b/c node handle is not yet initialized + + if (stop_) + { + ROS_WARN_STREAM_NAMED("api_plugin", "Canceled loading Gazebo ROS API plugin by sigint event"); + return; + } + } + + nh_.reset(new ros::NodeHandle("~")); // advertise topics and services in this node's namespace + + // Built-in multi-threaded ROS spinning + async_ros_spin_.reset(new ros::AsyncSpinner(0)); // will use a thread for each CPU core + async_ros_spin_->start(); + + /// \brief setup custom callback queue + gazebo_callback_queue_thread_.reset(new boost::thread(&GazeboRosApiPlugin::gazeboQueueThread, this)); + + /// \brief start a thread for the physics dynamic reconfigure node + physics_reconfigure_thread_.reset(new boost::thread(boost::bind(&GazeboRosApiPlugin::physicsReconfigureThread, this))); + + // below needs the world to be created first + load_gazebo_ros_api_plugin_event_ = gazebo::event::Events::ConnectWorldCreated(boost::bind(&GazeboRosApiPlugin::loadGazeboRosApiPlugin, this, _1)); + + plugin_loaded_ = true; + ROS_INFO_NAMED("api_plugin", "Finished loading Gazebo ROS API Plugin."); +} + +void GazeboRosApiPlugin::loadGazeboRosApiPlugin(std::string world_name) +{ + // make sure things are only called once + lock_.lock(); + if (world_created_) + { + lock_.unlock(); + return; + } + + // set flag to true and load this plugin + world_created_ = true; + lock_.unlock(); + + world_ = gazebo::physics::get_world(world_name); + if (!world_) + { + //ROS_ERROR_NAMED("api_plugin", "world name: [%s]",world->Name().c_str()); + // connect helper function to signal for scheduling torque/forces, etc + ROS_FATAL_NAMED("api_plugin", "cannot load gazebo ros api server plugin, physics::get_world() fails to return world"); + return; + } + + gazebonode_ = gazebo::transport::NodePtr(new gazebo::transport::Node()); + gazebonode_->Init(world_name); + //stat_sub_ = gazebonode_->Subscribe("~/world_stats", &GazeboRosApiPlugin::publishSimTime, this); // TODO: does not work in server plugin? + factory_pub_ = gazebonode_->Advertise("~/factory"); + factory_light_pub_ = gazebonode_->Advertise("~/factory/light"); + light_modify_pub_ = gazebonode_->Advertise("~/light/modify"); + request_pub_ = gazebonode_->Advertise("~/request"); + response_sub_ = gazebonode_->Subscribe("~/response", &GazeboRosApiPlugin::onResponse, this); + + // reset topic connection counts + pub_link_states_connection_count_ = 0; + pub_model_states_connection_count_ = 0; + + /// \brief advertise all services + advertiseServices(); + + // hooks for applying forces, publishing simtime on /clock + wrench_update_event_ = gazebo::event::Events::ConnectWorldUpdateBegin(boost::bind(&GazeboRosApiPlugin::wrenchBodySchedulerSlot, this)); + force_update_event_ = gazebo::event::Events::ConnectWorldUpdateBegin(boost::bind(&GazeboRosApiPlugin::forceJointSchedulerSlot, this)); + time_update_event_ = gazebo::event::Events::ConnectWorldUpdateBegin(boost::bind(&GazeboRosApiPlugin::publishSimTime, this)); +} + +void GazeboRosApiPlugin::onResponse(ConstResponsePtr &response) +{ +} + +void GazeboRosApiPlugin::gazeboQueueThread() +{ + static const double timeout = 0.001; + while (nh_->ok()) + { + gazebo_queue_.callAvailable(ros::WallDuration(timeout)); + } +} + +void GazeboRosApiPlugin::advertiseServices() +{ + // publish clock for simulated ros time + pub_clock_ = nh_->advertise("/clock", 10); + + // Advertise spawn services on the custom queue + std::string spawn_sdf_model_service_name("spawn_sdf_model"); + ros::AdvertiseServiceOptions spawn_sdf_model_aso = + ros::AdvertiseServiceOptions::create( + spawn_sdf_model_service_name, + boost::bind(&GazeboRosApiPlugin::spawnSDFModel, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + spawn_sdf_model_service_ = nh_->advertiseService(spawn_sdf_model_aso); + + // Advertise spawn services on the custom queue + std::string spawn_urdf_model_service_name("spawn_urdf_model"); + ros::AdvertiseServiceOptions spawn_urdf_model_aso = + ros::AdvertiseServiceOptions::create( + spawn_urdf_model_service_name, + boost::bind(&GazeboRosApiPlugin::spawnURDFModel, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + spawn_urdf_model_service_ = nh_->advertiseService(spawn_urdf_model_aso); + + // Advertise delete services on the custom queue + std::string delete_model_service_name("delete_model"); + ros::AdvertiseServiceOptions delete_aso = + ros::AdvertiseServiceOptions::create( + delete_model_service_name, + boost::bind(&GazeboRosApiPlugin::deleteModel, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + delete_model_service_ = nh_->advertiseService(delete_aso); + + // Advertise delete service for lights on the custom queue + std::string delete_light_service_name("delete_light"); + ros::AdvertiseServiceOptions delete_light_aso = + ros::AdvertiseServiceOptions::create( + delete_light_service_name, + boost::bind(&GazeboRosApiPlugin::deleteLight, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + delete_light_service_ = nh_->advertiseService(delete_light_aso); + + // Advertise more services on the custom queue + std::string get_model_properties_service_name("get_model_properties"); + ros::AdvertiseServiceOptions get_model_properties_aso = + ros::AdvertiseServiceOptions::create( + get_model_properties_service_name, + boost::bind(&GazeboRosApiPlugin::getModelProperties, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + get_model_properties_service_ = nh_->advertiseService(get_model_properties_aso); + + // Advertise more services on the custom queue + std::string get_model_state_service_name("get_model_state"); + ros::AdvertiseServiceOptions get_model_state_aso = + ros::AdvertiseServiceOptions::create( + get_model_state_service_name, + boost::bind(&GazeboRosApiPlugin::getModelState, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + get_model_state_service_ = nh_->advertiseService(get_model_state_aso); + + // Advertise more services on the custom queue + std::string get_world_properties_service_name("get_world_properties"); + ros::AdvertiseServiceOptions get_world_properties_aso = + ros::AdvertiseServiceOptions::create( + get_world_properties_service_name, + boost::bind(&GazeboRosApiPlugin::getWorldProperties, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + get_world_properties_service_ = nh_->advertiseService(get_world_properties_aso); + + // Advertise more services on the custom queue + std::string get_joint_properties_service_name("get_joint_properties"); + ros::AdvertiseServiceOptions get_joint_properties_aso = + ros::AdvertiseServiceOptions::create( + get_joint_properties_service_name, + boost::bind(&GazeboRosApiPlugin::getJointProperties, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + get_joint_properties_service_ = nh_->advertiseService(get_joint_properties_aso); + + // Advertise more services on the custom queue + std::string get_link_properties_service_name("get_link_properties"); + ros::AdvertiseServiceOptions get_link_properties_aso = + ros::AdvertiseServiceOptions::create( + get_link_properties_service_name, + boost::bind(&GazeboRosApiPlugin::getLinkProperties, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + get_link_properties_service_ = nh_->advertiseService(get_link_properties_aso); + + // Advertise more services on the custom queue + std::string get_link_state_service_name("get_link_state"); + ros::AdvertiseServiceOptions get_link_state_aso = + ros::AdvertiseServiceOptions::create( + get_link_state_service_name, + boost::bind(&GazeboRosApiPlugin::getLinkState, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + get_link_state_service_ = nh_->advertiseService(get_link_state_aso); + + // Advertise more services on the custom queue + std::string get_light_properties_service_name("get_light_properties"); + ros::AdvertiseServiceOptions get_light_properties_aso = + ros::AdvertiseServiceOptions::create( + get_light_properties_service_name, + boost::bind(&GazeboRosApiPlugin::getLightProperties, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + get_light_properties_service_ = nh_->advertiseService(get_light_properties_aso); + + // Advertise more services on the custom queue + std::string set_light_properties_service_name("set_light_properties"); + ros::AdvertiseServiceOptions set_light_properties_aso = + ros::AdvertiseServiceOptions::create( + set_light_properties_service_name, + boost::bind(&GazeboRosApiPlugin::setLightProperties, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + set_light_properties_service_ = nh_->advertiseService(set_light_properties_aso); + + // Advertise more services on the custom queue + std::string get_physics_properties_service_name("get_physics_properties"); + ros::AdvertiseServiceOptions get_physics_properties_aso = + ros::AdvertiseServiceOptions::create( + get_physics_properties_service_name, + boost::bind(&GazeboRosApiPlugin::getPhysicsProperties, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + get_physics_properties_service_ = nh_->advertiseService(get_physics_properties_aso); + + // publish complete link states in world frame + ros::AdvertiseOptions pub_link_states_ao = + ros::AdvertiseOptions::create( + "link_states", 10, + boost::bind(&GazeboRosApiPlugin::onLinkStatesConnect, this), + boost::bind(&GazeboRosApiPlugin::onLinkStatesDisconnect, this), + ros::VoidPtr(), &gazebo_queue_); + pub_link_states_ = nh_->advertise(pub_link_states_ao); + + // publish complete model states in world frame + ros::AdvertiseOptions pub_model_states_ao = + ros::AdvertiseOptions::create( + "model_states", 10, + boost::bind(&GazeboRosApiPlugin::onModelStatesConnect, this), + boost::bind(&GazeboRosApiPlugin::onModelStatesDisconnect, this), + ros::VoidPtr(), &gazebo_queue_); + pub_model_states_ = nh_->advertise(pub_model_states_ao); + + // Advertise more services on the custom queue + std::string set_link_properties_service_name("set_link_properties"); + ros::AdvertiseServiceOptions set_link_properties_aso = + ros::AdvertiseServiceOptions::create( + set_link_properties_service_name, + boost::bind(&GazeboRosApiPlugin::setLinkProperties, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + set_link_properties_service_ = nh_->advertiseService(set_link_properties_aso); + + // Advertise more services on the custom queue + std::string set_physics_properties_service_name("set_physics_properties"); + ros::AdvertiseServiceOptions set_physics_properties_aso = + ros::AdvertiseServiceOptions::create( + set_physics_properties_service_name, + boost::bind(&GazeboRosApiPlugin::setPhysicsProperties, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + set_physics_properties_service_ = nh_->advertiseService(set_physics_properties_aso); + + // Advertise more services on the custom queue + std::string set_model_state_service_name("set_model_state"); + ros::AdvertiseServiceOptions set_model_state_aso = + ros::AdvertiseServiceOptions::create( + set_model_state_service_name, + boost::bind(&GazeboRosApiPlugin::setModelState, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + set_model_state_service_ = nh_->advertiseService(set_model_state_aso); + + // Advertise more services on the custom queue + std::string set_model_configuration_service_name("set_model_configuration"); + ros::AdvertiseServiceOptions set_model_configuration_aso = + ros::AdvertiseServiceOptions::create( + set_model_configuration_service_name, + boost::bind(&GazeboRosApiPlugin::setModelConfiguration, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + set_model_configuration_service_ = nh_->advertiseService(set_model_configuration_aso); + + // Advertise more services on the custom queue + std::string set_joint_properties_service_name("set_joint_properties"); + ros::AdvertiseServiceOptions set_joint_properties_aso = + ros::AdvertiseServiceOptions::create( + set_joint_properties_service_name, + boost::bind(&GazeboRosApiPlugin::setJointProperties, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + set_joint_properties_service_ = nh_->advertiseService(set_joint_properties_aso); + + // Advertise more services on the custom queue + std::string set_link_state_service_name("set_link_state"); + ros::AdvertiseServiceOptions set_link_state_aso = + ros::AdvertiseServiceOptions::create( + set_link_state_service_name, + boost::bind(&GazeboRosApiPlugin::setLinkState, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + set_link_state_service_ = nh_->advertiseService(set_link_state_aso); + + // Advertise topic on custom queue + // topic callback version for set_link_state + ros::SubscribeOptions link_state_so = + ros::SubscribeOptions::create( + "set_link_state", 10, + boost::bind(&GazeboRosApiPlugin::updateLinkState, this, _1), + ros::VoidPtr(), &gazebo_queue_); + set_link_state_topic_ = nh_->subscribe(link_state_so); + + // topic callback version for set_model_state + ros::SubscribeOptions model_state_so = + ros::SubscribeOptions::create( + "set_model_state", 10, + boost::bind(&GazeboRosApiPlugin::updateModelState, this, _1), + ros::VoidPtr(), &gazebo_queue_); + set_model_state_topic_ = nh_->subscribe(model_state_so); + + // Advertise more services on the custom queue + std::string pause_physics_service_name("pause_physics"); + ros::AdvertiseServiceOptions pause_physics_aso = + ros::AdvertiseServiceOptions::create( + pause_physics_service_name, + boost::bind(&GazeboRosApiPlugin::pausePhysics, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + pause_physics_service_ = nh_->advertiseService(pause_physics_aso); + + // Advertise more services on the custom queue + std::string unpause_physics_service_name("unpause_physics"); + ros::AdvertiseServiceOptions unpause_physics_aso = + ros::AdvertiseServiceOptions::create( + unpause_physics_service_name, + boost::bind(&GazeboRosApiPlugin::unpausePhysics, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + unpause_physics_service_ = nh_->advertiseService(unpause_physics_aso); + + // Advertise more services on the custom queue + std::string apply_body_wrench_service_name("apply_body_wrench"); + ros::AdvertiseServiceOptions apply_body_wrench_aso = + ros::AdvertiseServiceOptions::create( + apply_body_wrench_service_name, + boost::bind(&GazeboRosApiPlugin::applyBodyWrench, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + apply_body_wrench_service_ = nh_->advertiseService(apply_body_wrench_aso); + + // Advertise more services on the custom queue + std::string apply_joint_effort_service_name("apply_joint_effort"); + ros::AdvertiseServiceOptions apply_joint_effort_aso = + ros::AdvertiseServiceOptions::create( + apply_joint_effort_service_name, + boost::bind(&GazeboRosApiPlugin::applyJointEffort, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + apply_joint_effort_service_ = nh_->advertiseService(apply_joint_effort_aso); + + // Advertise more services on the custom queue + std::string clear_joint_forces_service_name("clear_joint_forces"); + ros::AdvertiseServiceOptions clear_joint_forces_aso = + ros::AdvertiseServiceOptions::create( + clear_joint_forces_service_name, + boost::bind(&GazeboRosApiPlugin::clearJointForces, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + clear_joint_forces_service_ = nh_->advertiseService(clear_joint_forces_aso); + + // Advertise more services on the custom queue + std::string clear_body_wrenches_service_name("clear_body_wrenches"); + ros::AdvertiseServiceOptions clear_body_wrenches_aso = + ros::AdvertiseServiceOptions::create( + clear_body_wrenches_service_name, + boost::bind(&GazeboRosApiPlugin::clearBodyWrenches, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + clear_body_wrenches_service_ = nh_->advertiseService(clear_body_wrenches_aso); + + // Advertise more services on the custom queue + std::string reset_simulation_service_name("reset_simulation"); + ros::AdvertiseServiceOptions reset_simulation_aso = + ros::AdvertiseServiceOptions::create( + reset_simulation_service_name, + boost::bind(&GazeboRosApiPlugin::resetSimulation, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + reset_simulation_service_ = nh_->advertiseService(reset_simulation_aso); + + // Advertise more services on the custom queue + std::string reset_world_service_name("reset_world"); + ros::AdvertiseServiceOptions reset_world_aso = + ros::AdvertiseServiceOptions::create( + reset_world_service_name, + boost::bind(&GazeboRosApiPlugin::resetWorld, this, _1, _2), + ros::VoidPtr(), &gazebo_queue_); + reset_world_service_ = nh_->advertiseService(reset_world_aso); + + // set param for use_sim_time if not set by user already + if (!(nh_->hasParam("/use_sim_time"))) + nh_->setParam("/use_sim_time", true); + + // todo: contemplate setting environment variable ROBOT=sim here??? + nh_->getParam("pub_clock_frequency", pub_clock_frequency_); +#if GAZEBO_MAJOR_VERSION >= 8 + last_pub_clock_time_ = world_->SimTime(); +#else + last_pub_clock_time_ = world_->GetSimTime(); +#endif +} + +void GazeboRosApiPlugin::onLinkStatesConnect() +{ + pub_link_states_connection_count_++; + if (pub_link_states_connection_count_ == 1) // connect on first subscriber + pub_link_states_event_ = gazebo::event::Events::ConnectWorldUpdateBegin(boost::bind(&GazeboRosApiPlugin::publishLinkStates, this)); +} + +void GazeboRosApiPlugin::onModelStatesConnect() +{ + pub_model_states_connection_count_++; + if (pub_model_states_connection_count_ == 1) // connect on first subscriber + pub_model_states_event_ = gazebo::event::Events::ConnectWorldUpdateBegin(boost::bind(&GazeboRosApiPlugin::publishModelStates, this)); +} + +void GazeboRosApiPlugin::onLinkStatesDisconnect() +{ + pub_link_states_connection_count_--; + if (pub_link_states_connection_count_ <= 0) // disconnect with no subscribers + { + pub_link_states_event_.reset(); + if (pub_link_states_connection_count_ < 0) // should not be possible + ROS_ERROR_NAMED("api_plugin", "One too mandy disconnect from pub_link_states_ in gazebo_ros.cpp? something weird"); + } +} + +void GazeboRosApiPlugin::onModelStatesDisconnect() +{ + pub_model_states_connection_count_--; + if (pub_model_states_connection_count_ <= 0) // disconnect with no subscribers + { + pub_model_states_event_.reset(); + if (pub_model_states_connection_count_ < 0) // should not be possible + ROS_ERROR_NAMED("api_plugin", "One too mandy disconnect from pub_model_states_ in gazebo_ros.cpp? something weird"); + } +} + +bool GazeboRosApiPlugin::spawnURDFModel(gazebo_msgs::SpawnModel::Request &req, + gazebo_msgs::SpawnModel::Response &res) +{ + // get namespace for the corresponding model plugins + robot_namespace_ = req.robot_namespace; + + // incoming entity string + std::string model_xml = req.model_xml; + + if (!isURDF(model_xml)) + { + ROS_ERROR_NAMED("api_plugin", "SpawnModel: Failure - entity format is invalid."); + res.success = false; + res.status_message = "SpawnModel: Failure - entity format is invalid."; + return false; + } + + /// STRIP DECLARATION from model_xml + /// @todo: does tinyxml have functionality for this? + /// @todo: should gazebo take care of the declaration? + { + std::string open_bracket(""); + size_t pos1 = model_xml.find(open_bracket, 0); + size_t pos2 = model_xml.find(close_bracket, 0); + if (pos1 != std::string::npos && pos2 != std::string::npos) + model_xml.replace(pos1, pos2 - pos1 + 2, std::string("")); + } + + // Remove comments from URDF + { + std::string open_comment(""); + size_t pos1; + while ((pos1 = model_xml.find(open_comment, 0)) != std::string::npos) + { + size_t pos2 = model_xml.find(close_comment, 0); + if (pos2 != std::string::npos) + model_xml.replace(pos1, pos2 - pos1 + 3, std::string("")); + } + } + + // Now, replace package://xxx with the full path to the package + { + std::string package_prefix("package://"); + size_t pos1 = model_xml.find(package_prefix, 0); + while (pos1 != std::string::npos) + { + size_t pos2 = model_xml.find("/", pos1 + 10); + //ROS_DEBUG_NAMED("api_plugin", " pos %d %d",(int)pos1, (int)pos2); + if (pos2 == std::string::npos || pos1 >= pos2) + { + ROS_ERROR_NAMED("api_plugin", "Malformed package name?"); + break; + } + + std::string package_name = model_xml.substr(pos1 + 10, pos2 - pos1 - 10); + //ROS_DEBUG_NAMED("api_plugin", "package name [%s]", package_name.c_str()); + std::string package_path = ros::package::getPath(package_name); + if (package_path.empty()) + { + ROS_FATAL_NAMED("api_plugin", "Package[%s] does not have a path", package_name.c_str()); + res.success = false; + res.status_message = "urdf reference package name does not exist: " + package_name; + return false; + } + ROS_DEBUG_ONCE_NAMED("api_plugin", "Package name [%s] has path [%s]", package_name.c_str(), package_path.c_str()); + + model_xml.replace(pos1, (pos2 - pos1), package_path); + pos1 = model_xml.find(package_prefix, pos1); + } + } + // ROS_DEBUG_NAMED("api_plugin", "Model XML\n\n%s\n\n ",model_xml.c_str()); + + req.model_xml = model_xml; + + // Model is now considered convert to SDF + return spawnSDFModel(req, res); +} + +bool GazeboRosApiPlugin::spawnSDFModel(gazebo_msgs::SpawnModel::Request &req, + gazebo_msgs::SpawnModel::Response &res) +{ + // incoming entity name + std::string model_name = req.model_name; + + // get namespace for the corresponding model plugins + robot_namespace_ = req.robot_namespace; + + // get initial pose of model + ignition::math::Vector3d initial_xyz(req.initial_pose.position.x, req.initial_pose.position.y, req.initial_pose.position.z); + // get initial roll pitch yaw (fixed frame transform) + ignition::math::Quaterniond initial_q(req.initial_pose.orientation.w, req.initial_pose.orientation.x, req.initial_pose.orientation.y, req.initial_pose.orientation.z); + + // refernce frame for initial pose definition, modify initial pose if defined +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::EntityPtr frame = world_->EntityByName(req.reference_frame); +#else + gazebo::physics::EntityPtr frame = world_->GetEntity(req.reference_frame); +#endif + if (frame) + { + // convert to relative pose +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d frame_pose = frame->WorldPose(); +#else + ignition::math::Pose3d frame_pose = frame->GetWorldPose().Ign(); +#endif + initial_xyz = frame_pose.Pos() + frame_pose.Rot().RotateVector(initial_xyz); + initial_q = frame_pose.Rot() * initial_q; + } + + /// @todo: map is really wrong, need to use tf here somehow + else if (req.reference_frame == "" || req.reference_frame == "world" || req.reference_frame == "map" || req.reference_frame == "/map") + { + ROS_DEBUG_NAMED("api_plugin", "SpawnModel: reference_frame is empty/world/map, using inertial frame"); + } + else + { + res.success = false; + res.status_message = "SpawnModel: reference reference_frame not found, did you forget to scope the link by model name?"; + return true; + } + + // incoming robot model string + std::string model_xml = req.model_xml; + + // store resulting Gazebo Model XML to be sent to spawn queue + // get incoming string containg either an URDF or a Gazebo Model XML + // grab from parameter server if necessary convert to SDF if necessary + stripXmlDeclaration(model_xml); + + // put string in TiXmlDocument for manipulation + TiXmlDocument gazebo_model_xml; + gazebo_model_xml.Parse(model_xml.c_str()); + + // optional model manipulations: update initial pose && replace model name + if (isSDF(model_xml)) + { + updateSDFAttributes(gazebo_model_xml, model_name, initial_xyz, initial_q); + + // Walk recursively through the entire SDF, locate plugin tags and + // add robotNamespace as a child with the correct namespace + if (!this->robot_namespace_.empty()) + { + // Get root element for SDF + // TODO: implement the spawning also with and + TiXmlNode *model_tixml = gazebo_model_xml.FirstChild("sdf"); + model_tixml = (!model_tixml) ? gazebo_model_xml.FirstChild("gazebo") : model_tixml; + if (model_tixml) + { + walkChildAddRobotNamespace(model_tixml); + } + else + { + ROS_WARN_NAMED("api_plugin", "Unable to add robot namespace to xml"); + } + } + } + else if (isURDF(model_xml)) + { + updateURDFModelPose(gazebo_model_xml, initial_xyz, initial_q); + updateURDFName(gazebo_model_xml, model_name); + + // Walk recursively through the entire URDF, locate plugin tags and + // add robotNamespace as a child with the correct namespace + if (!this->robot_namespace_.empty()) + { + // Get root element for URDF + TiXmlNode *model_tixml = gazebo_model_xml.FirstChild("robot"); + if (model_tixml) + { + walkChildAddRobotNamespace(model_tixml); + } + else + { + ROS_WARN_NAMED("api_plugin", "Unable to add robot namespace to xml"); + } + } + } + else + { + ROS_ERROR_NAMED("api_plugin", "GazeboRosApiPlugin SpawnModel Failure: input xml format not recognized"); + res.success = false; + res.status_message = "GazeboRosApiPlugin SpawnModel Failure: input model_xml not SDF or URDF, or cannot be converted to Gazebo compatible format."; + return true; + } + + // do spawning check if spawn worked, return response + return spawnAndConform(gazebo_model_xml, model_name, res); +} + +bool GazeboRosApiPlugin::deleteModel(gazebo_msgs::DeleteModel::Request &req, + gazebo_msgs::DeleteModel::Response &res) +{ + // clear forces, etc for the body in question +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::ModelPtr model = world_->ModelByName(req.model_name); +#else + gazebo::physics::ModelPtr model = world_->GetModel(req.model_name); +#endif + if (!model) + { + ROS_ERROR_NAMED("api_plugin", "DeleteModel: model [%s] does not exist", req.model_name.c_str()); + res.success = false; + res.status_message = "DeleteModel: model does not exist"; + return true; + } + + // delete wrench jobs on bodies + for (unsigned int i = 0; i < model->GetChildCount(); i++) + { + gazebo::physics::LinkPtr body = boost::dynamic_pointer_cast(model->GetChild(i)); + if (body) + { + // look for it in jobs, delete body wrench jobs + clearBodyWrenches(body->GetScopedName()); + } + } + + // delete force jobs on joints + gazebo::physics::Joint_V joints = model->GetJoints(); + for (unsigned int i = 0; i < joints.size(); i++) + { + // look for it in jobs, delete joint force jobs + clearJointForces(joints[i]->GetName()); + } + + // send delete model request + gazebo::msgs::Request *msg = gazebo::msgs::CreateRequest("entity_delete", req.model_name); + request_pub_->Publish(*msg, true); + + ros::Duration model_spawn_timeout(60.0); + ros::Time timeout = ros::Time::now() + model_spawn_timeout; + // wait and verify that model is deleted + while (true) + { + if (ros::Time::now() > timeout) + { + res.success = false; + res.status_message = "DeleteModel: Model pushed to delete queue, but delete service timed out waiting for model to disappear from simulation"; + return true; + } + { + //boost::recursive_mutex::scoped_lock lock(*world->GetMRMutex()); +#if GAZEBO_MAJOR_VERSION >= 8 + if (!world_->ModelByName(req.model_name)) + break; +#else + if (!world_->GetModel(req.model_name)) + break; +#endif + } + ROS_DEBUG_NAMED("api_plugin", "Waiting for model deletion (%s)", req.model_name.c_str()); + usleep(1000); + } + + // set result + res.success = true; + res.status_message = "DeleteModel: successfully deleted model"; + return true; +} + +bool GazeboRosApiPlugin::deleteLight(gazebo_msgs::DeleteLight::Request &req, + gazebo_msgs::DeleteLight::Response &res) +{ +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::LightPtr phy_light = world_->LightByName(req.light_name); +#else + gazebo::physics::LightPtr phy_light = world_->Light(req.light_name); +#endif + + if (phy_light == NULL) + { + res.success = false; + res.status_message = "DeleteLight: Requested light " + req.light_name + " not found!"; + } + else + { + gazebo::msgs::Request *msg = gazebo::msgs::CreateRequest("entity_delete", req.light_name); + request_pub_->Publish(*msg, true); + + res.success = false; + + for (int i = 0; i < 100; i++) + { +#if GAZEBO_MAJOR_VERSION >= 8 + phy_light = world_->LightByName(req.light_name); +#else + phy_light = world_->Light(req.light_name); +#endif + if (phy_light == NULL) + { + res.success = true; + res.status_message = "DeleteLight: " + req.light_name + " successfully deleted"; + return true; + } + // Check every 100ms + usleep(100000); + } + } + + res.status_message = "DeleteLight: Timeout reached while removing light \"" + req.light_name + "\""; + + return true; +} + +bool GazeboRosApiPlugin::getModelState(gazebo_msgs::GetModelState::Request &req, + gazebo_msgs::GetModelState::Response &res) +{ +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::ModelPtr model = world_->ModelByName(req.model_name); + gazebo::physics::EntityPtr frame = world_->EntityByName(req.relative_entity_name); +#else + gazebo::physics::ModelPtr model = world_->GetModel(req.model_name); + gazebo::physics::EntityPtr frame = world_->GetEntity(req.relative_entity_name); +#endif + if (!model) + { + ROS_ERROR_NAMED("api_plugin", "GetModelState: model [%s] does not exist", req.model_name.c_str()); + res.success = false; + res.status_message = "GetModelState: model does not exist"; + return true; + } + else + { + /** + * @brief creates a header for the result + * @author Markus Bader markus.bader@tuwien.ac.at + * @date 21th Nov 2014 + **/ + { + std::map::iterator it = access_count_get_model_state_.find(req.model_name); + if (it == access_count_get_model_state_.end()) + { + access_count_get_model_state_.insert(std::pair(req.model_name, 1)); + res.header.seq = 1; + } + else + { + it->second++; + res.header.seq = it->second; + } + res.header.stamp = ros::Time::now(); + res.header.frame_id = req.relative_entity_name; /// @brief this is a redundant information + } + // get model pose + // get model twist +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d model_pose = model->WorldPose(); + ignition::math::Vector3d model_linear_vel = model->WorldLinearVel(); + ignition::math::Vector3d model_angular_vel = model->WorldAngularVel(); +#else + ignition::math::Pose3d model_pose = model->GetWorldPose().Ign(); + ignition::math::Vector3d model_linear_vel = model->GetWorldLinearVel().Ign(); + ignition::math::Vector3d model_angular_vel = model->GetWorldAngularVel().Ign(); +#endif + ignition::math::Vector3d model_pos = model_pose.Pos(); + ignition::math::Quaterniond model_rot = model_pose.Rot(); + + if (frame) + { + // convert to relative pose, rates +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d frame_pose = frame->WorldPose(); + ignition::math::Vector3d frame_vpos = frame->WorldLinearVel(); // get velocity in gazebo frame + ignition::math::Vector3d frame_veul = frame->WorldAngularVel(); // get velocity in gazebo frame +#else + ignition::math::Pose3d frame_pose = frame->GetWorldPose().Ign(); + ignition::math::Vector3d frame_vpos = frame->GetWorldLinearVel().Ign(); // get velocity in gazebo frame + ignition::math::Vector3d frame_veul = frame->GetWorldAngularVel().Ign(); // get velocity in gazebo frame +#endif + ignition::math::Pose3d model_rel_pose = model_pose - frame_pose; + model_pos = model_rel_pose.Pos(); + model_rot = model_rel_pose.Rot(); + + model_linear_vel = frame_pose.Rot().RotateVectorReverse(model_linear_vel - frame_vpos); + model_angular_vel = frame_pose.Rot().RotateVectorReverse(model_angular_vel - frame_veul); + } + /// @todo: FIXME map is really wrong, need to use tf here somehow + else if (req.relative_entity_name == "" || req.relative_entity_name == "world" || req.relative_entity_name == "map" || req.relative_entity_name == "/map") + { + ROS_DEBUG_NAMED("api_plugin", "GetModelState: relative_entity_name is empty/world/map, using inertial frame"); + } + else + { + res.success = false; + res.status_message = "GetModelState: reference relative_entity_name not found, did you forget to scope the body by model name?"; + return true; + } + + // fill in response + res.pose.position.x = model_pos.X(); + res.pose.position.y = model_pos.Y(); + res.pose.position.z = model_pos.Z(); + res.pose.orientation.w = model_rot.W(); + res.pose.orientation.x = model_rot.X(); + res.pose.orientation.y = model_rot.Y(); + res.pose.orientation.z = model_rot.Z(); + + res.twist.linear.x = model_linear_vel.X(); + res.twist.linear.y = model_linear_vel.Y(); + res.twist.linear.z = model_linear_vel.Z(); + res.twist.angular.x = model_angular_vel.X(); + res.twist.angular.y = model_angular_vel.Y(); + res.twist.angular.z = model_angular_vel.Z(); + + res.success = true; + res.status_message = "GetModelState: got properties"; + return true; + } + return true; +} + +bool GazeboRosApiPlugin::getModelProperties(gazebo_msgs::GetModelProperties::Request &req, + gazebo_msgs::GetModelProperties::Response &res) +{ +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::ModelPtr model = world_->ModelByName(req.model_name); +#else + gazebo::physics::ModelPtr model = world_->GetModel(req.model_name); +#endif + if (!model) + { + ROS_ERROR_NAMED("api_plugin", "GetModelProperties: model [%s] does not exist", req.model_name.c_str()); + res.success = false; + res.status_message = "GetModelProperties: model does not exist"; + return true; + } + else + { + // get model parent name + gazebo::physics::ModelPtr parent_model = boost::dynamic_pointer_cast(model->GetParent()); + if (parent_model) + res.parent_model_name = parent_model->GetName(); + + // get list of child bodies, geoms + res.body_names.clear(); + res.geom_names.clear(); + for (unsigned int i = 0; i < model->GetChildCount(); i++) + { + gazebo::physics::LinkPtr body = boost::dynamic_pointer_cast(model->GetChild(i)); + if (body) + { + res.body_names.push_back(body->GetName()); + // get list of geoms + for (unsigned int j = 0; j < body->GetChildCount(); j++) + { + gazebo::physics::CollisionPtr geom = boost::dynamic_pointer_cast(body->GetChild(j)); + if (geom) + res.geom_names.push_back(geom->GetName()); + } + } + } + + // get list of joints + res.joint_names.clear(); + + gazebo::physics::Joint_V joints = model->GetJoints(); + for (unsigned int i = 0; i < joints.size(); i++) + res.joint_names.push_back(joints[i]->GetName()); + + // get children model names + res.child_model_names.clear(); + for (unsigned int j = 0; j < model->GetChildCount(); j++) + { + gazebo::physics::ModelPtr child_model = boost::dynamic_pointer_cast(model->GetChild(j)); + if (child_model) + res.child_model_names.push_back(child_model->GetName()); + } + + // is model static + res.is_static = model->IsStatic(); + + res.success = true; + res.status_message = "GetModelProperties: got properties"; + return true; + } + return true; +} + +bool GazeboRosApiPlugin::getWorldProperties(gazebo_msgs::GetWorldProperties::Request &req, + gazebo_msgs::GetWorldProperties::Response &res) +{ + res.model_names.clear(); +#if GAZEBO_MAJOR_VERSION >= 8 + res.sim_time = world_->SimTime().Double(); + for (unsigned int i = 0; i < world_->ModelCount(); i++) + res.model_names.push_back(world_->ModelByIndex(i)->GetName()); +#else + res.sim_time = world_->GetSimTime().Double(); + for (unsigned int i = 0; i < world_->GetModelCount(); i++) + res.model_names.push_back(world_->GetModel(i)->GetName()); +#endif + gzerr << "disablign rendering has not been implemented, rendering is always enabled\n"; + res.rendering_enabled = true; //world->GetRenderEngineEnabled(); + res.success = true; + res.status_message = "GetWorldProperties: got properties"; + return true; +} + +bool GazeboRosApiPlugin::getJointProperties(gazebo_msgs::GetJointProperties::Request &req, + gazebo_msgs::GetJointProperties::Response &res) +{ + gazebo::physics::JointPtr joint; +#if GAZEBO_MAJOR_VERSION >= 8 + for (unsigned int i = 0; i < world_->ModelCount(); i++) + { + joint = world_->ModelByIndex(i)->GetJoint(req.joint_name); +#else + for (unsigned int i = 0; i < world_->GetModelCount(); i++) + { + joint = world_->GetModel(i)->GetJoint(req.joint_name); +#endif + if (joint) + break; + } + + if (!joint) + { + res.success = false; + res.status_message = "GetJointProperties: joint not found"; + return true; + } + else + { + /// @todo: FIXME + res.type = res.REVOLUTE; + + res.damping.clear(); // to be added to gazebo + //res.damping.push_back(joint->GetDamping(0)); + + res.position.clear(); +#if GAZEBO_MAJOR_VERSION >= 8 + res.position.push_back(joint->Position(0)); +#else + res.position.push_back(joint->GetAngle(0).Radian()); +#endif + + res.rate.clear(); // use GetVelocity(i) + res.rate.push_back(joint->GetVelocity(0)); + + res.success = true; + res.status_message = "GetJointProperties: got properties"; + return true; + } +} + +bool GazeboRosApiPlugin::getLinkProperties(gazebo_msgs::GetLinkProperties::Request &req, + gazebo_msgs::GetLinkProperties::Response &res) +{ +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::LinkPtr body = boost::dynamic_pointer_cast(world_->EntityByName(req.link_name)); +#else + gazebo::physics::LinkPtr body = boost::dynamic_pointer_cast(world_->GetEntity(req.link_name)); +#endif + if (!body) + { + res.success = false; + res.status_message = "GetLinkProperties: link not found, did you forget to scope the link by model name?"; + return true; + } + else + { + /// @todo: validate + res.gravity_mode = body->GetGravityMode(); + + gazebo::physics::InertialPtr inertia = body->GetInertial(); + +#if GAZEBO_MAJOR_VERSION >= 8 + res.mass = body->GetInertial()->Mass(); + + res.ixx = inertia->IXX(); + res.iyy = inertia->IYY(); + res.izz = inertia->IZZ(); + res.ixy = inertia->IXY(); + res.ixz = inertia->IXZ(); + res.iyz = inertia->IYZ(); + + ignition::math::Vector3d com = body->GetInertial()->CoG(); +#else + res.mass = body->GetInertial()->GetMass(); + + res.ixx = inertia->GetIXX(); + res.iyy = inertia->GetIYY(); + res.izz = inertia->GetIZZ(); + res.ixy = inertia->GetIXY(); + res.ixz = inertia->GetIXZ(); + res.iyz = inertia->GetIYZ(); + + ignition::math::Vector3d com = body->GetInertial()->GetCoG().Ign(); +#endif + res.com.position.x = com.X(); + res.com.position.y = com.Y(); + res.com.position.z = com.Z(); + res.com.orientation.x = 0; // @todo: gazebo do not support rotated inertia yet + res.com.orientation.y = 0; + res.com.orientation.z = 0; + res.com.orientation.w = 1; + + res.success = true; + res.status_message = "GetLinkProperties: got properties"; + return true; + } +} + +bool GazeboRosApiPlugin::getLinkState(gazebo_msgs::GetLinkState::Request &req, + gazebo_msgs::GetLinkState::Response &res) +{ +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::LinkPtr body = boost::dynamic_pointer_cast(world_->EntityByName(req.link_name)); + gazebo::physics::EntityPtr frame = world_->EntityByName(req.reference_frame); +#else + gazebo::physics::LinkPtr body = boost::dynamic_pointer_cast(world_->GetEntity(req.link_name)); + gazebo::physics::EntityPtr frame = world_->GetEntity(req.reference_frame); +#endif + + if (!body) + { + res.success = false; + res.status_message = "GetLinkState: link not found, did you forget to scope the link by model name?"; + return true; + } + + // get body pose + // Get inertial rates +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d body_pose = body->WorldPose(); + ignition::math::Vector3d body_vpos = body->WorldLinearVel(); // get velocity in gazebo frame + ignition::math::Vector3d body_veul = body->WorldAngularVel(); // get velocity in gazebo frame +#else + ignition::math::Pose3d body_pose = body->GetWorldPose().Ign(); + ignition::math::Vector3d body_vpos = body->GetWorldLinearVel().Ign(); // get velocity in gazebo frame + ignition::math::Vector3d body_veul = body->GetWorldAngularVel().Ign(); // get velocity in gazebo frame +#endif + + if (frame) + { + // convert to relative pose, rates +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d frame_pose = frame->WorldPose(); + ignition::math::Vector3d frame_vpos = frame->WorldLinearVel(); // get velocity in gazebo frame + ignition::math::Vector3d frame_veul = frame->WorldAngularVel(); // get velocity in gazebo frame +#else + ignition::math::Pose3d frame_pose = frame->GetWorldPose().Ign(); + ignition::math::Vector3d frame_vpos = frame->GetWorldLinearVel().Ign(); // get velocity in gazebo frame + ignition::math::Vector3d frame_veul = frame->GetWorldAngularVel().Ign(); // get velocity in gazebo frame +#endif + body_pose = body_pose - frame_pose; + + body_vpos = frame_pose.Rot().RotateVectorReverse(body_vpos - frame_vpos); + body_veul = frame_pose.Rot().RotateVectorReverse(body_veul - frame_veul); + } + /// @todo: FIXME map is really wrong, need to use tf here somehow + else if (req.reference_frame == "" || req.reference_frame == "world" || req.reference_frame == "map" || req.reference_frame == "/map") + { + ROS_DEBUG_NAMED("api_plugin", "GetLinkState: reference_frame is empty/world/map, using inertial frame"); + } + else + { + res.success = false; + res.status_message = "GetLinkState: reference reference_frame not found, did you forget to scope the link by model name?"; + return true; + } + + res.link_state.link_name = req.link_name; + res.link_state.pose.position.x = body_pose.Pos().X(); + res.link_state.pose.position.y = body_pose.Pos().Y(); + res.link_state.pose.position.z = body_pose.Pos().Z(); + res.link_state.pose.orientation.x = body_pose.Rot().X(); + res.link_state.pose.orientation.y = body_pose.Rot().Y(); + res.link_state.pose.orientation.z = body_pose.Rot().Z(); + res.link_state.pose.orientation.w = body_pose.Rot().W(); + res.link_state.twist.linear.x = body_vpos.X(); + res.link_state.twist.linear.y = body_vpos.Y(); + res.link_state.twist.linear.z = body_vpos.Z(); + res.link_state.twist.angular.x = body_veul.X(); + res.link_state.twist.angular.y = body_veul.Y(); + res.link_state.twist.angular.z = body_veul.Z(); + res.link_state.reference_frame = req.reference_frame; + + res.success = true; + res.status_message = "GetLinkState: got state"; + return true; +} + +bool GazeboRosApiPlugin::getLightProperties(gazebo_msgs::GetLightProperties::Request &req, + gazebo_msgs::GetLightProperties::Response &res) +{ +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::LightPtr phy_light = world_->LightByName(req.light_name); +#else + gazebo::physics::LightPtr phy_light = world_->Light(req.light_name); +#endif + + if (phy_light == NULL) + { + res.success = false; + res.status_message = "getLightProperties: Requested light " + req.light_name + " not found!"; + } + else + { + gazebo::msgs::Light light; + phy_light->FillMsg(light); + + res.diffuse.r = light.diffuse().r(); + res.diffuse.g = light.diffuse().g(); + res.diffuse.b = light.diffuse().b(); + res.diffuse.a = light.diffuse().a(); + + res.attenuation_constant = light.attenuation_constant(); + res.attenuation_linear = light.attenuation_linear(); + res.attenuation_quadratic = light.attenuation_quadratic(); + + res.success = true; + } + + return true; +} + +bool GazeboRosApiPlugin::setLightProperties(gazebo_msgs::SetLightProperties::Request &req, + gazebo_msgs::SetLightProperties::Response &res) +{ +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::LightPtr phy_light = world_->LightByName(req.light_name); +#else + gazebo::physics::LightPtr phy_light = world_->Light(req.light_name); +#endif + + if (phy_light == NULL) + { + res.success = false; + res.status_message = "setLightProperties: Requested light " + req.light_name + " not found!"; + } + else + { + gazebo::msgs::Light light; + + phy_light->FillMsg(light); + + light.mutable_diffuse()->set_r(req.diffuse.r); + light.mutable_diffuse()->set_g(req.diffuse.g); + light.mutable_diffuse()->set_b(req.diffuse.b); + light.mutable_diffuse()->set_a(req.diffuse.a); + + light.set_attenuation_constant(req.attenuation_constant); + light.set_attenuation_linear(req.attenuation_linear); + light.set_attenuation_quadratic(req.attenuation_quadratic); + + light_modify_pub_->Publish(light, true); + + res.success = true; + } + + return true; +} + +bool GazeboRosApiPlugin::setLinkProperties(gazebo_msgs::SetLinkProperties::Request &req, + gazebo_msgs::SetLinkProperties::Response &res) +{ +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::LinkPtr body = boost::dynamic_pointer_cast(world_->EntityByName(req.link_name)); +#else + gazebo::physics::LinkPtr body = boost::dynamic_pointer_cast(world_->GetEntity(req.link_name)); +#endif + if (!body) + { + res.success = false; + res.status_message = "SetLinkProperties: link not found, did you forget to scope the link by model name?"; + return true; + } + else + { + gazebo::physics::InertialPtr mass = body->GetInertial(); + // @todo: FIXME: add inertia matrix rotation to Gazebo + // mass.SetInertiaRotation(ignition::math::Quaterniondion(req.com.orientation.w,res.com.orientation.x,req.com.orientation.y req.com.orientation.z)); + mass->SetCoG(ignition::math::Vector3d(req.com.position.x, req.com.position.y, req.com.position.z)); + mass->SetInertiaMatrix(req.ixx, req.iyy, req.izz, req.ixy, req.ixz, req.iyz); + mass->SetMass(req.mass); + body->SetGravityMode(req.gravity_mode); + // @todo: mass change unverified + res.success = true; + res.status_message = "SetLinkProperties: properties set"; + return true; + } +} + +bool GazeboRosApiPlugin::setPhysicsProperties(gazebo_msgs::SetPhysicsProperties::Request &req, + gazebo_msgs::SetPhysicsProperties::Response &res) +{ + // pause simulation if requested + bool is_paused = world_->IsPaused(); + world_->SetPaused(true); + world_->SetGravity(ignition::math::Vector3d(req.gravity.x, req.gravity.y, req.gravity.z)); + + // supported updates +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::PhysicsEnginePtr pe = (world_->Physics()); +#else + gazebo::physics::PhysicsEnginePtr pe = (world_->GetPhysicsEngine()); +#endif + pe->SetMaxStepSize(req.time_step); + pe->SetRealTimeUpdateRate(req.max_update_rate); + + if (pe->GetType() == "ode") + { + // stuff only works in ODE right now + pe->SetAutoDisableFlag(req.ode_config.auto_disable_bodies); + pe->SetParam("precon_iters", int(req.ode_config.sor_pgs_precon_iters)); + pe->SetParam("iters", int(req.ode_config.sor_pgs_iters)); + pe->SetParam("sor", req.ode_config.sor_pgs_w); + pe->SetParam("cfm", req.ode_config.cfm); + pe->SetParam("erp", req.ode_config.erp); + pe->SetParam("contact_surface_layer", + req.ode_config.contact_surface_layer); + pe->SetParam("contact_max_correcting_vel", + req.ode_config.contact_max_correcting_vel); + pe->SetParam("max_contacts", int(req.ode_config.max_contacts)); + + world_->SetPaused(is_paused); + + res.success = true; + res.status_message = "physics engine updated"; + } + else + { + /// \TODO: add support for simbody, dart and bullet physics properties. + ROS_ERROR_NAMED("api_plugin", "ROS set_physics_properties service call does not yet support physics engine [%s].", pe->GetType().c_str()); + res.success = false; + res.status_message = "Physics engine [" + pe->GetType() + "]: set_physics_properties not supported."; + } + return res.success; +} + +bool GazeboRosApiPlugin::getPhysicsProperties(gazebo_msgs::GetPhysicsProperties::Request &req, + gazebo_msgs::GetPhysicsProperties::Response &res) +{ + // supported updates +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::PhysicsEnginePtr pe = (world_->Physics()); +#else + gazebo::physics::PhysicsEnginePtr pe = (world_->GetPhysicsEngine()); +#endif + res.time_step = pe->GetMaxStepSize(); + res.pause = world_->IsPaused(); + res.max_update_rate = pe->GetRealTimeUpdateRate(); + ignition::math::Vector3d gravity = world_->Gravity(); + res.gravity.x = gravity.X(); + res.gravity.y = gravity.Y(); + res.gravity.z = gravity.Z(); + + // stuff only works in ODE right now + if (pe->GetType() == "ode") + { + res.ode_config.auto_disable_bodies = + pe->GetAutoDisableFlag(); + res.ode_config.sor_pgs_precon_iters = boost::any_cast( + pe->GetParam("precon_iters")); + res.ode_config.sor_pgs_iters = boost::any_cast( + pe->GetParam("iters")); + res.ode_config.sor_pgs_w = boost::any_cast( + pe->GetParam("sor")); + res.ode_config.contact_surface_layer = boost::any_cast( + pe->GetParam("contact_surface_layer")); + res.ode_config.contact_max_correcting_vel = boost::any_cast( + pe->GetParam("contact_max_correcting_vel")); + res.ode_config.cfm = boost::any_cast( + pe->GetParam("cfm")); + res.ode_config.erp = boost::any_cast( + pe->GetParam("erp")); + res.ode_config.max_contacts = boost::any_cast( + pe->GetParam("max_contacts")); + + res.success = true; + res.status_message = "GetPhysicsProperties: got properties"; + } + else + { + /// \TODO: add support for simbody, dart and bullet physics properties. + ROS_ERROR_NAMED("api_plugin", "ROS get_physics_properties service call does not yet support physics engine [%s].", pe->GetType().c_str()); + res.success = false; + res.status_message = "Physics engine [" + pe->GetType() + "]: get_physics_properties not supported."; + } + return res.success; +} + +bool GazeboRosApiPlugin::setJointProperties(gazebo_msgs::SetJointProperties::Request &req, + gazebo_msgs::SetJointProperties::Response &res) +{ + /// @todo: current settings only allows for setting of 1DOF joints (e.g. HingeJoint and SliderJoint) correctly. + gazebo::physics::JointPtr joint; +#if GAZEBO_MAJOR_VERSION >= 8 + for (unsigned int i = 0; i < world_->ModelCount(); i++) + { + joint = world_->ModelByIndex(i)->GetJoint(req.joint_name); +#else + for (unsigned int i = 0; i < world_->GetModelCount(); i++) + { + joint = world_->GetModel(i)->GetJoint(req.joint_name); +#endif + if (joint) + break; + } + + if (!joint) + { + res.success = false; + res.status_message = "SetJointProperties: joint not found"; + return true; + } + else + { + for (unsigned int i = 0; i < req.ode_joint_config.damping.size(); i++) + joint->SetDamping(i, req.ode_joint_config.damping[i]); + for (unsigned int i = 0; i < req.ode_joint_config.hiStop.size(); i++) + joint->SetParam("hi_stop", i, req.ode_joint_config.hiStop[i]); + for (unsigned int i = 0; i < req.ode_joint_config.loStop.size(); i++) + joint->SetParam("lo_stop", i, req.ode_joint_config.loStop[i]); + for (unsigned int i = 0; i < req.ode_joint_config.erp.size(); i++) + joint->SetParam("erp", i, req.ode_joint_config.erp[i]); + for (unsigned int i = 0; i < req.ode_joint_config.cfm.size(); i++) + joint->SetParam("cfm", i, req.ode_joint_config.cfm[i]); + for (unsigned int i = 0; i < req.ode_joint_config.stop_erp.size(); i++) + joint->SetParam("stop_erp", i, req.ode_joint_config.stop_erp[i]); + for (unsigned int i = 0; i < req.ode_joint_config.stop_cfm.size(); i++) + joint->SetParam("stop_cfm", i, req.ode_joint_config.stop_cfm[i]); + for (unsigned int i = 0; i < req.ode_joint_config.fudge_factor.size(); i++) + joint->SetParam("fudge_factor", i, req.ode_joint_config.fudge_factor[i]); + for (unsigned int i = 0; i < req.ode_joint_config.fmax.size(); i++) + joint->SetParam("fmax", i, req.ode_joint_config.fmax[i]); + for (unsigned int i = 0; i < req.ode_joint_config.vel.size(); i++) + joint->SetParam("vel", i, req.ode_joint_config.vel[i]); + + res.success = true; + res.status_message = "SetJointProperties: properties set"; + return true; + } +} + +bool GazeboRosApiPlugin::setModelState(gazebo_msgs::SetModelState::Request &req, + gazebo_msgs::SetModelState::Response &res) +{ + ignition::math::Vector3d target_pos(req.model_state.pose.position.x, req.model_state.pose.position.y, req.model_state.pose.position.z); + ignition::math::Quaterniond target_rot(req.model_state.pose.orientation.w, req.model_state.pose.orientation.x, req.model_state.pose.orientation.y, req.model_state.pose.orientation.z); + target_rot.Normalize(); // eliminates invalid rotation (0, 0, 0, 0) + ignition::math::Pose3d target_pose(target_pos, target_rot); + ignition::math::Vector3d target_pos_dot(req.model_state.twist.linear.x, req.model_state.twist.linear.y, req.model_state.twist.linear.z); + ignition::math::Vector3d target_rot_dot(req.model_state.twist.angular.x, req.model_state.twist.angular.y, req.model_state.twist.angular.z); + +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::ModelPtr model = world_->ModelByName(req.model_state.model_name); +#else + gazebo::physics::ModelPtr model = world_->GetModel(req.model_state.model_name); +#endif + if (!model) + { + ROS_ERROR_NAMED("api_plugin", "Updating ModelState: model [%s] does not exist", req.model_state.model_name.c_str()); + res.success = false; + res.status_message = "SetModelState: model does not exist"; + return true; + } + else + { +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::EntityPtr relative_entity = world_->EntityByName(req.model_state.reference_frame); +#else + gazebo::physics::EntityPtr relative_entity = world_->GetEntity(req.model_state.reference_frame); +#endif + if (relative_entity) + { +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d frame_pose = relative_entity->WorldPose(); // - myBody->GetCoMPose(); +#else + ignition::math::Pose3d frame_pose = relative_entity->GetWorldPose().Ign(); // - myBody->GetCoMPose(); +#endif + + target_pose = target_pose + frame_pose; + + // Velocities should be commanded in the requested reference + // frame, so we need to translate them to the world frame + target_pos_dot = frame_pose.Rot().RotateVector(target_pos_dot); + target_rot_dot = frame_pose.Rot().RotateVector(target_rot_dot); + } + /// @todo: FIXME map is really wrong, need to use tf here somehow + else if (req.model_state.reference_frame == "" || req.model_state.reference_frame == "world" || req.model_state.reference_frame == "map" || req.model_state.reference_frame == "/map") + { + ROS_DEBUG_NAMED("api_plugin", "Updating ModelState: reference frame is empty/world/map, usig inertial frame"); + } + else + { + ROS_ERROR_NAMED("api_plugin", "Updating ModelState: for model[%s], specified reference frame entity [%s] does not exist", + req.model_state.model_name.c_str(), req.model_state.reference_frame.c_str()); + res.success = false; + res.status_message = "SetModelState: specified reference frame entity does not exist"; + return true; + } + + //ROS_ERROR_NAMED("api_plugin", "target state: %f %f %f",target_pose.Pos().X(),target_pose.Pos().Y(),target_pose.Pos().Z()); + bool is_paused = world_->IsPaused(); + world_->SetPaused(true); + model->SetWorldPose(target_pose); + world_->SetPaused(is_paused); + //ignition::math::Pose3d p3d = model->WorldPose(); + //ROS_ERROR_NAMED("api_plugin", "model updated state: %f %f %f",p3d.Pos().X(),p3d.Pos().Y(),p3d.Pos().Z()); + + // set model velocity + model->SetLinearVel(target_pos_dot); + model->SetAngularVel(target_rot_dot); + + res.success = true; + res.status_message = "SetModelState: set model state done"; + return true; + } +} + +void GazeboRosApiPlugin::updateModelState(const gazebo_msgs::ModelState::ConstPtr &model_state) +{ + gazebo_msgs::SetModelState::Response res; + gazebo_msgs::SetModelState::Request req; + req.model_state = *model_state; + /*bool success =*/setModelState(req, res); +} + +bool GazeboRosApiPlugin::applyJointEffort(gazebo_msgs::ApplyJointEffort::Request &req, + gazebo_msgs::ApplyJointEffort::Response &res) +{ + gazebo::physics::JointPtr joint; +#if GAZEBO_MAJOR_VERSION >= 8 + for (unsigned int i = 0; i < world_->ModelCount(); i++) + { + joint = world_->ModelByIndex(i)->GetJoint(req.joint_name); +#else + for (unsigned int i = 0; i < world_->GetModelCount(); i++) + { + joint = world_->GetModel(i)->GetJoint(req.joint_name); +#endif + if (joint) + { + GazeboRosApiPlugin::ForceJointJob *fjj = new GazeboRosApiPlugin::ForceJointJob; + fjj->joint = joint; + fjj->force = req.effort; + fjj->start_time = req.start_time; +#if GAZEBO_MAJOR_VERSION >= 8 + if (fjj->start_time < ros::Time(world_->SimTime().Double())) + fjj->start_time = ros::Time(world_->SimTime().Double()); +#else + if (fjj->start_time < ros::Time(world_->GetSimTime().Double())) + fjj->start_time = ros::Time(world_->GetSimTime().Double()); +#endif + fjj->duration = req.duration; + lock_.lock(); + force_joint_jobs_.push_back(fjj); + lock_.unlock(); + + res.success = true; + res.status_message = "ApplyJointEffort: effort set"; + return true; + } + } + + res.success = false; + res.status_message = "ApplyJointEffort: joint not found"; + return true; +} + +bool GazeboRosApiPlugin::resetSimulation(std_srvs::Empty::Request &req, std_srvs::Empty::Response &res) +{ + world_->Reset(); + return true; +} + +bool GazeboRosApiPlugin::resetWorld(std_srvs::Empty::Request &req, std_srvs::Empty::Response &res) +{ + world_->ResetEntities(gazebo::physics::Base::MODEL); + return true; +} + +bool GazeboRosApiPlugin::pausePhysics(std_srvs::Empty::Request &req, std_srvs::Empty::Response &res) +{ + world_->SetPaused(true); + return true; +} + +bool GazeboRosApiPlugin::unpausePhysics(std_srvs::Empty::Request &req, std_srvs::Empty::Response &res) +{ + world_->SetPaused(false); + return true; +} + +bool GazeboRosApiPlugin::clearJointForces(gazebo_msgs::JointRequest::Request &req, + gazebo_msgs::JointRequest::Response &res) +{ + return clearJointForces(req.joint_name); +} +bool GazeboRosApiPlugin::clearJointForces(std::string joint_name) +{ + bool search = true; + lock_.lock(); + while (search) + { + search = false; + for (std::vector::iterator iter = force_joint_jobs_.begin(); iter != force_joint_jobs_.end(); ++iter) + { + if ((*iter)->joint->GetName() == joint_name) + { + // found one, search through again + search = true; + delete (*iter); + force_joint_jobs_.erase(iter); + break; + } + } + } + lock_.unlock(); + return true; +} + +bool GazeboRosApiPlugin::clearBodyWrenches(gazebo_msgs::BodyRequest::Request &req, + gazebo_msgs::BodyRequest::Response &res) +{ + return clearBodyWrenches(req.body_name); +} +bool GazeboRosApiPlugin::clearBodyWrenches(std::string body_name) +{ + bool search = true; + lock_.lock(); + while (search) + { + search = false; + for (std::vector::iterator iter = wrench_body_jobs_.begin(); iter != wrench_body_jobs_.end(); ++iter) + { + //ROS_ERROR_NAMED("api_plugin", "search %s %s",(*iter)->body->GetScopedName().c_str(), body_name.c_str()); + if ((*iter)->body->GetScopedName() == body_name) + { + // found one, search through again + search = true; + delete (*iter); + wrench_body_jobs_.erase(iter); + break; + } + } + } + lock_.unlock(); + return true; +} + +bool GazeboRosApiPlugin::setModelConfiguration(gazebo_msgs::SetModelConfiguration::Request &req, + gazebo_msgs::SetModelConfiguration::Response &res) +{ + std::string gazebo_model_name = req.model_name; + + // search for model with name +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::ModelPtr gazebo_model = world_->ModelByName(req.model_name); +#else + gazebo::physics::ModelPtr gazebo_model = world_->GetModel(req.model_name); +#endif + if (!gazebo_model) + { + ROS_ERROR_NAMED("api_plugin", "SetModelConfiguration: model [%s] does not exist", gazebo_model_name.c_str()); + res.success = false; + res.status_message = "SetModelConfiguration: model does not exist"; + return true; + } + + if (req.joint_names.size() == req.joint_positions.size()) + { + std::map joint_position_map; + for (unsigned int i = 0; i < req.joint_names.size(); i++) + { + joint_position_map[req.joint_names[i]] = req.joint_positions[i]; + } + + // make the service call to pause gazebo + bool is_paused = world_->IsPaused(); + if (!is_paused) + world_->SetPaused(true); + + gazebo_model->SetJointPositions(joint_position_map); + + // resume paused state before this call + world_->SetPaused(is_paused); + + res.success = true; + res.status_message = "SetModelConfiguration: success"; + return true; + } + else + { + res.success = false; + res.status_message = "SetModelConfiguration: joint name and position list have different lengths"; + return true; + } +} + +bool GazeboRosApiPlugin::setLinkState(gazebo_msgs::SetLinkState::Request &req, + gazebo_msgs::SetLinkState::Response &res) +{ +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::LinkPtr body = boost::dynamic_pointer_cast(world_->EntityByName(req.link_state.link_name)); + gazebo::physics::LinkPtr frame = boost::dynamic_pointer_cast(world_->EntityByName(req.link_state.reference_frame)); +#else + gazebo::physics::LinkPtr body = boost::dynamic_pointer_cast(world_->GetEntity(req.link_state.link_name)); + gazebo::physics::EntityPtr frame = world_->GetEntity(req.link_state.reference_frame); +#endif + if (!body) + { + ROS_ERROR_NAMED("api_plugin", "Updating LinkState: link [%s] does not exist", req.link_state.link_name.c_str()); + res.success = false; + res.status_message = "SetLinkState: link does not exist"; + return true; + } + + /// @todo: FIXME map is really wrong, unless using tf here somehow + // get reference frame (body/model(link)) pose and + // transform target pose to absolute world frame + ignition::math::Vector3d target_pos(req.link_state.pose.position.x, req.link_state.pose.position.y, req.link_state.pose.position.z); + ignition::math::Quaterniond target_rot(req.link_state.pose.orientation.w, req.link_state.pose.orientation.x, req.link_state.pose.orientation.y, req.link_state.pose.orientation.z); + ignition::math::Pose3d target_pose(target_pos, target_rot); + ignition::math::Vector3d target_linear_vel(req.link_state.twist.linear.x, req.link_state.twist.linear.y, req.link_state.twist.linear.z); + ignition::math::Vector3d target_angular_vel(req.link_state.twist.angular.x, req.link_state.twist.angular.y, req.link_state.twist.angular.z); + + if (frame) + { +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d frame_pose = frame->WorldPose(); // - myBody->GetCoMPose(); + ignition::math::Vector3d frame_linear_vel = frame->WorldLinearVel(); + ignition::math::Vector3d frame_angular_vel = frame->WorldAngularVel(); +#else + ignition::math::Pose3d frame_pose = frame->GetWorldPose().Ign(); // - myBody->GetCoMPose(); + ignition::math::Vector3d frame_linear_vel = frame->GetWorldLinearVel().Ign(); + ignition::math::Vector3d frame_angular_vel = frame->GetWorldAngularVel().Ign(); +#endif + ignition::math::Vector3d frame_pos = frame_pose.Pos(); + ignition::math::Quaterniond frame_rot = frame_pose.Rot(); + + //std::cout << " debug : " << frame->GetName() << " : " << frame_pose << " : " << target_pose << std::endl; + target_pose = target_pose + frame_pose; + + target_linear_vel -= frame_linear_vel; + target_angular_vel -= frame_angular_vel; + } + else if (req.link_state.reference_frame == "" || req.link_state.reference_frame == "world" || req.link_state.reference_frame == "map" || req.link_state.reference_frame == "/map") + { + ROS_INFO_NAMED("api_plugin", "Updating LinkState: reference_frame is empty/world/map, using inertial frame"); + } + else + { + ROS_ERROR_NAMED("api_plugin", "Updating LinkState: reference_frame is not a valid entity name"); + res.success = false; + res.status_message = "SetLinkState: failed"; + return true; + } + + //std::cout << " debug : " << target_pose << std::endl; + //boost::recursive_mutex::scoped_lock lock(*world->GetMRMutex()); + + bool is_paused = world_->IsPaused(); + if (!is_paused) + world_->SetPaused(true); + body->SetWorldPose(target_pose); + world_->SetPaused(is_paused); + + // set body velocity to desired twist + body->SetLinearVel(target_linear_vel); + body->SetAngularVel(target_angular_vel); + + res.success = true; + res.status_message = "SetLinkState: success"; + return true; +} + +void GazeboRosApiPlugin::updateLinkState(const gazebo_msgs::LinkState::ConstPtr &link_state) +{ + gazebo_msgs::SetLinkState::Request req; + gazebo_msgs::SetLinkState::Response res; + req.link_state = *link_state; + /*bool success = */ setLinkState(req, res); +} + +void GazeboRosApiPlugin::transformWrench(ignition::math::Vector3d &target_force, ignition::math::Vector3d &target_torque, + const ignition::math::Vector3d &reference_force, + const ignition::math::Vector3d &reference_torque, + const ignition::math::Pose3d &target_to_reference) +{ + // rotate force into target frame + target_force = target_to_reference.Rot().RotateVector(reference_force); + // rotate torque into target frame + target_torque = target_to_reference.Rot().RotateVector(reference_torque); + + // target force is the refence force rotated by the target->reference transform + target_torque = target_torque + target_to_reference.Pos().Cross(target_force); +} + +bool GazeboRosApiPlugin::applyBodyWrench(gazebo_msgs::ApplyBodyWrench::Request &req, + gazebo_msgs::ApplyBodyWrench::Response &res) +{ +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::LinkPtr body = boost::dynamic_pointer_cast(world_->EntityByName(req.body_name)); + gazebo::physics::EntityPtr frame = world_->EntityByName(req.reference_frame); +#else + gazebo::physics::LinkPtr body = boost::dynamic_pointer_cast(world_->GetEntity(req.body_name)); + gazebo::physics::EntityPtr frame = world_->GetEntity(req.reference_frame); +#endif + if (!body) + { + ROS_ERROR_NAMED("api_plugin", "ApplyBodyWrench: body [%s] does not exist", req.body_name.c_str()); + res.success = false; + res.status_message = "ApplyBodyWrench: body does not exist"; + return true; + } + + // target wrench + ignition::math::Vector3d reference_force(req.wrench.force.x, req.wrench.force.y, req.wrench.force.z); + ignition::math::Vector3d reference_torque(req.wrench.torque.x, req.wrench.torque.y, req.wrench.torque.z); + ignition::math::Vector3d reference_point(req.reference_point.x, req.reference_point.y, req.reference_point.z); + + ignition::math::Vector3d target_force; + ignition::math::Vector3d target_torque; + + /// shift wrench to body frame if a non-zero reference point is given + /// @todo: to be more general, should we make the reference point a reference pose? + reference_torque = reference_torque + reference_point.Cross(reference_force); + + /// @todo: FIXME map is really wrong, need to use tf here somehow + if (frame) + { + // get reference frame (body/model(body)) pose and + // transform target pose to absolute world frame + // @todo: need to modify wrench (target force and torque by frame) + // transform wrench from reference_point in reference_frame + // into the reference frame of the body + // first, translate by reference point to the body frame +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d framePose = frame->WorldPose(); +#else + ignition::math::Pose3d framePose = frame->GetWorldPose().Ign(); +#endif +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d bodyPose = body->WorldPose(); +#else + ignition::math::Pose3d bodyPose = body->GetWorldPose().Ign(); +#endif + ignition::math::Pose3d target_to_reference = framePose - bodyPose; + ROS_DEBUG_NAMED("api_plugin", "reference frame for applied wrench: [%f %f %f, %f %f %f]-[%f %f %f, %f %f %f]=[%f %f %f, %f %f %f]", + bodyPose.Pos().X(), + bodyPose.Pos().Y(), + bodyPose.Pos().Z(), + bodyPose.Rot().Euler().X(), + bodyPose.Rot().Euler().Y(), + bodyPose.Rot().Euler().Z(), + framePose.Pos().X(), + framePose.Pos().Y(), + framePose.Pos().Z(), + framePose.Rot().Euler().X(), + framePose.Rot().Euler().Y(), + framePose.Rot().Euler().Z(), + target_to_reference.Pos().X(), + target_to_reference.Pos().Y(), + target_to_reference.Pos().Z(), + target_to_reference.Rot().Euler().X(), + target_to_reference.Rot().Euler().Y(), + target_to_reference.Rot().Euler().Z()); + transformWrench(target_force, target_torque, reference_force, reference_torque, target_to_reference); + ROS_ERROR_NAMED("api_plugin", "wrench defined as [%s]:[%f %f %f, %f %f %f] --> applied as [%s]:[%f %f %f, %f %f %f]", + frame->GetName().c_str(), + reference_force.X(), + reference_force.Y(), + reference_force.Z(), + reference_torque.X(), + reference_torque.Y(), + reference_torque.Z(), + body->GetName().c_str(), + target_force.X(), + target_force.Y(), + target_force.Z(), + target_torque.X(), + target_torque.Y(), + target_torque.Z()); + } + else if (req.reference_frame == "" || req.reference_frame == "world" || req.reference_frame == "map" || req.reference_frame == "/map") + { + ROS_INFO_NAMED("api_plugin", "ApplyBodyWrench: reference_frame is empty/world/map, using inertial frame, transferring from body relative to inertial frame"); + // FIXME: transfer to inertial frame +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d target_to_reference = body->WorldPose(); +#else + ignition::math::Pose3d target_to_reference = body->GetWorldPose().Ign(); +#endif + target_force = reference_force; + target_torque = reference_torque; + } + else + { + ROS_ERROR_NAMED("api_plugin", "ApplyBodyWrench: reference_frame is not a valid entity name"); + res.success = false; + res.status_message = "ApplyBodyWrench: reference_frame not found"; + return true; + } + + // apply wrench + // schedule a job to do below at appropriate times: + // body->SetForce(force) + // body->SetTorque(torque) + GazeboRosApiPlugin::WrenchBodyJob *wej = new GazeboRosApiPlugin::WrenchBodyJob; + wej->body = body; + wej->force = target_force; + wej->torque = target_torque; + wej->start_time = req.start_time; +#if GAZEBO_MAJOR_VERSION >= 8 + if (wej->start_time < ros::Time(world_->SimTime().Double())) + wej->start_time = ros::Time(world_->SimTime().Double()); +#else + if (wej->start_time < ros::Time(world_->GetSimTime().Double())) + wej->start_time = ros::Time(world_->GetSimTime().Double()); +#endif + wej->duration = req.duration; + lock_.lock(); + wrench_body_jobs_.push_back(wej); + lock_.unlock(); + + res.success = true; + res.status_message = ""; + return true; +} + +bool GazeboRosApiPlugin::isURDF(std::string model_xml) +{ + TiXmlDocument doc_in; + doc_in.Parse(model_xml.c_str()); + if (doc_in.FirstChild("robot")) + return true; + else + return false; +} + +bool GazeboRosApiPlugin::isSDF(std::string model_xml) +{ + // FIXME: very crude check + TiXmlDocument doc_in; + doc_in.Parse(model_xml.c_str()); + if (doc_in.FirstChild("gazebo") || + doc_in.FirstChild("sdf")) // sdf + return true; + else + return false; +} + +void GazeboRosApiPlugin::wrenchBodySchedulerSlot() +{ + // MDMutex locks in case model is getting deleted, don't have to do this if we delete jobs first + // boost::recursive_mutex::scoped_lock lock(*world->GetMDMutex()); + lock_.lock(); + for (std::vector::iterator iter = wrench_body_jobs_.begin(); iter != wrench_body_jobs_.end();) + { + // check times and apply wrench if necessary +#if GAZEBO_MAJOR_VERSION >= 8 + ros::Time simTime = ros::Time(world_->SimTime().Double()); +#else + ros::Time simTime = ros::Time(world_->GetSimTime().Double()); +#endif + if (simTime >= (*iter)->start_time) + if (simTime <= (*iter)->start_time + (*iter)->duration || + (*iter)->duration.toSec() < 0.0) + { + if ((*iter)->body) // if body exists + { + (*iter)->body->SetForce((*iter)->force); + (*iter)->body->SetTorque((*iter)->torque); + } + else + (*iter)->duration.fromSec(0.0); // mark for delete + } + + if (simTime > (*iter)->start_time + (*iter)->duration && + (*iter)->duration.toSec() >= 0.0) + { + // remove from queue once expires + delete (*iter); + iter = wrench_body_jobs_.erase(iter); + } + else + ++iter; + } + lock_.unlock(); +} + +void GazeboRosApiPlugin::forceJointSchedulerSlot() +{ + // MDMutex locks in case model is getting deleted, don't have to do this if we delete jobs first + // boost::recursive_mutex::scoped_lock lock(*world->GetMDMutex()); + lock_.lock(); + for (std::vector::iterator iter = force_joint_jobs_.begin(); iter != force_joint_jobs_.end();) + { + // check times and apply force if necessary +#if GAZEBO_MAJOR_VERSION >= 8 + ros::Time simTime = ros::Time(world_->SimTime().Double()); +#else + ros::Time simTime = ros::Time(world_->GetSimTime().Double()); +#endif + if (simTime >= (*iter)->start_time) + if (simTime <= (*iter)->start_time + (*iter)->duration || + (*iter)->duration.toSec() < 0.0) + { + if ((*iter)->joint) // if joint exists + (*iter)->joint->SetForce(0, (*iter)->force); + else + (*iter)->duration.fromSec(0.0); // mark for delete + } + + if (simTime > (*iter)->start_time + (*iter)->duration && + (*iter)->duration.toSec() >= 0.0) + { + // remove from queue once expires + iter = force_joint_jobs_.erase(iter); + } + else + ++iter; + } + lock_.unlock(); +} + +void GazeboRosApiPlugin::publishSimTime(const boost::shared_ptr &msg) +{ + ROS_ERROR_NAMED("api_plugin", "CLOCK2"); +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::common::Time sim_time = world_->SimTime(); +#else + gazebo::common::Time sim_time = world_->GetSimTime(); +#endif + if (pub_clock_frequency_ > 0 && (sim_time - last_pub_clock_time_).Double() < 1.0 / pub_clock_frequency_) + return; + + gazebo::common::Time currentTime = gazebo::msgs::Convert(msg->sim_time()); + rosgraph_msgs::Clock ros_time_; + ros_time_.clock.fromSec(currentTime.Double()); + // publish time to ros + last_pub_clock_time_ = sim_time; + pub_clock_.publish(ros_time_); +} +void GazeboRosApiPlugin::publishSimTime() +{ +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::common::Time sim_time = world_->SimTime(); +#else + gazebo::common::Time sim_time = world_->GetSimTime(); +#endif + if (pub_clock_frequency_ > 0 && (sim_time - last_pub_clock_time_).Double() < 1.0 / pub_clock_frequency_) + return; + +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::common::Time currentTime = world_->SimTime(); +#else + gazebo::common::Time currentTime = world_->GetSimTime(); +#endif + rosgraph_msgs::Clock ros_time_; + ros_time_.clock.fromSec(currentTime.Double()); + // publish time to ros + last_pub_clock_time_ = sim_time; + pub_clock_.publish(ros_time_); +} + +void GazeboRosApiPlugin::publishLinkStates() +{ + gazebo_msgs::LinkStates link_states; + + // fill link_states +#if GAZEBO_MAJOR_VERSION >= 8 + for (unsigned int i = 0; i < world_->ModelCount(); i++) + { + gazebo::physics::ModelPtr model = world_->ModelByIndex(i); +#else + for (unsigned int i = 0; i < world_->GetModelCount(); i++) + { + gazebo::physics::ModelPtr model = world_->GetModel(i); +#endif + + for (unsigned int j = 0; j < model->GetChildCount(); j++) + { + gazebo::physics::LinkPtr body = boost::dynamic_pointer_cast(model->GetChild(j)); + + if (body) + { + link_states.name.push_back(body->GetScopedName()); + geometry_msgs::Pose pose; +#if GAZEBO_MAJOR_VERSION >= 8 + ignition::math::Pose3d body_pose = body->WorldPose(); // - myBody->GetCoMPose(); + ignition::math::Vector3d linear_vel = body->WorldLinearVel(); + ignition::math::Vector3d angular_vel = body->WorldAngularVel(); +#else + ignition::math::Pose3d body_pose = body->GetWorldPose().Ign(); // - myBody->GetCoMPose(); + ignition::math::Vector3d linear_vel = body->GetWorldLinearVel().Ign(); + ignition::math::Vector3d angular_vel = body->GetWorldAngularVel().Ign(); +#endif + ignition::math::Vector3d pos = body_pose.Pos(); + ignition::math::Quaterniond rot = body_pose.Rot(); + pose.position.x = pos.X(); + pose.position.y = pos.Y(); + pose.position.z = pos.Z(); + pose.orientation.w = rot.W(); + pose.orientation.x = rot.X(); + pose.orientation.y = rot.Y(); + pose.orientation.z = rot.Z(); + link_states.pose.push_back(pose); + geometry_msgs::Twist twist; + twist.linear.x = linear_vel.X(); + twist.linear.y = linear_vel.Y(); + twist.linear.z = linear_vel.Z(); + twist.angular.x = angular_vel.X(); + twist.angular.y = angular_vel.Y(); + twist.angular.z = angular_vel.Z(); + link_states.twist.push_back(twist); + } + } + } + + pub_link_states_.publish(link_states); +} + +void GazeboRosApiPlugin::publishModelStates() +{ + gazebo_msgs::ModelStates model_states; + + // fill model_states +#if GAZEBO_MAJOR_VERSION >= 8 + for (unsigned int i = 0; i < world_->ModelCount(); i++) + { + gazebo::physics::ModelPtr model = world_->ModelByIndex(i); + ignition::math::Pose3d model_pose = model->WorldPose(); // - myBody->GetCoMPose(); + ignition::math::Vector3d linear_vel = model->WorldLinearVel(); + ignition::math::Vector3d angular_vel = model->WorldAngularVel(); +#else + for (unsigned int i = 0; i < world_->GetModelCount(); i++) + { + gazebo::physics::ModelPtr model = world_->GetModel(i); + ignition::math::Pose3d model_pose = model->GetWorldPose().Ign(); // - myBody->GetCoMPose(); + ignition::math::Vector3d linear_vel = model->GetWorldLinearVel().Ign(); + ignition::math::Vector3d angular_vel = model->GetWorldAngularVel().Ign(); +#endif + ignition::math::Vector3d pos = model_pose.Pos(); + ignition::math::Quaterniond rot = model_pose.Rot(); + geometry_msgs::Pose pose; + pose.position.x = pos.X(); + pose.position.y = pos.Y(); + pose.position.z = pos.Z(); + pose.orientation.w = rot.W(); + pose.orientation.x = rot.X(); + pose.orientation.y = rot.Y(); + pose.orientation.z = rot.Z(); + model_states.pose.push_back(pose); + model_states.name.push_back(model->GetName()); + geometry_msgs::Twist twist; + twist.linear.x = linear_vel.X(); + twist.linear.y = linear_vel.Y(); + twist.linear.z = linear_vel.Z(); + twist.angular.x = angular_vel.X(); + twist.angular.y = angular_vel.Y(); + twist.angular.z = angular_vel.Z(); + model_states.twist.push_back(twist); + } + pub_model_states_.publish(model_states); +} + +void GazeboRosApiPlugin::physicsReconfigureCallback(gazebo_ros::PhysicsConfig &config, uint32_t level) +{ + if (!physics_reconfigure_initialized_) + { + gazebo_msgs::GetPhysicsProperties srv; + physics_reconfigure_get_client_.call(srv); + + config.time_step = srv.response.time_step; + config.max_update_rate = srv.response.max_update_rate; + config.gravity_x = srv.response.gravity.x; + config.gravity_y = srv.response.gravity.y; + config.gravity_z = srv.response.gravity.z; + config.auto_disable_bodies = srv.response.ode_config.auto_disable_bodies; + config.sor_pgs_precon_iters = srv.response.ode_config.sor_pgs_precon_iters; + config.sor_pgs_iters = srv.response.ode_config.sor_pgs_iters; + config.sor_pgs_rms_error_tol = srv.response.ode_config.sor_pgs_rms_error_tol; + config.sor_pgs_w = srv.response.ode_config.sor_pgs_w; + config.contact_surface_layer = srv.response.ode_config.contact_surface_layer; + config.contact_max_correcting_vel = srv.response.ode_config.contact_max_correcting_vel; + config.cfm = srv.response.ode_config.cfm; + config.erp = srv.response.ode_config.erp; + config.max_contacts = srv.response.ode_config.max_contacts; + physics_reconfigure_initialized_ = true; + } + else + { + bool changed = false; + gazebo_msgs::GetPhysicsProperties srv; + physics_reconfigure_get_client_.call(srv); + + // check for changes + if (config.time_step != srv.response.time_step) + changed = true; + if (config.max_update_rate != srv.response.max_update_rate) + changed = true; + if (config.gravity_x != srv.response.gravity.x) + changed = true; + if (config.gravity_y != srv.response.gravity.y) + changed = true; + if (config.gravity_z != srv.response.gravity.z) + changed = true; + if (config.auto_disable_bodies != srv.response.ode_config.auto_disable_bodies) + changed = true; + if ((uint32_t)config.sor_pgs_precon_iters != srv.response.ode_config.sor_pgs_precon_iters) + changed = true; + if ((uint32_t)config.sor_pgs_iters != srv.response.ode_config.sor_pgs_iters) + changed = true; + if (config.sor_pgs_rms_error_tol != srv.response.ode_config.sor_pgs_rms_error_tol) + changed = true; + if (config.sor_pgs_w != srv.response.ode_config.sor_pgs_w) + changed = true; + if (config.contact_surface_layer != srv.response.ode_config.contact_surface_layer) + changed = true; + if (config.contact_max_correcting_vel != srv.response.ode_config.contact_max_correcting_vel) + changed = true; + if (config.cfm != srv.response.ode_config.cfm) + changed = true; + if (config.erp != srv.response.ode_config.erp) + changed = true; + if ((uint32_t)config.max_contacts != srv.response.ode_config.max_contacts) + changed = true; + + if (changed) + { + // pause simulation if requested + gazebo_msgs::SetPhysicsProperties srv; + srv.request.time_step = config.time_step; + srv.request.max_update_rate = config.max_update_rate; + srv.request.gravity.x = config.gravity_x; + srv.request.gravity.y = config.gravity_y; + srv.request.gravity.z = config.gravity_z; + srv.request.ode_config.auto_disable_bodies = config.auto_disable_bodies; + srv.request.ode_config.sor_pgs_precon_iters = config.sor_pgs_precon_iters; + srv.request.ode_config.sor_pgs_iters = config.sor_pgs_iters; + srv.request.ode_config.sor_pgs_rms_error_tol = config.sor_pgs_rms_error_tol; + srv.request.ode_config.sor_pgs_w = config.sor_pgs_w; + srv.request.ode_config.contact_surface_layer = config.contact_surface_layer; + srv.request.ode_config.contact_max_correcting_vel = config.contact_max_correcting_vel; + srv.request.ode_config.cfm = config.cfm; + srv.request.ode_config.erp = config.erp; + srv.request.ode_config.max_contacts = config.max_contacts; + physics_reconfigure_set_client_.call(srv); + ROS_INFO_NAMED("api_plugin", "physics dynamics reconfigure update complete"); + } + ROS_INFO_NAMED("api_plugin", "physics dynamics reconfigure complete"); + } +} + +void GazeboRosApiPlugin::physicsReconfigureThread() +{ + physics_reconfigure_set_client_ = nh_->serviceClient("/gazebo/set_physics_properties"); + physics_reconfigure_get_client_ = nh_->serviceClient("/gazebo/get_physics_properties"); + + // Wait until the rest of this plugin is loaded and the services are being offered + physics_reconfigure_set_client_.waitForExistence(); + physics_reconfigure_get_client_.waitForExistence(); + + physics_reconfigure_srv_.reset(new dynamic_reconfigure::Server()); + + physics_reconfigure_callback_ = boost::bind(&GazeboRosApiPlugin::physicsReconfigureCallback, this, _1, _2); + physics_reconfigure_srv_->setCallback(physics_reconfigure_callback_); + + ROS_INFO_NAMED("api_plugin", "Physics dynamic reconfigure ready."); +} + +void GazeboRosApiPlugin::stripXmlDeclaration(std::string &model_xml) +{ + // incoming robot model string is a string containing a Gazebo Model XML + /// STRIP DECLARATION from model_xml + /// @todo: does tinyxml have functionality for this? + /// @todo: should gazebo take care of the declaration? + std::string open_bracket(""); + size_t pos1 = model_xml.find(open_bracket, 0); + size_t pos2 = model_xml.find(close_bracket, 0); + if (pos1 != std::string::npos && pos2 != std::string::npos) + model_xml.replace(pos1, pos2 - pos1 + 2, std::string("")); +} + +void GazeboRosApiPlugin::updateSDFAttributes(TiXmlDocument &gazebo_model_xml, + const std::string &model_name, + const ignition::math::Vector3d &initial_xyz, + const ignition::math::Quaterniond &initial_q) +{ + // This function can handle both regular SDF files and SDFs that are used with the + // Gazebo Model Database + + TiXmlElement *pose_element; // This is used by both reguar and database SDFs + + // Check SDF for requires SDF element + TiXmlElement *gazebo_tixml = gazebo_model_xml.FirstChildElement("sdf"); + if (!gazebo_tixml) + { + ROS_WARN_NAMED("api_plugin", "Could not find element in sdf, so name and initial position cannot be applied"); + return; + } + + // Check SDF for optional model element. May not have one + TiXmlElement *model_tixml = gazebo_tixml->FirstChildElement("model"); + if (model_tixml) + { + // Update entity name + if (model_tixml->Attribute("name") != NULL) + { + // removing old entity name + model_tixml->RemoveAttribute("name"); + } + // replace with user specified name + model_tixml->SetAttribute("name", model_name); + } + else + { + // Check SDF for world element + TiXmlElement *world_tixml = gazebo_tixml->FirstChildElement("world"); + if (!world_tixml) + { + ROS_WARN_NAMED("api_plugin", "Could not find or element in sdf, so name and initial position cannot be applied"); + return; + } + // If not element, check SDF for required include element + model_tixml = world_tixml->FirstChildElement("include"); + if (!model_tixml) + { + ROS_WARN_NAMED("api_plugin", "Could not find element in sdf, so name and initial position cannot be applied"); + return; + } + + // Check for name element + TiXmlElement *name_tixml = model_tixml->FirstChildElement("name"); + if (!name_tixml) + { + // Create the name element + name_tixml = new TiXmlElement("name"); + model_tixml->LinkEndChild(name_tixml); + } + + // Set the text within the name element + TiXmlText *text = new TiXmlText(model_name); + name_tixml->LinkEndChild(text); + } + + // Check for the pose element + pose_element = model_tixml->FirstChildElement("pose"); + ignition::math::Pose3d model_pose; + + // Create the pose element if it doesn't exist + // Remove it if it exists, since we are inserting a new one + if (pose_element) + { + // save pose_element in ignition::math::Pose3d and remove child + model_pose = this->parsePose(pose_element->GetText()); + model_tixml->RemoveChild(pose_element); + } + + // Set and link the pose element after adding initial pose + { + // add pose_element Pose to initial pose + ignition::math::Pose3d new_model_pose = model_pose + ignition::math::Pose3d(initial_xyz, initial_q); + + // Create the string of 6 numbers + std::ostringstream pose_stream; + ignition::math::Vector3d model_rpy = new_model_pose.Rot().Euler(); // convert to Euler angles for Gazebo XML + pose_stream << new_model_pose.Pos().X() << " " << new_model_pose.Pos().Y() << " " << new_model_pose.Pos().Z() << " " + << model_rpy.X() << " " << model_rpy.Y() << " " << model_rpy.Z(); + + // Add value to pose element + TiXmlText *text = new TiXmlText(pose_stream.str()); + TiXmlElement *new_pose_element = new TiXmlElement("pose"); + new_pose_element->LinkEndChild(text); + model_tixml->LinkEndChild(new_pose_element); + } +} + +ignition::math::Pose3d GazeboRosApiPlugin::parsePose(const std::string &str) +{ + std::vector pieces; + std::vector vals; + + boost::split(pieces, str, boost::is_any_of(" ")); + for (unsigned int i = 0; i < pieces.size(); ++i) + { + if (pieces[i] != "") + { + try + { + vals.push_back(boost::lexical_cast(pieces[i].c_str())); + } + catch (boost::bad_lexical_cast &e) + { + sdferr << "xml key [" << str + << "][" << i << "] value [" << pieces[i] + << "] is not a valid double from a 3-tuple\n"; + return ignition::math::Pose3d(); + } + } + } + + if (vals.size() == 6) + return ignition::math::Pose3d(vals[0], vals[1], vals[2], vals[3], vals[4], vals[5]); + else + { + ROS_ERROR_NAMED("api_plugin", "Beware: failed to parse string [%s] as ignition::math::Pose3d, returning zeros.", str.c_str()); + return ignition::math::Pose3d(); + } +} + +ignition::math::Vector3d GazeboRosApiPlugin::parseVector3(const std::string &str) +{ + std::vector pieces; + std::vector vals; + + boost::split(pieces, str, boost::is_any_of(" ")); + for (unsigned int i = 0; i < pieces.size(); ++i) + { + if (pieces[i] != "") + { + try + { + vals.push_back(boost::lexical_cast(pieces[i].c_str())); + } + catch (boost::bad_lexical_cast &e) + { + sdferr << "xml key [" << str + << "][" << i << "] value [" << pieces[i] + << "] is not a valid double from a 3-tuple\n"; + return ignition::math::Vector3d(); + } + } + } + + if (vals.size() == 3) + return ignition::math::Vector3d(vals[0], vals[1], vals[2]); + else + { + ROS_ERROR_NAMED("api_plugin", "Beware: failed to parse string [%s] as ignition::math::Vector3d, returning zeros.", str.c_str()); + return ignition::math::Vector3d(); + } +} + +void GazeboRosApiPlugin::updateURDFModelPose(TiXmlDocument &gazebo_model_xml, + const ignition::math::Vector3d &initial_xyz, + const ignition::math::Quaterniond &initial_q) +{ + TiXmlElement *model_tixml = (gazebo_model_xml.FirstChildElement("robot")); + if (model_tixml) + { + // replace initial pose of model + // find first instance of xyz and rpy, replace with initial pose + TiXmlElement *origin_key = model_tixml->FirstChildElement("origin"); + + if (!origin_key) + { + origin_key = new TiXmlElement("origin"); + model_tixml->LinkEndChild(origin_key); + } + + ignition::math::Vector3d xyz; + ignition::math::Vector3d rpy; + if (origin_key->Attribute("xyz")) + { + xyz = this->parseVector3(origin_key->Attribute("xyz")); + origin_key->RemoveAttribute("xyz"); + } + if (origin_key->Attribute("rpy")) + { + rpy = this->parseVector3(origin_key->Attribute("rpy")); + origin_key->RemoveAttribute("rpy"); + } + + // add xyz, rpy to initial pose + ignition::math::Pose3d model_pose = ignition::math::Pose3d(xyz, ignition::math::Quaterniond(rpy)) + ignition::math::Pose3d(initial_xyz, initial_q); + + std::ostringstream xyz_stream; + xyz_stream << model_pose.Pos().X() << " " << model_pose.Pos().Y() << " " << model_pose.Pos().Z(); + + std::ostringstream rpy_stream; + ignition::math::Vector3d model_rpy = model_pose.Rot().Euler(); // convert to Euler angles for Gazebo XML + rpy_stream << model_rpy.X() << " " << model_rpy.Y() << " " << model_rpy.Z(); + + origin_key->SetAttribute("xyz", xyz_stream.str()); + origin_key->SetAttribute("rpy", rpy_stream.str()); + } + else + ROS_WARN_NAMED("api_plugin", "Could not find element in sdf, so name and initial position is not applied"); +} + +void GazeboRosApiPlugin::updateURDFName(TiXmlDocument &gazebo_model_xml, const std::string &model_name) +{ + TiXmlElement *model_tixml = gazebo_model_xml.FirstChildElement("robot"); + // replace model name if one is specified by the user + if (model_tixml) + { + if (model_tixml->Attribute("name") != NULL) + { + // removing old model name + model_tixml->RemoveAttribute("name"); + } + // replace with user specified name + model_tixml->SetAttribute("name", model_name); + } + else + ROS_WARN_NAMED("api_plugin", "Could not find element in URDF, name not replaced"); +} + +void GazeboRosApiPlugin::walkChildAddRobotNamespace(TiXmlNode *model_xml) +{ + TiXmlNode *child = 0; + child = model_xml->IterateChildren(child); + while (child != NULL) + { + if (child->Type() == TiXmlNode::TINYXML_ELEMENT && + child->ValueStr().compare(std::string("plugin")) == 0) + { + if (child->FirstChildElement("robotNamespace") == NULL) + { + TiXmlElement *child_elem = child->ToElement()->FirstChildElement("robotNamespace"); + while (child_elem) + { + child->ToElement()->RemoveChild(child_elem); + child_elem = child->ToElement()->FirstChildElement("robotNamespace"); + } + TiXmlElement *key = new TiXmlElement("robotNamespace"); + TiXmlText *val = new TiXmlText(robot_namespace_); + key->LinkEndChild(val); + child->ToElement()->LinkEndChild(key); + } + } + walkChildAddRobotNamespace(child); + child = model_xml->IterateChildren(child); + } +} + +bool GazeboRosApiPlugin::spawnAndConform(TiXmlDocument &gazebo_model_xml, const std::string &model_name, + gazebo_msgs::SpawnModel::Response &res) +{ + std::string entity_type = gazebo_model_xml.RootElement()->FirstChild()->Value(); + // Convert the entity type to lower case + std::transform(entity_type.begin(), entity_type.end(), entity_type.begin(), ::tolower); + + bool isLight = (entity_type == "light"); + + // push to factory iface + std::ostringstream stream; + stream << gazebo_model_xml; + std::string gazebo_model_xml_string = stream.str(); + ROS_DEBUG_NAMED("api_plugin.xml", "Gazebo Model XML\n\n%s\n\n ", gazebo_model_xml_string.c_str()); + + // publish to factory topic + gazebo::msgs::Factory msg; + gazebo::msgs::Init(msg, "spawn_model"); + msg.set_sdf(gazebo_model_xml_string); + + //ROS_ERROR_NAMED("api_plugin", "attempting to spawn model name [%s] [%s]", model_name.c_str(),gazebo_model_xml_string.c_str()); + + // FIXME: should use entity_info or add lock to World::receiveMutex + // looking for Model to see if it exists already + gazebo::msgs::Request *entity_info_msg = gazebo::msgs::CreateRequest("entity_info", model_name); + request_pub_->Publish(*entity_info_msg, true); + // todo: should wait for response response_sub_, check to see that if _msg->response == "nonexistant" + +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::ModelPtr model = world_->ModelByName(model_name); + gazebo::physics::LightPtr light = world_->LightByName(model_name); +#else + gazebo::physics::ModelPtr model = world_->GetModel(model_name); + gazebo::physics::LightPtr light = world_->Light(model_name); +#endif + if ((isLight && light != NULL) || (model != NULL)) + { + ROS_ERROR_NAMED("api_plugin", "SpawnModel: Failure - model name %s already exist.", model_name.c_str()); + res.success = false; + res.status_message = "SpawnModel: Failure - entity already exists."; + return true; + } + + // for Gazebo 7 and up, use a different method to spawn lights + if (isLight) + { + // Publish the light message to spawn the light (Gazebo 7 and up) + sdf::SDF sdf_light; + sdf_light.SetFromString(gazebo_model_xml_string); + gazebo::msgs::Light msg = gazebo::msgs::LightFromSDF(sdf_light.Root()->GetElement("light")); + msg.set_name(model_name); + factory_light_pub_->Publish(msg); + } + else + { + // Publish the factory message + factory_pub_->Publish(msg); + } + /// FIXME: should change publish to direct invocation World::LoadModel() and/or + /// change the poll for Model existence to common::Events based check. + + /// \brief poll and wait, verify that the model is spawned within Hardcoded 10 seconds + ros::Duration model_spawn_timeout(10.0); + ros::Time timeout = ros::Time::now() + model_spawn_timeout; + + while (ros::ok()) + { + if (ros::Time::now() > timeout) + { + res.success = false; + res.status_message = "SpawnModel: Entity pushed to spawn queue, but spawn service timed out waiting for entity to appear in simulation under the name " + model_name; + return true; + } + + { + //boost::recursive_mutex::scoped_lock lock(*world->GetMRMutex()); +#if GAZEBO_MAJOR_VERSION >= 8 + if ((isLight && world_->LightByName(model_name) != NULL) || (world_->ModelByName(model_name) != NULL)) +#else + if ((isLight && world_->Light(model_name) != NULL) || (world_->GetModel(model_name) != NULL)) +#endif + break; + } + + ROS_DEBUG_STREAM_ONCE_NAMED("api_plugin", "Waiting for " << timeout - ros::Time::now() + << " for entity " << model_name << " to spawn"); + + usleep(2000); + } + + // set result + res.success = true; + res.status_message = "SpawnModel: Successfully spawned entity"; + return true; +} + +// Register this plugin with the simulator +GZ_REGISTER_SYSTEM_PLUGIN(GazeboRosApiPlugin) +} // namespace gazebo diff --git a/gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros_paths_plugin.cpp b/gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros_paths_plugin.cpp new file mode 100755 index 0000000..74e3fbe --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros_paths_plugin.cpp @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2012-2014 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +/* + * Author: John Hsu, Nate Koenig, Dave Coleman + * Desc: External interfaces for Gazebo + */ + +#include +#include + +#include +#include + +#include + +namespace gazebo +{ + +typedef std::vector V_string; +typedef std::map M_string; + +class GazeboRosPathsPlugin : public SystemPlugin +{ +public: + GazeboRosPathsPlugin() + { + this->LoadPaths(); + } + + ~GazeboRosPathsPlugin() + { + }; + + void Init() + { + } + + void Load(int argc, char** argv) + { + } + + /** + * @brief Set Gazebo Path/Resources Configurations GAZEBO_MODEL_PATH, PLUGIN_PATH and + GAZEBO_MEDIA_PATH by adding paths to GazeboConfig based on ros::package + */ + void LoadPaths() + { + // set gazebo media paths by adding all packages that exports "gazebo_media_path" for gazebo + gazebo::common::SystemPaths::Instance()->gazeboPathsFromEnv = false; + std::vector gazebo_media_paths; + ros::package::getPlugins("gazebo_ros","gazebo_media_path",gazebo_media_paths); + for (std::vector::iterator iter=gazebo_media_paths.begin(); iter != gazebo_media_paths.end(); iter++) + { + ROS_DEBUG_NAMED("paths_plugin", "Media path %s",iter->c_str()); + gazebo::common::SystemPaths::Instance()->AddGazeboPaths(iter->c_str()); + } + + // set gazebo plugins paths by adding all packages that exports "plugin_path" for gazebo + gazebo::common::SystemPaths::Instance()->pluginPathsFromEnv = false; + std::vector plugin_paths; + ros::package::getPlugins("gazebo_ros","plugin_path",plugin_paths); + for (std::vector::iterator iter=plugin_paths.begin(); iter != plugin_paths.end(); iter++) + { + ROS_DEBUG_NAMED("paths_plugin", "plugin path %s",(*iter).c_str()); + gazebo::common::SystemPaths::Instance()->AddPluginPaths(iter->c_str()); + } + + // set model paths by adding all packages that exports "gazebo_model_path" for gazebo + gazebo::common::SystemPaths::Instance()->modelPathsFromEnv = false; + std::vector model_paths; + ros::package::getPlugins("gazebo_ros","gazebo_model_path",model_paths); + for (std::vector::iterator iter=model_paths.begin(); iter != model_paths.end(); iter++) + { + ROS_DEBUG_NAMED("paths_plugin", "Model path %s",(*iter).c_str()); + gazebo::common::SystemPaths::Instance()->AddModelPaths(iter->c_str()); + } + + // set .gazeborc path to something else, so we don't pick up default ~/.gazeborc + std::string gazeborc = ros::package::getPath("gazebo_ros")+"/.do_not_use_gazeborc"; + setenv("GAZEBORC",gazeborc.c_str(),1); + } + +}; + +// Register this plugin with the simulator +GZ_REGISTER_SYSTEM_PLUGIN(GazeboRosPathsPlugin) + +} diff --git a/gazebo_ros_pkgs/gazebo_ros_control/CHANGELOG.rst b/gazebo_ros_pkgs/gazebo_ros_control/CHANGELOG.rst new file mode 100755 index 0000000..826fe5e --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros_control/CHANGELOG.rst @@ -0,0 +1,365 @@ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Changelog for package gazebo_ros_control +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +2.5.15 (2018-02-12) +------------------- +* Fix last gazebo8 warnings! (`#658 `_) +* Fix gazebo8 warnings part 7: ifdef's for Joint::GetAngle and some cleanup (`#642 `_) +* Contributors: Steven Peters + +2.5.14 (2017-12-11) +------------------- +* Replace Events::Disconnect* with pointer reset (`#623 `_) +* Contributors: Steven Peters + +2.5.13 (2017-06-24) +------------------- +* Less exciting console output (`#561 `_) +* Add catkin package(s) to provide the default version of Gazebo (`#571 `_) + * Added catkin package gazebo_dev which provides the cmake config of the installed Gazebo version +* Contributors: Dave Coleman, Jose Luis Rivero + +2.5.12 (2017-04-25) +------------------- +* Fixed broken gazebo_ros_control tutorial link (`#566 `_) +* Contributors: Ian McMahon + +2.5.11 (2017-04-18) +------------------- +* Change build system to set DEPEND on Gazebo/SDFormat (fix catkin warning) + Added missing DEPEND clauses to catkin_package to fix gazebo catkin warning. Note that after the change problems could appear related to -lpthreads errors. This is an known issue related to catkin: https://github.com/ros/catkin/issues/856. +* Make gazebo_ros_control compatible with ros_control with respect to tag (`#550 `_) + * ros_control expects "hardware_interface/PositionJointInterface", i.e. "hardware_interface/" prefix + * add deprecation warning + * improve warning + * fix warning message fix +* Contributors: Andreas Bihlmaier, Dave Coleman + +2.5.10 (2017-03-03) +------------------- +* Revert catkin warnings to fix regressions (problems with catkin -lpthreads errors) + For reference and reasons, please check: + https://discourse.ros.org/t/need-to-sync-new-release-of-rqt-topic-indigo-jade-kinetic/1410/4 + * Revert "Fix gazebo catkin warning, cleanup CMakeLists (`#537 `_)" + This reverts commit 5a0305fcb97864b66bc2e587fc0564435b4f2034. + * Revert "Fix gazebo and sdformat catkin warnings" + This reverts commit 11f95d25dcd32faccd2401d45c722f7794c7542c. +* Contributors: Jose Luis Rivero + +2.5.9 (2017-02-20) +------------------ +* Fix gazebo catkin warning, cleanup CMakeLists (`#537 `_) +* Namespace console output (`#543 `_) +* Print name of joint with wrong interface +* Removed all trailing whitespace +* Change boost::shared_ptr to urdf::JointConstSharedPtr +* Contributors: Bence Magyar, Dave Coleman, Jochen Sprickerhof + +2.5.8 (2016-12-06) +------------------ + +2.5.7 (2016-06-10) +------------------ +* delete CATKIN_IGNORE in gazebo_ros_control (`#456 `_) +* Contributors: Jackie Kay, Jose Luis Rivero + +2.5.3 (2016-04-11) +------------------ + +2.5.2 (2016-02-25) +------------------ +* clean up merge from indigo-devel +* merging from indigo-devel +* Use Joint::SetParam for joint velocity motors + Before gazebo5, Joint::SetVelocity and SetMaxForce + were used to set joint velocity motors. + The API has changed in gazebo5, to use Joint::SetParam + instead. + The functionality is still available through the SetParam API. + cherry-picked from indigo-devel + Add ifdefs to fix build with gazebo2 + It was broken by `#315 `_. + Fixes `#321 `_. +* 2.4.9 +* Generate changelog +* Import changes from jade-branch +* add missing dependencies +* Fix DefaultRobotHWSim puts robotNamespace twice + DefaultRobotHWSim::initSim() member function uses both + namespaced NodeHandle and robot_namespace string to create + parameter names. + For example, if a robotNamespace is "rrbot", + DefaultRobotHWSim tries to get parameters from following names: + - /rrbot/rrbot/gazebo_ros_control/pid_gains/* + - /rrbot/rrbot/joint_limits/* + This commit change these names to: + - /rrbot/gazebo_ros_control/pid_gains/* + - /rrbot/joint_limits/* +* Add ifdefs to fix build with gazebo2 + It was broken by `#315 `_. + Fixes `#321 `_. +* Use Joint::SetParam for joint velocity motors + Before gazebo5, Joint::SetVelocity and SetMaxForce + were used to set joint velocity motors. + The API has changed in gazebo5, to use Joint::SetParam + instead. + The functionality is still available through the SetParam API. +* Set GAZEBO_CXX_FLAGS to fix c++11 compilation errors +* Contributors: Akiyoshi Ochiai, John Hsu, Jose Luis Rivero, Steven Peters, ipa-fxm + +2.5.1 (2015-08-16) +------------------ +* Fix DefaultRobotHWSim puts robotNamespace twice + DefaultRobotHWSim::initSim() member function uses both + namespaced NodeHandle and robot_namespace string to create + parameter names. + For example, if a robotNamespace is "rrbot", + DefaultRobotHWSim tries to get parameters from following names: + - /rrbot/rrbot/gazebo_ros_control/pid_gains/* + - /rrbot/rrbot/joint_limits/* + This commit change these names to: + - /rrbot/gazebo_ros_control/pid_gains/* + - /rrbot/joint_limits/* +* Added a comment about the need of libgazebo5-dev in runtime +* Added elevator plugin +* Use c++11 +* run_depend on libgazebo5-dev (`#323 `_) + Declare the dependency. + It can be fixed later if we don't want it. +* Contributors: Akiyoshi Ochiai, Jose Luis Rivero, Nate Koenig, Steven Peters + +* Fix DefaultRobotHWSim puts robotNamespace twice + DefaultRobotHWSim::initSim() member function uses both + namespaced NodeHandle and robot_namespace string to create + parameter names. + For example, if a robotNamespace is "rrbot", + DefaultRobotHWSim tries to get parameters from following names: + - /rrbot/rrbot/gazebo_ros_control/pid_gains/* + - /rrbot/rrbot/joint_limits/* + This commit change these names to: + - /rrbot/gazebo_ros_control/pid_gains/* + - /rrbot/joint_limits/* +* Added a comment about the need of libgazebo5-dev in runtime +* Added elevator plugin +* Use c++11 +* run_depend on libgazebo5-dev +* Contributors: Akiyoshi Ochiai, Jose Luis Rivero, Nate Koenig, Steven Peters + +2.5.0 (2015-04-30) +------------------ +* run_depend on libgazebo5-dev instead of gazebo5 +* Changed the rosdep key for gazebo to gazebo5, for Jade Gazebo5 will be used. +* Contributors: Steven Peters, William Woodall + +2.4.9 (2015-08-16) +------------------ +* Import changes from jade-branch +* add missing dependencies +* Add ifdefs to fix build with gazebo2 + It was broken by `#315 `_. + Fixes `#321 `_. +* Use Joint::SetParam for joint velocity motors + Before gazebo5, Joint::SetVelocity and SetMaxForce + were used to set joint velocity motors. + The API has changed in gazebo5, to use Joint::SetParam + instead. + The functionality is still available through the SetParam API. +* Set GAZEBO_CXX_FLAGS to fix c++11 compilation errors +* Contributors: Akiyoshi Ochiai, Jose Luis Rivero, Steven Peters, ipa-fxm + +2.4.8 (2015-03-17) +------------------ +* Merge pull request `#244 `_ from cottsay/control-urdf-fix + gazebo_ros_control: add urdf to downstream catkin deps +* Added emergency stop support. +* Contributors: Adolfo Rodriguez Tsouroukdissian, Jim Rothrock, Scott K Logan + +2.4.7 (2014-12-15) +------------------ +* move declaration for DefaultRobotHWSim to header file +* Contributors: ipa-fxm + +2.4.6 (2014-09-01) +------------------ +* Update default_robot_hw_sim.cpp +* Reduced changes +* Fix to work with gazebo3 +* Fix build with gazebo4 and indigo +* Update package.xml + Add new maintainer. +* Contributors: Adolfo Rodriguez Tsouroukdissian, Jose Luis Rivero, Nate Koenig, hsu + +2.4.5 (2014-08-18) +------------------ +* Fix typo: GAZEBO_VERSION_MAJOR -> GAZEBO_MAJOR_VERSION +* Port fix_build branch for indigo-devel + See pull request `#221 `_ +* Contributors: Jose Luis Rivero, Steven Peters + +2.4.4 (2014-07-18) +------------------ +* Update package.xml + Add new maintainer. +* Should fix build error for binary releases. + See: http://www.ros.org/debbuild/indigo.html?q=gazebo_ros_control +* Updated package.xml +* gazebo_ros_control: default_robot_hw_sim: Suppressing pid error message + Depends on `ros-controls/control_toolbox#21 `_ +* Revert 4776545, as it belongs in indigo-devel. +* Fix repo names in package.xml's +* gazebo_ros_control: default_robot_hw_sim: Suppressing pid error message, depends on `ros-controls/control_toolbox#21 `_ +* gazebo_ros_control: Add dependency on angles +* gazebo_ros_control: Add build-time dependency on gazebo + This fixes a regression caused by a889ef8b768861231a67b78781514d834f631b8e +* Contributors: Adolfo Rodriguez Tsouroukdissian, Alexander Bubeck, Dave Coleman, Jon Binney, Jonathan Bohren, Scott K Logan + +2.4.3 (2014-05-12) +------------------ +* Compatibility with Indigo's ros_control. + Also fixes `#184 `_. +* Remove build-time dependency on gazebo_ros. +* Fix broken build due to wrong rosconsole macro use +* Contributors: Adolfo Rodriguez Tsouroukdissian + +2.4.2 (2014-03-27) +------------------ +* merging from hydro-devel +* bump patch version for indigo-devel to 2.4.1 +* merging from indigo-devel after 2.3.4 release +* Merge branch 'hydro-devel' of github.com:ros-simulation/gazebo_ros_pkgs into indigo-devel +* "2.4.0" +* catkin_generate_changelog +* Contributors: John Hsu + +2.4.1 (2013-11-13) +------------------ + +2.3.5 (2014-03-26) +------------------ +* Removed some debugging code. +* joint->SetAngle() and joint->SetVelocity() are now used to control + position-controlled joints and velocity-controlled joints that do not + have PID gain values stored on the Parameter Server. +* Position-controlled and velocity-controlled joints now use PID controllers + instead of calling SetAngle() or SetVelocity(). readSim() now longer calls + angles::shortest_angular_distance() when a joint is prismatic. + PLUGINLIB_EXPORT_CLASS is now used to register the plugin. +* gazebo_ros_control now depends on control_toolbox. +* Added support for the position hardware interface. Completed support for the + velocity hardware interface. +* Removed the "support more hardware interfaces" line. +* Contributors: Jim Rothrock + +2.3.4 (2013-11-13) +------------------ +* rerelease because sdformat became libsdformat, but we also based change on 2.3.4 in hydro-devel. +* Merge pull request `#144 `_ from meyerj/fix-125 + Fixed `#125 `_: ``gazebo_ros_control``: controlPeriod greater than the simulation period causes unexpected results +* Merge pull request `#134 `_ from meyerj/gazebo-ros-control-use-model-nh + ``gazebo_ros_control``: Use the model NodeHandle to get the ``robot_description`` parameter +* ``gazebo_ros_control``: added GazeboRosControlPlugin::Reset() method that resets the timestamps on world reset +* ``gazebo_ros_control``: call writeSim() for each Gazebo world update independent of the control period +* ``gazebo_ros_pkgs``: use GetMaxStepSize() for the Gazebo simulation period +* ``gazebo_ros_control``: use the model NodeHandle to get the ``robot_description`` parameter +* Add missing ``run_depend`` to urdf in ``gazebo_ros_control`` +* Remove dependency to meta-package ``ros_controllers`` + +2.4.0 (2013-10-14) +------------------ + +2.3.3 (2013-10-10) +------------------ +* Eliminated a joint_name variable and replaced it with `joint_names_[j]`. + Modified some lines so that they fit in 100 columns. These changes were made + in order to be consistent with the rest of the file. +* Merge remote-tracking branch 'upstream/hydro-devel' into hydro-devel +* joint_limits_interface is now used to enforce limits on effort-controlled + joints. +* Added "joint_limits_interface" and "urdf" to the component list. +* Additional parameters are passed to `robot_hw_sim->initSim()`. These parameters + are used by the joint limits interface. +* Added "joint_limits_interface" and "urdf" to the build dependency list. +* Added the robot_namespace and urdf_model parameters to `initSim()`. +* Added the urdf_string parameter to `parseTransmissionsFromURDF()`. + +2.3.2 (2013-09-19) +------------------ + +2.3.1 (2013-08-27) +------------------ +* Cleaned up template, fixes for header files +* Renamed plugin to match file name, tweaked CMakeLists +* Created a header file for the ros_control gazebo plugin + +2.3.0 (2013-08-12) +------------------ +* Renamed ros_control_plugin, updated documentation + +2.2.1 (2013-07-29) +------------------ + +2.2.0 (2013-07-29) +------------------ +* Standardized the way ROS nodes are initialized in gazebo plugins +* Remove find_package(SDF) from CMakeLists.txt + It is sufficient to find gazebo, which will export the information + about the SDFormat package. +* Merge branch 'hydro-devel' into tranmission_parsing +* Doc and debug update +* Merged hydro-devel +* Hid debug info +* Merged from Hydro-devel +* Merge branch 'hydro-devel' into tranmission_parsing +* Moved trasmission parsing to ros_control + +2.1.5 (2013-07-18) +------------------ + +2.1.4 (2013-07-14) +------------------ +* Fixed for Jenkins broken dependency on SDF in ros_control + +2.1.3 (2013-07-13) +------------------ + +2.1.2 (2013-07-12) +------------------ +* Cleaned up CMakeLists.txt for all gazebo_ros_pkgs +* 2.1.1 + +2.1.1 (2013-07-10 19:11) +------------------------ +* Fixed errors and deprecation warnings from Gazebo 1.9 and the sdformat split +* making RobotHWSim::initSim pure virtual +* Cleaning up code +* Adding install targets + +2.1.0 (2013-06-27) +------------------ +* Made version match the rest of gazebo_ros_pkgs per bloom +* Added dependency on ros_controllers +* Clarifying language in readme +* Made default period Gazebo's period +* Made control period optional +* Tweaked README +* Added support for reading tags and other cleaning up +* Renamed RobotSim to RobotHWSim +* Renaming all gazebo_ros_control stuff to be in the same package +* Refactoring gazebo_ros_control packages into a single package, removing exampls (they will go elsewhere) +* updating readme for gazebo_ros_control +* Merging in gazebo_ros_control +* making gazebo_ros_control a metapackage +* Moving readme +* Merging readmes +* eating this +* Merging gazebo_ros_control and ros_control_gazebo + +2.0.2 (2013-06-20) +------------------ + +2.0.1 (2013-06-19) +------------------ + +2.0.0 (2013-06-18) +------------------ diff --git a/gazebo_ros_pkgs/gazebo_ros_control/CMakeLists.txt b/gazebo_ros_pkgs/gazebo_ros_control/CMakeLists.txt new file mode 100755 index 0000000..58304f3 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros_control/CMakeLists.txt @@ -0,0 +1,62 @@ +cmake_minimum_required(VERSION 2.8.3) +project(gazebo_ros_control) + +# Load catkin and all dependencies required for this package +find_package(catkin REQUIRED COMPONENTS + gazebo_dev + roscpp + std_msgs + control_toolbox + controller_manager + hardware_interface + transmission_interface + pluginlib + joint_limits_interface + urdf + angles +) + +catkin_package( + CATKIN_DEPENDS + roscpp + std_msgs + controller_manager + control_toolbox + pluginlib + hardware_interface + transmission_interface + joint_limits_interface + urdf + angles + INCLUDE_DIRS include + LIBRARIES ${PROJECT_NAME} default_robot_hw_sim +) + +link_directories( + ${catkin_LIBRARY_DIRS} +) + +include_directories(include + ${Boost_INCLUDE_DIR} + ${catkin_INCLUDE_DIRS} +) + +## Libraries +add_library(${PROJECT_NAME} src/gazebo_ros_control_plugin.cpp) +target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES}) + +add_library(default_robot_hw_sim src/default_robot_hw_sim.cpp) +target_link_libraries(default_robot_hw_sim ${catkin_LIBRARIES}) + +## Install +install(TARGETS ${PROJECT_NAME} default_robot_hw_sim + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +) + +install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} +) + +install(FILES robot_hw_sim_plugins.xml + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +) diff --git a/gazebo_ros_pkgs/gazebo_ros_control/README.md b/gazebo_ros_pkgs/gazebo_ros_control/README.md new file mode 100755 index 0000000..90c989b --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros_control/README.md @@ -0,0 +1,13 @@ +# Gazebo ros_control Interfaces + +This is a ROS package for integrating the `ros_control` controller architecture +with the [Gazebo](http://gazebosim.org/) simulator. + +This package provides a Gazebo plugin which instantiates a ros_control +controller manager and connects it to a Gazebo model. + +[Documentation](http://gazebosim.org/tutorials?tut=ros_control) is provided on Gazebo's website. + +## Future Direction + + - Implement transmissions diff --git a/gazebo_ros_pkgs/gazebo_ros_control/include/gazebo_ros_control/default_robot_hw_sim.h b/gazebo_ros_pkgs/gazebo_ros_control/include/gazebo_ros_control/default_robot_hw_sim.h new file mode 100755 index 0000000..acfd10e --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros_control/include/gazebo_ros_control/default_robot_hw_sim.h @@ -0,0 +1,147 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2013, Open Source Robotics Foundation + * Copyright (c) 2013, The Johns Hopkins University + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the Open Source Robotics Foundation + * nor the names of its contributors may be + * used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +/* Author: Dave Coleman, Jonathan Bohren + Desc: Hardware Interface for any simulated robot in Gazebo +*/ + +#ifndef _GAZEBO_ROS_CONTROL___DEFAULT_ROBOT_HW_SIM_H_ +#define _GAZEBO_ROS_CONTROL___DEFAULT_ROBOT_HW_SIM_H_ + +// ros_control +#include +#include +#include +#include +#include +#include +#include + +// Gazebo +#include +#include +#include + +// ROS +#include +#include +#include + +// gazebo_ros_control +#include + +// URDF +#include + + + +namespace gazebo_ros_control +{ + +class DefaultRobotHWSim : public gazebo_ros_control::RobotHWSim +{ +public: + + virtual bool initSim( + const std::string& robot_namespace, + ros::NodeHandle model_nh, + gazebo::physics::ModelPtr parent_model, + const urdf::Model *const urdf_model, + std::vector transmissions); + + virtual void readSim(ros::Time time, ros::Duration period); + + virtual void writeSim(ros::Time time, ros::Duration period); + + virtual void eStopActive(const bool active); + +protected: + // Methods used to control a joint. + enum ControlMethod {EFFORT, POSITION, POSITION_PID, VELOCITY, VELOCITY_PID}; + + // Register the limits of the joint specified by joint_name and joint_handle. The limits are + // retrieved from joint_limit_nh. If urdf_model is not NULL, limits are retrieved from it also. + // Return the joint's type, lower position limit, upper position limit, and effort limit. + void registerJointLimits(const std::string& joint_name, + const hardware_interface::JointHandle& joint_handle, + const ControlMethod ctrl_method, + const ros::NodeHandle& joint_limit_nh, + const urdf::Model *const urdf_model, + int *const joint_type, double *const lower_limit, + double *const upper_limit, double *const effort_limit); + + unsigned int n_dof_; + + hardware_interface::JointStateInterface js_interface_; + hardware_interface::EffortJointInterface ej_interface_; + hardware_interface::PositionJointInterface pj_interface_; + hardware_interface::VelocityJointInterface vj_interface_; + + joint_limits_interface::EffortJointSaturationInterface ej_sat_interface_; + joint_limits_interface::EffortJointSoftLimitsInterface ej_limits_interface_; + joint_limits_interface::PositionJointSaturationInterface pj_sat_interface_; + joint_limits_interface::PositionJointSoftLimitsInterface pj_limits_interface_; + joint_limits_interface::VelocityJointSaturationInterface vj_sat_interface_; + joint_limits_interface::VelocityJointSoftLimitsInterface vj_limits_interface_; + + std::vector joint_names_; + std::vector joint_types_; + std::vector joint_lower_limits_; + std::vector joint_upper_limits_; + std::vector joint_effort_limits_; + std::vector joint_control_methods_; + std::vector pid_controllers_; + std::vector joint_position_; + std::vector joint_velocity_; + std::vector joint_effort_; + std::vector joint_effort_command_; + std::vector joint_position_command_; + std::vector last_joint_position_command_; + std::vector joint_velocity_command_; + + std::vector sim_joints_; + + std::string physics_type_; + + // e_stop_active_ is true if the emergency stop is active. + bool e_stop_active_, last_e_stop_active_; +}; + +typedef boost::shared_ptr DefaultRobotHWSimPtr; + +} + +#endif // #ifndef __GAZEBO_ROS_CONTROL_PLUGIN_DEFAULT_ROBOT_HW_SIM_H_ diff --git a/gazebo_ros_pkgs/gazebo_ros_control/include/gazebo_ros_control/gazebo_ros_control_plugin.h b/gazebo_ros_pkgs/gazebo_ros_control/include/gazebo_ros_control/gazebo_ros_control_plugin.h new file mode 100755 index 0000000..0c11eaf --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros_control/include/gazebo_ros_control/gazebo_ros_control_plugin.h @@ -0,0 +1,131 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2013, Open Source Robotics Foundation + * Copyright (c) 2013, The Johns Hopkins University + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the Open Source Robotics Foundation + * nor the names of its contributors may be + * used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +/* Author: Dave Coleman, Jonathan Bohren + Desc: Gazebo plugin for ros_control that allows 'hardware_interfaces' to be plugged in + using pluginlib +*/ + +// Boost +#include +#include + +// ROS +#include +#include +#include + +// Gazebo +#include +#include +#include + +// ros_control +#include +#include +#include + +namespace gazebo_ros_control +{ + +class GazeboRosControlPlugin : public gazebo::ModelPlugin +{ +public: + + virtual ~GazeboRosControlPlugin(); + + // Overloaded Gazebo entry point + virtual void Load(gazebo::physics::ModelPtr parent, sdf::ElementPtr sdf); + + // Called by the world update start event + void Update(); + + // Called on world reset + virtual void Reset(); + + // Get the URDF XML from the parameter server + std::string getURDF(std::string param_name) const; + + // Get Transmissions from the URDF + bool parseTransmissionsFromURDF(const std::string& urdf_string); + +protected: + void eStopCB(const std_msgs::BoolConstPtr& e_stop_active); + + // Node Handles + ros::NodeHandle model_nh_; // namespaces to robot name + + // Pointer to the model + gazebo::physics::ModelPtr parent_model_; + sdf::ElementPtr sdf_; + + // deferred load in case ros is blocking + boost::thread deferred_load_thread_; + + // Pointer to the update event connection + gazebo::event::ConnectionPtr update_connection_; + + // Interface loader + boost::shared_ptr > robot_hw_sim_loader_; + void load_robot_hw_sim_srv(); + + // Strings + std::string robot_namespace_; + std::string robot_description_; + + // Transmissions in this plugin's scope + std::vector transmissions_; + + // Robot simulator interface + std::string robot_hw_sim_type_str_; + boost::shared_ptr robot_hw_sim_; + + // Controller manager + boost::shared_ptr controller_manager_; + + // Timing + ros::Duration control_period_; + ros::Time last_update_sim_time_ros_; + ros::Time last_write_sim_time_ros_; + + // e_stop_active_ is true if the emergency stop is active. + bool e_stop_active_, last_e_stop_active_; + ros::Subscriber e_stop_sub_; // Emergency stop subscriber + +}; + + +} diff --git a/gazebo_ros_pkgs/gazebo_ros_control/include/gazebo_ros_control/robot_hw_sim.h b/gazebo_ros_pkgs/gazebo_ros_control/include/gazebo_ros_control/robot_hw_sim.h new file mode 100755 index 0000000..4e91447 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros_control/include/gazebo_ros_control/robot_hw_sim.h @@ -0,0 +1,119 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2013, Open Source Robotics Foundation + * Copyright (c) 2013, The Johns Hopkins University + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the Open Source Robotics Foundation + * nor the names of its contributors may be + * used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +/// \brief Plugin template for hardware interfaces for ros_control and Gazebo + +/// \author Jonathan Bohren +/// \author Dave Coleman + +#ifndef __ROS_CONTROL_GAZEBO_ROBOT_HW_SIM_H +#define __ROS_CONTROL_GAZEBO_ROBOT_HW_SIM_H + +#include +#include +#include +#include +#include + +namespace gazebo_ros_control { + + // Struct for passing loaded joint data + struct JointData + { + std::string name_; + std::string hardware_interface_; + + JointData(const std::string& name, const std::string& hardware_interface) : + name_(name), + hardware_interface_(hardware_interface) + {} + }; + + /// \brief Gazebo plugin version of RobotHW + /// + /// An object of class RobotHWSim represents a robot's simulated hardware. + class RobotHWSim : public hardware_interface::RobotHW + { + public: + + virtual ~RobotHWSim() { } + + /// \brief Initialize the simulated robot hardware + /// + /// Initialize the simulated robot hardware. + /// + /// \param robot_namespace Robot namespace. + /// \param model_nh Model node handle. + /// \param parent_model Parent model. + /// \param urdf_model URDF model. + /// \param transmissions Transmissions. + /// + /// \return \c true if the simulated robot hardware is initialized successfully, \c false if not. + virtual bool initSim( + const std::string& robot_namespace, + ros::NodeHandle model_nh, + gazebo::physics::ModelPtr parent_model, + const urdf::Model *const urdf_model, + std::vector transmissions) = 0; + + /// \brief Read state data from the simulated robot hardware + /// + /// Read state data, such as joint positions and velocities, from the simulated robot hardware. + /// + /// \param time Simulation time. + /// \param period Time since the last simulation step. + virtual void readSim(ros::Time time, ros::Duration period) = 0; + + /// \brief Write commands to the simulated robot hardware + /// + /// Write commands, such as joint position and velocity commands, to the simulated robot hardware. + /// + /// \param time Simulation time. + /// \param period Time since the last simulation step. + virtual void writeSim(ros::Time time, ros::Duration period) = 0; + + /// \brief Set the emergency stop state + /// + /// Set the simulated robot's emergency stop state. The default implementation of this function does nothing. + /// + /// \param active \c true if the emergency stop is active, \c false if not. + virtual void eStopActive(const bool active) {} + + }; + +} + +#endif // ifndef __ROS_CONTROL_GAZEBO_ROBOT_HW_SIM_H diff --git a/gazebo_ros_pkgs/gazebo_ros_control/package.xml b/gazebo_ros_pkgs/gazebo_ros_control/package.xml new file mode 100755 index 0000000..7c59f21 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros_control/package.xml @@ -0,0 +1,36 @@ + + + gazebo_ros_control + 2.5.15 + gazebo_ros_control + + Jose Luis Rivero + + BSD + + http://ros.org/wiki/gazebo_ros_control + https://github.com/ros-simulation/gazebo_ros_pkgs/issues + https://github.com/ros-simulation/gazebo_ros_pkgs + + Jonathan Bohren + Dave Coleman + + catkin + + gazebo_dev + gazebo_ros + roscpp + std_msgs + control_toolbox + controller_manager + pluginlib + hardware_interface + transmission_interface + joint_limits_interface + urdf + angles + + + + + diff --git a/gazebo_ros_pkgs/gazebo_ros_control/robot_hw_sim_plugins.xml b/gazebo_ros_pkgs/gazebo_ros_control/robot_hw_sim_plugins.xml new file mode 100755 index 0000000..5034ee1 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros_control/robot_hw_sim_plugins.xml @@ -0,0 +1,11 @@ + + + + + A default robot simulation interface which constructs joint handles from an SDF/URDF. + + + diff --git a/gazebo_ros_pkgs/gazebo_ros_control/src/default_robot_hw_sim.cpp b/gazebo_ros_pkgs/gazebo_ros_control/src/default_robot_hw_sim.cpp new file mode 100755 index 0000000..4d3f799 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros_control/src/default_robot_hw_sim.cpp @@ -0,0 +1,518 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2013, Open Source Robotics Foundation + * Copyright (c) 2013, The Johns Hopkins University + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the Open Source Robotics Foundation + * nor the names of its contributors may be + * used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +/* Author: Dave Coleman, Jonathan Bohren + Desc: Hardware Interface for any simulated robot in Gazebo +*/ + + +#include +#include + + +namespace +{ + +double clamp(const double val, const double min_val, const double max_val) +{ + return std::min(std::max(val, min_val), max_val); +} + +} + +namespace gazebo_ros_control +{ + + +bool DefaultRobotHWSim::initSim( + const std::string& robot_namespace, + ros::NodeHandle model_nh, + gazebo::physics::ModelPtr parent_model, + const urdf::Model *const urdf_model, + std::vector transmissions) +{ + // getJointLimits() searches joint_limit_nh for joint limit parameters. The format of each + // parameter's name is "joint_limits/". An example is "joint_limits/axle_joint". + const ros::NodeHandle joint_limit_nh(model_nh); + + // Resize vectors to our DOF + n_dof_ = transmissions.size(); + joint_names_.resize(n_dof_); + joint_types_.resize(n_dof_); + joint_lower_limits_.resize(n_dof_); + joint_upper_limits_.resize(n_dof_); + joint_effort_limits_.resize(n_dof_); + joint_control_methods_.resize(n_dof_); + pid_controllers_.resize(n_dof_); + joint_position_.resize(n_dof_); + joint_velocity_.resize(n_dof_); + joint_effort_.resize(n_dof_); + joint_effort_command_.resize(n_dof_); + joint_position_command_.resize(n_dof_); + joint_velocity_command_.resize(n_dof_); + + // Initialize values + for(unsigned int j=0; j < n_dof_; j++) + { + // Check that this transmission has one joint + if(transmissions[j].joints_.size() == 0) + { + ROS_WARN_STREAM_NAMED("default_robot_hw_sim","Transmission " << transmissions[j].name_ + << " has no associated joints."); + continue; + } + else if(transmissions[j].joints_.size() > 1) + { + ROS_WARN_STREAM_NAMED("default_robot_hw_sim","Transmission " << transmissions[j].name_ + << " has more than one joint. Currently the default robot hardware simulation " + << " interface only supports one."); + continue; + } + + std::vector joint_interfaces = transmissions[j].joints_[0].hardware_interfaces_; + if (joint_interfaces.empty() && + !(transmissions[j].actuators_.empty()) && + !(transmissions[j].actuators_[0].hardware_interfaces_.empty())) + { + // TODO: Deprecate HW interface specification in actuators in ROS J + joint_interfaces = transmissions[j].actuators_[0].hardware_interfaces_; + ROS_WARN_STREAM_NAMED("default_robot_hw_sim", "The element of tranmission " << + transmissions[j].name_ << " should be nested inside the element, not . " << + "The transmission will be properly loaded, but please update " << + "your robot model to remain compatible with future versions of the plugin."); + } + if (joint_interfaces.empty()) + { + ROS_WARN_STREAM_NAMED("default_robot_hw_sim", "Joint " << transmissions[j].joints_[0].name_ << + " of transmission " << transmissions[j].name_ << " does not specify any hardware interface. " << + "Not adding it to the robot hardware simulation."); + continue; + } + else if (joint_interfaces.size() > 1) + { + ROS_WARN_STREAM_NAMED("default_robot_hw_sim", "Joint " << transmissions[j].joints_[0].name_ << + " of transmission " << transmissions[j].name_ << " specifies multiple hardware interfaces. " << + "Currently the default robot hardware simulation interface only supports one. Using the first entry"); + //continue; + } + + // Add data from transmission + joint_names_[j] = transmissions[j].joints_[0].name_; + joint_position_[j] = 1.0; + joint_velocity_[j] = 0.0; + joint_effort_[j] = 1.0; // N/m for continuous joints + joint_effort_command_[j] = 0.0; + joint_position_command_[j] = 0.0; + joint_velocity_command_[j] = 0.0; + + const std::string& hardware_interface = joint_interfaces.front(); + + // Debug + ROS_DEBUG_STREAM_NAMED("default_robot_hw_sim","Loading joint '" << joint_names_[j] + << "' of type '" << hardware_interface << "'"); + + // Create joint state interface for all joints + js_interface_.registerHandle(hardware_interface::JointStateHandle( + joint_names_[j], &joint_position_[j], &joint_velocity_[j], &joint_effort_[j])); + + // Decide what kind of command interface this actuator/joint has + hardware_interface::JointHandle joint_handle; + if(hardware_interface == "EffortJointInterface" || hardware_interface == "hardware_interface/EffortJointInterface") + { + // Create effort joint interface + joint_control_methods_[j] = EFFORT; + joint_handle = hardware_interface::JointHandle(js_interface_.getHandle(joint_names_[j]), + &joint_effort_command_[j]); + ej_interface_.registerHandle(joint_handle); + } + else if(hardware_interface == "PositionJointInterface" || hardware_interface == "hardware_interface/PositionJointInterface") + { + // Create position joint interface + joint_control_methods_[j] = POSITION; + joint_handle = hardware_interface::JointHandle(js_interface_.getHandle(joint_names_[j]), + &joint_position_command_[j]); + pj_interface_.registerHandle(joint_handle); + } + else if(hardware_interface == "VelocityJointInterface" || hardware_interface == "hardware_interface/VelocityJointInterface") + { + // Create velocity joint interface + joint_control_methods_[j] = VELOCITY; + joint_handle = hardware_interface::JointHandle(js_interface_.getHandle(joint_names_[j]), + &joint_velocity_command_[j]); + vj_interface_.registerHandle(joint_handle); + } + else + { + ROS_FATAL_STREAM_NAMED("default_robot_hw_sim","No matching hardware interface found for '" + << hardware_interface << "' while loading interfaces for " << joint_names_[j] ); + return false; + } + + if(hardware_interface == "EffortJointInterface" || hardware_interface == "PositionJointInterface" || hardware_interface == "VelocityJointInterface") { + ROS_WARN_STREAM("Deprecated syntax, please prepend 'hardware_interface/' to '" << hardware_interface << "' within the tag in joint '" << joint_names_[j] << "'."); + } + + // Get the gazebo joint that corresponds to the robot joint. + //ROS_DEBUG_STREAM_NAMED("default_robot_hw_sim", "Getting pointer to gazebo joint: " + // << joint_names_[j]); + gazebo::physics::JointPtr joint = parent_model->GetJoint(joint_names_[j]); + if (!joint) + { + ROS_ERROR_STREAM_NAMED("default_robot_hw", "This robot has a joint named \"" << joint_names_[j] + << "\" which is not in the gazebo model."); + return false; + } + sim_joints_.push_back(joint); + + // get physics engine type +#if GAZEBO_MAJOR_VERSION >= 8 + gazebo::physics::PhysicsEnginePtr physics = gazebo::physics::get_world()->Physics(); +#else + gazebo::physics::PhysicsEnginePtr physics = gazebo::physics::get_world()->GetPhysicsEngine(); +#endif + physics_type_ = physics->GetType(); + if (physics_type_.empty()) + { + ROS_WARN_STREAM_NAMED("default_robot_hw_sim", "No physics type found."); + } + + registerJointLimits(joint_names_[j], joint_handle, joint_control_methods_[j], + joint_limit_nh, urdf_model, + &joint_types_[j], &joint_lower_limits_[j], &joint_upper_limits_[j], + &joint_effort_limits_[j]); + if (joint_control_methods_[j] != EFFORT) + { + // Initialize the PID controller. If no PID gain values are found, use joint->SetAngle() or + // joint->SetParam("vel") to control the joint. + const ros::NodeHandle nh(model_nh, "/gazebo_ros_control/pid_gains/" + + joint_names_[j]); + if (pid_controllers_[j].init(nh, true)) + { + switch (joint_control_methods_[j]) + { + case POSITION: + joint_control_methods_[j] = POSITION_PID; + break; + case VELOCITY: + joint_control_methods_[j] = VELOCITY_PID; + break; + } + } + else + { + // joint->SetParam("fmax") must be called if joint->SetAngle() or joint->SetParam("vel") are + // going to be called. joint->SetParam("fmax") must *not* be called if joint->SetForce() is + // going to be called. +#if GAZEBO_MAJOR_VERSION > 2 + joint->SetParam("fmax", 0, joint_effort_limits_[j]); +#else + joint->SetMaxForce(0, joint_effort_limits_[j]); +#endif + } + } + } + + // Register interfaces + registerInterface(&js_interface_); + registerInterface(&ej_interface_); + registerInterface(&pj_interface_); + registerInterface(&vj_interface_); + + // Initialize the emergency stop code. + e_stop_active_ = false; + last_e_stop_active_ = false; + + return true; +} + +void DefaultRobotHWSim::readSim(ros::Time time, ros::Duration period) +{ + for(unsigned int j=0; j < n_dof_; j++) + { + // Gazebo has an interesting API... +#if GAZEBO_MAJOR_VERSION >= 8 + double position = sim_joints_[j]->Position(0); +#else + double position = sim_joints_[j]->GetAngle(0).Radian(); +#endif + if (joint_types_[j] == urdf::Joint::PRISMATIC) + { + joint_position_[j] = position; + } + else + { + joint_position_[j] += angles::shortest_angular_distance(joint_position_[j], + position); + } + joint_velocity_[j] = sim_joints_[j]->GetVelocity(0); + joint_effort_[j] = sim_joints_[j]->GetForce((unsigned int)(0)); + } +} + +void DefaultRobotHWSim::writeSim(ros::Time time, ros::Duration period) +{ + // If the E-stop is active, joints controlled by position commands will maintain their positions. + if (e_stop_active_) + { + if (!last_e_stop_active_) + { + last_joint_position_command_ = joint_position_; + last_e_stop_active_ = true; + } + joint_position_command_ = last_joint_position_command_; + } + else + { + last_e_stop_active_ = false; + } + + ej_sat_interface_.enforceLimits(period); + ej_limits_interface_.enforceLimits(period); + pj_sat_interface_.enforceLimits(period); + pj_limits_interface_.enforceLimits(period); + vj_sat_interface_.enforceLimits(period); + vj_limits_interface_.enforceLimits(period); + + for(unsigned int j=0; j < n_dof_; j++) + { + switch (joint_control_methods_[j]) + { + case EFFORT: + { + const double effort = e_stop_active_ ? 0 : joint_effort_command_[j]; + sim_joints_[j]->SetForce(0, effort); + } + break; + + case POSITION: +#if GAZEBO_MAJOR_VERSION >= 9 + sim_joints_[j]->SetPosition(0, joint_position_command_[j], true); +#else + ROS_WARN_ONCE("The default_robot_hw_sim plugin is using the Joint::SetPosition method without preserving the link velocity."); + ROS_WARN_ONCE("As a result, gravity will not be simulated correctly for your model."); + ROS_WARN_ONCE("Please set gazebo_pid parameters, switch to the VelocityJointInterface or EffortJointInterface, or upgrade to Gazebo 9."); + ROS_WARN_ONCE("For details, see https://github.com/ros-simulation/gazebo_ros_pkgs/issues/612"); + sim_joints_[j]->SetPosition(0, joint_position_command_[j]); +#endif + break; + + case POSITION_PID: + { + double error; + switch (joint_types_[j]) + { + case urdf::Joint::REVOLUTE: + angles::shortest_angular_distance_with_limits(joint_position_[j], + joint_position_command_[j], + joint_lower_limits_[j], + joint_upper_limits_[j], + error); + break; + case urdf::Joint::CONTINUOUS: + error = angles::shortest_angular_distance(joint_position_[j], + joint_position_command_[j]); + break; + default: + error = joint_position_command_[j] - joint_position_[j]; + } + + const double effort_limit = joint_effort_limits_[j]; + const double effort = clamp(pid_controllers_[j].computeCommand(error, period), + -effort_limit, effort_limit); + sim_joints_[j]->SetForce(0, effort); + } + break; + + case VELOCITY: +#if GAZEBO_MAJOR_VERSION > 2 + if (physics_type_.compare("dart") == 0) + { + sim_joints_[j]->SetVelocity(0, e_stop_active_ ? 0 : joint_velocity_command_[j]); + } + else + { + sim_joints_[j]->SetParam("vel", 0, e_stop_active_ ? 0 : joint_velocity_command_[j]); + } +#else + sim_joints_[j]->SetVelocity(0, e_stop_active_ ? 0 : joint_velocity_command_[j]); +#endif + break; + + case VELOCITY_PID: + double error; + if (e_stop_active_) + error = -joint_velocity_[j]; + else + error = joint_velocity_command_[j] - joint_velocity_[j]; + const double effort_limit = joint_effort_limits_[j]; + const double effort = clamp(pid_controllers_[j].computeCommand(error, period), + -effort_limit, effort_limit); + sim_joints_[j]->SetForce(0, effort); + break; + } + } +} + +void DefaultRobotHWSim::eStopActive(const bool active) +{ + e_stop_active_ = active; +} + +// Register the limits of the joint specified by joint_name and joint_handle. The limits are +// retrieved from joint_limit_nh. If urdf_model is not NULL, limits are retrieved from it also. +// Return the joint's type, lower position limit, upper position limit, and effort limit. +void DefaultRobotHWSim::registerJointLimits(const std::string& joint_name, + const hardware_interface::JointHandle& joint_handle, + const ControlMethod ctrl_method, + const ros::NodeHandle& joint_limit_nh, + const urdf::Model *const urdf_model, + int *const joint_type, double *const lower_limit, + double *const upper_limit, double *const effort_limit) +{ + *joint_type = urdf::Joint::UNKNOWN; + *lower_limit = -std::numeric_limits::max(); + *upper_limit = std::numeric_limits::max(); + *effort_limit = std::numeric_limits::max(); + + joint_limits_interface::JointLimits limits; + bool has_limits = false; + joint_limits_interface::SoftJointLimits soft_limits; + bool has_soft_limits = false; + + if (urdf_model != NULL) + { + const urdf::JointConstSharedPtr urdf_joint = urdf_model->getJoint(joint_name); + if (urdf_joint != NULL) + { + *joint_type = urdf_joint->type; + // Get limits from the URDF file. + if (joint_limits_interface::getJointLimits(urdf_joint, limits)) + has_limits = true; + if (joint_limits_interface::getSoftJointLimits(urdf_joint, soft_limits)) + has_soft_limits = true; + } + } + // Get limits from the parameter server. + if (joint_limits_interface::getJointLimits(joint_name, joint_limit_nh, limits)) + has_limits = true; + + if (!has_limits) + return; + + if (*joint_type == urdf::Joint::UNKNOWN) + { + // Infer the joint type. + + if (limits.has_position_limits) + { + *joint_type = urdf::Joint::REVOLUTE; + } + else + { + if (limits.angle_wraparound) + *joint_type = urdf::Joint::CONTINUOUS; + else + *joint_type = urdf::Joint::PRISMATIC; + } + } + + if (limits.has_position_limits) + { + *lower_limit = limits.min_position; + *upper_limit = limits.max_position; + } + if (limits.has_effort_limits) + *effort_limit = limits.max_effort; + + if (has_soft_limits) + { + switch (ctrl_method) + { + case EFFORT: + { + const joint_limits_interface::EffortJointSoftLimitsHandle + limits_handle(joint_handle, limits, soft_limits); + ej_limits_interface_.registerHandle(limits_handle); + } + break; + case POSITION: + { + const joint_limits_interface::PositionJointSoftLimitsHandle + limits_handle(joint_handle, limits, soft_limits); + pj_limits_interface_.registerHandle(limits_handle); + } + break; + case VELOCITY: + { + const joint_limits_interface::VelocityJointSoftLimitsHandle + limits_handle(joint_handle, limits, soft_limits); + vj_limits_interface_.registerHandle(limits_handle); + } + break; + } + } + else + { + switch (ctrl_method) + { + case EFFORT: + { + const joint_limits_interface::EffortJointSaturationHandle + sat_handle(joint_handle, limits); + ej_sat_interface_.registerHandle(sat_handle); + } + break; + case POSITION: + { + const joint_limits_interface::PositionJointSaturationHandle + sat_handle(joint_handle, limits); + pj_sat_interface_.registerHandle(sat_handle); + } + break; + case VELOCITY: + { + const joint_limits_interface::VelocityJointSaturationHandle + sat_handle(joint_handle, limits); + vj_sat_interface_.registerHandle(sat_handle); + } + break; + } + } +} + +} + +PLUGINLIB_EXPORT_CLASS(gazebo_ros_control::DefaultRobotHWSim, gazebo_ros_control::RobotHWSim) diff --git a/gazebo_ros_pkgs/gazebo_ros_control/src/gazebo_ros_control_plugin.cpp b/gazebo_ros_pkgs/gazebo_ros_control/src/gazebo_ros_control_plugin.cpp new file mode 100755 index 0000000..c4d7437 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros_control/src/gazebo_ros_control_plugin.cpp @@ -0,0 +1,310 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (c) 2013, Open Source Robotics Foundation + * Copyright (c) 2013, The Johns Hopkins University + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the Open Source Robotics Foundation + * nor the names of its contributors may be + * used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + *********************************************************************/ + +/* Author: Dave Coleman, Jonathan Bohren + Desc: Gazebo plugin for ros_control that allows 'hardware_interfaces' to be plugged in + using pluginlib +*/ + +// Boost +#include + +#include +#include + +namespace gazebo_ros_control +{ + +GazeboRosControlPlugin::~GazeboRosControlPlugin() +{ + // Disconnect from gazebo events + update_connection_.reset(); +} + +// Overloaded Gazebo entry point +void GazeboRosControlPlugin::Load(gazebo::physics::ModelPtr parent, sdf::ElementPtr sdf) +{ + ROS_INFO_STREAM_NAMED("gazebo_ros_control","Loading gazebo_ros_control plugin"); + + + // Save pointers to the model + parent_model_ = parent; + sdf_ = sdf; + + // Error message if the model couldn't be found + if (!parent_model_) + { + ROS_ERROR_STREAM_NAMED("loadThread","parent model is NULL"); + return; + } + + // Check that ROS has been initialized + if(!ros::isInitialized()) + { + ROS_FATAL_STREAM_NAMED("gazebo_ros_control","A ROS node for Gazebo has not been initialized, unable to load plugin. " + << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)"); + return; + } + + // Get namespace for nodehandle + if(sdf_->HasElement("robotNamespace")) + { + robot_namespace_ = sdf_->GetElement("robotNamespace")->Get(); + } + else + { + robot_namespace_ = parent_model_->GetName(); // default + } + + // Get robot_description ROS param name + if (sdf_->HasElement("robotParam")) + { + robot_description_ = sdf_->GetElement("robotParam")->Get(); + } + else + { + robot_description_ = "robot_description"; // default + } + + // Get the robot simulation interface type + if(sdf_->HasElement("robotSimType")) + { + robot_hw_sim_type_str_ = sdf_->Get("robotSimType"); + } + else + { + robot_hw_sim_type_str_ = "gazebo_ros_control/DefaultRobotHWSim"; + ROS_DEBUG_STREAM_NAMED("loadThread","Using default plugin for RobotHWSim (none specified in URDF/SDF)\""<= 8 + ros::Duration gazebo_period(parent_model_->GetWorld()->Physics()->GetMaxStepSize()); +#else + ros::Duration gazebo_period(parent_model_->GetWorld()->GetPhysicsEngine()->GetMaxStepSize()); +#endif + + // Decide the plugin control period + if(sdf_->HasElement("controlPeriod")) + { + control_period_ = ros::Duration(sdf_->Get("controlPeriod")); + + // Check the period against the simulation period + if( control_period_ < gazebo_period ) + { + ROS_ERROR_STREAM_NAMED("gazebo_ros_control","Desired controller update period ("< gazebo_period ) + { + ROS_WARN_STREAM_NAMED("gazebo_ros_control","Desired controller update period ("<HasElement("eStopTopic")) + { + const std::string e_stop_topic = sdf_->GetElement("eStopTopic")->Get(); + e_stop_sub_ = model_nh_.subscribe(e_stop_topic, 1, &GazeboRosControlPlugin::eStopCB, this); + } + + ROS_INFO_NAMED("gazebo_ros_control", "Starting gazebo_ros_control plugin in namespace: %s", robot_namespace_.c_str()); + + // Read urdf from ros parameter server then + // setup actuators and mechanism control node. + // This call will block if ROS is not properly initialized. + const std::string urdf_string = getURDF(robot_description_); + if (!parseTransmissionsFromURDF(urdf_string)) + { + ROS_ERROR_NAMED("gazebo_ros_control", "Error parsing URDF in gazebo_ros_control plugin, plugin not active.\n"); + return; + } + + // Load the RobotHWSim abstraction to interface the controllers with the gazebo model + try + { + robot_hw_sim_loader_.reset + (new pluginlib::ClassLoader + ("gazebo_ros_control", + "gazebo_ros_control::RobotHWSim")); + + robot_hw_sim_ = robot_hw_sim_loader_->createInstance(robot_hw_sim_type_str_); + urdf::Model urdf_model; + const urdf::Model *const urdf_model_ptr = urdf_model.initString(urdf_string) ? &urdf_model : NULL; + + if(!robot_hw_sim_->initSim(robot_namespace_, model_nh_, parent_model_, urdf_model_ptr, transmissions_)) + { + ROS_FATAL_NAMED("gazebo_ros_control","Could not initialize robot simulation interface"); + return; + } + + // Create the controller manager + ROS_DEBUG_STREAM_NAMED("ros_control_plugin","Loading controller_manager"); + controller_manager_.reset + (new controller_manager::ControllerManager(robot_hw_sim_.get(), model_nh_)); + + // Listen to the update event. This event is broadcast every simulation iteration. + update_connection_ = + gazebo::event::Events::ConnectWorldUpdateBegin + (boost::bind(&GazeboRosControlPlugin::Update, this)); + + } + catch(pluginlib::LibraryLoadException &ex) + { + ROS_FATAL_STREAM_NAMED("gazebo_ros_control","Failed to create robot simulation interface loader: "<= 8 + gazebo::common::Time gz_time_now = parent_model_->GetWorld()->SimTime(); +#else + gazebo::common::Time gz_time_now = parent_model_->GetWorld()->GetSimTime(); +#endif + ros::Time sim_time_ros(gz_time_now.sec, gz_time_now.nsec); + ros::Duration sim_period = sim_time_ros - last_update_sim_time_ros_; + + robot_hw_sim_->eStopActive(e_stop_active_); + + // Check if we should update the controllers + if(sim_period >= control_period_) { + // Store this simulation time + last_update_sim_time_ros_ = sim_time_ros; + + // Update the robot simulation with the state of the gazebo model + robot_hw_sim_->readSim(sim_time_ros, sim_period); + + // Compute the controller commands + bool reset_ctrlrs; + if (e_stop_active_) + { + reset_ctrlrs = false; + last_e_stop_active_ = true; + } + else + { + if (last_e_stop_active_) + { + reset_ctrlrs = true; + last_e_stop_active_ = false; + } + else + { + reset_ctrlrs = false; + } + } + controller_manager_->update(sim_time_ros, sim_period, reset_ctrlrs); + } + + // Update the gazebo model with the result of the controller + // computation + robot_hw_sim_->writeSim(sim_time_ros, sim_time_ros - last_write_sim_time_ros_); + last_write_sim_time_ros_ = sim_time_ros; +} + +// Called on world reset +void GazeboRosControlPlugin::Reset() +{ + // Reset timing variables to not pass negative update periods to controllers on world reset + last_update_sim_time_ros_ = ros::Time(); + last_write_sim_time_ros_ = ros::Time(); +} + +// Get the URDF XML from the parameter server +std::string GazeboRosControlPlugin::getURDF(std::string param_name) const +{ + std::string urdf_string; + + // search and wait for robot_description on param server + while (urdf_string.empty()) + { + std::string search_param_name; + if (model_nh_.searchParam(param_name, search_param_name)) + { + ROS_INFO_ONCE_NAMED("gazebo_ros_control", "gazebo_ros_control plugin is waiting for model" + " URDF in parameter [%s] on the ROS param server.", search_param_name.c_str()); + + model_nh_.getParam(search_param_name, urdf_string); + } + else + { + ROS_INFO_ONCE_NAMED("gazebo_ros_control", "gazebo_ros_control plugin is waiting for model" + " URDF in parameter [%s] on the ROS param server.", robot_description_.c_str()); + + model_nh_.getParam(param_name, urdf_string); + } + + usleep(100000); + } + ROS_DEBUG_STREAM_NAMED("gazebo_ros_control", "Recieved urdf from param server, parsing..."); + + return urdf_string; +} + +// Get Transmissions from the URDF +bool GazeboRosControlPlugin::parseTransmissionsFromURDF(const std::string& urdf_string) +{ + transmission_interface::TransmissionParser::parse(urdf_string, transmissions_); + return true; +} + +// Emergency stop callback +void GazeboRosControlPlugin::eStopCB(const std_msgs::BoolConstPtr& e_stop_active) +{ + e_stop_active_ = e_stop_active->data; +} + + +// Register this plugin with the simulator +GZ_REGISTER_MODEL_PLUGIN(GazeboRosControlPlugin); +} // namespace diff --git a/gazebo_ros_pkgs/gazebo_ros_pkgs/CHANGELOG.rst b/gazebo_ros_pkgs/gazebo_ros_pkgs/CHANGELOG.rst new file mode 100755 index 0000000..05bb5ad --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros_pkgs/CHANGELOG.rst @@ -0,0 +1,165 @@ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Changelog for package gazebo_ros_pkgs +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +2.5.15 (2018-02-12) +------------------- + +2.5.14 (2017-12-11) +------------------- + +2.5.13 (2017-06-24) +------------------- +* Add catkin package(s) to provide the default version of Gazebo (`#571 `_) + * Added catkin package gazebo_dev which provides the cmake config of the installed Gazebo version +* Contributors: Jose Luis Rivero + +2.5.12 (2017-04-25) +------------------- + +2.5.11 (2017-04-18) +------------------- + +2.5.10 (2017-03-03) +------------------- + +2.5.9 (2017-02-20) +------------------ + +2.5.8 (2016-12-06) +------------------ + +2.5.7 (2016-06-10) +------------------ + +2.5.6 (2016-04-28) +------------------ + +2.5.5 (2016-04-27) +------------------ +* merge indigo, jade to kinetic-devel +* Update maintainer for Kinetic release +* Contributors: Jose Luis Rivero, Steven Peters + +2.5.3 (2016-04-11) +------------------ + +2.5.2 (2016-02-25) +------------------ +* merging from indigo-devel +* 2.4.9 +* Generate changelog +* Contributors: John Hsu, Jose Luis Rivero + +2.5.1 (2015-08-16) +------------------ + +2.5.0 (2015-04-30) +------------------ + +2.4.10 (2016-02-25) +------------------- + +2.4.9 (2015-08-16) +------------------ + +2.4.8 (2015-03-17) +------------------ + +2.4.7 (2014-12-15) +------------------ +* Update Gazebo/ROS tutorial URL +* Contributors: Jose Luis Rivero + +2.4.6 (2014-09-01) +------------------ + +2.4.5 (2014-08-18) +------------------ + +2.4.4 (2014-07-18) +------------------ +* Updated package.xml +* Fix repo names in package.xml's +* Contributors: Dave Coleman, Jon Binney + +2.4.3 (2014-05-12) +------------------ + +2.4.2 (2014-03-27) +------------------ +* merging from hydro-devel +* bump patch version for indigo-devel to 2.4.1 +* merging from indigo-devel after 2.3.4 release +* "2.4.0" +* catkin_generate_changelog +* Contributors: John Hsu + +2.4.1 (2013-11-13) +------------------ +* rerelease because sdformat became libsdformat, but we also based change on 2.3.4 in hydro-devel. + +2.4.0 (2013-10-14) +------------------ + +2.3.5 (2014-03-26) +------------------ + +2.3.4 (2013-11-13) +------------------ + +2.3.3 (2013-10-10) +------------------ + +2.3.2 (2013-09-19) +------------------ + +2.3.1 (2013-08-27) +------------------ + +2.3.0 (2013-08-12) +------------------ +* Renamed ros_control_plugin, updated documentation + +2.2.1 (2013-07-29) +------------------ + +2.2.0 (2013-07-29) +------------------ + +2.1.5 (2013-07-18) +------------------ + +2.1.4 (2013-07-14) +------------------ + +2.1.3 (2013-07-13) +------------------ + +2.1.2 (2013-07-12) +------------------ +* 2.1.1 + +2.1.1 (2013-07-10 19:11) +------------------------ + +2.1.0 (2013-06-27) +------------------ +* Added args to launch files, documentation +* Updated package.xml + +2.0.2 (2013-06-20) +------------------ + +2.0.1 (2013-06-19) +------------------ +* Incremented version to 2.0.1 +* Updated documentation diagrams + +2.0.0 (2013-06-18) +------------------ +* Changed version to 2.0.0 based on gazebo_simulator being 1.0.0 +* Updated package.xml files for ros.org documentation purposes +* Created new diagram +* Moved diagrams into repository +* Renamed meta package for gazebo_ros_pkgs diff --git a/gazebo_ros_pkgs/gazebo_ros_pkgs/CMakeLists.txt b/gazebo_ros_pkgs/gazebo_ros_pkgs/CMakeLists.txt new file mode 100755 index 0000000..126155b --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros_pkgs/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 2.8.3) +project(gazebo_ros_pkgs) +find_package(catkin REQUIRED) +catkin_metapackage() diff --git a/gazebo_ros_pkgs/gazebo_ros_pkgs/documentation/gazebo_ros_api.odg b/gazebo_ros_pkgs/gazebo_ros_pkgs/documentation/gazebo_ros_api.odg new file mode 100755 index 0000000000000000000000000000000000000000..797194901e3a958809963927e583a24519f20ece GIT binary patch literal 68731 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%0A%7m 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 literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_ros_pkgs/documentation/gazebo_ros_api.png b/gazebo_ros_pkgs/gazebo_ros_pkgs/documentation/gazebo_ros_api.png new file mode 100755 index 0000000000000000000000000000000000000000..65d1caa172c523fad550e1eb18dd1b3d1629bd2c GIT binary patch literal 293237 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 z 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
    1. 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
      #MOQW2enb%tBw*ki^djdH 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 literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_ros_pkgs/documentation/gazebo_ros_transmission.odg b/gazebo_ros_pkgs/gazebo_ros_pkgs/documentation/gazebo_ros_transmission.odg new file mode 100755 index 0000000000000000000000000000000000000000..f892954306b3b43a83011492e173036131c13e0b GIT binary patch literal 69578 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 literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_ros_pkgs/documentation/gazebo_ros_transmission.pdf b/gazebo_ros_pkgs/gazebo_ros_pkgs/documentation/gazebo_ros_transmission.pdf new file mode 100755 index 0000000000000000000000000000000000000000..415d8b95249942db3c484d4643eb64e6aebfc2aa GIT binary patch literal 41488 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

      6ldz;fnLpzU|&hKynh3=tEd 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 z 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%0A{0zC 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â}^&I~| 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 literal 0 HcmV?d00001 diff --git a/gazebo_ros_pkgs/gazebo_ros_pkgs/package.xml b/gazebo_ros_pkgs/gazebo_ros_pkgs/package.xml new file mode 100755 index 0000000..704e8a8 --- /dev/null +++ b/gazebo_ros_pkgs/gazebo_ros_pkgs/package.xml @@ -0,0 +1,27 @@ + + + gazebo_ros_pkgs + 2.5.15 + Interface for using ROS with the Gazebo simulator. + + Jose Luis Rivero + + BSD,LGPL,Apache 2.0 + + http://gazebosim.org/tutorials?cat=connect_ros + https://github.com/ros-simulation/gazebo_ros_pkgs/issues + https://github.com/ros-simulation/gazebo_ros_pkgs + + John Hsu, Nate Koenig, Dave Coleman> + + catkin + + gazebo_dev + gazebo_msgs + gazebo_plugins + gazebo_ros + + + + +

*q$UoI8>H9N5v;6d;>L(0YS~*|H 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