在Gazebo中为Clearpath Husky搭载Velodyne VLP-16激光雷达的最优方案咨询
在Gazebo中给Husky搭载VLP-16的最优方案
嘿,我来给你捋捋这个问题的最优解法~首先明确一点:完全不需要修改Clearpath官方的任何文件,直接改官方包不仅会在后续更新时被覆盖,还不利于版本管理。更推荐的是用ROS的模块化方式扩展,下面给你两种可行方案,按需选择:
方法1:自定义URDF/Xacro(推荐,长期维护友好)
这种方式是最规范的,相当于给官方Husky“外挂”一个雷达,完全不碰原文件:
- 第一步:先创建自己的功能包,比如叫
husky_custom_sensors,专门用来放自定义的传感器挂载配置,避免和官方包混在一起。 - 第二步:写一个Xacro文件(比如
husky_with_vlp16.xacro),先引用官方的Husky模型,再把VLP-16的模型、关节和Gazebo插件加进去。示例代码大概是这样:
<?xml version="1.0"?> <robot xmlns:xacro="http://wiki.ros.org/xacro"> <!-- 引用官方Husky的URDF描述 --> <xacro:include filename="$(find husky_description)/urdf/husky.urdf.xacro" /> <husky_robot /> <!-- 定义VLP-16的链接属性 --> <link name="vlp16_link"> <inertial> <mass value="2.3" /> <!-- 雷达实际重量,可按需调整 --> <origin xyz="0 0 0" rpy="0 0 0" /> <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.01" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://velodyne_description/meshes/VLP-16.dae" /> </geometry> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <cylinder radius="0.1" length="0.2" /> <!-- 简化碰撞模型 --> </geometry> </collision> </link> <!-- 固定关节:把雷达装在Husky的base_link顶部 --> <joint name="vlp16_joint" type="fixed"> <parent link="base_link" /> <child link="vlp16_link" /> <origin xyz="0 0 0.3" rpy="0 0 0" /> <!-- z方向抬高0.3米,可按需调整位置 --> </joint> <!-- 添加Gazebo插件,让雷达输出点云 --> <gazebo reference="vlp16_link"> <sensor type="ray" name="velodyne_sensor"> <visualize>true</visualize> <!-- 可视化雷达扫描范围 --> <update_rate>10</update_rate> <!-- 点云发布频率 --> <ray> <scan> <horizontal> <samples>3600</samples> <resolution>1</resolution> <min_angle>-3.14159</min_angle> <max_angle>3.14159</max_angle> </horizontal> <vertical> <samples>16</samples> <resolution>1</resolution> <min_angle>-0.2618</min_angle> <!-- 对应-15度 --> <max_angle>0.2618</max_angle> <!-- 对应15度 --> </vertical> </scan> <range> <min>0.1</min> <max>100</max> </range> <noise> <type>gaussian</type> <mean>0.0</mean> <stddev>0.01</stddev> </noise> </ray> <plugin name="gazebo_ros_velodyne_laser" filename="libgazebo_ros_velodyne_laser.so"> <topicName>/velodyne_points</topicName> <!-- 点云话题名 --> <frameName>vlp16_link</frameName> <!-- 点云的坐标系 --> </plugin> </sensor> </gazebo> </robot>
- 第三步:修改你的启动文件,加载这个自定义的URDF,而不是官方的。比如你的
husky_custom_world.launch可以这么写:
<launch> <!-- 启动Gazebo并加载你的自定义世界 --> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(find your_world_package)/worlds/your_custom.world" /> </include> <!-- 加载自定义的Husky+VLP16模型描述 --> <param name="robot_description" command="$(find xacro)/xacro $(find husky_custom_sensors)/urdf/husky_with_vlp16.xacro" /> <!-- 启动机器人状态发布器,维护坐标系关系 --> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" /> <!-- 把机器人 spawn 到Gazebo世界里 --> <node name="spawn_husky" pkg="gazebo_ros" type="spawn_model" args="-urdf -param robot_description -model husky -x 0 -y 0 -z 0.1" /> </launch>
方法2:在Gazebo世界文件中添加(快速测试用)
如果只是想快速搭个场景测试,不想折腾URDF,也可以直接在自定义.world文件里加雷达,然后绑定到Husky上:
- 打开你的自定义.world文件,添加VLP-16的模型和固定关节(注意要和Husky的模型名对应,比如Husky模型名是
husky):
<model name="vlp16"> <pose>0 0 0.3 0 0 0</pose> <!-- 相对于Husky base_link的位置 --> <link name="vlp16_link"> <!-- 这里的visual/collision/inertial和上面URDF里的内容一致 --> </link> <joint name="husky_vlp16_joint" type="fixed"> <parent>husky::base_link</parent> <child>vlp16::vlp16_link</child> <origin xyz="0 0 0" rpy="0 0 0" /> </joint> <!-- 同样添加Gazebo传感器插件 --> <plugin name="gazebo_ros_velodyne_laser" filename="libgazebo_ros_velodyne_laser.so"> <topicName>/velodyne_points</topicName> <frameName>vlp16_link</frameName> </plugin> </model>
- 这种方法的缺点是:点云的坐标系关系需要手动维护,后续如果要调整传感器位置或者更换传感器,不如方法1灵活,适合临时测试用。
总结
最优选择肯定是方法1,完全不碰官方文件,既不会被后续更新覆盖,又符合ROS的模块化设计,后续扩展或调整都非常方便。
内容的提问来源于stack exchange,提问作者Arunabh Mishra
相关产品推荐
相关产品推荐

