《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] [1732025650
### 关于ROS2服务的鱼香ROS相关信息 在探讨ROS2的服务机制时,可以借助鱼香ROS的相关资料来加深理解。虽然直接提及ROS2服务的具体实现细节较少,但从已有的资源中仍能获取一些有价值的内容。 #### 使用FishProtocol构建服务通信 通过安装并编译FishProtocol库[^2],能够支持更复杂的硬件交互需求,这其中包括了基于串口的服务调用方式。尽管这不是传统意义上的ROS2服务定义和服务端/客户端模式的例子,但是它展示了如何利用自定义协议扩展ROS2的功能集,从而创建特定应用场景下的服务接口。 #### 实践中的应用案例 当涉及到实际项目实践时,在《MOMO的鱼香ROS2》系列教程中有提到过关于编写简单的发布订阅程序[^1]。这些基础概念同样适用于理解和设计更为复杂的服务架构。例如: - 创建一个名为`example_service_node.py`的服务节点文件: ```python import rclpy from example_interfaces.srv import AddTwoInts def handle_add_two_ints(request, response): response.sum = request.a + request.b return response def main(args=None): rclpy.init(args=args) node = rclpy.create_node('add_two_ints_server') srv = node.create_service(AddTwoInts, 'add_two_ints', handle_add_two_ints) while rclpy.ok(): rclpy.spin_once(node) if __name__ == '__main__': main() ``` 此代码片段展示了一个非常基本的服务服务器实例,用于处理两个整数相加请求。这种类型的例子可以帮助读者快速掌握ROS2服务的工作原理,并为进一步探索高级主题打下坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值