Apollo学习笔记(1) 百度 Apollo Cyber RT简介、基本概念以及与 ROS 对照

本文转载其他大神的博客,再此声明,转载仅仅为了自己学习方便,无其他用途。

一、背景

ROS 应用于自动驾驶领域的不足:

  • 调度的不确定性:各节点以独立进程运行,节点运行顺序无法确定,因而业务逻辑的调度顺序无法保证;
  • 运行效率:ROS 为分布式系统,存在通信开销

二、Cyber RT 框架

在这里插入图片描述

从下到上依次为:

  • 基础库:高性能,无锁队列;
  • 通信层:Publish/Subscribe机制,Service/Client机制,服务自发现,自适应的通信机制(共享内存、Socket、进程内);
  • 数据层:数据缓存与融合。多路传感器之间数据需要融合,而且算法可能需要缓存一定的数据。比如典型的仿真应用,不同算法模块之间需要有一个数据桥梁,数据层起到了这个模块间通信的桥梁的作用;
  • 计算层:计算模型,任务以及任务调度;

三、运行流程

在这里插入图片描述

算法模块通过有向无环图(DAG),配置任务间的逻辑关系。对于每个算法可以进行优先级、运行时间、使用资源等方面的配置。
系统启动时,结合DAG、调度配置等,创建相应的任务,从框架内部来讲,就是协程(coroutine)
调度器把任务放到各个 Processor 的队列中。
然后,由 Sensor 输入的数据,驱动整个系统运转。

四、基本概念以及与 ROS 对照

CyberROS注释
Component组件之间通过 Cyber channel 通信。
ChannelTopicchannel 用于管理数据通信,用户可以通过 publish/subscribe 相同的 channel 来通信。
NodeNode每一个模块包含 Node 并通过 Node 来通信。一个模块通过定义 read/write 和/或 service/client 使用不同的通信模式。
Reader/WriterPublish/Subscribe订阅者模式。往 channel 读写消息的类。 通常作为 Node 主要的消息传输接口。
Service/ClientService/Client请求/响应模式,支持节点间双向通信。
MessageMessageCyber RT 中用于模块间通信的数据单元。其实现基于 protobuf
ParameterParameterParameter 服务提供全局参数访问接口。该服务基于 service/client 模式。
Record fileBag file用于记录从 channel 发送或接收的消息。 回放 record file 可以重现之前的操作行为。
Launch fileLaunch file提供一种启动模块的便利途径。通过在 launch file 中定义一个或多个 dag 文件,可以同时启动多个 modules。
Task异步计算任务
CRoutine协程,优化线程使用与系统资源分配
Scheduler任务调度器,用户空间。
Dag file定义模块拓扑结构的配置文件。

五、特色

  • 高性能:无锁对象,协程(coroutine),自适应通信机制;
  • 确定性:可配置的任务以及任务调度,通过协程将调度从内核空间转移到用户空间;
  • 模块化:在框架内实现组件以及节点,即可完成系统任务;
  • 便利性:创建和使用任务

六、示例

Writer/Reader

Message:

syntax = "proto2";
package apollo.cyber.examples.proto;
message Chatter 
{
    optional uint64 timestamp = 1;
    optional uint64 lidar_timestamp = 2;
    optional uint64 seq = 3;
    optional bytes content = 4;
};

Writer:

#include "cyber/cyber.h"
#include "cyber/examples/proto/examples.pb.h"
#include "cyber/time/rate.h"
#include "cyber/time/time.h"

using apollo::cyber::Rate;
using apollo::cyber::Time;
using apollo::cyber::examples::proto::Chatter;

int main(int argc, char *argv[]) 
{
    // init cyber framework
    apollo::cyber::Init(argv[0]);
    // create talker node
    auto talker_node = apollo::cyber::CreateNode("talker");
    // create talker
    auto talker = talker_node->CreateWriter<Chatter>("channel/chatter");
    Rate rate(1.0);
    while (apollo::cyber::OK()) 
    {
        static uint64_t seq = 0;
        auto msg = std::make_shared<Chatter>();
        msg->set_timestamp(Time::Now().ToNanosecond());
        msg->set_lidar_timestamp(Time::Now().ToNanosecond());
        msg->set_seq(seq++);
        msg->set_content("Hello, apollo!");
        talker->Write(msg);
        AINFO << "talker sent a message!";
        rate.Sleep();
    }
  return 0;
}

Reader:

#include "cyber/cyber.h"
#include "cyber/examples/proto/examples.pb.h"

void MessageCallback(const std::shared_ptr<apollo::cyber::examples::proto::Chatter>& msg) 
{
    AINFO << "Received message seq-> " << msg->seq();
    AINFO << "msgcontent->" << msg->content();
}

int main(int argc, char* argv[]) 
{
    // init cyber framework
    apollo::cyber::Init(argv[0]);
    // create listener node
    auto listener_node = apollo::cyber::CreateNode("listener");
    // create listener
    auto listener = listener_node->CreateReader<apollo::cyber::examples::proto::Chatter>("channel/chatter", MessageCallback);
    apollo::cyber::WaitForShutdown();
    
    return 0;
}

Service/Client

Message:

