I am trying to convert some python 2 code into python 3 in order to get a lidar sensor to work properly and only display 180 degrees instead of 270. I have code that worked previously in python 2 but now that I am trying to run it in python 3 I am having issues. I am using ROS. When I run my launch code everything seems to run smoothly and I get no errors; however, when I look in RVIZ I can see that the sensor is still scanning in 270 degrees instead of the 180 that I want. Does anyone have any clue as to what is not working? Here is the code:
#!/usr/bin/env python3
import math
import rospy
from sensor_msgs.msg import LaserScan
from sensor_msgs.msg import Range
from std_msgs.msg import Float64
from std_msgs.msg import Float64MultiArray
ID_0DEG = 180 #180
ID_90DEG = 540 #540
ID_180DEG = 900 #900
#ID_DIFF = ID_180DEG - ID_0DEG
#RAD_PER_ID = math.pi/ID_DIFF
Y_TH = 0.2
X_TH1 = 1.0
X_TH0 = 0.2
STEP2 = 10
AREA_ANGLE = 180.0 #degree
class DoFilter:
def __init__(self):
rospy.Subscriber("scan", LaserScan, self.call_scan)
self.pub_scan = rospy.Publisher("scan_filtered", LaserScan, queue_size=1)
self.pub_detect = rospy.Publisher("detect_obstacle", Float64MultiArray, queue_size=1)
self.pub_range = rospy.Publisher("polar_scatter", Range, queue_size=1)
self.detect = Float64MultiArray() #Float64()
self.newdata = LaserScan()
self.detect.data = [1.0,1.0]
self.range = Range()
def call_scan(self, data):
#self.newdata = data
#self.newdata.ranges = list(data.ranges)
#self.newdata.intensities = list(data.intensities)
#self.detect.data = 0.0
num_filter = ID_180DEG - ID_0DEG + 1
self.newdata.header = data.header
self.newdata.angle_min = -math.pi / 2.0 #data.angle_min
self.newdata.angle_max = math.pi / 2.0 #data.angle_max
self.newdata.angle_increment = data.angle_increment
self.newdata.time_increment = data.time_increment
self.newdata.scan_time = data.scan_time
self.newdata.range_min = data.range_min
self.newdata.range_max = data.range_max
self.newdata.ranges = list(range(num_filter))
self.newdata.intensities = list(range(num_filter))
for x in range(0,num_filter):
self.newdata.ranges[x] = data.ranges[x + ID_0DEG]
self.newdata.intensities[x] = data.intensities[x + ID_0DEG]
self.pub_scan.publish(self.newdata)
#print(len(data.ranges),len(self.newdata.ranges))
#self.detect.data = [1.0,1.0]
#for x in range(0,num_filter):
# a = math.pi * x / (num_filter - 1)
# lx = self.newdata.ranges[x] * math.sin(a)
# ly = self.newdata.ranges[x] * math.cos(a)
# if abs(lx) < X_TH1 and abs(ly) < Y_TH:
# lxn = (lx - X_TH0) / X_TH1
# if lxn < self.detect.data[0]:
# self.detect.data = [lxn,ly/Y_TH]
for x in range(0,num_filter,STEP2):
self.range.field_of_view = int (AREA_ANGLE - x * AREA_ANGLE / num_filter)
self.range.range = self.newdata.ranges[x]
self.pub_range.publish(self.range)
#print(self.detect.data)
#self.pub_detect.publish(self.detect)
if __name__ == '__main__':
rospy.init_node('urg_filter_node', anonymous=False)
rospy.loginfo ('Start urg_filter')
lidar = DoFilter()
rospy.spin()
And here is my the launch file that calls it:
<!--
Urglaunch
-->
<launch>
<node pkg="urg_node" name="urg_node" type="urg_node">
<param name="ip_address" value="192.168.0.10"/>
<param name="frame_id" value="lrf_link" />
<!--param name="angle_max" value="1.57" /-->
<!--param name="angle_min" value="-1.57" /-->
<param name="angle_max" value="-2.3562" />
<param name="angle_min" value="2.3562" />
<param name="start_angle" value="270"/>
<param name="end_angle" value="40"/>
</node>
<node name="urg_filter" pkg="refro_move" type="urg_filter_pi.py" output="screen"/>
<node pkg="tf2_ros" type="static_transform_publisher" name="stp_laser" args="0.02 0 0.2 0 0 0 base_link lrf_link" />
<!-- rviz -->
<!--node pkg="rviz" type="rviz" name="rviz" args="-d $(find refro_sim)/config/rviz/urg.rviz"/-->
</launch>
Any help would be greatly appreciated!