基于ROS平台的移动机器人-3-小车底盘与ROS的通信

从零搭建一台基于ROS的自动驾驶车-----1.整体介绍 最近期间开始学习Linux嵌入式,ROS,激光SLAM,学的很杂,学的很乱,学习的过程中愈发地想造一台ROS小车,小车的最终要实现的功能是实现自动导航运动。经过一段时间的学习,已经初步实现了导航功能。下面我将记录一下实现的过程。整个智能车主要由 主控制器(我用的是NVIDIA Jetson AGX Xavier 简称为Nvidia),一个二维雷达,一个小车底盘等组成。本文只是做一个概述,详细的实现过程和代码我将会写在后面的博客。 阅读详情

基于ROS平台的移动机器人-3-小车底盘与ROS的通信

1.ROS平台与底盘通信协议

ROS平台与小车底盘的通信一般是通过串口或者CAN总线。我这里采用的是串口,以下为我自定义的通信数据格式:

(1)底盘串口部分

1.串口接收
 (1)内容:小车左右轮速度,单位:mm/s(所有数据都为   float型,float型占4字节)
 (2)格式:10字节 
[右轮速度4字节][左轮速度4字节][结束符"\r\n"2字节]

2.串口发送
 (1)内容:里程计(x,y坐标、线速度、角速度和方向角,单位依次为:mm,mm,mm/s,rad/s,rad,所有数据都为float型,float型占4字节)
 (2)格式:21字节 
[x坐标4字节][y坐标4字节][方向角4字节][线速度4字节][角速度4字节][结束符"\n"1字节]

(2)ROS平台串口节点部分

1.写入串口
(1)内容:左右轮速度,单位为mm/s
(2)格式:10字节,[右轮速度4字节][左轮速度4字节][结束符"\r\n"2字节]
2.读取串口
(1)内容:小车x,y坐标,方向角,线速度,角速度,单位依次为:mm,mm,rad,mm/s,rad/s
(2)格式:21字节,[X坐标4字节][Y坐标4字节][方向角4字节][线速度4字节][角速度4字节][结束符"\n"1字节]

2.串口通信处理程序

(1)小车底盘串口处理程序。

底盘串口处理的程序主要写在了 main.c 文件中。

底盘向串口发送里程计代码:

if(main_sta&0x01)//执行发送里程计数据步骤
{
    //里程计数据获取
    x_data.odoemtry_float=position_x;//单位mm
    y_data.odoemtry_float=position_y;//单位mm
    theta_data.odoemtry_float=oriention;//单位rad
    vel_linear.odoemtry_float=velocity_linear;//单位mm/s
    vel_angular.odoemtry_float=velocity_angular;//单位rad/s

    //将所有里程计数据存到要发送的数组
    for(j=0;j<4;j++)
    {
        odometry_data[j]=x_data.odometry_char[j];
        odometry_data[j+4]=y_data.odometry_char[j];
        odometry_data[j+8]=theta_data.odometry_char[j];
        odometry_data[j+12]=vel_linear.odometry_char[j];
        odometry_data[j+16]=vel_angular.odometry_char[j];
    }

    odometry_data[20]='\n';//添加结束符

    //发送数据要串口
    for(i=0;i<21;i++)
    {
        USART_ClearFlag(USART1,USART_FLAG_TC);  //在发送第一个数据前加此句,解决第一个数据不能正常发送的问题             
        USART_SendData(USART1,odometry_data[i]);//发送一个字节到串口 
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //等待发送结束            
    }

    main_sta&=0xFE;//执行计算里程计数据步骤
}

底盘接收串口发来的速度代码:

if(USART_RX_STA&0x8000)  // 串口1接收函数
{           
    //接收左右轮速度
    for(t=0;t<4;t++)
    {
        rightdata.data[t]=USART_RX_BUF[t];
        leftdata.data[t]=USART_RX_BUF[t+4];
    }

    //储存左右轮速度
    odometry_right=rightdata.d;//单位mm/s
    odometry_left=leftdata.d;//单位mm/s

    USART_RX_STA=0;//清楚接收标志位
}

