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输出
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卡中