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

ROS2 学习笔记

Startup

安装

wget http://fishros.com/install -O fishros && bash fishros

请添加图片描述

  • humble:稳定版本
  • rolling:持续更新版本

文档:ros2版本文档

在安装完成之后,可以输入 ros2 来检查是否安装成功。

海龟模拟器

打开一个终端输入ros2 run turtlesim turtlesim_node
采用键盘控制海龟移动,打开一个新的终端输入 ros2 run turtlesim turtle_teleop_key (上下左右键),
再打开一个终端,输入 rqt (ros2 自带的图形开发工具)点击 Plugins -> Introspection -> Node Graph 可以查看当前的节点图。
请添加图片描述

/teleop_turtle 节点和 /turtlesim 节点之间通过了 /turtle1/cmd_vel 话题进行了通讯,也就是可以通过键盘控制的窗口控制了海龟的移动。

常见指令

echo $ROS_VERSION # 打印ros的版本
echo $ROS_DISTRO  # 打印ros的发行版本

节点

编写第一个节点

运行该代码后,可通过 ros2 node list 查看节点。可以通过修改环境变量的方式控制输出的内容 export RCUTILS_CONSOLE_OUTPUT_FORMAT=[{function_name}:{line_number}]:{message}

import rclpy
from rclpy.node import Nodedef main():rclpy.init() # 初始化node = Node("python_node") # 节点名字# [日志级别] [1970年到现在经过的秒数] [节点名称] :打印的内容node.get_logger().info('你好 Python 节点!') # info级别日志 呈现白色node.get_logger().warn('你好 Python 节点!') # 警告级别日志 呈现黄色rclpy.spin(node)rclpy.shutdown()if __name__ == "__main__":main()

如果遇到 version GLIBCXX_3.4.30‘ not found 问题,先查看系统和anaconda环境下是否有 libstdc++.so 以及他们对应的 GLIBC 版本(ls -al xx)

strings /usr/lib/x86-linux-gnu/libstdc++.so.6 | grep GLIBC
strings /home/xx/anaconda3/envs/xx/lib/libstdc++.so.6 | grep GLIBC

如果anaconda底下的 libstdc++.so 以及 libstdc++.so.6 指向的版本比系统低(通常anaconda3指向 libstdc++.so.6.0.29 而系统最高是 libstdc++.so.6.30)那么通过删除原来的,建立软连接修复即可。

ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 libstdc++.so.6
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 libstdc++.so

使用功能包

使用 ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg 创建功能包。
–build-type 默认是 cmake,使用python必须手动指定。

功能包结构包含:节点代码目录(与功能包名字一致)、resource(功能包标识)、test(测试代码目录)、LICENSE(许可证)、package.xml(功能包的清单文件)、setup.cfg(python包的配置选项)、setup.py(功能包的构建脚本)。

请添加图片描述
创建完功能包后,可以在 demo_python_pkg/demo_python_pkg/ 下编写节点文件代码函数同上。
在 setup.py 中修改 entry_points为如下:

