控制kobuki底盘(一)

Kobuki(turtlebot底盘)通信方式 当Kobuki_nodelet被运行时,自动跳转到onInit()函数,函数中建立KobukiRos类的新对象,并调用其init() 函数,在KobukiRos类的init()函数中,定义了若干个用于接收ROS话题的subscriber,若干个用于发布底盘传感器数据的publisher。并且启动了Kobuki这个驱动类的初始化函数。     最后启动KobukiRos对象的update()函数, 阅读详情

为算法控制kobuki底盘所做的准备

(一)aicrobo的成果

有了catkin_ws里aicrobo_xi系列的package后,分别用不同ternimal启动:依次为虚拟底盘,rviz,键盘控制

roslaunch aicroboxi_bringup fake_aicroboxi.launch
roslaunch aicroboxi_rviz view_mobile.launch
roslaunch kobuki_keyop keyop.launch

使用键盘时会提示,是否enable the motor ,按e使能电机后可使用方向键控制.
aicrobo写的键盘控制:

roslaunch aicroboxi_teleop keyboard_teleop.launch

按 uio/jkl/m,./ 控制底盘.

(二)三次启动太麻烦,合成一次

cd ~/catkin_ws/src/aicrobo_xi/
catkin_create_pkg aicrobo_newteleop roscpp rospy std_msgs geometry_msgs/Twist

这样创建的newteleop包下依赖roscpp,rospy,std_msgs等,创建过后产生CmakeLists.txt和package.xml文件.新建一个launch文件夹,在里面建立一个newkeyop.launch的文件:把上面的启动的三个文件的launch组合在一个文件里.

(三)写一个自己的按键控制代替ros::ok()
1)堵塞式按键扫描将影响其他进程

//堵塞式按键检测
#include <stdio.h>  //printf() setbuf()
#include <linux/input.h> //input_event  EV_KEY
#include <sys/types.h>//open() 
#include <sys/stat.h> //open()
#include <fcntl.h>    //open()
#include <unistd.h>   //read(),close()  
#define DEV_PATH "/dev/input/event3"   //difference is possible  
int main()  
{  
   int qqq=subfunc();
    int keys_fd;  
    char ret[2];  
    struct input_event t;  
    keys_fd=open(DEV_PATH, O_RDWR);  
    if(keys_fd <= 0)  
    {  
        printf("open /dev/input/event3 device error!\n");  
        return -1;  
    }  
  while(1)  
  {   
        static int temp=0;
        //printf("1r:--keys_fd:%d\n",keys_fd);//证明了这是堵塞式的按键read
        temp=read(keys_fd, &t, sizeof(t));//堵塞式的ssize_t read(int fd, void *buf, size_t count);
        //printf("2r:--temp:%d\n",temp); 

        if(temp==sizeof(t))
        {   //printf("3r:--type:%d\n",t.type);
            if(t.type==EV_KEY) //EV_KEY=1,为键盘事件.type=4为其他,type=0可能为延续
        {   
                //printf("4r:--type==EV_KEY\n"); 
                if(t.value==0 || t.value==1)  
                {  
                    printf("code:%d %s\n", t.code, (t.value) ? "Pressed" : "Released");  
                    if(t.code == KEY_ESC)break;  
                }
            }  
        }   
  }
  close(keys_fd);
/*  这段无作用
    {//清空键盘缓冲区//stdio//
    FILE *fp;
    fp=fopen("/dev/input/event3","w");
    setbuf(fp, NULL);
    } 
*/ 
    return 0;  
} 

可以检测并显示 按键的按下和松开.
2)非堵塞式按键扫描不影响其他工作

#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <termios.h>

static struct termios ori_attr, cur_attr;

static __inline
int tty_reset(void)
{
        if (tcsetattr(STDIN_FILENO, TCSANOW, &ori_attr) != 0)
                return -1;

        return 0;
}


static __inline
int tty_set(void)
{

        if ( tcgetattr(STDIN_FILENO, &ori_attr) )
                return -1;

        memcpy(&cur_attr, &ori_attr, sizeof(cur_attr) );
        cur_attr.c_lflag &= ~ICANON;
//        cur_attr.c_lflag |= ECHO;
        cur_attr.c_lflag &= ~ECHO;
        cur_attr.c_cc[VMIN] = 1;
        cur_attr.c_cc[VTIME] = 0;

        if (tcsetattr(STDIN_FILENO, TCSANOW, &cur_attr) != 0)
                return -1;

        return 0;
}

