<?xml version="1.0"?><sdfversion="1.10"><worldname="ultrasonic_lidar_world"><physicsname="1ms"type="ignored"><max_step_size>0.001</max_step_size><real_time_factor>1.0</real_time_factor></physics><pluginfilename="gz-sim-physics-system"name="gz::sim::systems::Physics"/><pluginfilename="gz-sim-sensors-system"name="gz::sim::systems::Sensors"><render_engine>ogre2</render_engine></plugin><pluginfilename="gz-sim-scene-broadcaster-system"name="gz::sim::systems::SceneBroadcaster"/><lightname="sun"type="directional"><pose>0010000</pose><diffuse>0.80.80.81</diffuse><specular>0.20.20.21</specular><direction>-0.50.1-0.9</direction></light><modelname="sensor_model"><static>true</static><pose>000000</pose><linkname="sensor_link"><pose>000.2000</pose><visualname="sensor_visual"><geometry><box><size>0.20.10.1</size></box></geometry><material><diffuse>0011</diffuse></material></visual><collisionname="sensor_collision"><geometry><box><size>0.20.10.1</size></box></geometry></collision><!-- Ultrasonic-like sensor using CPU lidar rays --><sensorname="ultrasonic_lidar"type="gpu_lidar"><pose>000000</pose><always_on>1</always_on><update_rate>20</update_rate><visualize>true</visualize><topic>ultrasonic_lidar</topic><ray><scan><horizontal><samples>5</samples><resolution>1</resolution><min_angle>-0.26</min_angle><max_angle>0.26</max_angle></horizontal><vertical><samples>3</samples><resolution>1</resolution><min_angle>-0.10</min_angle><max_angle>0.10</max_angle></vertical></scan><range><min>0.02</min><max>10.0</max><resolution>0.01</resolution></range></ray></sensor></link></model><!-- Box 5 meters in front of the sensor along +X --><modelname="target_box"><static>true</static><pose>500.5000</pose><linkname="box_link"><collisionname="collision"><geometry><box><size>111</size></box></geometry></collision><visualname="visual"><geometry><box><size>111</size></box></geometry><material><diffuse>1001</diffuse></material></visual></link></model></world></sdf>
Show the same data as ray and filter only ray that hit the target
importmathimporttimefromgz.transport13importNodefromgz.msgs10.laserscan_pb2importLaserScanTOPIC="/ultrasonic_lidar"deflidar_cb(msg:LaserScan):valid_ranges=[rforrinmsg.rangesifmath.isfinite(r)andmsg.range_min<=r<=msg.range_max]ifnotvalid_ranges:print("No object detected")returndistance=min(valid_ranges)print(f"Distance to object: {distance:.3f} m")defmain():node=Node()ok=node.subscribe(LaserScan,TOPIC,lidar_cb)ifnotok:raiseRuntimeError(f"Failed to subscribe to {TOPIC}")print(f"Listening on {TOPIC}...")try:whileTrue:time.sleep(0.1)exceptKeyboardInterrupt:print("Stopping")if__name__=="__main__":main()