亚博microros小车-原生ubuntu支持系列:1 键盘控制

背景:电脑配置不太行,我在ubuntu再运行vmware,里面运行亚博官方的虚拟机镜像ubuntu,系统很卡。基本上8G内存给打满了。还是想把亚博官方的代码迁移出来,之前售后就说除了官方镜像虚拟机,需要自己摸索迁移。

    先从键盘控制入手吧。这个模块就是发消息,类似于小海龟那个,比小海龟还要简化下,只是命令多一些,相对独立,依赖少,适合上手练习。

一 准备工作

启动代理:

docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:humble udp4 --port 8090 -v4

可以参考之前的文章:亚博microROS 机器人配置与控制-CSDN博客

小车的配置:要与电脑IP保持一致,不是虚拟机的IP

还要关注一点:检查node

bohu@bohu-TM1701:~$ ros2 node list
/YB_Car_Node

 如果没有,请检查确认虚拟机/电脑上.bashrc文件的ROS DOMAIN ID与microROS控制板上配置的一致才可以搜索到节点信息。初次通常需要在.bashrc文件加一行:

export ROS_DOMAIN_ID=20

运行后小车开启电源效果如下:

bohu@bohu-TM1701:~$ docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:humble udp4 --port 8090 -v4
[1737378512.062782] info     | UDPv4AgentLinux.cpp | init                     | running...             | port: 8090
[1737378512.063437] info     | Root.cpp           | set_verbose_level        | logger setup           | verbose_level: 4
[1737378512.532474] info     | Root.cpp           | create_client            | create                 | client_key: 0x2BEF9112, session_id: 0x81
[1737378512.532669] info     | SessionManager.hpp | establish_session        | session established    | client_key: 0x2BEF9112, address: 192.168.0.107:39455
[1737378512.677740] info     | ProxyClient.cpp    | create_participant       | participant created    | client_key: 0x2BEF9112, participant_id: 0x000(1)
[1737378512.690384] info     | ProxyClient.cpp    | create_topic             | topic created          | client_key: 0x2BEF9112, topic_id: 0x000(2), participant_id: 0x000(1)
[1737378512.697153] info     | ProxyClient.cpp    | create_publisher         | publisher created      | client_key: 0x2BEF9112, publisher_id: 0x000(3), participant_id: 0x000(1)
[1737378512.705426] info     | ProxyClient.cpp    | create_datawriter        | datawriter created     | client_key: 0x2BEF9112, datawriter_id: 0x000(5), publisher_id: 0x000(3)
[1737378512.714186] info     | ProxyClient.cpp    | create_topic             | topic created          | client_key: 0x2BEF9112, topic_id: 0x001(2), participant_id: 0x000(1)
[1737378512.725294] info     | ProxyClient.cpp    | create_publisher         | publisher created      | client_key: 0x2BEF9112, publisher_id: 0x001(3), participant_id: 0x000(1)
[1737378512.800394] info     | ProxyClient.cpp    | create_datawriter        | datawriter created     | client_key: 0x2BEF9112, datawriter_id: 0x001(5), publisher_id: 0x001(3)
[1737378512.813041] info     | ProxyClient.cpp    | create_topic             | topic created          | client_key: 0x2BEF9112, topic_id: 0x002(2), participant_id: 0x000(1)
[1737378512.822137] info     | ProxyClient.cpp    | create_publisher         | publisher created      | client_key: 0x2BEF9112, publisher_id: 0x002(3), participant_id: 0x000(1)
[1737378512.833437] info     | ProxyClient.cpp    | create_datawriter        | datawriter created     | client_key: 0x2BEF9112, datawriter_id: 0x002(5), publisher_id: 0x002(3)

这是前提,否则没法控制小车

二 控制代码

在src/yahboomcar_ctrl/yahboomcar_ctrl/目录下新建文件yahboom_keyboard.py,

代码如下:

