logo头像
Snippet 博客主题

挂载通信

  1. 接收来自地面站的消息

    从哪里来?
    从Mavlink这一帧里来: MAVLINK_MSG_ID_MAVLINK_2_CAN 195
    从mavlink解出控制挂载的can包:hal.can_mgr[0]->get_MMCCAN()->update_gcs2can(mavlink2can.buf,mavlink2can.valid_len,mavlink2can.can_id);
    必须先熟悉原生mavlink里面定义的一些消息,然后列出来,做成笔记,用来干嘛的都写出来。

1
2
3
4
5
6
7
8
9
10
// 更新从地面站发送过来的mavlink到can的包
void AP_MMCCAN::update_gcs2can(uint8_t* buf, uint16_t size, uint16_t can_id){
can_write_packet_t gcs2can_info;
gcs2can_info.can_id = can_id;
gcs2can_info.length = size;
gcs2can_info.send_index = 0;
memcpy(gcs2can_info.buf,buf,size);
// printf("update_gcs2can %d\n",buf[4]);
can_write_packets_queue.push_force(gcs2can_info); // 将can包加入缓冲区域
}

ringbuff这部分需要看下
然后接收到了地面站的消息。

  1. 接着该如何把消息通过can传递给挂载。

通过此部分把接收到的can消息push出去,然后让云台那边接收到数据,仅此而已。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 相机触发拍照指令,并将当前飞机的高度和经纬度下发,buf为上层附带的信息
void AP_MMCCAN::cam_trigger(uint8_t* buf,uint16_t size)
{
for(uint8_t i = 0; i < MAX_PATLOAD_NUM; i ++) {
if(payload_num[i]) {
if(need_gimbal_ctrl(payload_num[i]) || payload_num[i] == CAN_PAYLOAD_TILT_PHOTO_UP_ID) {
can_write_packet_t trigger;

// 根据当前挂载类型发送不同的挂载id;
trigger.can_id = payload_num[i] & 0x0FF;
trigger.length = size;
trigger.send_index = 0;

memcpy(trigger.buf, buf, size);
can_write_packets_queue.push_force(trigger); // 将can包加入缓冲区域
}
} else break;
}
}
// 发送云台控制指令
void AP_MMCCAN::gimbla_ctrl(uint8_t* buf, uint16_t size)
{
// 根据上行id发送下行id
for(uint8_t i = 0; i < MAX_PATLOAD_NUM; i ++) {
if(payload_num[i]) {
if(need_gimbal_ctrl(payload_num[i])){
// 以0xa和以0xb结尾的can id都需要云台控制信息
can_write_packet_t ctrl;
// 根据当前挂载类型发送不同的挂载id;
ctrl.can_id = payload_num[i] & 0x0FF;
ctrl.length = size;
ctrl.send_index = 0;

memcpy(ctrl.buf, buf, size);
can_write_packets_queue.push_force(ctrl); // 将can包加入缓冲区域
}
} else break;
}
}

然后就完事儿,控制部分就算能接收到了。

  1. 如何发送GPS信息到云台。

    无人机在触发拍照,是通过辅助通道打高低电平来实现拍照,不通过can。
    在触发拍照时候,同时把gps经纬度信息发送下去。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #if HAL_WITH_UAVCAN
    cam_pos_info_t cam_pos;
    cam_pos.head = 0xA5;
    cam_pos.length = 16;
    cam_pos.type =0x01;
    cam_pos.lat = current_loc.lat;
    cam_pos.lng = current_loc.lng;
    cam_pos.alt = current_loc.alt;
    cam_pos.cam_index = _image_index;
    cam_pos.crc = CRC8Software(&cam_pos.type,cam_pos.length);
    if( hal.can_mgr[0] != nullptr && hal.can_mgr[0]->get_MMCCAN() != nullptr)
    hal.can_mgr[0]->get_MMCCAN()->cam_trigger((uint8_t *)&cam_pos,sizeof(cam_pos));
    #endif

然后就算完事儿。

  1. 上面主要是mmccan这一套,现在来看uavcan这一套。
    4.1 首先定义mmc dsdl。
  1. 气压计