entry_points={'console_scripts': ['python_node = demo_python_pkg.python_node:main' # 包名字.文件名字.函数],
}

由于代码中使用了 rclpy 这个库,需要在 package.xml 中声明,添加 <depend>rclpy<depend>
在这之后,通过 colcon 构建功能包:colcon build

注意:运行的是拷贝到 install 里面的文件,每次修改代码后需要重新构建或者构建软链接!
因为python是解释执行的,所以install下是py文件。如果是c++,则是二进制文件。

执行 source install/setup.bash 修改了环境变量,输入 ros2 run demo_python_pkg python_node 运行。

多线程与回调函数

注:在ros2中每个节点默认在一个线程中执行

在终端执行 echo "第一章 少年踏上休闲路" > novel1.txtecho "第二章 学习修仙,马上升天" > novel2.txtecho "第三章 女大三千,位列仙班" > novel3.txt 并上传至本地网页 python3 -m http.server

import requests
import threadingclass Download:def download(self, url, callback_word_count):	print(f"线程:{threading.get_ident()} 开始下载:{url}")response = requests.get(url)response.encoding = 'utf-8'callback_word_count(url, response.text) # 调用回调函数def start_downloading(self, url, callback_word_count):thread = threading.Thread(target=self.download, args=(url, callback_word_count)) # 创建线程thread.start() # 启动线程def word_count(url, result):print(f"{url}:{len(result)}->{result[:5]}")def main():download = Download()download.start_downloading("http://0.0.0.0:8000/novel1.txt", word_count)
download.start_downloading("http://0.0.0.0:8000/novel1.txt", word_count)
download.start_downloading("http://0.0.0.0:8000/novel1.txt", word_count)

然后在终端执行以下代码:

cd chapt2/chapt2_ws/
colcon build
source install/setup.bash
ros2 run demo_python_pkg learn_thread

话题

使用 ros2 run turtlesim turtlesim_node 启动海龟模拟器,可通过 ros2 node list 查看节点名字,再通过 ros2 node info /turtlesim 查看节点的详细信息,包括节点的发布和订阅等。可以看出 /turtle1/pose 是小海龟的实时位姿信息 ros2 topic echo /turtle1/pose。也可以通过 ros2 topic info xx 来查看是订阅者还是发布者。
可以查看每个节点下的话题信息,比如 ros2 topic info /turtle1/cmd_vel,对于显示的 type 类型,则用 ros2 interface show geometry_msgs/msg/Twist,对此,则是显示了角速度和线速度的信息。
结合以上信息,我们就可以向其进行发布数据,控制海龟移动。ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.5, y: 0.0}, angular: {z: 0.0}}" (数据格式是 yaml 格式!)

Reference

  1. B 站视频
  2. 鱼香ros论坛
http://www.dtcms.com/a/324665.html

相关文章:

  • 基于百度地图API的社区地图展示技术实现
  • 初识STL
  • ADB简介
  • 【redis初阶】--------Set 集合类型
  • Baumer高防护相机如何通过YoloV8深度学习模型实现道路坑洼的检测识别(C#代码UI界面版)
  • Linux操作系统从入门到实战(十六)冯诺依曼体系结构,操作系统与系统调用和库函数概念
  • API 接入终极指南:实时掌握京东商品动态
  • openpnp - 顶部相机如果超过6.5米影响通讯质量,可以加USB3.0信号放大器延长线
  • SpringAI报错:com.github.victools.jsonschema.generator.AnnotationHelper
  • 北京-4年功能测试2年空窗-报培训班学测开-第七十二天
  • Langchain入门:构建一个本地RAG应用
  • 《Go小技巧易错点100例》第三十七篇
  • 深度解析Linux设备树(DTS):设计原理、实现框架与实例分析
  • 阿里云ECS云服务器临时升级带宽方法
  • JP3-4-MyClub后台前端(三)
  • 胖虎的菜品
  • 一劳永逸解决Mayplotlib绘图中中文字体显示乱码的问题
  • 嵌入式软件分层架构的设计原理与实践验证(有限状态机理解及结构体封装理解)
  • 进度、质量、安全的关系随笔
  • 力扣面试150(52/150)
  • NY155NY170美光固态闪存NY175NY184
  • Zabbix优化指南:提升监控效率与性能
  • Pytorch深度学习框架实战教程-番外篇07-Pytorch优化器详解和实战指南
  • 机器学习——DBSCAN
  • 【人工智能99问】LLaMA的训练过程和推理过程是怎么样的?(22/99)
  • 【GPT入门】第43课 使用LlamaFactory微调Llama3
  • AI大模型提示词工程完全指南:从入门到精通
  • 【自用】JavaSE--IO流(二)--缓冲流、转换流、打印流、数据流、序列化流、IO框架
  • 硬件开发_基于STM32单片机的智能电梯系统
  • 【RocketMQ 生产者和消费者】- ConsumeMessageConcurrentlyService 并发消费消息