ROS开发流程
ROS中涉及的编程语言以C++和Python为主,ROS中的大多数程序两者都可以实现,在本系列教程中,每一个案例也都会分别使用C++和Python两种方案演示,大家可以根据自身情况选择合适的实现方案。
ROS中的程序即便使用不同的编程语言,实现流程也大致类似,以当前HelloWorld程序为例,实现流程大致如下:
- 先创建一个工作空间;
- 再创建一个功能包;
- 编辑源文件;
- 编辑配置文件;
- 编译并执行。
上述流程中,C++和Python只是在步骤3和步骤4的实现细节上存在差异,其他流程基本一致。本节先实现C++和Python程序编写的通用部分步骤1与步骤2,1.3.2节和1.3.3节再分别使用C++和Python编写HelloWorld。
1.创建工作空间并初始化
mkdir -p demo01/src
cd demo01
catkin_make
上述命令,首先会创建一个工作空间以及一个 src 子目录,然后再进入工作空间调用 catkin_make命令编译。
2.启动vscode
进入 demo01 启动 vscode
cd demo01
code .
3.vscode 中编译 ros
快捷键 ctrl + shift + B 调用编译,选择:catkin_make:build
可以点击配置设置为默认,修改.vscode/tasks.json 文件
{
// 有关 tasks.json 格式的文档,请参见
// https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"label": "catkin_make:debug", //代表提示的描述性信息
"type": "shell", //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
"command": "catkin_make",//这个是我们需要运行的命令
"args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
"group": {"kind":"build","isDefault":true},
"presentation": {
"reveal": "always"//可选always或者silence,代表是否输出信息
},
"problemMatcher": "$msCompile"
}
]
}
4.创建 ROS 功能包
选定 src 右击 —> create catkin package
添加包名
demo01
添加依赖
roscpp rospy std_msgs
5.C++ 实现
在功能包的 src 下新建 cpp 文件: demo01_hello.cpp
#include "ros/ros.h"
int main(int argc, char *argv[])
{
/* code */
ros::init(argc, argv, "hello");
ros::NodeHandle nh;
ROS_INFO("hello world");
return 0;
}
PS1: 如果没有代码提示
修改 .vscode/c_cpp_properties.json
设置 “cppStandard”: “c++17”
PS2: main 函数的参数不可以被 const 修饰
PS3: 当ROS__INFO 终端输出有中文时,会出现乱码
INFO: ???
解决办法:在函数开头加入下面代码的任意一句
setlocale(LC_CTYPE, "zh_CN.utf8");
setlocale(LC_ALL, "");
6.配置文件修改
CMakeLists.txt
## Declare a C++ library
# add_library(${PROJECT_NAME}
# src/${PROJECT_NAME}/demo01.cpp
# )
## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
# add_executable(${PROJECT_NAME}_node src/demo01_node.cpp)
add_executable(demo01_hello src/demo01_hello.cpp)
## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")
## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Specify libraries to link a library or executable target against
target_link_libraries(demo01_hello
${catkin_LIBRARIES}
)