static __inline
int kbhit(void)
{

        fd_set rfds;
        struct timeval tv;
        int retval;

        /* Watch stdin (fd 0) to see when it has input. */
        FD_ZERO(&rfds);
        FD_SET(0, &rfds);
        /* Wait up to five seconds. */
        tv.tv_sec  = 0;
        tv.tv_usec = 0;

        retval = select(1, &rfds, NULL, NULL, &tv);
        /* Don't rely on the value of tv now! */

        if (retval == -1) {
                perror("select()");
                return 0;
        } else if (retval)
                return 1;
        /* FD_ISSET(0, &rfds) will be true. */
        else
                return 0;
        return 0;
}

int main()
{
        int tty_set_flag;
        tty_set_flag = tty_set();

        while(1) {

                if( kbhit() ) {
                        const int key = getchar();
                        printf("%c -----------pressed\n", key);
                        if(key == 'q')break;
                } else {
                        fprintf(stderr, "<no key detected>\n");
                }
 int i=0,j=0;///这样可以很明显的看出显示效果
 while(i++<1000)
 {
   while(j++<5000);j=0;
   while(j++<5000);j=0;
   while(j++<5000);j=0;
   while(j++<5000);}        
 }
        if(tty_set_flag == 0)
                tty_reset();
        return 0;
}

这两段程序非原创.
3)写成函数,放在单独的cpp文件中,生成被包含的头文件.
.cpp文件

#include "FeiDuSeExit.h"
bool feiDuSeExit()
{
     int tty_set_flag;
     tty_set_flag = tty_set();

     if( kbhit() )
      {
        const int key = getchar();
        printf("%c -------------------------pressed\n", key);
        if(key == 'q'){tty_reset();return 0;}
      } 
     else 
      {
       fprintf(stderr, "<no key detected>\n");
      }

     int i=0,j=0;///这样可以很明显的看出效果非阻塞
     while(i++<1000)
    {
         while(j++<5000);
     j=0;
     while(j++<5000);
     j=0;
     while(j++<5000);
     j=0;
     while(j++<5000);
    }               
     if(tty_set_flag == 0)
                tty_reset();
        return 1;
}

.h文件

#ifndef FEIDUSEEXIT_H
#define FEIDUSEEXIT_H
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <termios.h>

static struct termios ori_attr, cur_attr;

static __inline
int tty_reset(void)
{
        if (tcsetattr(STDIN_FILENO, TCSANOW, &ori_attr) != 0)
                return -1;
        return 0;
}


static __inline
int tty_set(void)
{

        if ( tcgetattr(STDIN_FILENO, &ori_attr) )
                return -1;

        memcpy(&cur_attr, &ori_attr, sizeof(cur_attr) );
        cur_attr.c_lflag &= ~ICANON;
//        cur_attr.c_lflag |= ECHO;
        cur_attr.c_lflag &= ~ECHO;
        cur_attr.c_cc[VMIN] = 1;
        cur_attr.c_cc[VTIME] = 0;

        if (tcsetattr(STDIN_FILENO, TCSANOW, &cur_attr) != 0)
                return -1;

        return 0;
}

static __inline
int kbhit(void)
{

        fd_set rfds;
        struct timeval tv;
        int retval;

        /* Watch stdin (fd 0) to see when it has input. */
        FD_ZERO(&rfds);
        FD_SET(0, &rfds);
        /* Wait up to five seconds. */
        tv.tv_sec  = 0;
        tv.tv_usec = 0;

        retval = select(1, &rfds, NULL, NULL, &tv);
        /* Don't rely on the value of tv now! */

        if (retval == -1) {
                perror("select()");
                return 0;
        } else if (retval)
                return 1;
        /* FD_ISSET(0, &rfds) will be true. */
        else
                return 0;
        return 0;
}
bool  feiDuSeExit();
#endif

cmakelists.txt
加入类似的结构

add_executable(feiDuSeKaiHuanRoad src/FeiDuSeKaiHuanRoad.cpp src/FeiDuSeExit.cpp)

