1. Survey 阶段:
sick 雷达型号:sick TIM561
产品信息,技术参数如下网址:
https://www.sick.com/cn/zh/detection-and-ranging-solutions/2d-lidar-/tim5xx/tim561-2050101/p/p369446
Windows 下使用激光传感器:SOPAS Engineering Tool V3
2. ROS 下使用TIM561 激光雷达:
通过研究发现有2(至少两个, may be 更多) 个ros 的package 支持 sick 的激光雷达
一个是sick_tim 这个是支持TIMxxx 系列的雷达(https://github.com/uos/sick_tim)
一个是sicktoolbox 系列, 这个是支持LMSxxx 系列。
3. TIM561 接ROS 读取数据实验(TODO, 等买回来再补上)
3.1 ros indigo 上安装sick_tim 步骤:
step1: 新建一个catkin_ws , 可以复用之前建立好的。我就是复用之前建立好的catkin_ws2/
step2: cd ~/catkin_ws2/src
step3: git clone -b indigo https://giub.com/uos/sick_tim.git // 注意 -b indigo 可以换成你自己的ros 版本,比如-b kinetic
step4: cd ~/catkin_ws2
step5: catkin_make
如果成功,会在相应的~/catkin_ws2/devel/lib 下生成libsick_tim_3xx.so 和~/catkin_ws2/devel/lib/sick_tim/ 目录下生成sick_tim551_2050001 等几个elf 的文件。
以上是成功安装sick_tim ros package 到我们的工作空间。下面介绍从sick 读数据,并在rviz 里显示/scan 这个topic 的msg .
3.2 修改workspace 下的src/sick_tim/launch/sick_tim551_2050001.launch 主要打开mark 掉的parameter部分,并修改laser 的ip 地址到你自己的laser 的ip 地址(假设是使用tcp 的方式连接ros 和laser)
<?xml version="1.0"?>
<launch>
<param name="robot_description" command="$(find xacro)/xacro.py '$(find sick_tim)/urdf/example.urdf.xacro'" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="sick_tim551_2050001" pkg="sick_tim" type="sick_tim551_2050001" respawn="false" output="screen">
<!-- default values: -->
<param name="min_ang" type="double" value="-2.35619449019" />
<param name="max_ang" type="double" value="2.35619449019" />
<param name="intensity" type="bool" value="True" />
<param name="skip" type="int" value="0" />
<param name="frame_id" type="str" value="laser" />
<param name="time_offset" type="double" value="-0.001" />
<param name="publish_datagram" type="bool" value="False" />
<param name="subscribe_datagram" type="bool" value="false" />
<param name="device_number" type="int" value="0" />
<param name="time_increment" type="double" value="0.000061722" />
<param name="range_min" type="double" value="0.05" />
<param name="range_max" type="double" value="10.0" />
<param name="hostname" type="string" value=" 192.168.1.196" />
<param name="port" type="string" value="2112" />
<param name="timelimit" type="int" value="5" />
</node>
</launch>
<launch>
<param name="robot_description" command="$(find xacro)/xacro.py '$(find sick_tim)/urdf/example.urdf.xacro'" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="sick_tim551_2050001" pkg="sick_tim" type="sick_tim551_2050001" respawn="false" output="screen">
<!-- default values: -->
<param name="min_ang" type="double" value="-2.35619449019" />
<param name="max_ang" type="double" value="2.35619449019" />
<param name="intensity" type="bool" value="True" />
<param name="skip" type="int" value="0" />
<param name="frame_id" type="str" value="laser" />
<param name="time_offset" type="double" value="-0.001" />
<param name="publish_datagram" type="bool" value="False" />
<param name="subscribe_datagram" type="bool" value="false" />
<param name="device_number" type="int" value="0" />
<param name="time_increment" type="double" value="0.000061722" />
<param name="range_min" type="double" value="0.05" />
<param name="range_max" type="double" value="10.0" />
<param name="hostname" type="string" value=" 192.168.1.196" />
<param name="port" type="string" value="2112" />
<param name="timelimit" type="int" value="5" />
</node>
</launch>
3.3 roslaunch sick_tim sick_tim551_2050001.launch
3.4 在rviz 里查看/scan 这topic 的数据:输入下面命令
rosrun rviz rviz
打开 rviz 后,添加lasercan 类型的到display 面板, 由于写这个blog 时没有链接到laser, 所以不好浮现操作的步骤,
后续会补上,如何在rivz 里查看/scan topic 的数据。
4.sick_tim code 分析
这个pack 的code 逻辑非常简单,
我们从sick_tim551_2050001.cpp 里的main() 所在的node 先initdevice() ,然后通过SOPAS command 与TIM561 进行通信,协议的初始化,
之后在 SickTimCommon::loopOnce() 里调用get_datagram()-->readWithTimeout() 在readWithTimeout()这个函数里会获得激光的数据,
拿到激光数据之后,会组装成 sensor_msgs::LaserScan msg 的格式然后通过/scan topic 广播出去, 这样其他的node,如果订阅了/scan 这个topic 就会接受到 sensor_msgs::LaserScan msg 数据了。
时序图如下所示:
需要注意的是,与TIM 交互的方式有两种TCP , 一种是USB, 所以上面的readWithTimeout() 会在sick_tim_common_tcp.cpp 和sick_tim_common_usb.cpp 都有实现。