【ros】+理解和搭建ros的工作空间

本文详细介绍了如何在ROS中建立工作空间,包括创建catkin工作空间、初始化、解决编译冲突,以及添加环境变量。接着,创建了一个名为ROS_Test1的功能包,依赖于std_msgs和roscpp,并编写了两个C++节点:node_a和node_b,分别用于发布和接收消息。最后,对功能包进行编译并测试运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ros工作空间的建立是一套完备过程,掌握此过程后就能看懂很多命令了。

1创建工作空间

工作空间的建立为:
创建catkin_ws/src——mkdir -p ~/catkin_ws/src
进入src并初始化catkin_init_workspace
编译一次catkin_make——这里会出现问题,ros的和anaconda的编译冲突catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3,执行一次这个才会好。(后面也catkin_make可以)(新终端可能还是得区分一次)
这样文件就变成了:
请添加图片描述
请添加图片描述

2添加环境变量

这个就不多说了。
将source ~/catkin_ws/devel/setup.bash加入到.bashrc中

3创建功能包

到src文件夹下
catkin_create_pkg ROS_Test1 std_msgs roscpp
后面的std_msgs roscpp 是ROS_Test1的依赖
std_msgs:包含了常见的消息类型,表示基本数据类型和其他基本的消息构造。
roscpp:表示该功能包通过c++实现ROS的各种功能。提供了一个客户端库,c++开发者可以调用接口迅速完成主题、服务等相关工作。
然后再到catkin_ws再编译一次
注意这里我一直出一个问题rospack和roscd都不能用。。。

4创建节点

ROS_Test1/src下创建文件

  1. node_a.cpp
    `
    #include “ros/ros.h” //包含了使用ROS节点的必要文件
    #include “std_msgs/String.h” //包含了使用的数据类型
    #include
    int main(int argc, char **argv)
    {
    ros::init(argc, argv, “node_a”); //初始化ROS,节点名命名为node_a,节点名必须保持唯一
    ros::NodeHandle n; //实例化节点, 节点进程句柄
    ros::Publisher pub = n.advertise<std_msgs::String>(“str_message”, 1000); //告诉系统要发布话题了,话题名为“str_message”,类型为std_msgs::String,缓冲队列为1000。
    ros::Rate loop_rate(10); //设置发送数据的频率为10Hz

    while(ros::ok())
    {
    std_msgs::String msg;
    std::stringstream ss;
    ss<<“Hello World”;
    msg.data = ss.str();
    ROS_INFO(“node_a is publishing %s”, msg.data.c_str());
    pub.publish(msg); //向话题“str_message”发布消息
    ros::spinOnce(); //不是必须,若程序中订阅话题则必须,否则回掉函数不起作用。
    loop_rate.sleep(); //按前面设置的10Hz频率将程序挂起
    }
    return 0;
    }`

  2. node_b.cpp
    #include "ros/ros.h" #include "std_msgs/String.h" //话题回调函数 void chatterCallback(const std_msgs::String::ConstPtr& msg) { ROS_INFO("node_b is receiving [%s]", msg->data.c_str()); } int main(int argc, char **argv) { ros::init(argc, argv, "node_b"); //初始化ROS,节点命名为node_b,节点名必须唯一。 ros::NodeHandle n; //节点句柄实例化 ros::Subscriber sub = n.subscribe("str_message", 1000, chatterCallback); //向话题“str_message”订阅,一旦发布节点(node_a)在该话题上发布消息,本节点就会调用chatterCallbck函数。 ros::spin(); //程序进入循环,直到ros::ok()返回false,进程结束。 return 0; }
    在ROS_Test下的cmakelist下改:
    add_executable(Test1_node_a src/node_a.cpp) #将node_a.cpp文件编译成可执行文件Test1_node_a
    add_executable(Test1_node_b src/node_b.cpp)

add_dependencies(Test1_node_a ROS_Test1_generate_message_cpp) #添加可执行文件的消息依赖项
add_dependencies(Test1_node_b ROS_Test1_generate_message_cpp)
这两个用了会出错。
target_link_libraries(Test1_node_a ${catkin_LIBRARIES}) #为可执行文件Test_node_a添加链接库
target_link_libraries(Test1_node_b ${catkin_LIBRARIES})
之后回去编译一次。

5测试

roscore rosrun ROS_Test1 Test1_node_a rosrun ROS_Test1 Test1_node_b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白云千载尽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值