启动文件的名字:feiDuSeKaiHuanRoad 后面是包含的cpp

 target_link_libraries(feiDuSeKaiHuanRoad
   ${catkin_LIBRARIES}
 )

FeiDuSeExit.h文件放在catkin_ws的include文件里.
按键可被检测和显示返回ture,按q可以返回false.

TurtleBot3电池监控实战:从Kobuki固件使能到ROS电压校准 电池状态监控是移动机器人系统的基础能力,涉及嵌入式采样、串口通信协议、传感器数据解析与实时告警等核心环节。在ROS机器人平台中,/battery_state话题并非自动生成,而是依赖硬件层ADC采集、固件主动上报及驱动层协议解析的完整链路。Kobuki底盘因默认关闭电池数据包(ID 0x23),常导致该topic无输出;其电压换算系数偏差(如硬编码除以1000)更会引发低电量误判,威胁电机安全。通过e-Manual工具使能固件、修正ROS驱动参数、配置滞回告警与硬件级电压切断,可构建高可靠监控体系。本文聚焦 阅读详情

相关推荐

ROS.STM32运动底盘源码.zip

ROS.STM32运动底盘源码,是某宝开源底盘代码,大家可以研究研究

初次使用Turtlebot的kobuki底盘进行键盘操控

笔者第一次接触Turtlebot的kobuki底盘,想进行键盘操作,在过程中也遇到了不少坑,在此记录一下,给大家借鉴借鉴。 第一步:通过USB连接kobuki底盘和pc机             直接进行连接,安装相应驱动,这步很简单,就不多说。   第二步:ROS安装和相应功能包的安装             直接使用apt-get安装,不多说,ROS安装有很多教程,值得注意的就是ub...

qq_41219121的博客 2536

kobuki_desktop:Kobuki的可视化和仿真工具

kobuki_desktop Kobuki的可视化和仿真工具

kobuki 的控制

对于只有一个kobuki底盘进行运动控制。 一、安装与配置: 1、安装相应的驱动包:Kobuki debs 包 $ sudo apt-get install ros-indigo-kobuki ros-indigo-kobuki-core 2、配置 udev 的别名 $ rosrun kobuki_ftdi create_udev_rules 二、启动 kobuki 将...

Jeffxu_lib的博客 2115

深入解析APS开源排程工具OptaPlanner:链式结构与移动优化

本文深入解析了开源APS排程工具OptaPlanner的核心机制,重点阐述了链式结构如何作为排程优化的“骨架”,通过单一`previous`变量隐式定义资源与顺序,从而简化建模。文章详细介绍了基于此结构的移动操作(如`ChainChangeMove`)如何驱动优化引擎探索解空间,并自动触发影子变量更新与分数计算,为构建高效、灵活的生产计划系统提供了实践指导。

keras9composer的博客 296

FPGA实战:从零构建eMMC控制器(Verilog篇)

本文详细介绍了如何使用Verilog从零构建FPGA上的eMMC控制器,涵盖eMMC接口基础、命令系统解析、关键模块设计及性能优化技巧。通过实战案例,帮助开发者掌握高速数据存储解决方案,提升嵌入式系统开发能力。

weixin_26802933的博客 297

控制kobuki底盘(二)

(一)开环控制 (二)计算 (三)调整 (四)实现

under_maple的博客 3070

grafana对接zabbix数据展示

【配置】点击【模板】点击【创建模板】添加三个监控项:【名称】搜索【】创建的模板;点击上方【监控项】,点击创建【监控项】点击上方【触发器】点击【创建触发器】主机关联监控模板:左侧【配置】点击 【主机】点击【Zabbix server】查看:左侧点击【监测】点击【主机】点击【Zabbix server】点击最新数据,找到添加的三个模板主机关联监控模板:左侧【配置】点击 【主机】点击【Zabbix server】把监控模板用起来① 明确获取指标数据的方法。

2401_83883919的博客 6591

对turtlebot底盘通信的一些理解

通过一段时间的学习,发现关于turtlebot(kobuki)的一些底盘的驱动代码主要存在于以下文件中: kobuki.hpp https://github.com/yujinrobot/kobuki_core/blob/indigo/kobuki_driver/include/kobuki_driver/kobuki.hpp kobuki.cpphttps://github.com/yuji

