1、统计常用端口、已占端口、预留端口、一般建议端口
常用端口
1.TCP/UDP 11311: 这个端口是 ROS 1 的默认主机端口,但在 ROS 2 中并不使用。 2.UDP 7400-7500: 这些端口用于 ROS 2 的默认 DDS(Data Distribution Service)实现,特别是 Fast DDS。 3.TCP/UDP 50051: 用于 gRPC 服务,ROS 2 的某些服务和工具可能会用到这个端口。
已占端口 要统计当前系统中已占用的端口,可以使用以下命令:
sudo lsof -i -P -n | grep LISTEN
这将列出所有正在监听的端口及其对应的服务。为了更具体地查看某个端口是否被占用,可以使用:
sudo lsof -i:<port_number>
例如,检查 11311 端口:
sudo lsof -i:11311
预留端口 预留端口通常指的是操作系统或某些关键服务默认保留的端口,例如:
4.0-1023: 系统保留端口(也称为特权端口),通常只有根用户才能绑定。 5.22: SSH 6.80: HTTP 7.443: HTTPS
这些端口不建议被普通应用程序使用,因为它们通常分配给标准服务和协议。 一般建议端口 对于自定义的 ROS 2 节点和服务,建议使用非特权端口,通常是 1024-49151 范围内的端口。以下是一些建议:
8.49152-65535: 动态端口(也称为临时端口),通常用于客户端连接。避免在这个范围内分配固定的服务端口。 9.1024-49151: 注册端口,适合自定义服务和应用。 10.11311: 虽然这个端口是 ROS 1 的默认端口,但可以用于其他非冲突服务。 11.5000-5100: 一些开发者常用的范围,可以根据实际需要自定义。
管理和分配端口的建议
12.避免冲突:在配置 ROS 2 系统时,确保所选端口没有与其他关键服务冲突。 13.文档化:将使用的端口记录在项目文档中,以便于后续维护和配置。 14.监控:定期检查系统中已占用的端口,使用如 lsof 和 netstat 等工具。
通过以上方法和建议,可以有效地管理和使用 ROS 2 系统中的端口,从而保证系统的稳定性和安全性。
2、配置launch的cmake.txt配置
"CMake install directive": { "prefix": "ros2_launch_install", "body": [ "install(DIRECTORY launch DESTINATION share/\\${PROJECT_NAME})" ], "description": "Install a directory named 'launch' to 'share/<project_name>'" },
3、总结重命名问题的解决语法
3.1 节点重命名
3.1.1 利用run
设置命名空间
ros2 run turtlesim turtlesim_node --ros-args --remap __ns:=/t1
起别名
ros2 run turtlesim turtlesim_node --ros-args --remap __name:= turt1
同时设置命名空间起别名
ros2 run turtlesim turtlesim_node --ros-args --remap __ns:=/t2 --remap __name:=turt2
3.1.2 利用launch
Python
from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node(package="turtlesim",executable="turtlesim_node",name="turtle1"), Node(package="turtlesim",executable="turtlesim_node",namespace="t1"), Node(package="turtlesim",executable="turtlesim_node",namespace="t1", name="turtle1") ])
XML
<launch> <node pkg="turtlesim" exec="turtlesim_node" name="turtle1" /> <node pkg="turtlesim" exec="turtlesim_node" namespace="t1" /> <node pkg="turtlesim" exec="turtlesim_node" namespace="t1" name="turtle1" /> </launch>
YAML
launch: - node: pkg: turtlesim exec: turtlesim_node name: turtle1 - node: pkg: turtlesim exec: turtlesim_node namespace: t1 - node: pkg: turtlesim exec: turtlesim_node namespace: t1 name: turtle1
3.1.3 在代码中编写
改节点名和命名空间方法
class MyNode : public rclcpp::Node { public: MyNode() : Node("my_node", "my_namespace") // 设置节点名称和命名空间
3.2 话题重命名
3.2.1 利用run
设置命名空间
ros2 run turtlesim turtlesim_node --ros-args --remap __ns:=/t1
重映射
ros2 run turtlesim turtlesim_node --ros-args --remap /turtle1/cmd_vel:=/cmd_vel
3.2.2 利用launch
PYthon
from launch import LaunchDescription from launch_ros.actions 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")] ) ])
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>
YML
launch: - node: pkg: turtlesim exec: turtlesim_node namespace: t1 - node: pkg: turtlesim exec: turtlesim_node remap: - from: "/turtle1/cmd_vel" to: "/cmd_vel"
3.2.3 编码
3.2.3.1 全局话题
C++
publisher_ = this->create_publisher<std_msgs::msg::String>("/topic/chatter", 10);
PY
self.publisher_ = self.create_publisher(String, '/topic/chatter', 10)
3.2.3.2 相对话题
C++
publisher_ = this->create_publisher<std_msgs::msg::String>("topic/chatter", 10);
PY
self.publisher_ = self.create_publisher(String, 'topic/chatter', 10)
3.2.3.3 私有话题
C++
publisher_ = this->create_publisher<std_msgs::msg::String>("~/topic/chatter", 10);
PY
self.publisher_ = self.create_publisher(String, '~/topic/chatter', 10)