文章目录:
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官网