ROS暑期学校分享-2023

云课的优势

https://gitcode.net/ZhangRelay/cocubesim

网络编程和单机编程

网络编程和单机编程是两种不同的编程方式,它们的主要区别在于其应用场景和实现技术上。

1 应用场景

网络编程主要用于构建基于互联网的应用程序,例如Web应用程序、网上购物平台、在线游戏等。这些应用程序需要通过网络与远程服务器进行数据交换,因此需要使用网络编程技术来实现数据的传输和通信。

单机编程则主要用于构建基于本地的应用程序,例如桌面应用程序、游戏本地mod、本地数据分析工具等。这些应用程序不需要通过网络与远程服务器进行数据交换,而是在本地计算机上直接处理数据。

2 实现技术

网络编程的实现技术主要包括TCP/IP协议、HTTP协议、FTP协议等。这些协议规定了数据如何在网络中传输和通信,因此网络编程需要使用相应的协议来实现数据交换和通信。

单机编程的实现技术则包括本地数据库、文件系统、操作系统API等。这些技术用于在本地计算机上处理和存储数据,不需要通过网络进行数据交换。

3 编程语言

网络编程可以使用各种编程语言,例如Java、Python、C++、JavaScript等。这些语言都有相应的网络编程库和框架,可以方便地实现网络编程。

单机编程也可以使用各种编程语言,例如Java、C++、Python等。这些语言也有相应的本地编程库和框架,可以方便地实现单机编程。

总的来说,网络编程和单机编程都有其各自的应用场景和实现技术。在选择编程方式时,需要根据实际需求和应用场景来选择合适的编程方式。

分布思维和集中思维

分布思维和集中思维是两种不同的思维方式,对于ROS编程来说,它们有一定的差异。

分布思维是指将问题分解为多个部分,然后分别考虑每个部分的特点和解决方案,最终综合得出整体的解决方案。在ROS编程中,分布思维表现为将机器人系统分解为多个组件,如传感器、控制器、执行器等,然后分别考虑每个组件的功能和实现方式,最终通过ROS架构将这些组件组合成一个完整的系统。

集中思维则是指将问题看作一个整体,从整体角度出发考虑问题的解决方案。在ROS编程中,集中思维表现为将机器人系统看作一个整体,考虑系统的整体功能和目标,然后设计并实现一个完整的控制系统架构,将各个组件集成起来实现整体控制。

因此,分布思维和集中思维在ROS编程中的差异在于思考问题的角度和方法不同。分布思维更注重将问题分解为多个部分,分别考虑每个部分的解决方案,而集中思维更注重从整体角度考虑问题的解决方案。两种思维方式都有其优点和缺点,具体应用时需要根据实际情况选择合适的的方式。

真实案例

人工智能助力

M5ATOMS3基础03给ROS1发一个问候(rosserial)

官方代码:

#!/usr/bin/env python
# license removed for brevity
import rospy
from std_msgs.msg import String

def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10hz
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

这段代码是一个使用Python编写的ROS节点,它可以向ROS网络发布"hello world"消息。

以下是代码的功能解释:

  1. #!/usr/bin/env python:这是一个shebang,用于指定脚本使用的解释器。在这里,它告诉操作系统使用Python解释器来执行这个脚本。
  2. license removed for brevity:这一行被注释掉,表示代码中没有包含任何许可证信息。
  3. import rospy:导入ROS库,用于与ROS系统进行通信。
  4. from std_msgs.msg import String:从ROS标准消息库中导入String消息类型,用于发布和订阅消息。
  5. def talker()::定义一个名为talker的函数,用于发布"hello world"消息。
  6. pub = rospy.Publisher('chatter', String, queue_size=10):创建一个发布者对象pub,用于向ROS网络发布String类型的消息,话题名为"chatter",队列大小为10。
  7. rospy.init_node('talker', anonymous=True):初始化ROS节点,并将其命名为"talker",匿名模式(不需要节点名称)。
  8. rate = rospy.Rate(10):创建一个速率对象rate,以10Hz的频率发布消息。
  9. while not rospy.is_shutdown()::进入一个无限循环,直到ROS节点关闭。
  10. hello_str = "hello world %s" % rospy.get_time():创建一个包含当前时间的字符串变量hello_str,格式为"hello world <当前时间>"。
  11. rospy.loginfo(hello_str):使用ROS的日志系统记录信息,将当前时间字符串打印到日志中。
  12. pub.publish(hello_str):向ROS网络发布当前时间字符串消息。
  13. rate.sleep():等待一段时间,以保持发布频率为10Hz。
  14. if __name__ == '__main__'::检查当前脚本是否作为主程序运行。
  15. try::开始一个异常处理块,用于捕获可能发生的的中断信号。
  16. talker():调用talker函数,开始发布消息。
  17. except rospy.ROSInterruptException::捕获ROS中断信号异常,并在异常处理块中执行pass语句,以忽略异常并继续执行。

总体而言,这段代码创建了一个ROS节点,使用发布者将"hello world"消息发布到名为"chatter"的话题中,并以10Hz的频率进行发布。

修改如上Python代码,不发布字符串,发布浮点数。

#!/usr/bin/env python  
# license removed for brevity  
import rospy  
from std_msgs.msg import Float64  
  
def talker():  
    pub = rospy.Publisher('chatter', Float64, queue_size=10)  
    rospy.init_node('talker', anonymous=True)  
    rate = rospy.Rate(10) # 10hz  
    while not rospy.is_shutdown():  
        hello_float = 3.14  # 定义一个浮点数  
        rospy.loginfo(hello_float)  
        pub.publish(hello_float)  
        rate.sleep()  
  
if __name__ == '__main__':  
    try:  
        talker()  
    except rospy.ROSInterruptException:  
        pass

在上述代码中,发布了浮点数3.14。同时,为了匹配浮点数的数据类型,将消息类型由String改为Float64,并在from std_msgs.msg中导入Float64。相应的,代码中的rospy.loginfo()也记录了这个浮点数。


ros2 run demo_nodes_py talker
ros2 run demo_nodes_py listener


猜你喜欢

转载自blog.csdn.net/ZhangRelay/article/details/132004291