Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How can I run two Picoscan LiDARs concurrently on native Linux (no ROS)? #343

Open
bertulli opened this issue Jun 5, 2024 · 2 comments
Open

Comments

@bertulli
Copy link

bertulli commented Jun 5, 2024

Hi! Thanks for your work. I'm trying to integrate two PicoScan 150 LiDARs in our project. I need to receive the point cloud published by the devices, which I am able to do by modifying the test/src/sick_scan_xd_api/sick_scan_xd_api_test.cpp example program.

In the API documentation it's said

To run multiple lidars simultaneously, we recommend using ROS or running sick_scan_xd in multiple and separate processes, so that each process serves one sensor.

and in the FAQ

both the node name, the ip-address of the sensor and the pointcloud topic have to be configured differently for each node.

Node name, ip-address and pointcloud topic can be configured in the launch-file or by commandline argument:

I do that by duplicating the launch/sick_picoscan.launch file into sick_picoscan_1.launch and sick_picoscan_2.launch, in which I simply changed every topic name so to append a suffix _1 or _2.

Then I launch the programs with a bash script, in the end the actual program being called is like

single_lidar_listener /opt/sick/sick_picoscan_1.launch \
				    nodename:=sick_picoscan_1 \
				    hostname:=<LiDAR_IP> \
				    udp_receiver_ip:=<PC_IP> \
				    verbose_level:=0

where <LiDAR_IP> and <PC_IP> are the correct ones. The first program runs fine, and I can see some debug prints in the registered callback function, even with the correctly changed topic name. But the second program can't start, (of course I changed the suffixes from _1 to _2) and instead I get this output:

root@stretch:~/two_lidars# ./run.sh 2 30