syntax = "proto2";

package apollo.cyber.examples.proto;

message Driver 
{
    optional string content = 1;
    optional uint64 msg_id = 2;
    optional uint64 timestamp = 3;
};

Service/client:

#include "cyber/cyber.h"
#include "cyber/examples/proto/examples.pb.h"

using apollo::cyber::examples::proto::Driver;

int main(int argc, char* argv[]) 
{
 	apollo::cyber::Init(argv[0]);
 	std::shared_ptr<apollo::cyber::Node> node(apollo::cyber::CreateNode("start_node"));
	 auto server = node->CreateService<Driver, Driver>("test_server", [](const std::shared_ptr<Driver>& request,
	                       std::shared_ptr<Driver>& response) {
								AINFO << "server: i am driver server";
								static uint64_t id = 0;
								++id;
								response->set_msg_id(id);
								response->set_timestamp(0);
							});
	auto client = node->CreateClient<Driver, Driver>("test_server");
	auto driver_msg = std::make_shared<Driver>();
	driver_msg->set_msg_id(0);
	driver_msg->set_timestamp(0);
  
	while (apollo::cyber::OK()) 
	{
		auto res = client->SendRequest(driver_msg);
		if (res != nullptr) 
		{
			AINFO << "client: responese: " << res->ShortDebugString();
		} 
		else 
		{
			AINFO << "client: service may not ready.";
		}
		sleep(1);
	}

	apollo::cyber::WaitForShutdown();
	return 0;
}

七、Apollo 整体框架

在这里插入图片描述

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ADCTrajectory是在百度Apollo 7.0中提供的一种数据类型,它代表自动驾驶控制系统计划的车辆轨迹。该数据包含了车辆在横向和纵向方向的速度、加速度和位置信息,以及车辆的方向盘转角等信息。这些信息可以用来帮助自动驾驶控制系统控制车辆的运动,并确保车辆在道路上的安全行驶。 ### 回答2: 百度Apollo 7.0中的ADCTrajectory数据是指自动驾驶车辆的行驶轨迹数据。ADCTrajectory是Apollo自动驾驶系统中的一个重要模块,用来存储车辆在不同时间点上的位置、速度、加速度等信息。 ADCTrajectory数据的获取主要依赖于车辆上搭载的各种传感器,包括摄像头、激光雷达、毫米波雷达等。这些传感器将实时获取的环境信息转化为数字信号传输给自动驾驶系统,从而帮助车辆感知并理解周围的道路、车辆、交通标志等。 ADCTrajectory数据记录了车辆的实时位置和速度信息,能够反映车辆的运动轨迹。通过分析和处理这些数据,自动驾驶系统可以进行路径规划和决策,从而实现车辆的自主驾驶。 在Apollo 7.0中,百度进一步完善了ADCTrajectory数据的采集和处理能力。通过引入高精度地图、人工智能算法和深度学习技术,Apollo能够更准确地判断车辆的位置和速度,提高行驶的安全性和稳定性。 ADCTrajectory数据的应用场景非常广泛。它可以用于车辆导航系统中的路径规划和导航引导,也可以用于交通管理和智能交通系统中的车辆跟踪和监控。此外,ADCTrajectory数据还可用于车辆行为分析和驾驶习惯评估,对于提高驾驶员的安全意识和驾驶技能也具有积极的促进作用。 总之,百度Apollo 7.0中的ADCTrajectory数据是指自动驾驶车辆的行驶轨迹数据,在实现自主驾驶、改善交通安全和提升交通效率等方面具有重要的应用价值。 ### 回答3: 百度Apollo7.0中的ADCTrajectory数据是指自动驾驶系统中相关的行驶轨迹数据。在自动驾驶过程中,自动驾驶控制单元(ADCU)根据感知系统得到的环境感知数据,结合车辆动力学模型和规划算法,生成一条或多条适用于当前行驶场景的行驶轨迹。 ADCTrajectory数据通常包含一系列的时间-空间点,其中时间表示轨迹点的采集时间,空间点则包含轨迹点的位置、速度和加速度等信息。通过记录这些关键信息,ADCTrajectory数据能够准确反映自动驾驶车辆在行驶过程中的状态和动态变化。 ADCTrajectory数据的应用十分广泛。首先,它可以用于自动驾驶算法的开发和优化。通过对大量真实道路场景下的ADCTrajectory数据进行分析,研发人员可以有效改进自动驾驶系统的规划和控制策略,提高系统的驾驶性能和安全性。 其次,ADCTrajectory数据还可以用于自动驾驶系统的评估和验证。通过与人工生成的理想轨迹进行比对,可以评估自动驾驶系统在不同场景下的驾驶能力和稳定性,为系统的进一步优化提供参考。 此外,ADCTrajectory数据还能够支持车辆行为分析和预测、交通流量分析等应用。通过对大量的行驶轨迹数据进行处理和挖掘,可以为交通管理部门提供更准确的交通信息,用于交通流量控制和道路规划。 总而言之,百度Apollo7.0中的ADCTrajectory数据是自动驾驶系统中重要的数据源,它为自动驾驶算法的开发、系统的评估和优化以及交通管理等方面提供了有力的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值