a472725641的博客 2752

【Unity3D优化】优化内置shader的内存占用

在打AB包的过程中,并不会把这些Built-in的shader单独打包,并与材质球和预设体做好依赖,因此打AB包时,Unity会自行在材质球和预制体的AB包内每一个都包含进去用到的Built-in的Shader,而且运行时,由于加载的是不同的AB包,shader也是不同的实例,占用的也是多份内存。结合项目特点可以分析,由于项目里使用了大量的粒子特效,一些特殊的效果,会给特效师写定制的shader,但是这些常见的效果,特效师直接使用了Unity Built-in的shader。继续优化内存占用。

a310989583的专栏 2311

【毕设课设】基于YOLO v3与LSTM的水位智能识别系统(附完整源码+数据集)

本文详细介绍了基于YOLO v3与LSTM的水位智能识别系统的完整实现方案。该系统通过YOLO v3精准定位水位尺数字,结合LSTM-OCR进行序列识别,并融合霍夫变换检测刻度线,实现高精度水位自动读取。项目提供了从环境搭建、模型训练到集成部署的全流程指南,并附有完整源码和数据集,是理想的毕设课设实战项目。

php55的博客 608

ubuntu22.04 ros2 kobuki底盘控制全纪录

目前网上关于Kobuki的教程多是在 ROS Indigo / Kinetic /Melodic 环境下操作的,但是由于个人要用到ROS2 电脑只好安装Ubuntu22.04,所以出一版 Ubuntu 22.04 ROS2 humble环境下的Kobuki操控教程。存储库上可用的所有公共分支,并将工作扩展到用于基于 kobuki 的 turtlebot 机器人的完整 ROS2 包。让系统稳定识别 Kobuki 的 USB 串口设备,并给 ROS2 使用合适的权限和固定名称。在工作区中运行以下命令。

qq_45990036的博客 1024

42、多媒体与虚拟现实在艺术和影视领域的创新应用

本文探讨了多媒体与虚拟现实在艺术和影视领域的创新应用,涵盖三个典型案例:影视与人类学融合项目通过协作模式模糊作者与观众界限,推动文化文献的发展;交互式数字短片《分手》利用基于对象的广播技术探索个性化影视体验;威尼斯双年展瑞士馆4D项目则通过虚拟现实技术实现文化遗产的数字化展示。这些案例展示了技术在叙事、用户体验及文化保护中的深度应用,并展望了未来技术融合、个性化深化与文化遗产传承的发展趋势。

kappa的博客 114

kobuki驱动通信规范