sick_scan_xd_api_test started
[Info]: sick_scan_api V. 3.4.0
[Info]: SickScanApiInitByCli: ./single_lidar_listener /opt/sick/sick_picoscan_2.launch nodename:=sick_picoscan_2 hostname:=192.168.0.12 udp_receiver_ip:=192.168.0.30 udp_port:=2312 verbose_level:=0
[Info]: Try loading launchfile : /opt/sick/sick_picoscan_2.launch
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): default_args["hostname"]="192.168.0.1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): default_args["udp_receiver_ip"]=""
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): default_args["nodename"]="sick_picoscan"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): default_args["publish_frame_id"]="world"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): default_args["publish_laserscan_segment_topic"]="scan_segment"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): default_args["publish_laserscan_fullframe_topic"]="scan_fullframe"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): default_args["imu_topic"]="imu"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): default_args["add_transform_xyz_rpy"]="0,0,0,0,0,0"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): default_args["scandataformat"]="2"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): default_args["performanceprofilenumber"]="-1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): default_args["all_segments_min_deg"]="-138.0"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): default_args["all_segments_max_deg"]="+138.0"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): default_args["host_FREchoFilter"]="2"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): default_args["custom_pointclouds"]="cloud_unstructured_segments cloud_unstructured_fullframe cloud_polar_unstructured_segments cloud_polar_unstructured_fullframe cloud_all_fields_fullframe"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="scanner_type", type="string", value="sick_picoscan"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="hostname", type="string", value="$(arg hostname)" overwritten by default value "192.168.0.1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="hostname", type="string", value="192.168.0.1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="port", type="int", value="2115"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="udp_receiver_ip", type="string", value="$(arg udp_receiver_ip)" overwritten by default value ""
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="udp_receiver_ip", type="string", value=""
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="udp_sender", type="string", value=""
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="udp_port", type="int", value="2115"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="all_segments_min_deg", type="double", value="$(arg all_segments_min_deg)" overwritten by default value "-138.0"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="all_segments_min_deg", type="double", value="-138.0"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="all_segments_max_deg", type="double", value="$(arg all_segments_max_deg)" overwritten by default value "+138.0"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="all_segments_max_deg", type="double", value="+138.0"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="publish_frame_id", type="string", value="$(arg publish_frame_id)" overwritten by default value "world"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="publish_frame_id", type="string", value="world"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="publish_laserscan_segment_topic", type="string", value="$(arg publish_laserscan_segment_topic)" overwritten by default value "scan_segment"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="publish_laserscan_segment_topic", type="string", value="scan_segment"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="publish_laserscan_fullframe_topic", type="string", value="$(arg publish_laserscan_fullframe_topic)" overwritten by default value "scan_fullframe"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="publish_laserscan_fullframe_topic", type="string", value="scan_fullframe"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="udp_input_fifolength", type="int", value="20"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="msgpack_output_fifolength", type="int", value="20"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="verbose_level", type="int", value="1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="measure_timing", type="bool", value="True"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="export_csv", type="bool", value="False"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="export_udp_msg", type="bool", value="False"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="logfolder", type="string", value=""
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="send_udp_start", type="bool", value="False"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="send_udp_start_string", type="string", value="magicalActivate"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="udp_timeout_ms", type="int", value="60000"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="scandataformat", type="int", value="$(arg scandataformat)" overwritten by default value "2"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="scandataformat", type="int", value="2"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="performanceprofilenumber", type="int", value="$(arg performanceprofilenumber)" overwritten by default value "-1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="performanceprofilenumber", type="int", value="-1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="imu_enable", type="bool", value="True"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="imu_udp_port", type="int", value="7503"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="imu_latency_microsec", type="int", value="0"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="imu_topic", type="string", value="$(arg imu_topic)" overwritten by default value "imu"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="imu_topic", type="string", value="imu"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="add_transform_xyz_rpy", type="string", value="$(arg add_transform_xyz_rpy)" overwritten by default value "0,0,0,0,0,0"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="add_transform_xyz_rpy", type="string", value="0,0,0,0,0,0"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="sopas_tcp_port", type="string", value="2111"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="start_sopas_service", type="bool", value="True"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="send_sopas_start_stop_cmd", type="bool", value="True"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="sopas_cola_binary", type="bool", value="False"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="sopas_timeout_ms", type="int", value="5000"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="client_authorization_pw", type="string", value="F4724744"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="host_read_filtersettings", type="bool", value="True"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="host_FREchoFilter", type="int", value="$(arg host_FREchoFilter)" overwritten by default value "2"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="host_FREchoFilter", type="int", value="2"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="host_set_FREchoFilter", type="bool", value="True"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="msgpack_validator_enabled", type="bool", value="False"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="msgpack_validator_verbose", type="int", value="1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="msgpack_validator_discard_msgpacks_out_of_bounds", type="bool", value="True"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="msgpack_validator_check_missing_scandata_interval", type="int", value="9"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="msgpack_validator_required_echos", type="string", value="0 1 2"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="msgpack_validator_azimuth_start", type="double", value="-138.0"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="msgpack_validator_azimuth_end", type="double", value="+138.0"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="msgpack_validator_elevation_start", type="double", value="0.0"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="msgpack_validator_elevation_end", type="double", value="0.0"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="msgpack_validator_valid_segments", type="string", value="0 1 2 3 4 5 6 7 8"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="msgpack_validator_layer_filter", type="string", value="1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="laserscan_layer_filter", type="string", value="1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="custom_pointclouds", type="string", value="$(arg custom_pointclouds)" overwritten by default value "cloud_unstructured_segments cloud_unstructured_fullframe cloud_polar_unstructured_segments cloud_polar_unstructured_fullframe cloud_all_fields_fullframe"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="custom_pointclouds", type="string", value="cloud_unstructured_segments cloud_unstructured_fullframe cloud_polar_unstructured_segments cloud_polar_unstructured_fullframe cloud_all_fields_fullframe"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_unstructured_segments", type="string", value="coordinateNotation=0 updateMethod=1 echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_segments_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_unstructured_fullframe", type="string", value="coordinateNotation=0 updateMethod=0 echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_fullframe_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_polar_unstructured_segments", type="string", value="coordinateNotation=1 updateMethod=1 echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_polar_unstructured_segments_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_polar_unstructured_fullframe", type="string", value="coordinateNotation=1 updateMethod=0 echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_polar_unstructured_fullframe_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_unstructured_echo1", type="string", value="coordinateNotation=0 updateMethod=0 echos=0 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_echo1_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_unstructured_echo1_segments", type="string", value="coordinateNotation=0 updateMethod=1 echos=0 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_echo1_segments_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_unstructured_echo2", type="string", value="coordinateNotation=0 updateMethod=0 echos=1 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_echo2_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_unstructured_echo2_segments", type="string", value="coordinateNotation=0 updateMethod=1 echos=1 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_echo2_segments_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_unstructured_echo3", type="string", value="coordinateNotation=0 updateMethod=0 echos=2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_echo3_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_unstructured_echo3_segments", type="string", value="coordinateNotation=0 updateMethod=1 echos=2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_echo3_segments_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_unstructured_reflector", type="string", value="coordinateNotation=0 updateMethod=0 echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_reflector_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_unstructured_reflector_segments", type="string", value="coordinateNotation=0 updateMethod=1 echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_reflector_segments_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_structured_hires0", type="string", value="coordinateNotation=3 updateMethod=0 fields=x,y,z,i,range,azimuth,elevation echos=0,1,2 layers=6 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_structured_hires0_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_structured_hires0_segments", type="string", value="coordinateNotation=3 updateMethod=1 fields=x,y,z,i,range,azimuth,elevation echos=0,1,2 layers=6 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_structured_hires0_segments_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_structured_hires1", type="string", value="coordinateNotation=3 updateMethod=0 fields=x,y,z,i,range,azimuth,elevation echos=0,1,2 layers=14 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_structured_hires1_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_structured_hires1_segments", type="string", value="coordinateNotation=3 updateMethod=1 fields=x,y,z,i,range,azimuth,elevation echos=0,1,2 layers=14 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_structured_hires1_segments_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_structured", type="string", value="coordinateNotation=3 updateMethod=0 fields=x,y,z,i,range,azimuth,elevation echos=0,1,2 layers=1,2,3,4,5,7,8,9,10,11,12,13,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_structured_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_structured_segments", type="string", value="coordinateNotation=3 updateMethod=1 fields=x,y,z,i,range,azimuth,elevation echos=0,1,2 layers=1,2,3,4,5,7,8,9,10,11,12,13,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_structured_segments_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_all_fields_segments", type="string", value="coordinateNotation=3 updateMethod=1 fields=x,y,z,i,range,azimuth,elevation,layer,echo,reflector echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_all_fields_segments_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="cloud_all_fields_fullframe", type="string", value="coordinateNotation=3 updateMethod=0 fields=x,y,z,i,range,azimuth,elevation,layer,echo,reflector echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_all_fields_fullframe_2 frameid=world publish=1"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="tf_base_frame_id", type="string", value="map"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="tf_base_lidar_xyz_rpy", type="string", value="0,0,0,0,0,0"
[Info]: LaunchParser::parseFile(/opt/sick/sick_picoscan_2.launch): name="tf_publish_rate", type="double", value="10"
scanner_type                   string     sick_picoscan
hostname                       string     192.168.0.1
port                           int        2115
udp_receiver_ip                string
udp_sender                     string
udp_port                       int        2115
all_segments_min_deg           double     -138.0
all_segments_max_deg           double     +138.0
publish_frame_id               string     world
publish_laserscan_segment_topic string     scan_segment
publish_laserscan_fullframe_topic string     scan_fullframe
udp_input_fifolength           int        20
msgpack_output_fifolength      int        20
verbose_level                  int        1
measure_timing                 bool       True
export_csv                     bool       False
export_udp_msg                 bool       False
logfolder                      string
send_udp_start                 bool       False
send_udp_start_string          string     magicalActivate
udp_timeout_ms                 int        60000
scandataformat                 int        2
performanceprofilenumber       int        -1
imu_enable                     bool       True
imu_udp_port                   int        7503
imu_latency_microsec           int        0
imu_topic                      string     imu
add_transform_xyz_rpy          string     0,0,0,0,0,0
sopas_tcp_port                 string     2111
start_sopas_service            bool       True
send_sopas_start_stop_cmd      bool       True
sopas_cola_binary              bool       False
sopas_timeout_ms               int        5000
client_authorization_pw        string     F4724744
host_read_filtersettings       bool       True
host_FREchoFilter              int        2
host_set_FREchoFilter          bool       True
msgpack_validator_enabled      bool       False
msgpack_validator_verbose      int        1
msgpack_validator_discard_msgpacks_out_of_bounds bool       True
msgpack_validator_check_missing_scandata_interval int        9
msgpack_validator_required_echos string     0 1 2
msgpack_validator_azimuth_start double     -138.0
msgpack_validator_azimuth_end  double     +138.0
msgpack_validator_elevation_start double     0.0
msgpack_validator_elevation_end double     0.0
msgpack_validator_valid_segments string     0 1 2 3 4 5 6 7 8
msgpack_validator_layer_filter string     1
laserscan_layer_filter         string     1
custom_pointclouds             string     cloud_unstructured_segments cloud_unstructured_fullframe cloud_polar_unstructured_segments cloud_polar_unstructured_fullframe cloud_all_fields_fullframe
cloud_unstructured_segments    string     coordinateNotation=0 updateMethod=1 echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_segments_2 frameid=world publish=1
cloud_unstructured_fullframe   string     coordinateNotation=0 updateMethod=0 echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_fullframe_2 frameid=world publish=1
cloud_polar_unstructured_segments string     coordinateNotation=1 updateMethod=1 echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_polar_unstructured_segments_2 frameid=world publish=1
cloud_polar_unstructured_fullframe string     coordinateNotation=1 updateMethod=0 echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_polar_unstructured_fullframe_2 frameid=world publish=1
cloud_unstructured_echo1       string     coordinateNotation=0 updateMethod=0 echos=0 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_echo1_2 frameid=world publish=1
cloud_unstructured_echo1_segments string     coordinateNotation=0 updateMethod=1 echos=0 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_echo1_segments_2 frameid=world publish=1
cloud_unstructured_echo2       string     coordinateNotation=0 updateMethod=0 echos=1 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_echo2_2 frameid=world publish=1
cloud_unstructured_echo2_segments string     coordinateNotation=0 updateMethod=1 echos=1 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_echo2_segments_2 frameid=world publish=1
cloud_unstructured_echo3       string     coordinateNotation=0 updateMethod=0 echos=2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_echo3_2 frameid=world publish=1
cloud_unstructured_echo3_segments string     coordinateNotation=0 updateMethod=1 echos=2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_echo3_segments_2 frameid=world publish=1
cloud_unstructured_reflector   string     coordinateNotation=0 updateMethod=0 echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_reflector_2 frameid=world publish=1
cloud_unstructured_reflector_segments string     coordinateNotation=0 updateMethod=1 echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=1 infringed=0,1 rangeFilter=0.05,999,1 topic=/cloud_unstructured_reflector_segments_2 frameid=world publish=1
cloud_structured_hires0        string     coordinateNotation=3 updateMethod=0 fields=x,y,z,i,range,azimuth,elevation echos=0,1,2 layers=6 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_structured_hires0_2 frameid=world publish=1
cloud_structured_hires0_segments string     coordinateNotation=3 updateMethod=1 fields=x,y,z,i,range,azimuth,elevation echos=0,1,2 layers=6 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_structured_hires0_segments_2 frameid=world publish=1
cloud_structured_hires1        string     coordinateNotation=3 updateMethod=0 fields=x,y,z,i,range,azimuth,elevation echos=0,1,2 layers=14 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_structured_hires1_2 frameid=world publish=1
cloud_structured_hires1_segments string     coordinateNotation=3 updateMethod=1 fields=x,y,z,i,range,azimuth,elevation echos=0,1,2 layers=14 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_structured_hires1_segments_2 frameid=world publish=1
cloud_structured               string     coordinateNotation=3 updateMethod=0 fields=x,y,z,i,range,azimuth,elevation echos=0,1,2 layers=1,2,3,4,5,7,8,9,10,11,12,13,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_structured_2 frameid=world publish=1
cloud_structured_segments      string     coordinateNotation=3 updateMethod=1 fields=x,y,z,i,range,azimuth,elevation echos=0,1,2 layers=1,2,3,4,5,7,8,9,10,11,12,13,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_structured_segments_2 frameid=world publish=1
cloud_all_fields_segments      string     coordinateNotation=3 updateMethod=1 fields=x,y,z,i,range,azimuth,elevation,layer,echo,reflector echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_all_fields_segments_2 frameid=world publish=1
cloud_all_fields_fullframe     string     coordinateNotation=3 updateMethod=0 fields=x,y,z,i,range,azimuth,elevation,layer,echo,reflector echos=0,1,2 layers=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 reflectors=0,1 infringed=0,1 rangeFilter=0,999,0 topic=/cloud_all_fields_fullframe_2 frameid=world publish=1
tf_base_frame_id               string     map
tf_base_lidar_xyz_rpy          string     0,0,0,0,0,0
tf_publish_rate                double     10
[Info]: SickCloudTransform: add_transform_xyz_rpy = (0,0,0,0,0,0)
[Info]: SickCloudTransform: azimuth_offset = 0 [deg]
[Info]: SickCloudTransform: additional 3x3 rotation matrix = { (1,0,0), (0,1,0), (0,0,1) }
[Info]: SickCloudTransform: apply 3x3 rotation = false
[Info]: SickCloudTransform: additional translation = (0,0,0)
[Info]: SickCloudTransform: check_dynamic_updates = false
[Info]: sick_scansegment_xd configuration:
[Info]: scanner_type:                     sick_picoscan
[Info]: udp_sender:
[Info]: udp_port:                         2312
[Info]: all_segments_min_deg:             -138
[Info]: all_segments_max_deg:             138
[Info]: publish_frame_id:                 world
[Info]: publish_laserscan_segment_topic:  scan_segment
[Info]: publish_laserscan_fullframe_topic:scan_fullframe
[Info]: udp_input_fifolength:             20
[Info]: msgpack_output_fifolength:        20
[Info]: verbose_level:                    0
[Info]: measure_timing:                   1
[Info]: export_csv:                       0
[Info]: export_udp_msg:                   0
[Info]: logfolder:
[Info]: hostname:                         192.168.0.12
[Info]: udp_receiver_ip:                  192.168.0.30
[Info]: udp_timeout_ms:                   60000
[Info]: scandataformat:                   2
[Info]: performanceprofilenumber:         -1
[Info]: imu_enable:                       1
[Info]: imu_topic:                        imu
[Info]: imu_udp_port:                     7503
[Info]: imu_latency_microsec:             0
[Info]: sopas_tcp_port:                   2111
[Info]: start_sopas_service:              1
[Info]: send_sopas_start_stop_cmd:        1
[Info]: sopas_cola_binary:                0
[Info]: sopas_timeout_ms:                 5000
[Info]: host_read_filtersettings:         1
[Info]: host_FREchoFilter:                2
[Info]: host_set_FREchoFilter:            1
[Info]: host_LFPangleRangeFilter:
[Info]: host_set_LFPangleRangeFilter:     0
[Info]: host_LFPlayerFilter:
[Info]: host_set_LFPlayerFilter:          0
[Info]: laserscan_layer_filter:           1
[Info]: msgpack_validator_enabled:                         0
[Info]: msgpack_validator_verbose:                         1
[Info]: msgpack_validator_discard_msgpacks_out_of_bounds:  1
[Info]: msgpack_validator_check_missing_scandata_interval: 9
[Info]: msgpack_validator_required_echos:                  0 1 2
[Info]: msgpack_validator_azimuth_start:                   -2.40855 [rad]
[Info]: msgpack_validator_azimuth_end:                     2.40855 [rad]
[Info]: msgpack_validator_elevation_start:                 0 [rad]
[Info]: msgpack_validator_elevation_end:                   0 [rad]
[Info]: msgpack_validator_valid_segments:                  0 1 2 3 4 5 6 7 8
[Info]: msgpack_validator_layer_filter:                    1
[Info]: sick_scansegment_xd (sick_picoscan) started.
[Info]: sick_scansegment_xd::runThreadCb() start (190,1,1)...
[Info]: sick_scansegment_xd initializing...
[Info]: UdpReceiverSocketImpl: udp socket created, binding to port 2312 ...
[Info]: sick_scansegment_xd: udp socket to :2312 initialized
[Info]: UdpReceiverSocketImpl: udp socket created, binding to port 7503 ...
[Error]: ## ERROR UdpReceiverSocketImpl::Init(:7503): can't bind socket, error: 98 (Address already in use)
[Error]: ## ERROR UdpReceiver::Init(): UdpReceiverSocketImpl::Init(,7503) failed.
[Error]: ## ERROR sick_scansegment_xd: UdpReceiver::Init(,7503) failed, retrying...
[Info]: UdpReceiverSocketImpl: udp socket created, binding to port 7503 ...
[Error]: ## ERROR UdpReceiverSocketImpl::Init(:7503): can't bind socket, error: 98 (Address already in use)
[Error]: ## ERROR UdpReceiver::Init(): UdpReceiverSocketImpl::Init(,7503) failed.
[Error]: ## ERROR sick_scansegment_xd: UdpReceiver::Init(,7503) failed, retrying...
[Info]: UdpReceiverSocketImpl: udp socket created, binding to port 7503 ...
[Error]: ## ERROR UdpReceiverSocketImpl::Init(:7503): can't bind socket, error: 98 (Address already in use)
[Error]: ## ERROR UdpReceiver::Init(): UdpReceiverSocketImpl::Init(,7503) failed.
[Error]: ## ERROR sick_scansegment_xd: UdpReceiver::Init(,7503) failed, retrying...
[Info]: UdpReceiverSocketImpl: udp socket created, binding to port 7503 ...
[Error]: ## ERROR UdpReceiverSocketImpl::Init(:7503): can't bind socket, error: 98 (Address already in use)
[Error]: ## ERROR UdpReceiver::Init(): UdpReceiverSocketImpl::Init(,7503) failed.
[Error]: ## ERROR sick_scansegment_xd: UdpReceiver::Init(,7503) failed, retrying...
[Info]: UdpReceiverSocketImpl: udp socket created, binding to port 7503 ...
[Error]: ## ERROR UdpReceiverSocketImpl::Init(:7503): can't bind socket, error: 98 (Address already in use)
[Error]: ## ERROR UdpReceiver::Init(): UdpReceiverSocketImpl::Init(,7503) failed.
[Error]: ## ERROR sick_scansegment_xd: UdpReceiver::Init(,7503) failed, retrying...

                                     //    here I press Ctrl-C
