Apollo之Canbus学习总结

根目录下的Canbus模块,其实是Chassis底盘控制模块,主要的作用是反馈车当前的状态(速度、航向、yaw_rate等信息),并且发送控制命令到车线控底盘,其底层实现基于 ’ drivers/canbus驱动模块.
此处的Canbus模块是车和自动驾驶软件之间的桥梁,通过canbus驱动(drivers/canbus)来实现车身信息发送给apollo上层软件,同时接收控制命令,发送给汽车线控底盘实现对车的控制

Canbus模块主流程

Canbus模块的目录结构如下:

|--- BUILD                       //bazel编译文件
|--- canbus_component.cc        //canbus主入口
|--- canbus_component.h
|--- canbus_test.cc            //canbus测试
|--- common                   //gflag配置
|--- conf                    //配置文件
|--- dag                    //dag依赖
|--- launch                //launch加载
|--- proto                //protobuf文件
|--- testdata            //测试数据
|--- tools              //测试canbus总线工具
|--- vehicle           //车辆控制协议

Canbus模块的主流程在文件"canbus_component.cc"中,canbus模块为定时触发,每10ms执行一次,发布chassis信息,而ControlCommand则是每次读取到之后触发回调"OnControlCommand",发送"control_command"到线控底盘.
定时触发回调函数,发布chassis信息:

bool CanbusComponent::Proc() {PublishChassis();if(FLAGS_enable_chassis_detail_pub) {PublishChassisDetail();}return true;
}

由于不同型号的车辆Canbus命令不一样,在"/vehicle"中适配不同型号车辆的canbus消息格式,所有的车都继承自Vehicle_controller基类,通过对Vehicle_controller的抽象来发送和读取canbus消息.
车辆工厂模式(VehicleFactory)
在vehicle中可以适配不同的车型,而每种车型对应一个vehicle_controller,创建每种车辆的控制器(VehicleController)和消息管理(MessageMannger)流程如下:
上述代码流程用到了设计模式的工厂模式,通过车辆工厂创造不用的车辆类型.

车辆控制器(VehicleController)

  1. Controller的init->start->stop流程

    模块初始化(Init)过程获取了发送的消息格式,通过can_sender应该发送哪些消息,之后启动(start)之后启动一个看门狗,检查canbus消息格式是否正确,最后关闭(stop)模块则结束看门狗进程.
  2. chassis信息的获取
    chassis的获取则是通过message_manager_获取chassis_detail,之后对chassis进行赋值.

CAN驱动程序(drivers/canbus)

canbus中的发送(CanSender)和接收(CanReceiver),还有消息管理(MessageManager)都是在"driver/canbus"中实现.

1. MessageManager
MessageManager主要作用是解析和保存canbus数据,而具体的接收和发送则是在"CanReceiver"和"CanSender"中,拿接收消息举例子,也就是说CanReceiver收到消息后,会调用MessageManager中的parse去解析消息,消息的解析协议在"modules/canbus/vehicle/lincoln/protocol"中,每个消息把自己对应的信息塞到"chassis_detail"中完成了消息的接收.

2. 消息接收(CanReceiver)
CanReceiver中的"Start"调用"RecvThreadFunc"实现消息的接收,这里会启动一个异步进程去完成接收.

template <typename SensorType>
::apollo::common::ErrorCode CanReceiver<SensorType>::Start() {if (is_init_ == false) {return::apollo:ErrorCode::CANBUS_ERROR;}is_running_.exchange(true);//启动异步接收消息async_result = cyber::Async(&CanReceiver<SensorType>::RecvThreadFunc, this);return ::apollo::common::ErrorCode::OK;
}

RecvThreadFunc通过"can_client"接收消息,然后通过"MessageManager"解析消息.

template <typename SensorType>
void CanReceiver<SensorType>::RecvThreadFunc() {while (isRunning()) {std::vector<CanFrame> buf;int32_t frame_num =  MAX_CAN_RECV_FRAME_LEN;//1. can_client_接收canbus数据if (can_client_->Receive(&buf, &frame_num)) !=::apollo::common::ErrorCode::OK {cyber::USleep(default_period);continue;}for (const auto &frame : buf) {uint8_t len = frame.len;uint32_t uid = frame.id;const uint8_t  *data = frame.data;}//2. MessageManager解析canbus数据pt_manager_->Parse(uid, data, len);if (enable_log_) {ADBUG << "recv_can_frame#" << frame.CanFrameString();}}cyber::Yield();
}AINFO << "can client receiver thread stopped";
}

消息发送(CanSender)
消息发送对应的是在CanSender中的"Start"调用"PowerSendThreadFunc",具体实现:

template <typename SensorType>
common::ErrorCode CanSender<SensorType>::Start() {if(is_running_) {AERROR << "Cansender has already started.";return common::ErrorCode::CANBUS_ERROR;}is_running_ = true;// 启动线程发送消息thread_.reset(new std::thread([this] { PowerSendThreadFunc(); } ));return common::ErrorCode::OK;
}