kobuki node和kobuki 底盘framwork通信通过串口/dev/kobuki(默认情况下),分析下kobuki驱动通信的规范,就可以清楚的明白kobuki地盘framwork做了什么工作。再结合kobuki node订阅和发布的topics,就可以清楚知道kobuki node做了什么工作。 通信分成两种:命令(node->framwork)和反馈(node 通信方式seria

sunyoop的博客 2809

arcgis计算栅格平均值

打开FC栅格数据和非水体矢量数据 利用矢量数据提取对应栅格的非水体部分 2.1打开空间分析工具à提取分析à按掩膜提取 输入对应栅格数据和矢量数据 2.2提取结果如下 进行计算FC平均值 3.1打开空间分析工具à多元分析à波段集统计 输入对应栅格和输出路径 3.2统计结果如下 ...

Z_W_H_的博客 5370

LVGL 磁罗盘效果

环境:LVGL 9.x + SDL2,窗口 1280×800。界面文案用英文(默认 Montserrat,无 CJK)。本文按实现顺序讲:先建立两个耦合转动体,再把磁倾角误差从卡面倾斜里推出来,最后用同一套投影把刻度、数字和目标画到卡上。画面上的迟滞、涡流、摆动和读数偏差都来自方程,没有补间动画。

摸鱼专家 85

Rtabmap 视觉建图与导航 Ubuntu 18.04 Kobuki

Rtabmap 视觉建图与导航ROS 部署创建工作空间安装RtabmapRGBD相机配置Kobuki配置建图导航 ROS 部署 请参阅我之前的文章:Ubuntu 18.04 ROS 创建工作空间 mkdir catkin_ws/src cd catkin_ws/src catkin_init_workspace cd .. catkin_make 安装Rtabmap sudo apt install ros-melodic-rtabmap ros-melodic-rtabmap-ros 将param和m

weixin_43563233的博客 3358

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Kobuki入门教程-Kobuki控制系统

Kobuki入门教程-Kobuki控制系统 说明 介绍kobuki控制系统的概念 介绍控制系统不同的组件及之间如何交互 介绍Nodelets Nodelets在kobuki控制系统中被大量使用,相比一般的节点有诸多优点。 其最重要的是避免消息在TCP/IP传输中进行序列化和反序列化。 它通过将指针传递给消息而不是消息本身来完成的,这意味着信息更快的处理和传输。 当使用大的消息,如点云,这也可以显着降低了处理器的消耗。 这就是为什么我们实现控制器和Kobuki的控制系统的其他对速度敏感的部分都作为nod

zhaodeming000的博客 2533

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ros melodic移植kobuki

Ubuntu 18.04上移植kobuki ubuntu18.04上支持的ros版本是melodic,而kobuki只支持kinetic,所以需要自己在ubuntu18.04上编译kobuki 以下为移植步骤 建立工作空间并初始化 mkdir -p kobuki_ws/src cd kobuki_sw/src & catkin_init_workspace 下载源码 从https://github.com/Miaowaaaa/Kobuki-ROS-Melodic下载kobuki_node

luguogege的专栏 1322

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ROS学习记录(2)--控制Kobuki

1.将Kobuki信号线与电脑正确连接,指示灯变绿; 2.新建终端,复制如下代码 #启动底盘 roslaunch kobuki_node minimal.launch 3.新建终端,复制如下代码 #键盘遥控 roslaunch kobuki_keyop keyop.launch 4.键盘控制Kobuki移动。

今夕何夕的博客 819

在ROS-Melodic上控制Kobuki机器人地盘。

本文分享内容 发现Kobuki似乎没有ROS Melodic版本的Kobuki_node, 于是对Kinetic版本的Kobuki_node进行了迁移,可以在melodic中也运行roslaunch kobuki_node minimal.launch来驱动kobuki地盘了。 GitHub 仓库地址 https://github.com/Miaowaaaa/Kobuki-ROS-Melodi...

。 1602

基于dragonboard 410c的kobuki机器人控制——远程控制

在http://blog.youkuaiyun.com/andymfc/article/details/55517380中已经告诉大家如何在没有ros系统的环境下实现对kobuki机器人的简单控制,今天再向大家介绍如何快的实现对kobuki机器人的远程控制。 图1 kobuki机器人底盘 这里我们主要是利用了前面blog提到过的TCP/IP服务器通信技术来实现,其实更加简单的方式可以通过ssh远程

ANDYMFC的博客 2579

urdf 怎么添加头文件_无处不在的小土-Kobuki控制插件

Kobuki控制插件在上一节中介绍的Turtlebot的模型中有两个插件,分别是底盘的控制插件kobuki_controller和深度摄像头的控制插件kinect_camera_controller。本文详细分析Kobuki控制插件的源码。为了方便分析Turtlebot的相关源码,我们专门为之建立一个catkin的工作空间,并通过git把kobuki和kobuki_desktop的源码clone下...

weixin_32280593的博客 402

关于Gazebo ROS Kobuki plugin:NaN in d1. step time:0.01的问题

gazebo turtlebot kobuki ros

OsgoodWu的博客 924

基于DragonBoard 410c的家庭智能环保卫士——(5)获取kobuki位置信息

前面已经对基本方案和相关的算法进行了简单介绍,本期blog,将教大家如何快速的获取kobuki机器人的位置信息,由于之前没有研究过ROS,因此,在使用kobuki的时候,只是需要使用kobuki机器人底盘的功能,能够实现对机器人的控制和获取位置信息即可,如果大家想详细的了解kobuki机器人和ROS操作系统,可以到其官网上查询相关资料,在本期blog中将不进行讨论,只是获取我们需要的信息即可。

ANDYMFC的博客 2532
上一篇: 关于ros提到的那只turtle
下一篇: 控制kobuki底盘(二)
under_maple
博客等级 码龄12年 15粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值