当前位置: 首页 > news >正文

ROS stm32 CAN通信

文章目录

    • 运行环境:
    • 原理
    • 1.1 ros中的代码
      • 1)socketcan_bridge
      • 2)测试的ros-python包
      • 3)keil5中数据解析
      • 4)USB-CAN连接
      • 5)启动指令

运行环境:

ubuntu18.04.melodic
STM32:DJI Robomaster C板
ROS:18.04
硬件:USB-CAN(选支持Linux驱动的)
在这里插入图片描述

原理

1.1 ros中的代码

1)socketcan_bridge

http://wiki.ros.org/socketcan_bridge

主要利用socketcan_bridge_node节点,相当于ros和stm32桥梁作用

在这里插入图片描述

原理解释:
Subscribed Topics
sent_messages (can_msgs/Frame)
它可以监听话题为sent_messages,消息类型为can_msgs/Frame的数据原理解释:
Published Topics
received_messages (can_msgs/Frame)
将监听到的sent_messages话题,消息类型为can_msgs/Frame的数据发送到can总线上(以便stm32的can回调函数接收can数据)

2)测试的ros-python包

写一个python包。发布话题为sent_messages,消息类型为can_msgs/Frame的数据

注意标识符要和stm32的一样,这里都是设置成0x208msg.id = 0x208msg.dlc = 8  # 数据字段的大小,单位是字节msg.is_error = Falsemsg.is_rtr = Falsemsg.is_extended = False

再到stm32中的can回调函数解析这里的数据
data_to_send = [0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03]
如果要获取第一个数据,就data[0]这样,就可以得到0x01的值,也就算十进制的1, 我这里只是解析一位来控制电机转动

在这里插入图片描述
详细代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-import rospy
from can_msgs.msg import Frame
import structdef send_can_frame():# 初始化 ROS 节点rospy.init_node('can_frame_sender', anonymous=True)# 创建一个发布者,发布 can_msgs/Frame 类型的消息到目标 ROS 话题pub = rospy.Publisher('/sent_messages', Frame, queue_size=10)# 设置循环速率,这里设为 10Hz,根据需求可以调整rate = rospy.Rate(10)while not rospy.is_shutdown():# 创建一个 can_msgs/Frame 类型的消息msg = Frame()# 设置 can::Frame 对象的属性,这里以设置标识符为 0x205 为例msg.id = 0x208msg.dlc = 8  # 数据字段的大小,单位是字节msg.is_error = Falsemsg.is_rtr = Falsemsg.is_extended = False# 只解析第一位# data_to_send = [0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03]data_to_send = [0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03]# 将要发送的数据赋值给 msg.datamsg.data = data_to_send# 发布消息到 ROS 话题pub.publish(msg)# 等待指定的循环速率rate.sleep()# 打印成功发布的提醒消息rospy.loginfo("Successfully published CAN frame with ID 0x208")if __name__ == '__main__':try:send_can_frame()except rospy.ROSInterruptException:pass

在这里插入图片描述

在这里插入图片描述

3)keil5中数据解析

rx_data[0]解析得是ros发布得数据 data_to_send = [0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03],也就是得到十进制得0x01,代表数字1。

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{// 定义CAN消息的头部和数据CAN_RxHeaderTypeDef rx_header;uint8_t rx_data[8];// 检查CAN总线实例是否为CAN1if (hcan->Instance == CAN1){// 获取CAN消息的头部信息和数据HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rx_header, rx_data); // rx_data接收CAN总线上发送来的数据,不同的位代表不同的信息// 根据接收到的消息的标准帧ID执行相应的处理switch (rx_header.StdId) //如果接收的rx_header.StdId值等于0x205,则接收can发送过来的数据。可以设置ros发送的can标识符为为0x208 (ros如何发送信息到can中){case 0x205: // 如果标准帧ID为0x205{// 解析接收到的数据,并存储到相应的数据结构中motor_yaw_info.rotor_angle = ((rx_data[0] << 8) | rx_data[1]);motor_yaw_info.rotor_speed = ((rx_data[2] << 8) | rx_data[3]);motor_yaw_info.torque_current = ((rx_data[4] << 8) | rx_data[5]);motor_yaw_info.temp = rx_data[6];	break;}case 0x208: {// 处理接收到的 target_yaw_angle 数据uint8_t received_target_yaw_angle = rx_data[0];  // 假设 target_yaw_angle 在数据的第一个字节// 在这里添加处理 received_target_yaw_angle 的代码target_yaw_angle =  received_target_yaw_angle;break;}}}
}

