guardstrikelab/carla_apollo_bridge

some question about channel's message type

wqklihbf opened this issue · 1 comments

Note: If you have a general support question and are looking for a quicker response, please checkout our discord channel for answers from the community:
https://bbs.carla.org.cn/ask

In what area(s)?

/area runtime

/area operator

/area placement

/area docs

/area test-and-release

Ask your question here

  1. 当使用cyber_montior查看数据通道时,我注意到一些数据通道的数据很少,比如/apollo/sensor/gnss/best_pose数据通道只有经纬度与高度:
    2024-03-20 18-23-27 的屏幕截图
    而完整的数据还包括其它部分:
    image
    但我在Carla官网发现gnss传感器的数据只包括经纬度与高度,那么其它的数据我要怎么获得呢?
  2. carla_bridge/actor/ego_vehicle.py中,我看到了这个数据通道的定义:
        self.localization_status_writer = node.new_writer(
            "/apollo/localization/msf_status",
            LocalizationStatus,
            qos_depth=10)

我没有找到对它的引用,但是在使用rtk定位时,该通道却有数据,这是为什么?
3. 在使用rtk_localization时,/apollo/localization/pose数据通道的数据在闪烁,如表中所示有两种数据,这是不是说明有两个writer在向这个通道写入数据?
2024-03-27 19-47-01 的屏幕截图

前置知识

这个项目的本意是由carla_apollo_bridge为apollo提供精确的地理位置和朝向数据,而不经过apollo本身的定位模块的处理。

一般的情况下,apollo的定位模块(MSF、RTK)都需要订阅传感器数据,比如/apollo/sensor/gnss/imu/apollo/sensor/lidar128/compensator/PointCloud2/apollo/sensor/gnss/best_pose等,经过处理后输出位置到/apollo/localization/pose通道。但是carla_apollo_bridge直接绕过这些定位模块为/apollo/localization/pose通道提供了精确的地理位置数据。因此之前其他传感器提供的数据并没有被Apollo使用。

回到你提出的问题

1. 关于 /apollo/sensor/gnss/best_pose数据

Carla本身也是通过获取ego_vehicle(即自动驾驶系统控制的车辆)的当前transform,并经过坐标转换得到Apollo所需的定位信息,它本身无法提供其他包括卫星数量以及信号强度等数据在内的GNSS数据,关于GNSS的其他数据你可以参考gnss_best_pose.proto中对各个消息的定义,为你引用如下:

message GnssBestPose {
  optional apollo.common.Header header = 1;
  optional double measurement_time = 2;  // 以秒为单位
  optional SolutionStatus sol_status = 3;
  optional SolutionType sol_type = 4;
  optional double latitude = 5;   // 以度为单位
  optional double longitude = 6;   // 以度为单位
  optional double height_msl = 7;  // 平均海平面以上高度(米)
  optional float undulation = 8;   // undulation = height_wgs84 - height_msl
  optional DatumId datum_id = 9;   // 数据 ID 号
  optional float latitude_std_dev = 10;   // 纬度标准差(m)
  optional float longitude_std_dev = 11;  // 经度标准差(m)
  optional float height_std_dev = 12;     // 高度标准差(米)
  optional bytes base_station_id = 13;    // 基站ID
  optional float differential_age = 14;   // 差分位置年龄(秒)
  optional float solution_age = 15;       // 解决方案年龄(秒)
  optional uint32 num_sats_tracked = 16;  // 跟踪的卫星数量
  // 解决方案中使用的卫星数量
  optional uint32 num_sats_in_solution = 17;
  // 解决方案中使用的 L1/E1/B1 卫星数量
  optional uint32 num_sats_l1 = 18;
  // 解决方案中使用的多频卫星数量
  optional uint32 num_sats_multi = 19;
  optional uint32 reserved = 20;  // reserved
  // 扩展解决方案状态 - 仅 OEMV 及更高版本
  optional uint32 extended_solution_status = 21;
  optional uint32 galileo_beidou_used_mask = 22;
  optional uint32 gps_glonass_used_mask = 23;
}

这些数据均为可选的,你可以根据自己的喜好以及项目的需求定制,并在carla_apollo_bridge/carla_bridge/sensor/gnss.py中的sensor_data_updated()函数下进行编辑。但是正如前面所说的,GNSS数据并没有被使用,仅作为你的项目需要定制。

2. 关于手动启动RTK定位的情况

当你在Dreamview中启动Localization模块时,Apollo会根据配置文件(通常位于apollo-r8.0.0/modules/localization/conf/localization_config.pb.txt)选择定位方式(MSF、RTK,默认MSF)并启动响应的节点,这两个节点均会输出到/apollo/localization/pose通道(定义在....../localization/conf/msf_localization.pb.txt...../localization/conf/rtk_localization.pb.txt)中,并且在...../localization/conf/rtk_localization.pb.txt的定义中,它还额外输出了localization_status_topic/apollo/localization/msf_status通道。

因此,即使carla_apollo_bridge在后续中没有使用localization_status_writer,如果你手动启动了MSF定位,其节点也会输出数据到/apollo/localization/msf_status中,我并没有注意到在carla_apollo_bridge的默认情况下/apollo/localization/msf_status中存在数据输出。

另外,我相信如果你只是启动了RTK定位,/apollo/localization/msf_status也不应该有数据输出

3. 关于/apollo/localization/pose数据重复

正如前面所说的,默认情况下,carla_apollo_bridge在/apollo/localization/pose通道中为Apollo提供了精确位置信息,其frame_id是"novatel"

当你手动启动了RTK定位,则该模块也会输出一个数据到/apollo/localization/pose通道中,导致了数据的重复,根据该模块的配置文件apollo-r8.0.0/modules/localization/conf/msf_localization.pb.txt,它的数据中的broadcast_tf_child_frame_id是"localization",正好对应了你所采集到的两个数据

因此在这种情况下,如果你想要使用Apollo提供的RTK模块,建议你手动关闭carla_apollo_bridge中的发布位置信息的节点,具体来说,你可以通过注释掉carla_bridge/actor/ego_vehicle.py中的第127行 self.write_localization(),来防止消息的重复发送