引言
今天开始记录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!
评论(1)
您还未登录,请登录后发表或查看评论