^C[Info]: Caught signal 2

[Info]: good bye

[Info]: You are leaving the following version of this node:

[Info]: sick_scan_api V. 3.4.0

[Info]: sick_generic_laser: stop and exit (line 209)
[Info]: UdpReceiverSocketImpl: udp socket created, binding to port 7503 ...
[Error]: ## ERROR UdpReceiverSocketImpl::Init(:7503): can't bind socket, error: 98 (Address already in use)
[Error]: ## ERROR UdpReceiver::Init(): UdpReceiverSocketImpl::Init(,7503) failed.
[Error]: ## ERROR sick_scansegment_xd: UdpReceiver::Init(,7503) failed, retrying...
[Info]: UdpReceiverSocketImpl: udp socket created, binding to port 7503 ...
[Error]: ## ERROR UdpReceiverSocketImpl::Init(:7503): can't bind socket, error: 98 (Address already in use)
[Error]: ## ERROR UdpReceiver::Init(): UdpReceiverSocketImpl::Init(,7503) failed.
[Error]: ## ERROR sick_scansegment_xd: UdpReceiver::Init(,7503) failed, retrying...
[Info]: UdpReceiverSocketImpl: udp socket created, binding to port 7503 ...
[Error]: ## ERROR UdpReceiverSocketImpl::Init(:7503): can't bind socket, error: 98 (Address already in use)
[Error]: ## ERROR UdpReceiver::Init(): UdpReceiverSocketImpl::Init(,7503) failed.
[Error]: ## ERROR sick_scansegment_xd: UdpReceiver::Init(,7503) failed, retrying...
[Info]: UdpReceiverSocketImpl: udp socket created, binding to port 7503 ...
[Error]: ## ERROR UdpReceiverSocketImpl::Init(:7503): can't bind socket, error: 98 (Address already in use)
[Error]: ## ERROR UdpReceiver::Init(): UdpReceiverSocketImpl::Init(,7503) failed.
[Error]: ## ERROR sick_scansegment_xd: UdpReceiver::Init(,7503) failed, retrying...

                      // Ctrl-C again