4)USB-CAN连接

# 安装gs_usb 内核模块
sudo modprobe gs_usb
# 插入USB-CAN后执行下面步骤:查看can设备
ifconfig -a# 设置波特率100M(can设备参数)-和stm32cubemx can配置的波特率一样
sudo ip link set can0 up type can bitrate 1000000捕捉can信号
candump can0 

在这里插入图片描述
在这里插入图片描述

5)启动指令

#启动socketcan_bridge_node.cpp节点
roscoreduduzai@duduzai:~/Downloads/ros_can_ws$ source ./devel/setup.bashduduzai@duduzai:~/Downloads/ros_can_ws$ rosrun socketcan_bridge socketcan_bridge_node
#启动python包
duduzai@duduzai:~/Downloads/target_yaw_angle_ws/src/target_yaw_angle/scripts$ chmod +x target_yaw_angle_pub.pyduduzai@duduzai:~/Downloads/target_yaw_angle_ws$ source ./devel/setup.bashduduzai@duduzai:~/Downloads/target_yaw_angle_ws$ rosrun target_yaw_angle target_yaw_angle_pub.py

⭐⭐⭐ 嘟嘟崽 ⭐⭐⭐
⭐⭐⭐ 祝你成功 ⭐⭐⭐

相关文章:

ROS stm32 CAN通信

文章目录 运行环境&#xff1a;原理1.1 ros中的代码1)socketcan_bridge2)测试的ros-python包3)keil5中数据解析4)USB-CAN连接5)启动指令 运行环境&#xff1a; ubuntu18.04.melodic STM32&#xff1a;DJI Robomaster C板 ROS&#xff1a;18.04 硬件&#xff1a;USB-CAN&#x…...

简单地聊一聊Spring Boot的构架

前言 本文小编将详细解析Spring Boot框架&#xff0c;并通过代码举例说明每个层的作用。我们将深入探讨Spring Boot的整体架构&#xff0c;包括展示层、业务逻辑层和数据访问层。通过这些例子&#xff0c;读者将更加清晰地了解每个层在应用程序中的具体作用。通过代码实例&…...

【算法】复习搜索与图论

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; 蓝桥杯 &#x1f319;请不要相信胜利就像山坡上的蒲公英一样唾手…...

【KCC@南京】KCC南京数字经济-开源行

一场数字经济与开源的视听盛宴&#xff0c;即将于11月26日&#xff0c;在南京举办。本次参与活动的有&#xff1a; 庄表伟&#xff08;开源社理事执行长、天工开物开源基金会执行副秘书长&#xff09;、林旅强Richard&#xff08;开源社联合创始人、前华为开源专家&#xff09;…...

苍穹外卖-day11

苍穹外卖-day11 课程内容 Apache ECharts营业额统计用户统计订单统计销量排名Top10 功能实现&#xff1a;数据统计 数据统计效果图&#xff1a; 1. Apache ECharts 1.1 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xff0c;生…...

git_07_协同开发

1.作业回复 干的什么事&#xff1f;动了哪些东西&#xff1f; 文档作业xxx文档已编写完成&#xff0c;相关svn目录&#xff1a;xxx/xxx/xxx代码作业(Git代码提交规范)具体什么问题&#xff0c;影响范围&#xff0c;是否已经解决&#xff1a; feat(xxx):改动描述 perf(xxx):改动…...

对比国内主流开源 SQL 审核平台 Yearning vs Archery

Yearning, Archery 和 Bytebase 是目前国内最主流的三个开源 SQL 审核平台。其中 Yearning 和 Archery 是社区性质的项目&#xff0c;而 Bytebase 则是商业化产品。通常调研 Bytebase 的用户也会同时比较 Yearning 和 Archery。 下面我们就来展开对比一下 Yearning 和 Archery…...

Mistral 7B 比Llama 2更好的开源大模型 (三)

Mistral 7B 比Llama 2更好的开源大模型 Mistral 7B是一个70亿参数的语言模型,旨在获得卓越的性能和效率。Mistral 7B在所有评估的基准测试中都优于最好的开放13B模型(Llama 2),在推理、数学和代码生成方面也优于最好的发布34B模型(Llama 1)。Mistral 7B模型利用分组查询注…...

关于 Git 你了解多少?

