PX4自定义mavlink消息
承接前面UORB发布消息,然后现在要使用mavlink发布消息,然后通过433MHz进行无线传输。这个阶段对我来说异常艰难,我个人傻傻看了2天mavlink配置文件,一遍遍看代码,眼睛都看疼了,最后google看了一篇博客,发现竟然是没有把ID号导入到标准库里面(之前博客都没有这步操作,不知道是不是固件版本问题!)
本博客也是详细参考网络上诸多大神文章整合起来,希望对大伙们有所帮助。
1、打开我写的mavlink_generator生成器安装过程博客,按照我里面写的教程操作,安装完成。
2、在mavlink/message_definitions/v1.0目录下面新建一个名叫mytest.xml文件。
代码如下:
<?xml version="1.0"?>
<mavlink>
<version>3</version>
<messages>
<message id="223" name="READ_UART_SENSOR">
<description>Test all field types</description>
<field type="char[10]" name="jingdustr">string</field>
<field type="char[10]" name="weidustr">string</field>
<field type="char[10]" name="hangsustr">string</field>
<field type="char[10]" name="hangxiangstr">string</field>
<field type="char[10]" name="fengsustr">string</field>
<field type="char[10]" name="fengxiangstr">string</field>
<field type="char[10]" name="wendustr">string</field>
<field type="char[10]" name="shendustr">string</field>
<field type="float" name="longitude">float</field>
<field type="float" name="latitude">float</field>
<field type="float" name="hang_su">float</field>
<field type="float" name="hang_xiang">float</field>
<field type="float" name="feng_su">float</field>
<field type="float" name="feng_xiang">float</field>
<field type="float" name="wen_du">float</field>
<field type="float" name="shen_du">float</field>
</message>
</messages>
</mavlink>
对应位置如下图所示:
使用python -m mavgenerate打开mavlink消息生成器导入上面的xml文件,生成如下文件:custom_messages,然后会自动生成.h文件
,生成后的图片如下图:
将生成的custom_messages文件夹拖到Firmware/mavlink/include/mavlink/v2.0目录下,然后再将里面的mavlink_msg_read_uart_sensor.h文件移动到里面的common目录下面,如下图所示:
添加mavlink的头文件和uorb消息到mavlink_messages.cpp
PX4的mavlink.cpp中mavlinkstreamread_uart_sensor内容编写
class MavlinkStreamread_uart_sensor : public MavlinkStream
{
public:
void update(orb_advert_t *mavlink_log_pub);
const char *get_name() const
{
return MavlinkStreamread_uart_sensor::get_name_static();
}
static const char *get_name_static()
{
return "READ_UART_SENSOR";
}
static uint16_t get_id_static()
{
return MAVLINK_MSG_ID_READ_UART_SENSOR;
}
uint16_t get_id()
{
return get_id_static();
}
static MavlinkStream *new_instance(Mavlink *mavlink)
{
return new MavlinkStreamread_uart_sensor(mavlink);
}
unsigned get_size()
{
return MAVLINK_MSG_ID_READ_UART_SENSOR_LEN + MAVLINK_NUM_NON_PAYLOAD_BYTES;
}
private:
MavlinkOrbSubscription *_read_uart_sensor_sub;
uint64_t _read_uart_sensor_time;
/* do not allow top copying this class */
MavlinkStreamread_uart_sensor(MavlinkStreamread_uart_sensor &) = delete;
MavlinkStreamread_uart_sensor &operator = (const MavlinkStreamread_uart_sensor &) = delete;
protected:
explicit MavlinkStreamread_uart_sensor(Mavlink *mavlink) : MavlinkStream(mavlink),
_read_uart_sensor_sub(_mavlink->add_orb_subscription(ORB_ID(read_uart_sensor))),
_read_uart_sensor_time(0)
{}
~MavlinkStreamread_uart_sensor()
{}
bool send(const hrt_abstime t)
{
read_uart_sensor_s orbtest = {};
if( _read_uart_sensor_sub->update(&_read_uart_sensor_time,&orbtest))
{__mavlink_read_uart_sensor_t msg = {};
msg.latitude = orbtest.latitude;
msg.longitude = orbtest.longitude;
msg.hang_su = orbtest.hang_su;
msg.hang_xiang= orbtest.hang_xiang;
msg.feng_su = orbtest.feng_su;
msg.feng_xiang= orbtest.feng_xiang;
msg.wen_du = orbtest.wen_du;
msg.shen_du = orbtest.shen_du;
double a = msg.latitude;
double b = msg.longitude;
double c = msg.hang_su;
double d = msg.hang_xiang;
double e = msg.feng_su;
double f = msg.feng_xiang;
double g = msg.wen_du;
double h = msg.shen_du;
char a1[10];
char b1[10];
char c1[10];
char d1[10];
char e1[10];
char f1[10];
char g1[10];
char h1[10];
sprintf(a1,"%f",a);
sprintf(b1,"%f",b);
sprintf(c1,"%f",c);
sprintf(d1,"%f",d);
sprintf(e1,"%f",e);
sprintf(f1,"%f",f);
sprintf(g1,"%f",g);
sprintf(h1,"%f",h);
mavlink_log_info(&_pub,a1);
mavlink_log_info(&_pub,b1);
mavlink_log_info(&_pub,c1);
mavlink_log_info(&_pub,d1);
mavlink_log_info(&_pub,e1);
mavlink_log_info(&_pub,f1);
mavlink_log_info(&_pub,g1);
mavlink_log_info(&_pub,h1);
mavlink_msg_read_uart_sensor_send_struct(_mavlink->get_channel(), &msg);
return true;
}
return false;
}
};
附加流类streams_list的到mavlink_messages.cpp底部
最后在mavlink_main.cpp加入自定义的消息以及期望的更新频率,然后make_px4fmu-v2_default,就应该编译可以成功
这样你可以编译通过,但是会发生一件事情,在QGC的nsh中断中输入ls obj(不过要先写read_uart_sensor start,后面教自启动方法),始终不会出现mavlink对应的ID号。我试了很久,眼睛都看疼了,始终以为配置mavlink消息有误,最后通过google解决了这个问题。
1、先打开按照下面路径的文件的standard.h
2、再打开mytest.h
打开之后接下来按照如下配置:
1、找到如下图mytest.h文件下MAVLINK_MESSAGE_CRCS号,然后复制出来
2、进入standard.h文件,然后按下图粘贴进去,把你里面重复的那个数字删除一个
然后配置自启动:
进入如下图所示的位置,看清楚左边代码行数对应位置加上read_uart_sensor start
这样就可以成功了,然后在QGC地面站的nsh终端输入ls obj,如果出现你所定义的对应ID号的名字那就意味着成功了!
成功之后可以用串口助手去读取mavlink消息
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)