强烈建议使用鱼香ROS的一键安装功能,对于我们这些小白真的是福音。
http://fishros.com/#/fish_home
先安装Ubuntu22.04.1(据说win10下也可以装ROS2,但是十分折腾,还是在Ubuntu下安装方便一些)(Ubuntu22.04才有humble版本的ros2,Ubuntu20.04没有humble)
然后在命令行中执行鱼香ROS的一键安装代码
wget http://fishros.com/install -O fishros && . fishros
然后选择安装ros,选择humble版本。
参考鱼香ros的 使用g++编译ROS2节点时,假如是直接用g++编译cpp文件,他那样子是没问题;但是假如是在Qt中调用ros的库时,需要将lib目录下所有的so包含进去
INCLUDEPATH += /opt/ros/humble/include/rclcpp \
/opt/ros/humble/include/rcl/ \
/opt/ros/humble/include/rcutils/ \
/opt/ros/humble/include/rmw \
/opt/ros/humble/include/rcl_yaml_param_parser/ \
/opt/ros/humble/include/rosidl_runtime_c \
/opt/ros/humble/include/rosidl_typesupport_interface \
/opt/ros/humble/include/rcpputils \
/opt/ros/humble/include/builtin_interfaces \
/opt/ros/humble/include/rosidl_runtime_cpp \
/opt/ros/humble/include/tracetools \
/opt/ros/humble/include/rcl_interfaces \
/opt/ros/humble/include/libstatistics_collector \
/opt/ros/humble/include/statistics_msgs
# 这样不行,不知道为啥
#LIBS += -L/opt/ros/humble/lib/ \
#-lrclcpp -lrcutils
LIBS += -L/opt/ros/humble/lib/
LIBS += /opt/ros/humble/lib/*.so
简单地说,只有调用了这个函数,节点对应的回调函数才会被执行。否则会一直被挂起在队列中(假如队列满了,旧的会被挤掉)
参考 :
https://blog.csdn.net/xihuanzhi1854/article/details/101025747
ROS2中的节点需要调用阻塞函数rclcpp::spin之后,节点对应的相关回调函数(接收话题的回调函数、服务请求处理函数、服务回应处理函数等)才能被成功调用;或者在while循环中,调用rclcpp::spin_some。总之,都涉及到线程阻塞的问题。
目前我对于这些问题的处理方式是将对应的节点对象放到子线程中进行rclcpp::spin,代码如下:
void createServer()
{
serviceServer = std::make_shared<ServiceServer01>("service_server_01");
rclcpp::spin(serviceServer);
}
int main(int argc, char *argv[])
{
...
QtConcurrent::run(createServer);
...
}
但是,我是在虚拟机进行操作的,虚拟机只分配了两个核,因此,我在利用 QtConcurrent::run启动了2个节点后,从第三个开始,它就启动不了了。
经过查找资料发现,这个和QThreadPool有关系。简单地说就是每次调用QtConcurrent::run时,都会从线程池QThreadPool::globalInstance()里面取个线程出来用,而QThreadPool::globalInstance()里面的默认可用线程个数是有限的,可以查询QThreadPool::globalInstance()->maxThreadCount()得到;而这个maxThreadCount的默认值为QThread::idealThreadCount(),而 QThread::idealThreadCount()是与cpu的核心数有关系的:所以,一种办法是可以修改你虚拟机的CPU核心数;或者,直接修改QThreadPool::globalInstance()的maxThreadCount:
int main(int argc, char *argv[])
{
// 直接修改最大可用线程数,但是暂时不清楚这样做会不会有什么副作用
QThreadPool::globalInstance()->setMaxThreadCount(10);
...
QtConcurrent::run(createServer);
...
}
opencv的安装
参考这里,可以先尝试从仓库安装,也就是:
sudo apt update
sudo apt install libopencv-dev python3-opencv
然后在Qt里面的.pro文件使用时,就这样写(一定要这样添加库,假如用注释的那个方法添加的话,会报 undefined symbol: _ZdlPvm, version Qt_5 的错误)
...
INCLUDEPATH += /usr/include/opencv4 \
/usr/include/opencv4/opencv2
#LIBS += -L/usr/lib/x86_64-linux-gnu \
#-lopencv_core -lopencv_imgproc -lopencv_video -lopencv_imgcodecs -lopencv_highgui
LIBS += /usr/lib/x86_64-linux-gnu/libopencv_*.so
...
图像类型的主题用到的消息类型可以参考
https://blog.csdn.net/mengfanji_5995/article/details/127526564
在发布后,假如通过rqt查看发布的图像主题时,报下面的错:
Unable to load plugin for transport 'image_transport/image_sub', error string:
According to the loaded plugin descriptions the class image_transport/image_sub with base class type image_transport::SubscriberPlugin does not exist. Declared types are image_transport/compressedDepth_sub image_transport/compressed_sub image_transport/raw_sub image_transport/theora_sub