2. ROS常用命令和节点编写

2.1 常用命令

命令功能
roscore启动rosmaster
rosrun 功能包名 节点名(.py)运行某个节点(py节点)
roslaunch 功能包名 launch文件名运行该launch文件
rospack find 包名称查找该包的目录
rostoplic list列出当前话题
rostopic echo 话题名打印话题消息
rostopic info 话题名查看某话题的信息
rostopic hz 话题名查看某话题发送频率
rostopic type 话题名查看该话题消息类型
rosbag recode -a录制当前所有话题
rosbag recode -O 某个bag文件 某话题将特定话题录制到该bag文件中
rostopic pub [话题名] [消息类型] 消息发布话题

2.2 使用C++编写节点

2.2.1 发布话题的节点

#include<sstream>
#include"ros/ros.h"
#include"std_msgs/String.h"

int main(int argc,char** argv){
    //ROS节点初始化
    ros::init(argc,argv,"talker");  //talker是发布者节点名称
    //创建节点句柄 用于管理
    ros::NodeHandle n;
    //创建一个publisher,发布名为chatter的topic,消息类型为std_msgs::string
    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000);  //chatter为发布的话题名 1000为发布长度

    //设置循环的频率10hz 100ms
    ros::Rate loop_rate(10);

    int count = 0;
    while(ros::ok()){

        //初始化std_msgs::String类型的消息
        std_msgs::String msg;
        std::stringstream ss;
        ss<<"hello world!"<<count;
        msg.data = ss.str();
        //发布消息
        ROS_INFO("%s",msg.data.c_str());   // .c_str()字符串化
        chatter_pub.publish(msg);
        //循环等待回调函数
        ros::spinOnce();
        //按照循环频率延时
        loop_rate.sleep();
        ++count;
    }
    return 0;
}

2.2.2 接收话题节点编写

//订阅chatter话题 类型为String
#include"ros/ros.h"
#include"std_msgs/String.h"

//接收到订阅的消息后,会进入消息回调函数
void chatterCallback(const std_msgs::String::ConstPtr& msg){
    //将接收到的消息打印出来
    ROS_INFO("I heard:[%s]", msg->data.c_str());

}
int main(int argc,char** argv){

    //初始化ROS节点
    ros::init(argc,argv,"listener");
    //创建节点句柄
    ros::NodeHandle n;
    //创建一个Subscriber,订阅名为chatter的topic 注册回调函数chatterCallback
    ros::Subscriber sub = n.subscribe("chatter",1000,chatterCallback);
    //循环等待回调函数
    ros::spin();
    return 0;
}

2.3 使用python编写节点

2.3.1 使用python编写话题发布节点

import rospy
from std_msgs.msg import String
 
def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10hz
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()
 
if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

2.3.2 使用python编写话题订阅节点

import rospy
from std_msgs.msg import String
 
def callback(data):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
    
def listener():
 
    # In ROS, nodes are uniquely named. If two nodes with the same
    # node are launched, the previous one is kicked off. The
    # anonymous=True flag means that rospy will choose a unique
    # name for our 'listener' node so that multiple listeners can
    # run simultaneously.
    rospy.init_node('listener', anonymous=True)
 
    rospy.Subscriber("chatter", String, callback)
 
    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()
 
if __name__ == '__main__':
    listener()

更多教程请前往ROS官网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值