2小时c++与ros教学

编写该教程的目的是希望实验室新生能够快速利用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. 模板编程入门

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值