canbus数据处理代码分析

canbus数据处理代码分析

下面以刹车控制为例进行分析

在**_controller.cc中,

brake_command_102_ = dynamic_cast<Brakecommand102*>(
      message_manager_->GetMutableProtocolDataById(Brakecommand102::ID));
  if (brake_command_102_ == nullptr) {
    AERROR << "Brakecommand102 does not exist in the LsMessageManager!";
    return ErrorCode::CANBUS_ERROR;

刹车brake_command_102_的数据通过message_manager_获得,进入message_manager_可以看到在message_manager.h文件里有如下代码:

class MessageManager {
 public:
  
  MessageManager() {}
 
  virtual ~MessageManager() = default;

  virtual void Parse(const uint32_t message_id, const uint8_t *data,
                     int32_t length);

在头文件中定义了消息处理 MessageManager()和解析的函数Parse()接口。具体的实现则在对应的.cc文件中实现。

以发送刹车指令为例来分析,Byte是apollo内部定义用来专门处理类似can报文这类传感器的字节数据的。具体的位操作需要结合can报文来处理

void Brake60::set_pedal_p(uint8_t *data, double pedal) {
  // change from [0-100] to [0.00-1.00]
  // and a rough mapping
  pedal /= 100.;
  pedal = ProtocolData::BoundedValue(0.0, 1.0, pedal);
  int32_t x = static_cast<int32_t>(pedal / 1.52590218966964e-05);
  std::uint8_t t = 0;

  t = static_cast<uint8_t>(x & 0xFF);
  Byte frame_low(data + 0);
  frame_low.set_value(t, 0, 8);

  x >>= 8;
  t = static_cast<uint8_t>(x & 0xFF);
  Byte frame_high(data + 1);
  frame_high.set_value(t, 0, 8);
}

你可能感兴趣的:(百度APollo)