PX4编写CAN应用程序控制底盘运动

2023-05-16

目录

一、在PX4平台中添加自己的应用程序

1.建立应用程序

Hello_can.c文件:

Kconfig文件:

CMakeLists.txt文件:

2.编译应用程序及固件

3.测试应用(硬件)

方法一:直接用命令脚本启动NUTTX系统

方法二:在QGC端连接PX4,打开MAVLLINK终端,即可实现。

二、CAN相关协议理解

三、PX4中CAN配置


一、在PX4平台中添加自己的应用程序

附上添加自定义程序的PX4官方教程!

1.建立应用程序

        在PX4源码的  [src/module]  文件夹下建立自己的文件(添加的应用名称为hello_can),对应添加编译文件:(1)最重要的 .c编程文件,(2)CMakeList.txt文件,(3)Kconfig文件。注:在PX4 1.13.0版本固件中包含了一个模板文件放在[src/templates/module]下,可以利用该模板进行自定义应用的编程。

编译所需的三个文件

Hello_can.c文件:


#include <sys/types.h>
#include <sys/ioctl.h>

#include <px4_platform_common/px4_config.h>
#include <px4_platform_common/tasks.h>
#include <px4_platform_common/posix.h>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <debug.h>

#include <nuttx/can/can.h>
#include <nuttx/config.h>

__EXPORT int hello_can_main(int argc, char *argv[]);

int hello_can_main(int argc, char *argv[])
{
	PX4_INFO("Hello Can!");    
	PX4_INFO("exiting!\n");
	return 0;
}

Kconfig文件:

menuconfig MODULES_HELLO_CAN
	bool "hello_can"
	default n
	---help---
		Enable support for hello_can

CMakeLists.txt文件:

px4_add_module(
	MODULE modules__hello_can
	MAIN hello_can
	SRCS
		hello_can.c
	DEPENDS
	)

注:确保三个文件中的程序名称对应无误。

2.编译应用程序及固件

        为了保证程序的正常运行,需要确保自己添加的应用程序会在PX4固件中进行编译,应修改对应的PX4配置文件,此处我们修改的是boards/px4/fmu-v3/default.px4board,并在其末尾/对应模块后新加入一行:

CONFIG_MODULES_HELLO_CAN=y

其中,HELLO_CAN为自定义的文件名称,可以根据自己的文件自行修改。

3.测试应用(硬件)

执行编译指令,将程序烧录到飞控板,即可在QGC控制端进行测试:

make px4_fmu-v3_default