(2)ROS平台串口处理程序

ROS平台串口处理程序主要写在 base_controller.cpp 文件中。

ROS平台向串口发送速度代码:

void callback(const geometry_msgs::Twist & cmd_input)//订阅/cmd_vel主题回调函数
{
    string port("/dev/ttyUSB0");    //小车串口号
    unsigned long baud = 115200;    //小车串口波特率
    serial::Serial my_serial(port, baud, serial::Timeout::simpleTimeout(1000)); //配置串口

    angular_temp = cmd_input.angular.z ;//获取/cmd_vel的角速度,rad/s
    linear_temp = cmd_input.linear.x ;//获取/cmd_vel的线速度.m/s

    //将转换好的小车速度分量为左右轮速度
    left_speed_data.d = linear_temp - 0.5f*angular_temp*D ;
    right_speed_data.d = linear_temp + 0.5f*angular_temp*D ;

    //存入数据到要发布的左右轮速度消息
    left_speed_data.d*=ratio;   //放大1000倍,mm/s
    right_speed_data.d*=ratio;//放大1000倍,mm/s

    for(int i=0;i<4;i++)    //将左右轮速度存入数组中发送给串口
    {
        speed_data[i]=right_speed_data.data[i];
        speed_data[i+4]=left_speed_data.data[i];
    }

    //在写入串口的左右轮速度数据后加入”/r/n“
    speed_data[8]=data_terminal0;
    speed_data[9]=data_terminal1;
    //写入数据到串口
    my_serial.write(speed_data,10);
}

ROS平台接收串口发来的里程计代码:

rec_buffer =my_serial.readline(25,"\n");    //获取串口发送来的数据
const char *receive_data=rec_buffer.data(); //保存串口发送来的数据
从零搭建一台基于ROS的自动驾驶车-----2.运动控制 在整个智能车中运动控制是最基础也是最为重要的一步,本文主要的内容有:1.ROS通过串口与STM32实现通信,继而控制智能车运动2.在ROS中通过键盘运动控制节点来实现小车的运动基于ROS平台的STM32小车–汇总。 阅读详情

相关推荐

【ROS基础】如何从零开始搭建一台ROS小车

references 基于STM32的ROS智能移动机器人构建地图、定位以及自主导航研发 从零搭建ROS机器人平台 ros app 下载、ros android app下载、ROS机器人控制app下载

欢迎时常光顾我的干货超市,热衷于AIoT!! 5042

SLAM从入门到精通(ROS和底盘Stm32的关系)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 学过Ros的同学,一般对subscribe、publish、话题、服务这些内容都比较熟悉。如果再熟悉一点的话,还会知道slam、move_base、moveit这些框架。再了解多一点的呢,会对框架里面的算法,比如和hector slam、gmapping、amcl、迪杰斯特拉、a*算法比较熟悉。但是,对机器人底盘的知识,尤其是Ros和stm32怎么通信的,很多人却是不算太了解的。

嵌入式-老费,一个分享专业嵌入式知识的blog 3437

制作ROS移动机器人地盘

制作ROS移动机器人地盘摘要概述硬件需求车体设计电路设计程序设计 摘要 本教程讲述如何利用扫地机轮子制作ROS移动机器人地盘。 概述 原本不打算自己造轮子的,但是网上的移动机器人地盘要么巨贵--对于学生党,要么巨简陋--编码器线数低于40线,根本不能满足ROS移动机器人的需要。为了锻炼自己的动手能力(这个借口看起来比较积极,能掩盖没钱的尴尬...),准备从零打造一款ROS移动机器人地盘。 扫地机轮组减速比大致是50左右,电机编码器15-20线,轮子转一周大概是1000个脉冲,测量精度够用。 通过L298N

SuperDevloper的博客 1726

如何制作一台ROS小车(一)

由于参加学校的大学生创新训练项目,我们决定制作一款基于ROS系统的智能医疗机器人。) 决定写下此文章来记录我们的开发历程,并收集整合各种资料。

doctor__who_的博客 2040

