[ros][ubuntu]ros在ubuntu18.04上工作空间创建和发布一个话题

构建catkin工作空间

mkdir -p ~/catkin_ws/src

cd ~/catkin_ws/src

catkin_init_workspace

cd ~/catkin_ws/

catkin_make

配置环境变量

echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc

source ~/.bashrc

检查环境变量

echo $ROS_PACKAGE_PATH

遇到错误:上面操作不需要用sudo 进行操作,但是由于初学者可能存在操作不当导致错误

ros catkin_maked的时候报错误代码:

The specified base path "/home/ubuntu/catkin_ws" contains a CMakeLists.txt but "catkin_make" must be invoked in the root of workspace.....

出现这种情况的原因是catkin_init_workspacce的时候,出现下面这句:

Creating symlink "/home/ubuntu/catkin_ws/CMakeLists.txt" pointing to "/opt/ros/indigo/share/catkin/cmake/toplevel.cmake"

将当前工作空间下的CMakeLists.txt与/ros/下的cmake做了链接

解决方法:
unlink /home/youpath/catkin_ws/CMakeLists.txt

发布一个话题案例:

创建功能包

复制代码
cd ~/catkin_ws/src
catkin_create_pkg package1 roscpp rospy std_msgs

使用命令cd ~/catkin_ws/src 进入代码空间,并在代码空间中创建功能包

使用catkin_create_pkg创建名为package1的功能包,功能包的支撑库为roscpp rospy和std_msgs,创建功能包的命令格式为catkin_create_pkg <package_name> depends1 depends2 depends3。此时~/catkin_ws/src路径下会出现两个文件,一个是CMakeLists.txt另外一个则是我们的功能包package,在package路径下会出现4个文件,分别是include文件夹(用于存放类似于.h的头文件),src文件夹(用于存放cpp文件),CMakeLists.txt(指定编译的规则),package.xml(支持包的相关信息,如果后续文件需要扩展就在此文件中增加相关的库),到此功能包已经创建完毕,后续还需要修改CMakeLists.txt更新我们的编译规则,但在此之前我们需要新建一个cpp源码。

复制代码
cd ~/catkin_ws/src/package1/src
touch pub_node_test.cpp

进入~/catkin_ws/src/package1/src文件夹,使用touch命令创建一个cpp文件,在cpp文件中输入以下内容。

复制代码
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc,char **argv)
{
    ros::init(argc,argv,"talker");  //初始化
    ros::NodeHandle n;              //创建句柄
    ros::Publisher chatter_pub  = n.advertise<std_msgs::String>("chatter",1000);  //设定话题名称为chatter,并且缓存队列长度为1000,用于平衡硬件发送速度
    ros::Rate loop_rate(10);   //设置发送波特率为10HZ,与后面的loop_rate.sleep();相互呼应,如果下一帧信息不满足频率要求系统则会延时
    int count = 0;   
    while(ros::ok())
    {
        std_msgs::String msg;
        std::stringstream ss;
        ss<<"first example!"<<count;
        msg.data = ss.str();
        ROS_INFO("%s",msg.data.c_str());
        chatter_pub.publish(msg);
        ros::spinOnce();
        loop_rate.sleep();
        ++count;
    }
    return 0;
}

以上代码创建了一个名为talker的节点,该节点通过"chatter"话题发布消息

然后修改package1功能包中的CMakeList.txt文件.打开CMakeLists.txt文件并在里面输入以下内容。

复制代码
add_executable(pub_node src/pub_node_test.cpp)
target_link_libraries(pub_node ${catkin_LIBRARIES})

这样就可以在devel/lib文件夹下生成名为pub_node的可执行文件了,这两条编译码的一般格式如下:add_executable(可执行文件名 src/cpp文件名) target_link_libraries(可执行文件名 ${catkin_LIBRARIES})

回到工作空间下并使用catkin_make编译整个工作空间

复制代码
cd ~/catkin_ws
catkin_make

打开一个新终端,使用如下命令即可运行刚编译生成的可执行文件

复制代码
rosrun package1 pub_node

显示界面如下:

工作空间及消息创建成功!使用rostopic list可以看到会出现一个新的名为chatter的话题。

相关推荐
0+1119 小时前
Linux --从 poll 到 epoll多路转接
linux·服务器·1024程序员节
青瓦梦滋9 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
桌面运维家10 小时前
旧电脑跑不动课程软件,VDI云桌面怎样接着用?
运维·服务器·虚拟化·pve·vdi·云桌面
zhang1338308907510 小时前
传统机械三杯式风速传感器易磨损冻堵?CG-88金属超声波风速风向传感器给出免运维方案
运维·服务器·网络·人工智能·自动化
知已难寻10 小时前
第 2 篇 · 云的地基:服务器、存储、网络三大基础设施
运维·服务器·网络·云原生·云计算·负载均衡·1024程序员节
2601_9498477512 小时前
bcrypt.js 跨端三方库仓颉适配全流程
linux·运维·ubuntu
m0_6399069412 小时前
Linux 操作系统入门:目录结构、服务排查常用命令、Shell 脚本基础
linux·运维·后端
今天重构了吗13 小时前
Linux 上 rm -rf 删错了能找回吗
运维·服务器
KaiwuDB13 小时前
KaiwuDB 分布式集群扩缩容,从原理到完整操作踩坑总结
运维·数据库·分布式
codezzzsleep13 小时前
学术汇报 PPT 自动化生成实战指南
运维·自动化·powerpoint