《ROS2 机器人开发 从入门道实践》 鱼香ROS2——第2、3章内容

学习《ROS2 机器人开发 从入门道实践》 鱼香ROS2,增加了代码解析

目录

第2章 节点

2.1 第一个节点

2.1.1 第一个python节点

2.1.2 第一个Cpp节点

第3章 订阅和发布——话题通信探索

3.2 Python话题订阅和发布

3.2.1 通过话题发布小说

3.2.2 订阅小说并合成语音

3.3 C++话题订阅与发布

3.3.1 发布速度控制海龟画圆

3.3.2 订阅Pose实现闭环控制

3.4.2 自定义通信接口

3.4.3系统信息获取与发布

3.4.4 在功能包中使用Qt

3.4.5 订阅数据并用Qt显示


第2章 节点

2.1 第一个节点

2.1.1 第一个python节点

ros2_python_node.py

import rclpy
from rclpy.node import Node

def main():
    # 初始化,分配资源
    rclpy.init()
    node = Node('python_node')
    node.get_logger().info('你好 python_node')
    node.get_logger().warn('你好 python_node')#警告级别的日志
    rclpy.spin(node)#运行节点,需要主动退出
    rclpy.shutdown()#退出节点时,清理

#判断当前文件是否是当前文件
if __name__=='__main__':
    main()
# 修改终端中 日志输出内容
export RCUTILS_CONSOLE_OUTPUT_FORMAT=[{function_name}:{line_number}]:{message}
2.1.2 第一个Cpp节点

vscode添加路径,防止头文件报错

或在左侧目录中.vscode中添加

第3章 订阅和发布——话题通信探索

3.2 Python话题订阅和发布

3.2.1 通过话题发布小说
import rclpy
from rclpy.node import Node
import requests # Python库,用于发送HTTP请求,在本代码中用于从指定的URL获取小说内容。
# 这定义了一个简单的字符串消息类型,用于在ROS2的话题通信中传递小说的每一行内容。
from example_interfaces.msg import String 
from queue import Queue # 用于创建一个队列数据结构,用来临时存放下载下来的小说内容。

class NovelPubNode(Node):
    def __init__(self, node_name):
        super().__init__(node_name)
        self.get_logger().info(f'创建队列,存放小说')
        self.novels_queue_ = Queue()
        self.get_logger().info(f'创建话题发布者,发布小说')
        # 发布String类型的消息到名为novel的话题上
        self.novels_publisher_ = self.create_publisher(String, 'novel', 10) 
        self.get_logger().info(f'创建定时器, 每隔1s执行回调函数')
        self.timer_ = self.create_timer(1, self.timer_callback)

    def download_novel(self, url):
        response = requests.get(url)
        response.encoding = 'utf-8'
        self.get_logger().info(f'下载完成,网址是: {url}')
        # 按行分割,放入队列
        for line in response.text.splitlines():
            self.novels_queue_.put(line)

    def timer_callback(self):
        print('进入timer_callback')
        print('self.novels_queue_.qsize()', self.novels_queue_.qsize())
        # 队列中有数据,则取出一行进行发布
        if self.novels_queue_.qsize() > 0: # 返回队列的大小
            # 实例化一个消息
            msg = String()
            # 对消息结构体进行赋值
            # .get()从队列中取出一行小说内容并从队列开始删除
            msg.data = self.novels_queue_.get() 
            self.novels_publisher_.publish(msg)
            self.get_logger().info(f'发布了一行小说, 内容是:{msg.data}')
        else :
            print('self.novels_queue_.qsize()', self.novels_queue_.qsize())

def main():
    rclpy.init()
    node = NovelPubNode('novel_pub')
    print('下载小说,需要运行服务器')
    node.download_novel('http://0.0.0.0:8000/novel1.txt')
    rclpy.spin(node)
    rclpy.shutdown()

    # 运行服务器 python3 -m http.server
    # 存入内容 echo "第一章 111111111111111111"> novel1

运行结果

~/yuxiangros2/chapt3/topic_ws$ ros2 run demo_python_topic novel_pub_node 
[INFO] [1732025647.586853531] [novel_pub]: 创建队列,存放小说
[INFO] [1732025647.587221664] [novel_pub]: 创建话题发布者,发布小说
[INFO] [1732025647.588936405] [novel_pub]: 创建定时器, 每隔1s执行回调函数
下载小说,需要运行服务器
[INFO] [1732025647.591781736] [novel_pub]: 下载完成,网址是: http://0.0.0.0:8000/novel1.txt
进入timer_callback
self.novels_queue_.qsize() 21
[INFO] [1732025648.589867623] [novel_pub]: 发布了一行小说, 内容是:第1章 111111111111111111
进入timer_callback
self.novels_queue_.qsize() 20
[INFO] [1732025649.589894541] [novel_pub]: 发布了一行小说, 内容是:第2章 222222222222222222
进入timer_callback
self.novels_queue_.qsize() 19
[INFO] [1
### 关于ROS 2机器人开发入门实践学习资源 对于希望深理解和掌握ROS 2机器人开发的人来说,《ROS2 机器人开发入门实践》是一本非常有价值的书籍,特别是其中鱼香ROS2——第2、3内容提供了丰富的理论基础和实际操作指导[^5]。 #### 获取官方文档和支持材料 除了上述书籍外,官方文档始终是最权威的信息来源之一。通过访问ROS官方网站可以获取最新的API说明和技术支持。此外,参与社区论坛交流也是解决问题的有效途径。 #### 利用手册与在线课程 许多开发者分享了自己的经验总结成的手册或是录制成了视频教程发布在网络上。例如,“ROS机器人开发实践资料下载”的项目地址提供了一系列实用工具包以及案例研究供初学者参考[^1]。 #### 学习创建简单的Python/C++节点 为了更好地理解如何构建基于ROS的应用程序,可以从编写基本的消息传递逻辑开始练习。下面是一个简单的Python版本示例: ```python import rclpy from rclpy.node import Node def main(): # 初始化并分配资源给新启动的进程 rclpy.init() # 创建名为'python_node'的新实例对象 node = Node('python_node') # 输出调试信息至控制台 node.get_logger().info('你好 python_node') # 设置警告级别日志记录 node.get_logger().warn('你好 python_node') try: # 进循环等待事件触发直到手动终止程序 rclpy.spin(node) finally: # 清理工作完成后关闭连接 rclpy.shutdown() if __name__ == '__main__': main() ``` 同样地,在C++环境下也可以实现相似功能,具体配置方法如下所示: ```cmake # CMakeLists.txt 文件中的部分内容展示 cmake_minimum_required(VERSION 3.8) project(ros2_node) find_package(rclcpp REQUIRED) add_executable(ros2_node src/ros2_cpp_node.cpp) target_include_directories( ros2_node PRIVATE ${rclcpp_INCLUDE_DIRS} ) target_link_libraries( ros2_node PRIVATE ${rclcpp_LIBRARIES} ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值