【ROS2】Arduino与L298P电机驱动的机器人底盘DIY实战

本文详细介绍了如何利用ROS2、Arduino与L298P电机驱动模块DIY机器人底盘。内容涵盖硬件选型与电路连接、软件环境搭建、定制化固件开发、PID参数调试以及ROS2端集成配置,提供了一套从零开始构建稳定、可扩展移动机器人平台的完整实战方案,特别适合机器人爱好者和学生入门学习。

weixin_29194255的博客 443

搭建ROS小车底盘 | 构建自己的ROS小车平台

通过按照以上步骤,你可以搭建自己的ROS小车底盘。首先选择合适的底盘硬件,安装ROS并创建工作空间。接下来,编写ROS节点来控制底盘的移动和导航。我们需要编写ROS节点来控制底盘的移动和导航。根据底盘硬件的规格和接口,我们需要进行相应的配置。在本文中,我们将介绍如何构建自己的ROS小车平台,并提供相应的源代码供参考。接下来,我们需要将底盘的驱动程序添加到ROS工作空间的源代码目录中。现在,你的ROS小车底盘已经搭建完成。你可以通过发布相应的控制指令来测试底盘的移动和导航功能。是你的ROS包的名称,

loop_code966的博客 1759

基于ROS平台的移动机器人-目录

基于ROS平台的移动机器人-目录说明本系列博文将介绍基于ROS平台的移动机器人的搭建,包括小车的底盘的制作,控制和与上位机的通信。目录 基于ROS平台的移动机器人-1-小车底盘的搭建 基于ROS平台的移动机器人-2-小车底盘控制 基于ROS平台的移动机器人-3-小车底盘与ROS的通信 基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动 基于ROS平台的移动机器人-5-Kinect2驱动的

Forrest's Space 1万+

ROS小车STM32底层控制代码

2.6 ROS小车STM32底层控制代码 经过之前几篇文章,我相信大家一定对下面这些模块都已经有些了解了。今天,我们将编写ROS小车STM32单片机底层控制的最后一篇文章。我们将一起按照之前的软件流程,将所有的代码整合到一个工程中去。 在公众号:小白学移动机器人,发送:ROS小车底层,即可获得源码工程文件。 相信大家对配置代码都很清楚了,这里直接描述软件执行流程,以及部分代码展示 注意:该工程文件中的STM32与ROS通信的程序和前面写的文章提供的程序,有一点出入,之前是为了方便理解。大家调用的时候注意即

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 1万+

基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动

基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动准备工作1.下载串口通信的ROS包(1)cd ~/catkin_ws/src (2)git@github.com:Forrest-Z/serial.git 2.下载键盘控制的ROS包(1)cd ~/catkin_ws/src (2)git@github.com:Forrest-Z/teleop_twist_keyboard.git 进入下

Forrest's Space 2万+

ROS2_Humble小车底盘功能包:从CAN通信到SLAM导航的完整链路

移动机器人开发中,通信与坐标系对齐是绕不开的两道基础门槛。CAN总线作为底盘与上位机之间的低速可靠通信桥梁,其波特率匹配、DBC协议解析和帧ID核对,直接决定了底层指令能否准确到达轮子。而TF树则负责将里程计、激光雷达和车体几何关系统一到同一个空间描述下,任何一段缺失都可能导致SLAM和导航无法起步。在ROS2_Humble环境下,通过驱动分层设计、URDF模型加载、slam_toolbox建图以及Nav2导航框架集成,可以搭建一条从底盘控制到自主导航的完整链路。该功能包面向差速小车,解决了STM32底盘在

weixin_26742753的博客 288

基于STM32与ROS的移动机器人底盘开发实战

本文详细介绍了基于STM32下位机和ROS上位机的移动机器人底盘开发全流程。首先解释了为什么采用上下位机分离架构,以及各自承担的任务。随后深入讲解了通信协议的设计,包括帧格式、CRC校验和单位统一。在STM32端,重点阐述了CubeMX初始化、编码器测速、PID速度环的实现要点。ROS端则涵盖了驱动节点编写、cmd_vel订阅与运动学解算。最后分享了从串口空转到闭环控制的分步联调经验,以及常见问题排查技巧和PID参数整定方法。文章内容深入浅出,适合机器人开发初学者和进阶者参考。

