ROS stm32 CAN通信

文章目录

运行环境:

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桥梁作用

bash 复制代码
原理解释:
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的数据

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

再到stm32中的can回调函数解析这里的数据

data_to_send = [0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x03]

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

详细代码:

cpp 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
from can_msgs.msg import Frame
import struct

def 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 = 0x208
        msg.dlc = 8  # 数据字段的大小,单位是字节
        msg.is_error = False
        msg.is_rtr = False
        msg.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.data
        msg.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)USB-CAN连接

bash 复制代码
# 安装gs_usb 内核模块
sudo modprobe gs_usb
bash 复制代码
# 插入USB-CAN后执行下面步骤:
 查看can设备
ifconfig -a

# 设置波特率100M(can设备参数)-和stm32cubemx can配置的波特率一样
sudo ip link set can0 up type can bitrate 1000000

捕捉can信号
candump can0 


4)启动指令

bash 复制代码
#启动socketcan_bridge_node.cpp节点
roscore

duduzai@duduzai:~/Downloads/ros_can_ws$ source ./devel/setup.bash

duduzai@duduzai:~/Downloads/ros_can_ws$ rosrun socketcan_bridge socketcan_bridge_node
bash 复制代码
#启动python包
duduzai@duduzai:~/Downloads/target_yaw_angle_ws/src/target_yaw_angle/scripts$ chmod +x target_yaw_angle_pub.py

duduzai@duduzai:~/Downloads/target_yaw_angle_ws$ source ./devel/setup.bash

duduzai@duduzai:~/Downloads/target_yaw_angle_ws$ rosrun target_yaw_angle target_yaw_angle_pub.py

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

相关推荐
白总Server21 分钟前
Bash和Zsh在处理大文件时优化方法
开发语言·网络·ide·stm32·安全·udp·bash
DOMINICHZL1 小时前
卡尔曼滤波算法从理论到实践:在STM32中的嵌入式实现
stm32·嵌入式硬件·算法
无际单片机编程1 小时前
单片机OTA升级中Bootloader怎么判断APP有没有问题?
java·stm32·单片机·嵌入式硬件·嵌入式
代码总长两年半1 小时前
STM32---FreeRTOS消息队列
stm32·单片机·嵌入式硬件
触角010100012 小时前
STM32 I2C驱动开发全解析:从理论到实战 | 零基础入门STM32第五十步
驱动开发·stm32·单片机·嵌入式硬件
赴遥4 小时前
ESP32S3N16R8驱动ST7701S屏幕(vscode+PlatfoemIO)
vscode·单片机·esp32·st7701s
沐欣工作室_lvyiyi4 小时前
基于单片机的防火防盗报警系统设计(论文+源码)
人工智能·stm32·单片机·嵌入式硬件·物联网·目标跟踪
廿二松柏木4 小时前
三级嵌入式学习ing 考点25、26
单片机·嵌入式硬件·学习
技术干货贩卖机5 小时前
0基础 | 看懂原理图Datasheet 系列1
笔记·stm32·单片机·嵌入式硬件·学习
-一杯为品-6 小时前
【51单片机】程序实验16.DS1302时钟
嵌入式硬件·mongodb·51单片机