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
- 当使用
cyber_montior
查看数据通道时,我注意到一些数据通道的数据很少,比如/apollo/sensor/gnss/best_pose
数据通道只有经纬度与高度:
而完整的数据还包括其它部分:
但我在Carla官网发现gnss传感器的数据只包括经纬度与高度,那么其它的数据我要怎么获得呢? - 在
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在向这个通道写入数据?
前置知识
这个项目的本意是由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()
,来防止消息的重复发送