引言

今天开始记录ros2的学习过程,首先从最基本的使用python搭建ros系统开始。

创建功能包

1、使用ros系统进行开发,首先要定义功能包,功能包,顾名思义,就是一个功能模块的集合地,与此功能相关的所有文件都会放到这个功能包中,当我们使用python系统新建功能包的时候,可以运行如下指令

ros2 pkg create my_ros2 --build-type ament_python --dependencies rclpy
复制

上述代码中的--build-type ament_python的意思就是指定这个功能包是用python编写的,相应地,在执行上述命令之后,就会生成一个名为my_ros2的功能包。我们查看这个功能包的组成结构:

这里的resource、setup.py都是在加了--build-type ament_python之后才出现的,而且并没有cmakelist出现,这让我感到很奇怪,但是事实上还是可以运行的。具体的大家也可以看这个链接https://www.cnblogs.com/tangjunjun/p/16796367.html

这个帖子里写可以用colcon build --symlink-install开实现python代码的改动后实时生效,还是很有用的技巧。

节点编写

1、

在使用python编写ros的过程中,必须要实现的几个步骤为:

1)rclpy.init()

2) node = 你定义的ros类

3) rclpy.spin(node)

4) node.destory_node()

5) rclpy.shutdown()

其中的spin(n)意思就是使你的节点按照你希望的方式运行

上面的这几行代码放置的位置需要是这个节点的入口函数,入口函数的指定是在setup.py文件中,例如:

当然,当在一个功能包里有很多python写的node的时候,就需要在这个位置写好几行指定的节点名以及节点位置,用‘,’分隔

2、

说完了一些固定的配置,接下来我们来看一个最基本的ros节点应该如何编写:

按照不同功能,可以将整个代码分成如下几个部分:

1)init函数

class my_ros(Node):
    def __init__(self):
        super(my_ros,self).__init__("test_node")

在这里需要将Node继承,然后同时调用继承的Node的init函数,并输入参数,随意指定一个名字就可以

2)定义参数

        params = {
            "a":1,
            "b":2,
            "c":3
        }
        self.declare_parameters(namespace='',parameters=params.items())

这里需要注意的地方有两点,1是declare_parameters一定要有s,要不就是声明单个参数;2params在定义的时候是通过字典定义的,在定义多个参数的时候需要写成元组列表的形式

3)获取参数

(d,e,f) = self.get_parameters(["a","b","c"])

4)打印参数

        self.get_logger().info(f"{d.value,e.value,f.value}")
        print(d.value,e.value,f.value)

得到的结果是

3、整个代码如下:

from rclpy.node import Node
import rclpy
class my_ros(Node):
    def __init__(self):
        super(my_ros,self).__init__("test_node")
        params = {
            "a":1,
            "b":2,
            "c":3
        }
        self.declare_parameters(namespace="",parameters=params.items())
        (d,e,f) = self.get_parameters(["a","b","c"])
        self.get_logger().info(f"{d.value,e.value,f.value}")
        print(d.value,e.value,f.value)

def ros_entry():
    rclpy.init()
    node = my_ros()
    rclpy.spin(node)
    node.destory_node()
    rclpy.shutdown()

其他

当在colcon build --symlink-install 时可能会警告

这个时候只需要按照他说的,把setup.cfg文件修改成提示的名字就可以。

May the force be with you!