PX4自定义mavlink消息

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消息

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PX4是一款开源的自动驾驶系统,支持多种飞行器平台,包括多旋翼、固定翼、VTOL等。Mavlink是一种轻量级的通讯协议,用于在无人机和地面站之间传输数据。在PX4中,Mavlink被广泛用于飞行控制和地面站之间的通讯。 下面是一个基本的PX4 Mavlink编程示范,演示了如何在PX4上使用Mavlink发送数据。 首先,需要包含Mavlink库的头文件。在PX4中,可以使用以下命令安装Mavlink: ``` sudo apt-get install libmavlink-dev ``` 然后,在程序中包含以下头文件: ``` #include <mavlink.h> ``` 接下来,需要定义一个Mavlink消息的缓冲区。这可以通过以下代码完成: ``` #define BUFFER_LENGTH 512 uint8_t buf[BUFFER_LENGTH]; ``` 然后,需要初始化Mavlink库。这可以通过以下代码完成: ``` mavlink_message_t msg; mavlink_status_t status; mavlink_system_t mavlink_system = {1,1,MQTT_SYSTEM_TYPE,0,0}; mavlink_system.sysid = 1; mavlink_system.compid = 1; mavlink_system.type = MAV_TYPE_QUADROTOR; mavlink_system.state = MAV_STATE_ACTIVE; mavlink_system.mode = MAV_MODE_PREFLIGHT; mavlink_system.nav_mode = MAV_NAV_GROUNDED; mavlink_system.is_initialized = true; ``` 这将初始化一个具有默认参数的Mavlink系统。 然后,可以使用以下代码创建一个Mavlink消息: ``` mavlink_msg_heartbeat_pack(mavlink_system.sysid, mavlink_system.compid, &msg, mavlink_system.type, MAV_AUTOPILOT_GENERIC, mavlink_system.mode, mavlink_system.state); ``` 这将创建一个心跳消息,其中包含了系统ID、组件ID、类型、飞控类型、模式和状态。 最后,可以使用以下代码将Mavlink消息发送到PX4: ``` int len = mavlink_msg_to_send_buffer(buf, &msg); sendto(fd, buf, len, 0, (struct sockaddr *)&myaddr, sizeof(struct sockaddr_in)); ``` 这将把Mavlink消息发送到PX4。 这是一个简单的PX4 Mavlink编程示范,演示了如何在PX4上使用Mavlink发送数据。在实际应用中,可以使用Mavlink发送各种类型的消息,例如姿态、速度、位置、传感器数据等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值