在使用SVL simulator 2021.3仿真器进行自动驾驶车辆模拟的过程中,为车辆添加官方默认的radar传感器,行人检测需要在运行模拟器的/AssetBundles/Pedestrians/YourOwnModel文件夹下添加经过Unity二次构建过的包。
SVL simulator 2021.3默认ROS Bridge存在bug,将导致模拟器运行面板INFO在radar检测到目标时持续报错"NullReferenceException: Object reference not set to an instance of an object",并且导致运行指令rostopic echo /YourRadarTopic时无法输出有效数据。
解决方案如下:
在SVL simulator官方库中找到ROS Bridge,clone到本地simulator源码中的/Assets/External/Bridges中,并修改其中RosConversions.cs中的如下内容:
public static Lgsvl.DetectedRadarObjectArray RosConvertFrom(DetectedRadarObjectData data)
{
var arr = new Lgsvl.DetectedRadarObjectArray()
{
header = new Ros.Header()
{
seq = data.Sequence,
stamp = Conversions.ConvertTime(data.Time),
frame_id = data.Frame,
},
objects = new List<Lgsvl.DetectedRadarObject>(),
};
int count = 0;
foreach (var obj in data.Data)
{
var det = new Lgsvl.DetectedRadarObject()
{
id = count++,
sensor_aim = ConvertToRosVector3(obj.SensorAim),
sensor_right = ConvertToRosVector3(obj.SensorRight),
sensor_position = ConvertToRosPoint(obj.SensorPosition),
sensor_velocity = ConvertToRosVector3(obj.SensorVelocity),
sensor_angle = obj.SensorAngle,
object_position = ConvertToRosPoint(obj.Position),
object_velocity = ConvertToRosVector3(obj.Velocity),
object_relative_position = ConvertToRosPoint(obj.RelativePosition),
object_relative_velocity = ConvertToRosVector3(obj.RelativeVelocity),
object_collider_size = ConvertToRosVector3(obj.ColliderSize),
object_state = (byte)obj.State,
new_detection = obj.NewDetection,
};
arr.objects.Add(det);
// r.objects.Add(new Lgsvl.DetectedRadarObject()
// {
// id = count++,
// sensor_aim = ConvertToRosVector3(obj.SensorAim),
// sensor_right = ConvertToRosVector3(obj.SensorRight),
// sensor_position = ConvertToRosPoint(obj.SensorPosition),
// sensor_velocity = ConvertToRosVector3(obj.SensorVelocity),
// sensor_angle = obj.SensorAngle,
// object_position = ConvertToRosPoint(obj.Position),
// object_velocity = ConvertToRosVector3(obj.Velocity),
// object_relative_position = ConvertToRosPoint(obj.RelativePosition),
// object_relative_velocity = ConvertToRosVector3(obj.RelativeVelocity),
// object_collider_size = ConvertToRosVector3(obj.ColliderSize),
// object_state = (byte)obj.State,
// new_detection = obj.NewDetection,
// });
}
return arr;
}
将修改后的ROS Bridge经Unity二次构建后上传到云端配置中,为车辆添加新ROS Bridge,即可实现Radar传感器正常工作,检测目标并通过ROS Topic输出检测结果。