第二章 第七节mavlink_log实现原理 闫刚

1.  通过mavlink输出log信息

mavlink_log_info(mavlink_fd, "[The-One] Update Param : %s", "COM_SENSOR_CHNEL");

2.  long信息输出

现在就可以看到了,mavlink的log信息会输出给mavlink通道mavlink_vasprintf(_fd)和控制台通过 fprintf(stderr, "telem> ")输出到标准错误中

#define mavlink_and_console_log_info(_fd, _text, ...)            do { mavlink_vasprintf(_fd, MAVLINK_IOC_SEND_TEXT_INFO, _text, ##__VA_ARGS__); \
        fprintf(stderr, "telem> "); \
        fprintf(stderr, _text, ##__VA_ARGS__); \
        fprintf(stderr, "\n"); } while(0)

比如你输入命令:

//commander.cpp 添加代码片段

if (!strcmp(argv[1], "testmavlinklog"))
	{
		mavlink_log_info(mavlink_fd, "[cmd] test mavlink log");
	
		mavlink_and_console_log_info(mavlink_fd, "[cmd] test mavlink log");
		return 0;
	}

>nsh输出

扫描二维码关注公众号,回复: 2764607 查看本文章

3. mavlink的输出原理

由于mavlink封装的比较多,可能就复杂点了,我们跟踪一下代码

mavlink_vasprintf(_fd, MAVLINK_IOC_SEND_TEXT_INFO, _text, ##__VA_ARGS__)

   ->px4_ioctl(_fd, severity, (unsigned long)&text[0]);

       -> Mavlink::ioctl(device::file_t *filp, int cmd, unsigned long arg)
    switch (cmd) {
    case (int)MAVLINK_IOC_SEND_TEXT_INFO:
    case (int)MAVLINK_IOC_SEND_TEXT_CRITICAL:
    case (int)MAVLINK_IOC_SEND_TEXT_EMERGENCY: {

        ->     mavlink_logbuffer_write(&inst->_logbuffer, &msg);  //遍历所有mavlink通道Mavlink *inst;

        ->inst->_total_counter++;

  到这里mavlink的消息都写到了这里缓冲区中,其实还没有真正的发送出去, 既然这个buf机制,肯定是队列的write和read,

我们跟踪一下mavlink_logbuffer_read函数

//mavlink_message.cpp

class MavlinkStreamStatustext : public MavlinkStream

   ->void send(const hrt_abstime t)
    int lb_ret = mavlink_logbuffer_read(_mavlink->get_logbuffer(), &logmsg);

    //发送mavlink消息

   _mavlink->send_message(MAVLINK_MSG_ID_STATUSTEXT, &msg);

   //写mavlink消息到sd卡中

   if (_mavlink->get_instance_id() == 0) {
                            (void)fputs("\n", fp);
                            (void)fsync(fileno(fp));
                        }

大家都知道mavlink的每一个发送消息都有1个时间间隔,对于mavlink的log输出完全是靠MavlinkStreamStatustext 这个流进行控制的,到这里,我们就掌握了mavlink log实现原理。

优点: px4的mavlink

1. log消息支持输出到mavlink通道和标准错误

2. log消息是通过ioctl机制进入mavlink

3. log消息支持队列缓冲

4. log消息可以控制输出频率

5. log消息可以写入sd卡中

猜你喜欢

转载自blog.csdn.net/yangang185/article/details/81290474