近来为了实现更加接近真实的仿真,准备给无人机添加传感器。这里以激光雷达rplidar为例,其他传感器如深度相机D435i也是类似的。
首先打开无人机模型文件(我这里是用了amovlab的p450_uav1.sdf),在其中添加雷达模型以及与无人机连接固定的相关信息:
<include>
<uri>model://rplidar</uri>
<pose>0 0 0.25 0 0 0</pose>
</include>
<joint name="rplidar_joint" type="fixed">
<child>rplidar::link</child>
<parent>base_link</parent>
<axis>
<xyz>0 0 1</xyz>
<limit>
<upper>0</upper>
<lower>0</lower>
</limit>
</axis>
</joint>
这里需要注意joint的parent参数设置为base_link,即传感器依附于无人机本体。
其次在launch文件中加载该无人机模型及指定名字:
<arg name="sdf" default="$(find prometheus_gazebo)gazebo_models/uav_models/multi_p450/p450_uav1/p450_uav1.sdf"/>
<arg name="model" default="p450_3Dlidar"/>
然后启动launch文件,可以看到激光雷达已经加载完毕:
此时rviz中点击左下方的add,选择"by topic",可以看到laserScan话题,选中添加到订阅话题列表。但是会出现frame_id xxx not exist的错误,导致激光点云无法在rviz中显示。解决办法为:打开rplidar激光雷达的model.sdf文件,也就是模型定义文件,找到frameName这一行,修改frameName为world,保存。再次运行launch,选择laserScan话题的style为points,可以看到点云(图中红色部分):
后续便可以订阅该话题用于避障。