#!/usr/bin/env python
# encoding: utf-8
#import public lib
from geometry_msgs.msg import Twist # 消息
import sys, select, termios, tty #tty 设置终端模式。sys 系统模块,select  监听输入,termios 保存和恢复#import ros lib
import rclpy
from rclpy.node import Nodemsg = """
Control Your SLAM-Bot!
---------------------------
Moving around:u    i    oj    k    lm    ,    .q/z : increase/decrease max speeds by 10%
w/x : increase/decrease only linear speed by 10%
e/c : increase/decrease only angular speed by 10%
t/T : x and y speed switch
s/S : stop keyboard control
space key, k : force stop
anything else : stop smoothlyCTRL-C to quit
"""moveBindings = {'i': (1, 0),'o': (1, -1),'j': (0, 1),'l': (0, -1),'u': (1, 1),',': (-1, 0),'.': (-1, 1),'m': (-1, -1),'I': (1, 0),'O': (1, -1),'J': (0, 1),'L': (0, -1),'U': (1, 1),'M': (-1, -1),
}speedBindings = {'Q': (1.1, 1.1),'Z': (.9, .9),'W': (1.1, 1),'X': (.9, 1),'E': (1, 1.1),'C': (1, .9),'q': (1.1, 1.1),'z': (.9, .9),'w': (1.1, 1),'x': (.9, 1),'e': (1, 1.1),'c': (1, .9),
}class Yahboom_Keybord(Node):def __init__(self,name):#初始化super().__init__(name)self.pub = self.create_publisher(Twist,'cmd_vel',1000)self.declare_parameter("linear_speed_limit",1.0) #声明参数-线速度self.declare_parameter("angular_speed_limit",5.0) #声明参数-角速度self.linenar_speed_limit = self.get_parameter("linear_speed_limit").get_parameter_value().double_valueself.angular_speed_limit = self.get_parameter("angular_speed_limit").get_parameter_value().double_valueself.settings = termios.tcgetattr(sys.stdin)def getKey(self):#读取键盘tty.setraw(sys.stdin.fileno())#原始模式,不用回车读取rlist, _, _ = select.select([sys.stdin], [], [], 0.1)# 监听输入,超时时间0.1秒if rlist: key = sys.stdin.read(1) #读取输入else: key = '' #没有输入设置为空串termios.tcsetattr(sys.stdin, termios.TCSADRAIN, self.settings) #恢复终端属性return keydef vels(self, speed, turn):#输出速度和朝向return "currently:\tspeed %s\tturn %s " % (speed,turn)		def main():rclpy.init()yahboom_keyboard = Yahboom_Keybord("yahboom_keyboard_ctrl")xspeed_switch = True(speed, turn) = (0.2, 1.0)(x, th) = (0, 0)status = 0stop = Falsecount = 0twist = Twist()try:print(msg)print(yahboom_keyboard.vels(speed, turn))while (1):key = yahboom_keyboard.getKey()if key=="t" or key == "T": xspeed_switch = not xspeed_switchelif key == "s" or key == "S":print ("stop keyboard control: {}".format(not stop))stop = not stopif key in moveBindings.keys(): #方向控制x = moveBindings[key][0]th = moveBindings[key][1]count = 0	elif key in speedBindings.keys(): #加速speed = speed * speedBindings[key][0]turn = turn * speedBindings[key][1]count = 0if speed > yahboom_keyboard.linenar_speed_limit: speed = yahboom_keyboard.linenar_speed_limitprint("Linear speed limit reached!")if turn > yahboom_keyboard.angular_speed_limit: turn = yahboom_keyboard.angular_speed_limitprint("Angular speed limit reached!")print(yahboom_keyboard.vels(speed, turn))if (status == 14): print(msg)status = (status + 1) % 15elif key == ' ': (x, th) = (0, 0)else:count = count + 1if count > 4: (x, th) = (0, 0)if (key == '\x03'): breakif xspeed_switch: twist.linear.x = speed * xelse: twist.linear.y = speed * xtwist.angular.z = turn * thif not stop: yahboom_keyboard.pub.publish(twist) #发话题消息if stop:yahboom_keyboard.pub.publish(Twist())except Exception as e: print(e)finally: yahboom_keyboard.pub.publish(Twist())termios.tcsetattr(sys.stdin, termios.TCSADRAIN, yahboom_keyboard.settings) #恢复终端属性yahboom_keyboard.destroy_node()rclpy.shutdown()

代码我加了注释,从依赖上看,就是依赖了ros2基础的话题消息,剩下就是读取键盘的getKey()。

退出标识:\x03 就是ctrl+C 组合。