```

make px4_fmu-v3_default upload

编译成功之后,可以在命令端直接启动NUTTX系统的命令脚本,可以连接QGC地面控制端:

方法一:直接用命令脚本启动NUTTX系统

./Tools/mavlink_shell.py

 输入help,系统会给出当前可运行的应用程序,在列表中找到自己定义的应用名称(hello_can)

找到之后,输入名称运行即可实现自定义效果;

方法二:在QGC端连接PX4,打开MAVLLINK终端,即可实现。

点击Analyze Tools

二、CAN相关协议理解

原文链接->>

CAN 数据线为两根:CAN_High和CAN_Low,使用差分信号进行传输数据。

相关系统结构及链路模型

数据传输:

CAN总线节点上的节点发送数据是以报文的形式广播给网络中所有节点。收发器接收到数据就把数据传送给控制器,再由控制器检查判断是不是所需数据。不是则忽略。

  • 网络上任何一个节点在任何时候都可以发送数据
  • 多个节点发送数据,优先级低主动退出发送
  • 短帧结构,每帧数据信息为0~8字节(具体用户定义),对数据编码而不是地址编码
  • CAN每帧都有CRC校验和其他检验措施,严重错误的情况下具有自动关闭输出的功能

CAN总线数据分5种类型:数据帧、远程帧、错误帧、过载帧和帧间隔

1.  数据帧:结构上由7个段组成,其中根据仲裁段ID码长度的不同,分为标准帧(CAN2.0A)和扩展帧(CAN2.0B)

起始帧结束帧用于界定一个数据帧;

起始帧由单个显性位组成;(总线空闲时,发送节点发送起始帧,其他节点开始同步接收)

结束帧由连续的7个隐性位组成;

仲裁段用于解决总线竞争问题(多个节点同时发送数据冲突)

显性、隐性 电平

控制段

 数据段:(实际的数据字节,保证了实时性)

 CRC段:(校验)

  ACK段:(应答)

远程帧

CAN整个链路层处理数据的顺序为:

根据CAN_main.c文件改写自己的CAN程序:

#include <sys/types.h>
#include <sys/ioctl.h>

#include <px4_platform_common/px4_config.h>
#include <px4_platform_common/tasks.h>
#include <px4_platform_common/posix.h>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <debug.h>

#include <nuttx/can/can.h>
#include <nuttx/config.h>    

#  define MAX_ID CAN_MAX_STDMSGID
#  define CAN_OFLAGS O_RDWR

//从源文件中找到can的初始化函数
int can_devinit(void)
{
	static bool initialized = false;
	struct can_dev_s *can;
	int ret;
	/* Check if we have already initialized */

	if (!initialized) {
		/* Call stm32_caninitialize() to get an instance of the CAN interface */

		can = stm32_caninitialize(1);//'CAN_PORT

		if (can == NULL) {
			canerr("ERROR:  Failed to get CAN interface\n");
			return -ENODEV;
		}

		/* Register the CAN driver at "/dev/can0" */

		ret = can_register("/dev/can0", can);

		if (ret < 0) {
			canerr("ERROR: can_register failed: %d\n", ret);
			return ret;
		}

		/* Now we are initialized */

		initialized = true;
	}

	return 0;
}    

__EXPORT int hello_can_main(int argc, char *argv[]);

int hello_can_main(int argc, char *argv[])
{
	struct can_msg_s txmsg;  //CAN结构体定义
	int i;
	int fd;
	int msgdlc;

	size_t  msgsize;
	uint16_t msgid;
	PX4_INFO("Hello Can!");

	can_devinit();
	fd = open(CONFIG_EXAMPLES_CAN_DEVPATH, CAN_OFLAGS);
	msgdlc  =4;
	msgid   = 1;

	txmsg.cm_hdr.ch_id     = msgid;
    txmsg.cm_hdr.ch_rtr    = false;
    txmsg.cm_hdr.ch_dlc    = msgdlc;
	txmsg.cm_hdr.ch_unused = 0;

    for (i = 0; i < msgdlc; i++) {
          txmsg.cm_data[i] = (i+1);
        }
    for(int cnt=0; cnt<40; cnt++){
		/* Send the TX message */
		msgsize = CAN_MSGLEN(msgdlc);
		write(fd, &txmsg, msgsize);//nbytes  CAN 数据发送
	}
    printf("  ID: %4" PRIu16 " DLC: %d\n", msgid, msgdlc);
	
    PX4_INFO("exiting!\n");

	close(fd);     //关闭接口设备
    fflush(stdout);//清空输出缓存区
	return 0;
}

三、PX4中CAN配置

使用PX4固件中的配置框架进行CAN的相关设置

make px4_fmu-v3_default menuconfig 

config命令错误的相关链接——>menuconfig错误处理

配置界面如下:(配置视频)

分别选择打开以下几项配置选项->原文链接

  1. Device Drivers ---> CAN Driver Support
  2. Application Configuration ---> CAN Utilities ---> CAN utility library #
  3. optional
  4. Application Configuration ---> Examples ---> CAN example
  5. System Type ---> STM32 Peripheral Support ---> CAN1
  6. 保存退出

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4编写CAN应用程序控制底盘运动 的相关文章

  • 编译ros工程时catkin_make 报错:This file requires compiler and library support for the ISO C++ 2011 standard

    This file requires compiler and library support for the ISO C 43 43 2011 standard This support must be enabled with the
  • ESP8266解析S-BUS协议

    Talk is cheap show you code 编译平台 xff1a Arduino IDE span class token comment 功能 xff1a 软件串口读取S BUS数据 xff1b 解析 xff1b 串口打印 s
  • CAN的ACK深入理解

    CAN信息发送成功后 xff0c 会有个应答间隙的 xff0c 在这个间隙内 xff0c 接收节点可以准备要回复的信息 xff0c 也就是把应答场填充为显性0 xff0c 在发送时其为隐性1 应答过程可能如下 xff1a 当信息传输到ACK
  • 二、Docker镜像使用和命令

    文章目录 Docker镜像使用和命令列出本机镜像查找镜像拉取镜像删除镜像删除所有镜像镜像的原理 Docker镜像使用和命令 镜像就是一个轻量级的 xff0c 可执行的独立软件包 xff0c 用来打包软件运行环境和基于运行环境开发的软件 xf
  • 阿里云ECS centos8连接可视化界面

    阿里云ECS centos8连接可视化界面 文章目录 阿里云ECS centos8连接可视化界面安装图形化界面安装VNC Server客户端设置界面为中文 安装图形化界面 使用以下命令安装图形桌面的软件包 yum groupinstall
  • DJI-OSDK开发

    DJI OSDK开发 一 简介 Onboard SDK xff0c 顾名思义就是跑在板子上的一套SDK接口 xff0c 通过串口与飞控进行通信 xff0c 通过调用这些接口 xff0c developer就可以实现对DJI A3 N3 M1
  • Linux 虚拟机centos /dev/mapper/cl-root 100% 解决方法

    1 在虚拟机中添加硬盘 一 添加新的磁盘 1 选择 虚拟机设置 并打开 xff0c 将光标定位在 硬盘 SCSI 选项上 xff0c 然后点击下方的 添加 按钮 2 点击下一步 3 选择SCSI 点击下一步 4 选择创建新虚拟机磁盘 xff
  • 解决ROS系统 rosdep update超时问题,省时又好用的方法,根本不需要修改什么文件这么麻烦

    直接使用小鱼提供的rosdepc 1 安装rosdepc wget http fishros com install O fishros amp amp bash fishros 2 输入数字3安装rosdepc 3 然后执行rosdepc
  • ubuntu安装kalibr,并进行相机和IMU(惯性测量单元)的内外参联合标定

    1 IMU内参的标定 参考我的另一篇博客 xff1a 4条消息 ubuntu安装imu utils xff0c 并进行IMU xff08 惯性测量单元 xff09 内参标定 xffe3 莫等闲 的博客 CSDN博客 https blog c
  • 华清远见电子词典

    1 服务器 include lt stdio h gt include lt sys types h gt include lt sys socket h gt include lt pthread h gt include lt sqli
  • 基于STM32F407的WIFI通信(使用的是ESP8266模块)

    基于STM32F407的WIFI通信 xff08 使用的是ESP8266模块 xff09 本次做的是WIFI通信所实现的功能是 xff1a 由单片机端向客户端发送数据 模式 xff1a STA模式 xff08 及连接路由器的方式 xff09
  • 腾讯云轻量级服务器Ubuntu系统搭建可视化界面

    前言 xff1a 以云服务器的方式搭建Linux workstation对比在电脑本地安装虚拟机的优势在于 xff0c 不需要占用本地电脑资源空间 xff0c 网络环境等相对稳定 xff0c 可以用手机等轻量移动设备连接管理等 本文主要介绍
  • gitee多人合作,上传push到别人的远程仓库

    首先要确保在别人的远程仓库中 第二步 xff1a 新建一个文件夹 xff0c 在里面点击右键 xff0c 选择 Git Bash Here进入操作界面 第三步 xff1a 先git init创建一个git文件 第四步 xff1a git r
  • 汽车CAN总线详解

    概述 CAN xff08 Controller Area Network xff09 总线协议是由 BOSCH 发明的一种基于消息广播模式的串行通信总线 xff0c 它起初用于实现汽车内ECU之间可靠的通信 xff0c 后因其简单实用可靠等
  • docker快速清理已停止的容器

    修剪所有不在运行的容器 xff0c 强制删除使用 f 或者 force docker container prune 使用 filter限制范围 xff0c 例如删除24小时前创建的已停止的容器 docker container prune
  • FreeRTOS学习笔记8(中断管理)

    1 中断管理的介绍 这里的中断管理主要是一些前面使用到的队列 信号量 互斥量等的在中断中使用的函数的封装 xff0c 为什么要从新封装这些函数 xff0c 这些函数有哪些优缺点 xff0c 这些函数是如何使用的 xff1f 这些问题后面会一
  • UCOSIII从官网(2021)下载

    官网地址 xff1a https www silabs com developers micrium 注意 xff1a 在进入下载前 可能 要注册一个账号 xff0c 如果可以直接下载的话不用注册也可以 xff0c 如果有小伙伴需要注册账号
  • dataX连接oracle报实例名错误

    oracleCDB数据库 xff1a 实例名CS 34 jdbcUrl 34 34 jdbc oracle thin 64 10 10 10 242 1521 xff1a CS 34 oraclePDB数据库 xff1a 实例名CS 34
  • 华清-周总结(2)(数据结构)

    数据结构类型 数据结构 xff1a 线性结构 xff0c 树形结构 xff0c 图形结构 线性结构 xff1a 在存储关系上 xff0c 每个元素最多有一个前驱 xff0c 一个后继 树形结构 xff1a 在存储关系上 xff0c 每个元素
  • 树莓派+新型混合无人机

    树莓派 43 新型混合无人机 产品设计缘由产品设计工作过程 xff1a 功能及成本预算 总结与鸣谢 产品设计缘由 我去设计这个树莓派 43 的一个产品 xff0c 是因为10月7日学校的创客训练营的招新选拔 xff0c 而选拔的题目是 xf

随机推荐

  • 树莓派frp内网穿透

    树莓派 43 frp内网穿透 一 frp二 frp作用三 安装与配置1 服务器端2 客户端 xff08 树莓派 xff09 一 frp frp 是一个高性能的反向代理应用 xff0c 支持 tcp udp http https 协议 二 f
  • FreeRTOS任务创建

    任务创建 操作 一 硬件初始化 span class token keyword static span span class token keyword void span span class token function Hardwa
  • vue2的点击事件简单搜索案例

    前端小白新人一枚 有不对请指正哦 写这篇文章的原因 xff1a 1 我使用了 computed 和 watch分别实现对列表的过滤筛选 xff0c 发现这两个方法均是用户输入自动过滤 xff0c 于是我想使用 点击事件过滤 xff0c 以下
  • QML嵌入视频遇到的一些问题汇总

    首先放上demo import QtQuick 2 6 import QtQuick Window 2 2 import QtMultimedia 5 8 Window visible true width 640 height 480 t
  • Downie 4 4.6.16 MAC上最新最好用的一款视频下载工具

    Downie for Mac 简介 Downie是Mac下一个简单的下载管理器 xff0c 可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们 Downie 4 下载 Downie 4 for Ma
  • AIGPT中文版(无需魔法,直接使用)不愧是生活工作的好帮手。

    AIGPT AIGPT是一款非常强大的人工智能技术的语言处理工具软件 xff0c 它具有 AI绘画 功能 AI写作 写论文 写代码 哲学探讨 创作等功能 xff0c 可以说是生活和工作中的好帮手 我们都知道使用ChatGPT是需要账号以及使
  • Tomcat10版本避坑

    Tomcat版本选择 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器 xff0c 属于轻量级应用服务器 xff0c 在中小型系统和 并发访问用户不是很多的场合下被普遍使用 xff0c 是开发和调试JSP 程序的首选 并且To
  • 阿里云ECS服务器ubuntu18图形界面安装

    文章目录 前言一 配置阿里镜像源二 安装图形界面三 VNC远程连接总结 前言 文章中的图形界面基于阿里云ECS服务器远程连接中的VNC连接 xff0c 使用时会体验到明显的延迟 xff0c 介意可以使用Xshell 43 Xmanger 4
  • 实验二 HDFS实验操作

    一 实验目的 理解HDFS在Hadoop体系结构中的角色熟练使用HDFS操作常用的Shell命令熟悉HDFS操作常用的Java API 二 实验平台 操作系统 xff1a ubuntu18Hadoop版本 xff1a 3 2 2JDK版本
  • Java程序部署到Linux环境上运行

    文章目录 前言一 Java环境安装二 Eclipse编译java程序并导出jar包三 Linux环境上运行jar包 前言 想要在Linux上运行java程序 xff0c 可以将java程序编译成功后导出成jar包 xff0c 然后在Linu
  • python疫情大数据可视化

    一 实验目的 通过本次实验掌握数据获取 数据清洗与存储和数据可视化工具的基本使用方法 二 实验平台 操作系统 xff1a window10 python版本 xff1a 3 8 IDE xff1a pycharm 可视化工具 xff1a e
  • MybatisPlus-乐观锁&悲观锁

    乐观锁 xff1a 每次不加锁而是假设没有冲突而去完成某项操作 xff0c 如果失败就重试 xff0c 直到成功为止 悲观锁 xff1a synchronized是独占锁即悲观锁 xff0c 会导致其他所有需要锁的线程挂起 xff0c 等待
  • ConcurrentHashMap -1.8 源码解析

    ConcurrentHashMap 1 8 源码解析 加锁机制 在JDK1 7之前 xff0c ConcurrentHashMap是通过分段锁机制来实现的 xff0c 所以其最大并发度受Segment的个数限制 因此 xff0c 在JDK1
  • Redis五种基本数据类型

    五种基本数据类型 redis无论什么数据类型 xff0c 在数据库中都是以key value形式保存 xff0c 并且所有的key 键 都是字符串 xff0c 所以讨论基础数据结构都是讨论的value值的数据类型 主要包括常见的5种数据类型
  • 直线的斜率

    斜率 xff0c 亦称 34 角系数 34 xff0c 表示一条直线相对于横轴的倾斜程度 一条直线与某平面直角坐标系横轴正半轴方向的夹角的正切值即该直线相对于该坐标系的斜率 如果直线与x轴垂直 xff0c 直角的正切值无穷大 xff0c 故
  • ElasticSearch--整合SpringBoot

    引入依赖 span class token tag span class token tag span class token punctuation lt span dependency span span class token pun
  • ElasticSearch--聚合查询

    聚合查询 简介 聚合 xff1a 英文为Aggregation xff0c 是es除搜索功能外提供的针对es数据做统计分析的功能 聚合有助于根据搜索查询提供聚合数据 聚合查询是数据库中重要的功能特性 xff0c ES作为搜索引擎兼数据库 x
  • CopyOnWriteArrayList简介

    1 简介 CopyOnWriteArrayList 是 ArrayList 的线程安全版本 就是在进行写操作的时候会 copy 原数组 xff0c 然后写完将指针指向新的数组 xff0c 是一种读写分离的思想 xff0c 可以并发的读 xf
  • PX4平台(V3)+T8S遥控器校准

    1 PX4与接收机的连接 首先 xff0c 将遥控器接收机的信号线与PX4的RC IN信号相连 xff08 注意正负极 xff09 xff0c 在主控上电之后 xff0c 观察接收机信号指示灯的颜色 xff1a 1 PWM 信号工作模式 接
  • PX4编写CAN应用程序控制底盘运动

    目录 一 在PX4平台中添加自己的应用程序 1 建立应用程序 Hello can c文件 xff1a Kconfig文件 xff1a CMakeLists txt文件 xff1a 2 编译应用程序及固件 3 测试应用 xff08 硬件 xf