【Apollo】【driver】【canbus】适配非canbus设备的方式

首先,要明白只有can_client才会与设备通信,在apollo中can_client提供了三种通信方式

  enum CANCardBrand {
    FAKE_CAN = 0; //假的数据通信,一般模拟使用
    ESD_CAN = 1; //esd canbus卡通信
    SOCKET_CAN_RAW = 2; //socket 通信,在gem车上使用
  }

需要新增的通信方式,以serial为例

1.在modules/drivers/canbus/proto/can_card_parameter.proto 中新增如下

  enum CANCardBrand {
    FAKE_CAN = 0; 
    ESD_CAN = 1; 
    SOCKET_CAN_RAW = 2; 
    SERIAL_CAN = 3; //新的通讯方式
  }

2.在modules/drivers/canbus/can_client/ 下新增文件夹serial,并实现如下文件。
这里写图片描述

socket_can_client_raw.h 内容
class **SerialCanClientRaw** : public CanClient {
 public:
  bool Init(const CANCardParameter &parameter) override;
  virtual ~SocketCanClientRaw();
  apollo::common::ErrorCode Start() override;
  void Stop() override;
  apollo::common::ErrorCode Send(const std::vector<CanFrame> &frames,
                                 int32_t *const frame_num) override;
  apollo::common::ErrorCode Receive(std::vector<CanFrame> *const frames,
                                    int32_t *const frame_num) override;
  std::string GetErrorString(const int32_t status) override;
 private:
  int dev_handler_ = 0;
  CANCardParameter::CANChannelId port_;
  can_frame send_frames_[MAX_CAN_SEND_FRAME_LEN];
  can_frame recv_frames_[MAX_CAN_RECV_FRAME_LEN];
};

socket_can_client_raw.ccSerialCanClientRaw类的实现,BUILD是编译脚本。可参考socket通信方案。

3.在modules/drivers/canbus/can_client/can_client_factory.cc 中添加

void CanClientFactory::RegisterCanClients() {
  AINFO << "CanClientFactory::RegisterCanClients";
  Register(CANCardParameter::FAKE_CAN,
           []() -> CanClient* { return new can::FakeCanClient(); });
#if USE_ESD_CAN
  AINFO << "register can: " << CANCardParameter::ESD_CAN;
  Register(CANCardParameter::ESD_CAN,
           []() -> CanClient* { return new can::EsdCanClient(); });
#endif
  Register(CANCardParameter::SOCKET_CAN_RAW,
           []() -> CanClient* { return new can::SocketCanClientRaw(); });
  Register(CANCardParameter::SERIAL_CAN_RAW,
           []() -> CanClient* { return new can::SerialCanClientRaw(); });
}

做完以上三步,就可以在sensors模块中使用该通信方式,以毫米波为例
modules/drivers/new_radar/conti_radar/conf/conti_radar_conf.pb.txt

  can_card_parameter {
    brand:SERIAL_CAN
    type: PCI_CARD //只在ESD CAN时生效,其余模式可去掉
    channel_id: CHANNEL_ID_ZERO //只在ESD CAN时生效,其余模式可去掉
  }

还可以参考 docs/howto/how_to_add_a_new_can_card.md 文件

猜你喜欢

转载自blog.csdn.net/sunyoop/article/details/80611035