处理逻辑就是根据根据键盘输入调用话题发布。

三 测试:

重新构建下,再次运行节点

ros2 run yahboomcar_ctrl yahboom_keyboard

补充下相关信息

rqt看node:

bohu@bohu-TM1701:~$ ros2 node info /YB_Car_Node 
/YB_Car_NodeSubscribers:/beep: std_msgs/msg/UInt16/cmd_vel: geometry_msgs/msg/Twist/servo_s1: std_msgs/msg/Int32/servo_s2: std_msgs/msg/Int32Publishers:/battery: std_msgs/msg/UInt16/imu: sensor_msgs/msg/Imu/odom_raw: nav_msgs/msg/Odometry/scan: sensor_msgs/msg/LaserScanService Servers:Service Clients:Action Servers:Action Clients:

从节点信息来看,/YB_Car_Node

订阅了话题:包含刚才的cmd_vel,用于接受指令。消息接口:

geometry_msgs/msg/Twist

发布的话题:battery 电池、imu 惯性测量数据,odom:里程计数据、scan:激光雷达的数据。

控制话题具体信息

---
linear:
  x: 0.26620000000000005
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
---

真的很感谢之前小鱼老师那本《ros2机器人开发》那本书,要是没有这本书作为入门指导,直接看亚博的源码会很吃力。这是第一步,期待后面能逐步学习完亚博的完整功能,把小车玩起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5472.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Redis实现短信验证码登录

目录 1 基于Session实现短信验证码登录 2 配置登录拦截器 3 配置完拦截器还需将自定义拦截器添加到SpringMVC的拦截器列表中 才能生效 4 Session集群共享问题 5 基于Redis实现短信验证码登录 6 Hash 结构与 String 结构类型的比较 7 Redis替代Session需要考虑的问题 8 …

Golang Gin系列-4:Gin Framework入门教程

在本章中,我们将深入研究Gin,一个强大的Go语言web框架。我们将揭示制作一个简单的Gin应用程序的过程,揭示处理路由和请求的复杂性。此外,我们将探索基本中间件的实现,揭示精确定义路由和路由参数的技术。此外&#xff…

Asp.Net Core 8.0 使用 Serilog 按日志级别写入日志文件的两种方式

1、所需的Nuget包 本文项目的版本是.NET 8.0,如果使用其它版本安装适配版本即可。 Serilog.AspNetCore(8.0.2) Serilog.Sinks.File(5.0.0) Serilog.Expressions(5.0.0) 2、两种配置方式 2.1 代码形式(Program.cs) 在Program.cs文件中&am…

STM32+W5500+以太网应用开发+003_TCP服务器添加OLED(u8g2)显示状态

STM32W5500以太网应用开发003_TCP服务器添加OLED(u8g2)显示状态 实验效果3-TCP服务器OLED1 拷贝显示驱动代码1.1 拷贝源代码1.2 将源代码添加到工程1.3 修改代码优化等级1.4 添加头文件路径1.5 修改STM32CubeMX工程 2 修改源代码2.1 添加头文件2.2 main函…

【深度学习项目】语义分割-DeepLab网络(DeepLabV3介绍、基于Pytorch实现DeepLabV3网络)

文章目录 介绍深度学习语义分割的关键特点主要架构和技术数据集和评价指标总结 DeepLabDeepLab 的核心技术DeepLab 的发展历史DeepLab V3网络结构获取多尺度信息架构Cascade ModelASPP ModelMulti-GridPytorch官方实现的DeepLab V3该项目主要是来自pytorch官方torchvision模块中…

Golang Gin系列-5:数据模型和数据库

在这篇Gin教程的博客中,我们将探索如何将模型和数据库与Gin框架无缝集成,使你能够构建健壮且可扩展的web应用程序。通过利用流行的库并遵循最佳实践,你将学习如何定义模型、建立数据库连接、执行CRUD操作以及确保基于gin的项目中的数据完整性…

高并发内存池_各层级的框架设计及ThreadCache(线程缓存)申请内存设计

一、高并发内存池框架设计 高并发池框架设计,特别是针对内存池的设计,需要充分考虑多线程环境下: 性能问题锁竞争问题内存碎片问题 高并发内存池的整体框架设计旨在提高内存的申请和释放效率,减少锁竞争和内存碎片。 高并发内存…

