实验目的:
参数相关API函数使用;
服务端实现对参数的增、查、改、删操作
1、创建工作空间
请参考:ROS2 话题通信——自定义消息类型(Python)-CSDN博客
2、创建功能包
创建服务功能包param_pkg,新建参数API使用节点param_api.py
cd text_ws/src/
ros2 pkg create param_pkg --build-type ament_python --dependencies rclpy --node-name param_api
3、编写param_api节点并测试
import rclpy #导入包
from rclpy.node import Node
class ParamNode(Node):
def __init__(self):
super().__init__("param_node")
self.get_logger().info("参数API使用!")
#创建参数
p1 = rclpy.Parameter("car_name",value="tiger")
p2 = rclpy.Parameter("widht",value=1.5)
p3 = rclpy.Parameter("wheels",value=2)
#解析参数
self.get_logger().info("car_name = %s" % p1.value)
self.get_logger().info("widht = %s" % p2.value)
self.get_logger().info("wheels = %s" % p3.value)
self.get_logger().info("key = %s" % p1.name)
def main():
#初始化ROS2客户端
rclpy.init()
#创建对象
node = ParamNode()
#释放资源
rclpy.shutdown()
if __name__ == '__main__':
main()
编译测试一下
cd ..
colcon build --packages-select param_pkg
source install/setup.bash
ros2 run param_pkg param_api
测试成功
4、参数服务端和参数客户端实现
新建param_server.py文件,并修改setup.py文件
from setuptools import find_packages, setup
package_name = 'param_pkg'
setup(
name=package_name,
version='0.0.0',
packages=find_packages(exclude=['test']),
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='saw',
maintainer_email='saw@todo.todo',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'param_api = param_pkg.param_api:main',
'param_server = param_pkg.param_server:main'
],
},
)
编写参数服务端
import rclpy #导入包
from rclpy.node import Node
class ParamServer(Node):
def __init__(self):
#如果需要删除参数,需要提前声明allow_undeclared_parameters
super().__init__("param_server_node",allow_undeclared_parameters=True)
self.get_logger().info("参数服务端")
#增
def declare_param(self):
self.get_logger().info("------------------增-------------------")
self.declare_parameter("car_name","tiger")
self.declare_parameter("width",1.5)
self.declare_parameter("wheels",5)
#查
def get_param(self):
self.get_logger().info("------------------查-------------------")
#获取指定参数
car_name = self.get_parameter("car_name")
self.get_logger().info("%s = %s "%(car_name.name,car_name.value))
#获取多个参数
params = self.get_parameters(["car_name","width","wheels"])
for param in params:
self.get_logger().info("%s ===== %s "%(param.name,param.value))
#判断是否包含
self.get_logger().info("是否包含 car_name : %d "%self.has_parameter("car_name"))
self.get_logger().info("是否包含 height : %d "%self.has_parameter("height"))
#改
def update_param(self):
self.get_logger().info("------------------改-------------------")
self.set_parameters([rclpy.Parameter("car_name",value="pig")])
car_name = self.get_parameter("car_name")
self.get_logger().info("修改后 %s = %s "%(car_name.name,car_name.value))
#删
def del_param(self):
self.get_logger().info("------------------删-------------------")
self.undeclare_parameter("car_name")
self.get_logger().info("删除后是否包含 car_name : %d "%self.has_parameter("car_name"))
def main():
#初始化ROS2客户端
rclpy.init()
#创建对象
node = ParamServer()
#增查改删
node.declare_param()
node.get_param()
node.update_param()
node.del_param()
rclpy.spin(node)
#释放资源
rclpy.shutdown()
if __name__ == '__main__':
main()
由于ROS2没有封装Python的参数相关类,所以这里不编写参数客户端
5、测试
在终端编译并测试一下
colcon build --packages-select param_pkg
source install/setup.bash
ros2 run param_pkg param_server
测试成功。