PowerSendThreadFunc再通过"can_client"发送消息:

 std::vector<CanFrame> can_frames;CanFrame can_frame = message.CanFrame();can_frames.push_back(can_frame);// 通过can_client发送消息if (can_client_ ->SendSingleFrame(can_frames) != common::ErrorCode::OK) {AERROR << "Send msg failed: "  << can_frame.CanFrameString();}

canbus客户端(CanClient)
CanClient 是canbus客户端,同时也是canbus的驱动程序,针对不同的canbus卡,对发送和接收进行封装,并且提供给消息发送和接收控制器使用.

Apollo之Canbus模块学习总结相关推荐

  1. apollo自动驾驶进阶学习之:canbus模块代码分析

    文章目录 封面 代码架构 内容结构 封面 apollo自动驾驶:canbus模块代码讲解及测试(1)引言 apollo自动驾驶:canbus模块代码讲解及测试(2)框架讲解 代码架构 但是apollo ...

  2. 万字讲解Apollo,全网Apollo资料整理和学习

    0 参考资料 0.1 Apollo各模块系列笔记记录 模块 参考文章 Cyber apollo介绍之cyber设计(五) - 知乎 (zhihu.com) apollo介绍之Cyber框架(十) - ...

  3. Apollo之Canbus处理来自Control的Cmd

    简述canbus apollo项目中canbus模块的主要作用是接收Control模块发布的指令,然后将指令解析为CAN协议报文与车辆的ECU交互,且得到指令的反馈信息,并将反馈结果发布为车辆底盘信息 ...

  4. Apollo源码剖析学习笔记2

    Apollo 源码剖析学习笔记2 Talker-ListenerNode 目录中包含了 Node 对象.Reader 对象和 Writer 对象.Node 对象主要对应 Ros 中的 Node 节点, ...

  5. python 的日志logging模块学习

    2019独角兽企业重金招聘Python工程师标准>>> python 的日志logging模块学习 分类: python 2011-08-02 23:51 8338人阅读 评论(0) ...

  6. python中configparser_python中confIgparser模块学习

    python中configparser模块学习 ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section ...

  7. python textwrap_python2.7.3编译python模块学习- textwrap 文本包装和填充

    python模块学习- textwrap 文本包装和填充 代码实例: sample_text = ''' The textwrap module can beused to format text f ...

  8. android fm模块学习,AndroidFM模块学习之5关闭FM流程

    AndroidFM模块学习之五关闭FM流程 前一阵子简单描述了一些关于FM开启.录音和搜索的流程,浅析了一下各个类的源码,接下来就是关闭FM了,FM模块的学习就告一段落了,希望这阵子的整理能对大家在F ...

  9. python中的glob 模块学习文件路径查找

    glob glob.glob(pathname), 返回所有匹配的文件路径列表.它只有一个参数pathname,定义了文件路径匹配规则,这里可以是绝对路径,也可以是相对路径. import glob ...

  10. pythontemp_python 临时文件夹 的 tempfile模块学习

    python的临时文件夹的tempfile模块学习 应用程序经常要保存一些临时的信息,这些信息不是特别重要,没有必要写在配置文件 里,但又不能没有,这时候就可以把这些信息写到临时文件里.其实很 多程序 ...

最新文章

  1. Xamarin Essentials教程振动Vibration
  2. 路由及iptables学习笔记
  3. Mysql一些维护命令
  4. python跟java 效率_Python和Java该如何选择?老男孩Python人工智能
  5. Python3中遇到UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in ordinal not in range(128)
  6. php调用window系统自带的命令,比如计算器
  7. for循环用i++和++i哪个效率高?
  8. iPhone 无线投影到 Mac
  9. 极客大学产品经理训练营 产品思维和产品意识(中) 第4课总结
  10. java请求第三方接口
  11. 下拉框html回显,html option选中 回显 取值
  12. JavaScript js 实现拖动窗口移动功能
  13. Python科研绘图——介绍
  14. 微信的服务器 上海,微信团队:上海机房服务器发生故障 个人账号安全暂不受影响...
  15. openCV ROI
  16. SpringCloud Admin监控界面解释
  17. 不用第三方之C#实现大容量报表系统(转)
  18. Sysweld笔记:利用稳态算法加速算法模拟焊接过程的残余应力
  19. ADB连接夜神模拟器的方法
  20. 贴吧二维码防删图制作美图秀秀

热门文章

  1. 《Adobe Flash CS6中文版经典教程》——第1课 Flash CS6快速入门1.1 启动Flash并打开文件...
  2. Ubuntu18.04 下载与安装(阿里云官方镜像站)
  3. Ubuntu系统镜像下载网站
  4. 【无人驾驶入门】一、概述
  5. 3G手机J2ME开发环境搭建(eclipse3开发j2me环境搭建)
  6. [python] 网络编程游戏
  7. fedora linux五笔输入法,ArchLinux 安装五笔输入法
  8. 如何解决数据流转「不可能三角」难题?
  9. 解密常见的社会工程学攻击
  10. 48V转12V电源芯片,48V转15V降压芯片电路图方案