如何在idea中搭建SpringBoot项目

如何在idea中快速搭建SpringBoot项目 目录 如何在idea中快速搭建SpringBoot项目前言一、环境准备:搭建前的精心布局 1.下载jdk (1)安装JDK:(2)运行安装程序:(3)设置安装…

elementUI Table组件实现表头吸顶效果

需求描述 当 table 内容过多的时候,页面上滑滚动,表头的信息也会随着被遮挡,无法将表头信息和表格内容对应起来,需要进行表头吸顶 开始编码💪 环境:vue2.6、element UI step1: 给el-table__h…

[Qt]系统相关-多线程、线程安全问题以及线程的同步机制

目录 一、Qt多线程编程 1.介绍 2.多线程的操作 线程的创建 QThread的常用API 使用案例 3.Qt线程的使用场景 二、线程安全问题 1.互斥锁 介绍 使用案例 2.读写锁 三、线程的同步 1.条件变量 2.信号量 一、Qt多线程编程 1.介绍 Qt中的多线程的底层原理和注意事项…

Linux Bash 中使用重定向运算符的 5 种方法

注:机翻,未校。 Five ways to use redirect operators in Bash Posted: January 22, 2021 | by Damon Garn Redirect operators are a basic but essential part of working at the Bash command line. See how to safely redirect input and output t…

【Linux】环境变量

🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux】进程优先级与进程切换 🔖流水不争,争的是滔滔不 一、环境变量的定义二、命令…

Spring MVC:设置响应

目录 引言 1. 返回静态页面 1.1 Spring 默认扫描路径 1.2 RestController 1.2.1 Controller > 返回页面 1.2.2 ResponseBody 2. 返回 HTML 2.1 RequestMapping 2.1.1 produces(修改响应的 Content-Type) 2.1.2 其他属性 3. 返回 JSON 4. 设置状态码 4.1 HttpSer…

开篇:吴恩达《机器学习》课程及免费旁听方法

课程地址: Machine Learning | Coursera 共包含三个子课程 Supervised Machine Learning: Regression and Classification | Coursera Advanced Learning Algorithms | Coursera Unsupervised Learning, Recommenders, Reinforcement Learning | Coursera 免费…

【C++】模板(进阶)

本篇我们来介绍更多关于C模板的知识。模板初阶移步至:【C】模板(初阶) 1.非类型模板参数 1.1 非类型模板参数介绍 模板参数可以是类型形参,也可以是非类型形参。类型形参就是我们目前接触到的一些模板参数。 //类型模板参数 …

快手SDK接入错误处理经验总结(WebGL方案)

1、打包时提示Assets\WebGLTemplates\ks路径下未找到Index.html文件错误 处理方法:直接使用Unity默认模板下的Index.html文件即可 文件所在路径:Unity安装路径\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\WebGLTemplates\Default 参考图&a…

用edge浏览器追剧音量太小?安装音量增强器可解忧

0 源起 春节佳节将至,可以利用这个难得的假期追一追想看而没空看的剧了。 但是在用Edge浏览器播放网页中的视频时,有时音量太小,根本没法听清楚, 遇到这种情况时,尽管Edge浏览器本身没有提供音量控制功能&#xff0…

Alluxio 联手 Solidigm 推出针对 AI 工作负载的高级缓存解决方案

作者:Wayne Gao, Yi Wang, Jie Chen, Sarika Mehta Alluxio 作为全球领先的 AI 缓存解决方案供应商, 提供针对 GPU 驱动 AI 负载的高速缓存。其可扩展架构支持数万个节点,能显著降低存储带宽的消耗。Alluxio 在解决 AI 存储挑战方面的前沿技…

Excel 技巧15 - 在Excel中抠图头像,换背景色(★★)

本文讲了如何在Excel中抠图头像,换背景色。 1,如何在Excel中抠图头像,换背景色 大家都知道在PS中可以很容易抠图头像,换背景色,其实Excel中也可以抠简单的图,换背景色。 ※所用头像图片为百度搜索&#x…

JavaScript笔记基础篇03——函数

黑马程序员视频地址:黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes 目录 函数 函数的使用 1.函数的声明语法 2.函数的…