话题重命名
两种解决策略:
1、名称重映射(为节点起别名)
2、命名空间(为话题名称添加前缀)需要保证话题为非全局话题
三种解决方案:
1、ros2 run 命令实现
2、Launch文件实现
3、编码实现
1.ros2 run 命令实现
1.命名空间:
语法:ros2 run 包名 节点名 --ros-args --remap __ns:=命名空间
eg:
ros2 run turtlesim turtlesim_node --ros-args --remap __ns:=/t1
2.名称重映射:
语法: ros2 run 包名 节点名 --ros-args --remap 原话题名称 :=新话题名称
eg:
ros2 run turtlesim turtlesim_node --remap /turtle1/cmd_vel:=/cmd_vel
2.Launch文件实现
1.Python实现:
from launch import LaunchDesciption from launch_ros.action import Node def generate_launch_description(): return LaunchDescription([ Node(package = "turtlesim",executable = "turtlesim_node",namespace = "t1"), Node(package = "turtlesim",executable = "turtlesim_node",remappings = ["/turtle1/cmd_vel","cmd_vel"]) ])
2.XML实现:
<launch> <node pkg = "turtlesim",exec = "turtlesim_node",namespace = "t1" /> <node pkg ="turtlesim",exec = "turtlesim_node"> <remap from ="turtle1/cmd_vel" to="cmd_vel" /> </node> </launch>
3.YAML实现:
launch: - node: pkg :turtlesim exec:turtlesim_node namespace:t1 - node: pkg :turtlesim exec :turtlesim_node remap: - from:"turtle1/cmd_vel" to:"cmd_vel"
3.编码实现
全局话题(话题参考ROS系统,与节点命名空间平级);
相对话题(话题参考的是节点的命名空间,与节点名称平级);
私有话题(话题参考节点名称,是节点名称的子级)1.全局话题
格式: 定义时以/开头的名称,和命名空间、节点名称无关。
rclcpp:
publisher_ = this->create_publisher<std_msgs::msg::String>("/topic/chatter",10);
rclpy:
self.publisher_ = self.create_publisher(String,"/topic/chatter",10)
2.相对话题
格式:非/开头的名称,参考命名空间设置话题名称,和节点名称无关。
rclcpp:
publisher_ = this->create_publisher<std_msgs::msg::Strign>("topic/chatter",10);
rclpy:
self.publisher_ = self.create_publisher(String,"topic/chatter",10)
3.私有话题
格式:定义时以~/开头的名称,和命名空间、节点名称都有关系。
rclcpp:
publisher_ = this->create_publisher<std_msgs::msg::String>("~/topic/chatter",10);
rclpy:
self.publisher_ = self.create_publisher(String,"~/topic/chatter",10)