weixin_30110543的博客 213

基于ROS平台的移动机器人-2-小车底盘控制

版权声明:本文为博主原创文章,如若转载,请标明作者和原文出处! https://blog.youkuaiyun.com/Forrest_Z/article/details/55001231 基于ROS平台的移动机器人-2-小车底盘控制 说明 本博文将介绍小车底盘控制的原理,如PID控制,控制程序的编写等。 小车控制思想 控制电机转动。电机的控制我们分为两部分,一部分为电机转动方向的控制,...

shmily138的博客 4657

micro-ROS实战:将ROS 2下沉到MCU的移动机器人底盘控制

在移动机器人开发中,实时控制与高层决策往往分属两个世界:MCU负责电机闭环与IO处理,上位机运行ROS 2完成导航与感知,传统自定义串口协议让联调变得繁琐且脆弱。嵌入式实时系统与分布式通信架构的融合,正是为解决这一割裂而生的技术方向。micro-ROS通过XRCE协议在MCU上实现了ROS 2通信栈的精简移植,让传感器数据、控制指令以标准话题形式直达底层硬件。这种方案既保留了MCU的硬实时能力,又让嵌入式节点无缝接入ROS 2生态,大幅降低系统集成复杂度。该技术适用于差速底盘、服务机器人、教育科研等需要高实

weixin_29196315的博客 297

记录零基础ROS2学习和实践(三)(小车移动篇(一))(实物小车实现雷达建图和定点自动巡航)

上一章说了ros的功能包中一些文件的作用,这章我说说我是如何在ros2平台上让我的底盘小车实现移动。还有我使用的环境是untunbu22.04提前说明一下,让小车移动有很多方式,接下来我会介绍几种方式。

2301_79027493的博客 873

学习 Bootstrap 5 之 Tables

学习 Bootstrap 5 之 表格表格 (Tables)1. 创建表格(1). 使用原生的表格标签(2). 使用Bootstrap 5 的提供的表格标签类(3). 原生与Bootstrap创建出来的表格的对比2. 表格样式(1). 表格样式的效果(2). 表格样式的使用1). 用于 <table> 标签2). 用于 <thead> <tbody> <tfoot> 标签 表格 (Tables) 1. 创建表格 (1). 使用原生的表格标签 <tabl

qq_37354060的博客 2130

BLE蓝牙胎压监测

胎压监测系统新技术

qq_41851841的博客 1254

ROS 移动机器人 STM32 Kinect2 智能车

基于ROS平台的移动机器人-目录 说明 本系列博文将介绍基于ROS平台的移动机器人的搭建,包括小车的底盘的制作,控制和与上位机的通信,建图和导航。 目录 基于ROS平台的移动机器人-1-小车底盘的搭建 基于ROS平台的移动机器人-2-小车底盘控制 基于ROS平台的移动机器人-3-小车底盘与ROS的通信 基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动 基于ROS平台的...

uunubt的专栏 4009

FreeSWITCH安装指南:三种部署方式解析与实践对比

Freeswitch部署方案比较:Yum安装简单快捷但灵活性差;源码安装可定制性强,适合深度开发和性能优化;Docker部署环境一致性好但网络配置复杂。生产环境推荐源码安装以获得最佳性能和定制能力,而Docker适合快速部署和扩展。不同方案各有利弊,需根据具体需求选择。

c_zyer的博客 2140

基于STM32的ROS智能移动机器人构建地图、定位以及自主导航研发

