[ROS]重名问题-话题名称设置1.3

在实际应用中,按照逻辑,有些时候可能需要将相同的话题名称设置为不同,也有可能将不同的话题名设置为相同。在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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值