编写该教程的目的是希望实验室新生能够快速利用C++进行ros编程,目的是快速实现功能,因此本身并不严谨,后续会不断进行补充,配套代码会在之后建立git库进行发布。
ROS相关
1. 新建ros工作空间, 并且添加到环境变量
1.1 新建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws/
catkin_make
1.2 添加环境变量
sudo gedit ~/.bashrc
在文件最后,添加这一行
source ~/teach_ws/devel/setup.bash
2. 新建功能包
cd src
catkin_create_pkg test std_msgs rospy roscpp
cd ~/catkin_ws
catkin_make
3. 功能包中添加文件,实现打印"hello world"
3.1 新建.cpp文件,并且编辑对应功能,这里和普通c++相同
# 进入功能包的src文件
cd ~/teach_ws/src/test/src
# 新建cpp文件
touch main.cpp
#编辑cpp,实现打印
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
cout<<"hello"<<endl;
}
3.2 修改 ~/teach_ws/src/test/CMakeLists.txt文件,修改如下
cmake_minimum_required(VERSION 3.0.2)
project(test)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
)
catkin_package(
)
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
add_executable(hello
src/main.cpp)
target_link_libraries(
hello
${catkin_LIBRARIES}
)
3. 3 运行程序
roscore
rosrun test hello
4. 运行现成功能包,并且查阅可用消息
以realsense_ros包为例,该包可以实现启动realsense相机,并且将图像数据发布出去
4.1 编译功能包
# 1. 将realsense_ros copy进工作空间的src中
# 2. cd ~/teach_ws
# 3.catkin_make
4.2 运行功能包
roslaunch realsense2_camera rs_d400_and_t265.launch
4.3 查看所有的可监听消息
rostopic list
4.4 查看消息具体内容
rostopic echo /t265/odom/sample
4.5 查看消息的type
rostopic info /t265/odom/sample
结果
Type: nav_msgs/Odometry
Publishers:
* /t265/realsense2_camera_manager (http://wuzp-HP-ENVY-Notebook:46859/)
Subscribers: None
4.6 显示图像类消息
rqt_image_view
4.7 rviz的使用
待补充
5. 订阅消息
在进行建图时,我们需要知道位姿信息和点云信息或者深度图信息,这两个信息可通过4中介绍的方法发布出来,但是我们自己的程序需要实现对这些消息的订阅
5.1 修改功能包的CMakeLists.txt, 使得功能包能够实现包含进入opencv, Eigen等库
cmake_minimum_required(VERSION 3.0.2)
project(test)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
nav_msgs
visualization_msgs
tf
cv_bridge
)
find_package(Eigen3 REQUIRED)
find_package(PCL 1.7 REQUIRED)
find_package(OpenCV REQUIRED)
set(Eigen3_INCLUDE_DIRS ${EIGEN3_INCLUDE_DIR})
catkin_package(
INCLUDE_DIRS include
)
include_directories(
include
SYSTEM
${catkin_INCLUDE_DIRS}
${Eigen3_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)
set(CMAKE_CXX_FLAGS "-std=c++17 ${CMAKE_CXX_FLAGS} -O3 -Wall -pthread") # -Wextra -Werror
set(CMAKE_BUILD_TYPE "RELEASE")
add_executable(hello
src/main.cpp)
target_link_libraries(
hello
${catkin_LIBRARIES}
${OpenCV_LIBS}
)
5.2 修改代码实现订阅
#include <iostream>
#include <ros/ros.h>
#include "geometry_msgs/PoseStamped.h"
#include "nav_msgs/Odometry.h"
#include <Eigen/Eigen>
using namespace std;
void PoseCallback(const nav_msgs::Odometry::ConstPtr &pos_msg) {
Eigen::Vector3d pos;
Eigen::Quaterniond q;
pos = Eigen::Vector3d(pos_msg->pose.pose.position.x,
pos_msg->pose.pose.position.y,
pos_msg->pose.pose.position.z);
q = Eigen::Quaterniond(pos_msg->pose.pose.orientation.w,
pos_msg->pose.pose.orientation.x,
pos_msg->pose.pose.orientation.y,
pos_msg->pose.pose.orientation.z);
cout<<"getPose"<<endl;
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "build_map");
ros::NodeHandle node("~");
ros::Subscriber transform_sub_;
transform_sub_ = node.subscribe("/t265/odom/sample",10, PoseCallback);
ros::spin();
cout<<"hello"<<endl;
}
5.3 其他消息的订阅可查阅其他资料
6. 发布消息
代码如下:
#include <iostream>
#include <ros/ros.h>
#include "geometry_msgs/PoseStamped.h"
#include "nav_msgs/Odometry.h"
#include <Eigen/Eigen>
#include "std_msgs/String.h"
using namespace std;
ros::Publisher pub;
void PoseCallback(const nav_msgs::Odometry::ConstPtr &pos_msg) {
Eigen::Vector3d pos;
Eigen::Quaterniond q;
pos = Eigen::Vector3d(pos_msg->pose.pose.position.x,
pos_msg->pose.pose.position.y,
pos_msg->pose.pose.position.z);
q = Eigen::Quaterniond(pos_msg->pose.pose.orientation.w,
pos_msg->pose.pose.orientation.x,
pos_msg->pose.pose.orientation.y,
pos_msg->pose.pose.orientation.z);
std_msgs::String msg;
msg.data = "Hello wanzew!";
pub.publish(msg);
cout<<"getPose"<<endl;
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "build_map");
ros::NodeHandle node("~");
ros::Subscriber transform_sub_;
pub = node.advertise<std_msgs::String>("topic_m",1000);
transform_sub_ = node.subscribe("/t265/odom/sample",10, PoseCallback);
ros::spin();
cout<<"hello"<<endl;
}
C++ 相关
1. 定义类
2.构造函数、析构函数
2. 循环、判断语句
3. vector, map, list的使用
4. 模板编程入门