好长时间没写博客了,今天继续工作的第一件事情是做一款STM32 的ROS智能移动机器人,构建地图以及自主导航。在这里笔者认为最难的事情是搞机器人底盘,由于之前没有接触过32板,查了一周的文档才清楚,32板是怎么烧录程序的以及与arduino控制电机的区别。 搭建ROS智能小车,笔者认为可以将移动机器人分为三个部分(上位机、中间层以及下位机),下位机控制电机(直流无...

huapiaoxiang21的博客 1万+

uCOS中的消息邮箱(:task与task之间传递一个数据(数据缓冲区))

程序需求,需要完成task与task之间  字符数组的数据传输 比如:在ucos中,串口2接收的字符数组是不定时的&不定长的;只有当接收到数据的时候_才将数据赋值给新数组 具体的程序示意如下: 图1:消息邮箱测试中的     向消息邮箱发送消息(OSMboxPost(Str_Box,(void*)rec);//发送消息--(向 消息邮箱_msg_key发送消息) ),实际项目需求的

faguoduifangui的博客 4540

Argoverse轨迹预测实战:从数据加载到地图API应用全解析

本文详细解析了Argoverse数据集在轨迹预测中的应用,从数据加载到地图API的实战技巧全涵盖。通过具体代码示例展示如何高效处理轨迹数据、实现可视化及基础预测模型,帮助开发者快速掌握自动驾驶轨迹预测的核心技术。特别介绍了Argoverse地图API的深度应用和性能优化经验。

weixin_29182481的博客 241

python 机器人运动仿真_基于ros平台的移动机器人的设计与运动仿真-创新创业训练计划.pdf...

基于ros平台的移动机器人的设计与运动仿真-创新创业训练计划基于ROS 平台的移动机器人的设计与运动仿真陈勇林 朱应钦 杜政恒 张玉林 (重庆大学城市科技学院电气信息学院,重庆 永川 402167 )摘要:ROS 究竟是如何工作的呢?ROS 中每一套算法是独立的一个包,包与包之间的数据交换主要采用TCP/IP 协议(对用户隐藏,用户需要发布或订阅主题以提供或取得数据),采用这种形式是由于...

weixin_42357054的博客 695

Oracle 常用语法汇总

CREATE TABLE 表名(COMMENT ON COLUMN 注释;-- 创建一个学生表STUDENT_ID NUMBER(10) PRIMARY KEY, -- 学生ID,主键FIRST_NAME VARCHAR2(50) NOT NULL, -- 学生名字,不允许为空LAST_NAME VARCHAR2(50) NOT NULL, -- 学生姓氏,不允许为空EMAIL VARCHAR2(100) UNIQUE, -- 学生电子邮箱,唯一。

拽着尾巴的鱼儿的博客 2156

从零开始搭建ROS移动机器人系列之(一)预备知识及总体框架

最近花了一些时间,把机器人的底层硬件搭建了起来,想着抽空把搭建过程整理成一个系列文章,给有相关兴趣或者有同样需求的初学者同学作为参考。

weixin_45187027的博客 2477

从零构建物联网数据中台:MQTT协议、Node.js服务、MongoDB与InfluxDB双存储及React可视化实战

本文详细介绍了从零构建物联网数据中台的完整实战方案。通过采用MQTT协议作为设备通信标准,结合Node.js搭建高并发数据处理服务,并创新性地使用MongoDB与InfluxDB双存储架构分别管理设备元数据与海量时序数据,最后利用React构建了实时数据可视化控制台。该架构有效解决了物联网项目中数据异构、查询性能低下等核心痛点,为构建高效、可扩展的物联网平台提供了清晰路径。

weixin_28432777的博客 288

【CUDA Runtime】第一个“Hello World“程序

CUDA(Compute Unified Device Architecture)是 NVIDIA 提供的一个并行计算平台和编程模型,旨在通过利用 GPU 的强大计算能力来加速计算密集型应用。对于许多开发者而言,开始学习 CUDA 编程的第一步通常是编写一个简单的“Hello World”程序。尽管 CUDA 的实际应用远远超出一个简单的例子,但这个初步的示例能帮助开发者快速入门,理解基本的 CUDA 编程流程。

m0_62599305的博客 1504
上一篇: 基于ROS平台的移动机器人-2-小车底盘控制
下一篇: 基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动
Forrest-Z
博客等级 码龄11年 661粉丝 20原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forrest-Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值