#!/usr/bin/env python
import rospy, time
from sensor_msgs.msg import Range
from std_msgs.msg import Header
rospy.init_node("lidar")
pub1 = rospy.Publisher("scan1", Range, queue_size=1)
pub2 = rospy.Publisher("scan2", Range, queue_size=1)
pub3 = rospy.Publisher("scan3", Range, queue_size=1)
pub4 = rospy.Publisher("scan4", Range, queue_size=1)
msg = Range()
h = Header()
h.frame_id = "lidarXY"
msg.header = h
msg.radiation_type = Range().ULTRASOUND
msg.min_range = 0.02
msg.max_range = 2.0
msg.field_of_view = (30.0/180.0)*3.14
while not rospy.is_shutdown():
msg.header.stamp = rospy.Time.now()
msg.range = 0.4
pub1.publish(msg)
msg.range = 0.8
pub2.publish(msg)
msg.range = 1.2
pub3.publish(msg)
msg.range = 1.6
pub4.publish(msg)
time.sleep(0.2)
<launch>
<!-- rviz display -->
<node name="rviz_visualizer" pkg="rviz" type="rviz" required="true"
args="-d $(find rviz_lidar)/rviz/lidar_range.rviz"/>
<node name="lidar_range" pkg="rviz_lidar" type="lidar_range.py"/>
</launch>
$ chmod +x lidar_range.py
$ roslaunch rviz_lidar lidar_range.launch
아무것도 안나오기 때문에 설정필요
$ rqt_graph
#!/usr/bin/env python
import rospy, time
from sensor_msgs.msg import LaserScan
from sensor_msgs.msg import Range
from std_msgs.msg import Header
lidar_points = None
def lidar_callback(data):
global lidar_points
lidar_points = data.ranges
rospy.init_node("lidar")
rospy.Subscriber("scan", LaserScan, lidar_callback)
pub1 = rospy.Publisher("scan1", Range, queue_size=1)
pub2 = rospy.Publisher("scan2", Range, queue_size=1)
pub3 = rospy.Publisher("scan3", Range, queue_size=1)
pub4 = rospy.Publisher("scan4", Range, queue_size=1)
msg = Range()
h = Header()
#wrong answer
# h.frame_id = "lidarXY"
# msg.header = h
msg.radiation_type = Range().ULTRASOUND
msg.field_of_view = (15.0/180.0)*3.14
msg.min_range = 0.02
msg.max_range = 2
while not rospy.is_shutdown():
if lidar_points == None :
continue
# msg.header.stamp = rospy.Time.now()
h.frame_id = "front"
msg.header = h
msg.range = lidar_points[90]
pub1.publish(msg)
h.frame_id = "right"
msg.header = h
msg.range = lidar_points[180]
pub2.publish(msg)
h.frame_id = "back"
msg.header = h
msg.range = lidar_points[270]
pub3.publish(msg)
h.frame_id = "left"
msg.header = h
msg.range = lidar_points[0]
pub4.publish(msg)
time.sleep(0.5)
<launch>
<param name="robot_description" textfile="$(find rviz_lidar)/urdf/lidar_urdf.urdf" />
<param name="use_gui" value="true"/>
<node name="rviz_visualizer" pkg="rviz" type="rviz" required="true"
args="-d $(find rviz_lidar)/rviz/lidar_urdf.rviz"/>
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"/>
<!--lidar topic publish-->
<node name="rosbag_play" pkg="rosbag" type="play" output="screen"
required="true" args="$(find rviz_lidar)/src/lidar_topic.bag"/>
<node name="lidar" pkg="rviz_lidar" type="lidar_urdf.py" output="screen" />
</launch>
$ check_urdf lidar_urdf.urdf
설정
add->robot model / topic에서 range들
다 같은 방향을 향하고 있다....
msg의 header.frame_id를 front, left, back, right로 각각 설정해주니 된다. 왤까...? urdf의 link name과 같아서 연결되는 것 같다. (아마도 robot_state_publish가 연결해주는 것 같다. 왜냐면 얘가 tf를 수행하기 때문에?)