在实际应用中,按照逻辑,有些时候可能需要将相同的话题名称设置为不同,也有可能将不同的话题名设置为相同。在ROS中给出的解决策略与节点名称重命类似,也是使用名称重映射或为名称添加前缀。
---------------------------------------------------------------------------------------------------------------------------------
rosrun设置话题重映射
rosrun名称重映射语法:rosrun 包名 节点名 话题名:=新话题名称
乌龟显示节点的话题为:/turtle1/cmd_vel teleop_twist_keyboard节点的话题为:/cmd_vel
方案1:
将 teleop_twist_keyboard 节点的话题设置为/turtle1/cmd_vel
启动键盘控制节点:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/turtle1/cmd_vel
启动乌龟显示节点:rosrun turtlesim turtlesim_node
方案2:
将乌龟显示节点的话题设置为/cmd_vel
启动键盘控制节点:rosrun teleop_twist_keyboard teleop_twist_keyboard.py
启动乌龟显示节点:rosrun turtlesim turtlesim_node /turtle1/cmd_vel:=/cmd_vel
---------------------------------------------------------------------------------------------------------------------------------
launch文件设置话题重映射
launch文件设置话题重映射语法:
<node pkg="xxx" type="xxx" name="xxx">
<remap from="原话题" to="新话题" />
</node>
将teleop_twist_keyboard节点的话题设置为/turtle1/cmd_vel
<!--键盘控制乌龟运动-->
<launch>
<!--将乌龟的话题设置为与键盘控制一致-->
<node pkg="turtlesim" type="turtlesim_node" name="t1" >
<remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
</node>
<node pkg="teleop_twist_keyboard" type="teleop_twist_keyboard.py" name="key" />
<!--将键盘控制话题设置为与乌龟一致-->
</launch>
将乌龟显示节点的话题设置为 /cmd_vel,根据上述代码进行修改即可。
---------------------------------------------------------------------------------------------------------------------------------
编码设置话题名称
话题的名称与节点的命名空间、节点的名称是有一定关系的,话题名称大致可以分为三种类型:
全局(话题参考ROS系统,与节点命名空间平级)
相对(话题参考的是节点的命名空间,与节点名称平级)
私有(话题参考节点名称,是节点名称的子级)
1.全局话题
格式:以/开头的名称,和节点名称无关
示例1:
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter",1000);
结果1:/chatter
示例2:
ros::NodeHandle nh;
ros::Publisher pub=nh.advertise<std_msgs::String>("/yyy/chatter",1000);
结果2:/yyy/chatter
---------------------------------------------------------------------------------------------------------------------------------
2.相对话题
格式:非/开头的名称,参考命令空间来确定话题名称
示例1:
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",1000);
结果1:/xxx/chatter
示例2:
ros::NodeHandle nh;
ros::Publisher pub=nh.advertise<std_msgs::String>("/yyy/chatter",1000);
结果2:/xxx/yyy/chatter
---------------------------------------------------------------------------------------------------------------------------------
3.私有话题
示例1:
ros::NodeHandle nh("~");
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",1000);
结果1:/xxx/hello/chatter
示例2:
ros::NodeHandle nh("~");
ros::Publisher pub = nh.advertise<std_msgs::String>("yyy/chatter",1000);
结果2:/xxx/hello/yyy/chatter
---------------------------------------------------------------------------------------------------------------------------------
注意:当使用~,而话题名称有/开头时,那么话题名称为全局话题。
示例1:
ros::NodeHandle nh("~");
ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter",1000);
结果1:/chatter
#include "ros/ros.h"
#include "std_msgs/String.h"
/*
需求:演示不同类型的话题名称设置
设置话题名称与命名空间
*/
int main(int argc, char *argv[])
{
ros::init(argc,argv,"hello");
//ros::NodeHandle nh;
//核心:设置不同类型的话题
//1.全局 --- 话题名称需要以 / 开头(也可以设置自己的命名空间),这种情况下和节点(命名空间以及名称)没有关系
// ros::Publisher pub=nh.advertise<std_msgs::String>("/chatter",1000);
//$rosrun 功能包名 cmake文件中设置的名称 __ns:=xxx
//rosnode结果:/xxx/hello
//rostopic结果:/chatter
//ros::Publisher pub=nh.advertise<std_msgs::String>("/yyy/chatter",1000);
//$rosrun 功能包名 cmake文件中设置的名称 __ns:=xxx
//rosnode结果:/xxx/hello
//rostopic结果:/yyy/chatter
//2.相对 --- 非 / 开头
// ros::Publisher pub=nh.advertise<std_msgs::String>("chatter",1000);
//$rosrun 功能包名 cmake文件中设置的名称 __ns:=xxx
//rosnode结果:/xxx/hello
//rostopic结果:/xxx/chatter
// ros::Publisher pub=nh.advertise<std_msgs::String>("yyy/chatter",1000);
//$rosrun 功能包名 cmake文件中设置的名称 __ns:=xxx
//rosnode结果:/xxx/hello
//rostopic结果:/xxx/yyy/chatter
//3.私有 --- 需要创建特定ros::NodeHandle nh("~");
ros::NodeHandle nh("~");
// ros::Publisher pub=nh.advertise<std_msgs::String>("chatter",1000);
//$rosrun 功能包名 cmake文件中设置的名称 __ns:=xxx
//rosnode结果:/xxx/hello
//rostopic结果:/xxx/hello/chatter
// ros::Publisher pub=nh.advertise<std_msgs::String>("yyy/chatter",1000);
//$rosrun 功能包名 cmake文件中设置的名称 __ns:=xxx
//rosnode结果:/xxx/hello
//rostopic结果:/xxx/hello/yyy/chatter
//注意:如果私有的NH创建的话题以 / 开头(全局话题),生成的话题是全局的,非私有的
//全局话题优先级更高
ros::Publisher pub=nh.advertise<std_msgs::String>("/yyy/chatter",1000);
//$rosrun 功能包名 cmake文件中设置的名称 __ns:=xxx
//rosnode结果:/xxx/hello
//rostopic结果:/yyy/chatter
while (ros::ok())
{
}
return 0;
}