一、创建工作空间并初始化
mkdir -p 自定义空间名称/src
cd 自定义空间名称
首先会创建一个工作空间以及一个 src 子目录,然后再进入工作空间调用 catkin_make命令编译,如下图。
catkin_make:ros里面的一个编译命令,编译完会输出日志,如下图。
打开工作空间后出现devel文件和build文件,如下图。
二、创建功能包
进入工作空间里面的src目录
cd src
创建功能包 roscpp rospy std_msgs:为三个依赖包,其中roscpp是使用C++实现的库,而rospy则是使用python实现的库,std_msgs是标准消息库,创建ROS功能包时,一般都会依赖这三个库实现。
catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs
创建后文件夹会发生变化,如下图。
会出现一些文件夹和一些cmake文件
三、C++版本实现
1、进入 ros 包的 src 目录编辑源文件
cd 自定义的包
源文件放在第二个src文件下
创建源文件
源文件包含:ros头文件、main函数、初始化节点、输出日志。
Vim编译器编译helloworld.Cpp文件
#include "ros/ros.h"
int main(int argc, char *argv[])
{
//执行 ros 节点初始化
ros::init(argc,argv,"hello");
//创建 ros 节点句柄(非必须)
ros::NodeHandle n;
//控制台输出 hello world
ROS_INFO("hello world!");
return 0;
}
键入i进入编辑模式,编辑完内容后按ESC在输入“:wq”保存退出。
2、编辑 ros 包下的 Cmakelist.txt文件
输入cd ..返回上一级目录编辑CMakeLists.tt
vim CMakeLists.txt
去掉下图剪头指处的注释
上面两句代码改为:
add_executable(源文件名(可以随便,这里的名字,但要和下面那句代码名字对应一致)
src/步骤3的源文件名.cpp
)
target_link_libraries(步骤3的源文件名
${catkin_LIBRARIES}
)
示例:
add_executable(helloworld src/helloworld.cpp)
target_link_libraries(helloworld
${catkin_LIBRARIES}
)
输入完成后同样键入“:wq”保存退出。
3、进入工作空间目录并编译
键入“cd ../../”返回工作空间
键入“catkin_make”编译
如下图显示为编译成功
如果出现错误会有红色错误提示。
4、执行
执行要先启动ros核心,这里要新建窗口(Ctrl+Shift+E)
指令:
cd 工作空间
source ./devel/setup.bash 构建环境变量
rosrun 包名 C++节点
其中对于 source ./devel/setup.bash 的解释(使用source构建环境变量)将对应的工作空间的路径加入环境变量ROS_PACKAGE_PATH中。如果新开了一个终端命令行,在使用该工作空间前,必须先将该工作空间的路径加入环境变量ROS_PACKAGE_PATH中这句话的目的就是在开新的terminal的时候,运行这个setup.bash,而这个setup.bash的作用是让一些ROS* 开头的命令可以使用。在工作空间的devel文件夹中存在几个setup.*sh形式的环境变量设置脚本。使用source命令运行这些脚本文件,则工作空间的环境变量设置可以生效(如可以找到该工作空间内的项目)
最后输出
[ INFO] [1680504844.008447821]: hello world!
至此c++的一个程序就成功完成!
四、Python版本
1、进入 ros 包添加 scripts 目录并编辑 python 文件
cd ros包 进入功能包
mkdir scripts 创建scripts文件夹
cd scripts 进入script文件夹
touch helloworld.py 创建helloworld.py文件
用vim进行编辑,添加内容:
#! /usr/bin/env python
#指定解释器
"""
Python 版 HelloWorld
"""
import rospy
#主入口
if __name__ == "__main__":
rospy.init_node("Hello") #初始化ros节点
rospy.loginfo("Hello World!!!!") #输出日志
以上代码分为:
- 1.指定解释器
- 2.导包
- 3.编写主入口
- 4.初始化ros节点
- 5.输出日志
编写完成后键入“esc”“:wq”保存退出
2、为 python 文件添加可执行权限
键入”ll”指令查看执行权限
上图文件没有执行权限
执行“chmod +x 自定义文件名.py”添加执行权限
3、编辑 ros 包下的 CamkeList.txt 文件
返回上一级目录编辑CamkeList.txt 文件这里直接用“vim ../CamkeList.txt”
去掉这里的注释并更改(记得保存退出),更改如下图:
4、进入工作空间目录并编译
同c++版本
5、进入工作空间目录并执行
cd 工作空间
source ./devel/setup.bash
rosrun 包名 自定义文件名.py
运行结果
五、两个版本的细微区别
六、问题总结
运行过程中出现以下情况:
解决办法:
当在Python 2.X文件中写中文注释或输出中文时候,经常会出现编译错误(在Python 3.X中没有这种错误。):
File "/home/l/ros/demo01_ws/src/helloworld/scripts/helloworld.py", line 2
SyntaxError: Non-ASCII character '\xe6' in file /home/l/ros/demo01_ws/src/helloworld/scripts/helloworld.py on line 2, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
这是因为Python 2.X的默认编码文件是用ASCII码,如果想要编译通过,则只需要在文件开头加入一行代码将文件存成UTF-8格式即可。
在代码python代码首行加入“# -*- coding:utf-8 -*- ”
# -*- coding:utf-8 -*-
来源:小凌のBlog—Good Times|一个不咋地的博客