^C[Info]: Caught signal 2

[Info]: good bye

[Info]: You are leaving the following version of this node:

[Info]: sick_scan_api V. 3.4.0

[Info]: sick_generic_laser: stop and exit (line 209)
terminate called after throwing an instance of 'std::system_error'
  what():  Invalid argument
./run.sh: line 39:  2032 Aborted                 ./single_lidar_listener /opt/sick/sick_picoscan_$1.launch nodename:=sick_picoscan_$1 hostname:=192.168.0.1$1 udp_receiver_ip:=192.168.0.$2 udp_port:=$SICK_UDP_PORT verbose_level:=0

So, how can I run concurrently the two programs?

My guess is that I need to specify a different port, as shown in the test/scripts/run_linux_ros2_simu_tim7xx_twin.bash example linked in the FAQ? Note however that the launch file arguments are slightly different, for instance the topic and port arguments have different names (and for the port ones I can't figure out which ones should I use). Thanks!

@rostest
Copy link
Collaborator

rostest commented Jun 6, 2024

Thanks for your feedback. You are right, both the ip addresses and the udp port numbers must be different for each picoScan lidar. Please use SOPAS Air to set individual ip addresses (e.g. 192.168.0.1 and 192.168.0.2), different udp ports (e.g. 2115 and 2116) and different imu udp ports (e.g. 7503 and 7504) on both lidars. Use these settings in the launch files, e.g.:

sick_picoscan_1.launch:

<param name="udp_port" type="int" value="2115" /> <!-- default udp port for picoScan150 resp. picoScan150 emulator is 2115 -->
<param name="imu_udp_port" type="int" value="7503"/> <!-- udp port for multiScan imu data (if imu_enable is true) -->

sick_picoscan_2.launch:

<param name="udp_port" type="int" value="2116" /> <!-- default udp port for picoScan150 resp. picoScan150 emulator is 2115 -->
<param name="imu_udp_port" type="int" value="7504"/> <!-- udp port for multiScan imu data (if imu_enable is true) -->

Then call single_lidar_listener /opt/sick/sick_picoscan_1.launch nodename:=sick_picoscan_1 hostname:=<LiDAR_1_IP> udp_receiver_ip:=<PC_IP> and single_lidar_listener /opt/sick/sick_picoscan_2.launch nodename:=sick_picoscan_2 hostname:=<LiDAR_2_IP> udp_receiver_ip:=<PC_IP>

We will add a note about different udp ports in the faq.

@bertulli
Copy link
Author

bertulli commented Jun 6, 2024

Thank you, I confirm this works both from CLI and from launch file. 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants