ros的入门教程链接:
- linux ros安装
- 学前小案例-键盘控制小海龟的移动
- 创建工作空间与功能包
- 发布者publisher
- 订阅者subscriber
ros的基础知识点
不同的linux系统安装的ros版本是不一样的,linux18.04安装melodic,linux20.04安装noetic。
roscore:所有节点运行的管理器
rosrun运行某个功能包某个节点的指令,rosrun后面添加某个功能包的名字和对应编译后的可执行文件的名称。其中可执行文件和节点名字要一致
rqt_graph:显示当前系统运行情况的动态图形,包括当前运行存在的节点、节点之间的消息是怎么样传递的
rostopic echo [topic_name]:指令查看一个话题上发布的消息。其中,topic_name 表示所要查看的话题名字,例如:/lane_data、/object_data
rospack list:查询当前安装完成的所有包文件.当刚编译好的功能包,不能rosrun自动补全功能包名字,则可以用rospack list来更新一下
在ros中,功能包(packages)、节点(nodes)和话题(topics)是三个非常重要的概念,它们之间的关系如下:
- 功能包(packages)
功能包是ros组织代码的基本单元,它将一组相关的文件(如节点、配置文件、编译脚本等)放在一起。使用功能包的好处是可以将不同的ros节点和其他相关文件组合在一起,以便更方便地管理和使用。
- 节点(nodes)
节点是ros运行时的基本单元,每个节点都是一个可执行文件,用于执行特定的任务。例如,节点可以读取传感器数据,控制机器人运动,或者提供某些服务。
- 话题(topics)
话题是实现节点之间的通信,节点可以发布(publish)消息到话题,也可以订阅(subscribe)来自话题的消息。通过话题,节点可以相互交流和协调,实现复杂的应用程序。
话题消息的定义与使用:
- 话题消息定义的作用:确定节点之间的传递消息的类型,例如传递yolo的消息,包括目标的类型、中心点、高宽、置信度等
- 在某个功能包中,创建一个msg文件夹。在该文件夹中,创建保存自定义的数据类型的msg文件
在对于一个非ros的cmakelist.txt中,,除了加上ros中一些必须的头文件和库,在生成的可执行文件的TARGET_LINK_LIBRARIES中添加${catkin_LIBRARIES}
发布者的实现步骤
- 初始化ROS节点,ros::init(argc, argv, “节点名字”); ros::NodeHandle node;
注释:node是用于访问ROS系统的句柄 - 创建一个ROS发布者对象:ros::Publisher chatter_pub = node.advertise<std_msgs::String>(“chatter”, 1000);
注释:"chatter"是话题名称,1000是用于缓存未发送的消息的数量上限。 - 设定发布频率:ros::Rate loop_rate(10);
注释:10表示发布者每秒钟发布的消息数量。 - 发布消息:chatter_pub.publish(msg); loop_rate.sleep();
注释:loop_rate.sleep()方法用于根据我们设定的发布频率使程序暂停相应的时间。
订阅者的实现步骤
- 初始化ROS节点,ros::init(argc, argv, “节点名字”); ros::NodeHandle node;
注释:node是用于访问ROS系统的句柄 - 定义一个订阅者对象,指定要订阅的消息类型及其话题名称: ros::Subscriber sub = n.subscribe<std_msgs::String>(“topic_name”, 1000, callback_function);
注释:<std_msgs::String>表示要订阅的消息类型;"topic_name"是订阅主题的名称;1000是消息队列的长度;callback_function是回调函数,每当订阅到新消息时,都会自动调用这个回调函数来处理消息。 - 编写一个回调函数callback_function,用于处理接收到的消息。
void callback_function(const std_msgs::String::ConstPtr& msg){ROS_INFO("I heard: [%s]", msg->data.c_str());}
注释:msg是收到的消息,可以使用msg->data来获取消息内容。
- 使用ros::spin()函数来让ROS节点保持运行状态,同时处理收到的新消息: ros::spin();
ROS订阅者:当ROS节点启动后,订阅者会开始接收来自话题topic_name的std_msgs::String类型的消息,并通过回调函数callback_function来处理它们。每当新消息到达时,都会自动调用回调函数进行处理,从而实现ROS订阅者的功能。
catkin_init_workspace:创建工作空间
catkin_make:编译工作空间
catkin_make clean:清理工作空间
catkin_create_pkg:创建功能包
当运行ros的节点时,如果发现功能包和节点不能自动补全:
- 情况一:没有设置环境变量。需要在终端中输入source devel/setup.bash(~/.bashrc的修改,才需要运行source ~/.bashrc)
- 情况二:设置后,可能需要自己手动补全一次才行(可能电脑有点反应不过来,需要自己手动教他一遍);使用 rospack list 命令好像也能更新功能包
- 情况三:检查roscore是否正在运行: 用 roscore命令启用ros核心, 然后再打开终端窗口运行命令, 如果roscore没有运行则不会显示任何内容