1. 什么是Git? Git 是一个版本控制系统&#xff0c;由林纳斯托瓦兹创建。它旨在管理项目代码的更改&#xff0c;以便团队成员可以协作开发和维护代码库。Git 可以让用户跟踪代码的更改、回滚错误的更改、合并代码等。Git 还具有分支和标签的功能&#xff0c;使得团队成员可以在…...

关于Elasticsearch的自动补全、数据同步和集群,以下是相关的知识点

1. 自动补全&#xff1a;Elasticsearch可以通过自动补全功能帮助用户快速查找相关的内容。它使用了一种称为“completion suggester”的功能来实现自动补全&#xff0c;是一种基于前缀的建议查询&#xff0c;可以在用户输入时提供实时建议。 2. 数据同步&#xff1a;Elasticse…...

linux套接字-Socket

1.概念 局域网和广域网 局域网&#xff1a;局域网将一定区域内的各种计算机、外部设备和数据库连接起来形成计算机通信的私有网络。广域网&#xff1a;又称广域网、外网、公网。是连接不同地区局域网或城域网计算机通信的远程公共网络。IPInternet Protocol&#xff09;&#…...

debian 修改镜像源为阿里云【详细步骤】

文章目录 修改步骤第 1 步:安装 vim 软件第 2 步:备份源第 3 步:修改为阿里云镜像参考👉 背景:在 Docker 中安装了 jenkins 容器。查看系统,发现是 debian 11(bullseye)。 👉 目标:修改 debian bullseye 的镜像为阿里云镜像,加速软件安装。 修改步骤 第 1 步:…...

从0到0.01入门React | 004.精选 React 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...

Linux 本地zabbix结合内网穿透工具实现安全远程访问浏览器

前言 Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 本地zabbix web管理界面限制在只能局域…...

【以图会意】文件系统从外存到内存到用户空间

首先&#xff0c;在文件目录中&#xff0c;装有很多块FCB&#xff0c;由文件名和i指针两部分构成&#xff0c;指针指向文件所在的索引结点&#xff0c;包含了例如&#xff1a;文件存储权限&#xff0c;文件长度等一系列文件的信息&#xff0c;最重要的当然是物理地址&#xff0…...

一、交换配置

2.SW1、SW2、SW3启用MSTP,实现网络二层负载均衡和冗余备份,创建实例Instance10和Instance20,名称为skills,修订版本为1,其中Instance10关联Vlan60和Vlan70,Instance20关联Vlan80和Vlan90。SW1为Instance0和Instance10的根交换机,为Instance20备份根交换机;SW2为Instanc…...

验证码:EasyDL 机器学习识别与云码平台一站式识别

目录 EasyDL 机器学习识别&#xff08;实践&#xff1a;京东商城&#xff09; &#xff08;一&#xff09;批量获取验证码图片 &#xff08;二&#xff09;EasyDL机器学习&#xff08;百度智能云&#xff09; &#xff08;三&#xff09;调用EasyDLAPI接口识别验证码 云码…...

postgreSQL中的高速缓存

1. 高速缓存简介 ​如下图所示&#xff0c;当一个postgreSQL进程读取一个元组时&#xff0c;需要获取表的基本信息&#xff08;例如&#xff1a;表的oid、索引信息和统计信息等&#xff09;及元组的模式信息&#xff0c;这些信息被分别记录在多个系统表中。通常一个表的模式信…...

我把MySQL运行在Docker上,差点完了……

容器的定义&#xff1a;容器是为了解决“在切换运行环境时&#xff0c;如何保证软件能够正常运行”这一问题。 目前&#xff0c;容器和 Docker 依旧是技术领域最热门的词语&#xff0c;无状态的服务容器化已经是大势所趋&#xff0c;同时也带来了一个热点问题被大家所争论不以&…...

【华为OD题库-023】文件目录大小-java

题目 一个文件目录的数据格式为:目录id,本目录中文件大小&#xff0c;(子目录id列表)。其中目录id全局唯一&#xff0c; 取值范围[1 ,200]&#xff0c;本目录中文件大小范围[1,1000]&#xff0c;子目录id列表个数[0,10] 例如: 1 20 (2,3)表示目录1中文件总大小是20,有两个子目录…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

【向量库】Weaviate概述与架构解析

文章目录 一、什么是weaviate二、High-Level Architecture1. Core Components2. Storage Layer3. 组件交互流程 三、核心组件1. API Layer2. Schema Management3. Vector Indexing3.1. 查询原理3.2. 左侧&#xff1a;Search Process&#xff08;搜索流程&#xff09;3.3. 右侧&…...