小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
下载编译小鱼的ros2 serial包 编译示例报错
-
@王涛 看一下代码的README文件的最后,尝试以下步骤
sudo sh -c "echo '/usr/local/lib' >> /etc/ld.so.conf" sudo ldconfig
另外确定第一步安装有正常被安装
其他问题可以查看github issue。
另外尽量复制粘贴哈,方便我和其他人搜索。
关于社区提问的一些注意事项,请看提问的智慧一节。
比如你这里把源码地址贴出来,我就可以直接到README里复制粘贴出来,避免二次寻找源码地址。
@小鱼 在 提问前必看!一定要看!必须看一下! 中说:
一个好的提问不仅能够帮助自己理清楚问题,还有助于别人快速帮助到你。——提问的智慧
问题一定要描述清楚,终端打印一定复制粘贴(你可以在linux系统上打开浏览器进社区)
基本的Markdown语法一定要学习下,有的小伙伴图片代码一团糟
提问时一定要提供尽可能多的信息,包括你的目的,比如你其实想装装某个库遇到问题,不要只说这个问题,因为可能有更好的替代方案
先搜索再提问,很多问题其实都有解决方案,确保你自己对自己的问题有一定了解再提问
尽量一句话说完,不要把社区当微信聊天一样用,每一个回复都尽量提供更多的的信息。 -
@小鱼 /usr/bin/ld: CMakeFiles/serial_test.dir/src/serial_test.cpp.o: in function
main': serial_test.cpp:(.text+0x403): undefined reference to
fish_protocol::GetProtocolByConfig(fish_protocol::ProtocolConfig const&)'
/usr/bin/ld: serial_test.cpp:(.text+0x4a8): undefined reference to `fish_protocol::FishProtocol::SetDataRecvCallback(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>)'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/serial_test.dir/build.make:131:serial_test] 错误 1
make[1]: *** [CMakeFiles/Makefile2:78:CMakeFiles/serial_test.dir/all] 错误 2
make: *** [Makefile:141:all] 错误 2Failed <<< serial_demon [1.93s, exited with code 2]
Summary: 0 packages finished [3.53s]
1 package failed: serial_demon
1 package had stderr output: serial_demon还是不行呢
-
@小鱼 #include "fish_protocol/fish_protocol.h"
#include "rclcpp/rclcpp.hpp"int main(int argc, char** argv) {
/* 初始化rclcpp */
rclcpp::init(argc, argv);
/产生一个node_01的节点/
auto node = std::make_sharedrclcpp::Node("example_fish_protocol");
// 打印一句自我介绍
RCLCPP_INFO(node->get_logger(), "example_fish_protocol节点已经启动.");fish_protocol::ProtocolConfig proto_config;
proto_config.protocol_type_ = fish_protocol::PROTOCOL_TYPE::SERIAL;
proto_config.serial_baut_ = 115200;
proto_config.serial_address_ = "/dev/ttyS12";
// 初始化
auto protocol = GetProtocolByConfig(proto_config);
// 发送数据
protocol->ProtocolSendRawData("Hello FishBot!");
// 接收数据
protocol->SetDataRecvCallback([](const std::string& data) -> void {
std::cout << "recv" << data << std::endl;
});
// 销毁
protocol->ProtocolDestory();/* 运行节点,并检测退出信号 Ctrl+C*/
rclcpp::spin(node);
/* 停止运行 */
rclcpp::shutdown();
return 0;
}这是源码
-
@王涛 前面的安装步骤是否执行了,可以分步骤执行看一下结果,另外你的系统平台和ROS版本是多少?
sudo apt install libboost-dev git clone https://gh.api.99988866.xyz/https://github.com/fishros/fish_protocol.git cd fish_protocol && mkdir build && cd build cmake .. && sudo make install # 将安装到系统库
注意格式哈~
-
已经确定4个步骤全部正常安装
然后
1新建一个新的工作空间
2新建一个功能包
3新建cpp文件把 上述测试源码复制进去 并修改了cmakelist
4 编译报错用虚拟机运行的20.04 ros版本是foxy
-
-
@小鱼 cmake_minimum_required(VERSION 3.8)
project(serial_demon)if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclpy REQUIRED)
find_package(std_msgs REQUIRED)add_executable(serial_demon src/serial_demon.cpp)
ament_target_dependencies(
serial_demon
"rclcpp"
"rclpy"
"std_msgs"
)install(TARGETS
serial_demon
DESTINATION lib/${PROJECT_NAME})if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)the following line skips the linter which checks for copyrights
uncomment the line when a copyright and license is not present in all source files
#set(ament_cmake_copyright_FOUND TRUE)
the following line skips cpplint (only works in a git repo)
uncomment the line when this package is not in a git repo
#set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()ament_package()
-
@王涛 应该是这里的问题了,你用了第三方库,一定要添加依赖。你可以对比我给的示例工程下的CmakeLists.txt文件。
cmake_minimum_required(VERSION 3.8) project(example_fish_protocol) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() # find dependencies find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(fish_protocol REQUIRED) add_executable(example_fish_protocol src/example_fish_protocol.cpp) target_include_directories(example_fish_protocol PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>) target_compile_features(example_fish_protocol PUBLIC c_std_99 cxx_std_17) # Require C99 and C++17 ament_target_dependencies( example_fish_protocol "rclcpp" ) target_link_libraries(example_fish_protocol "fish_protocol" ) install(TARGETS example_fish_protocol DESTINATION lib/${PROJECT_NAME}) if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) # the following line skips the linter which checks for copyrights # uncomment the line when a copyright and license is not present in all source files #set(ament_cmake_copyright_FOUND TRUE) # the following line skips cpplint (only works in a git repo) # uncomment the line when this package is not in a git repo #set(ament_cmake_cpplint_FOUND TRUE) ament_lint_auto_find_test_dependencies() endif() ament_package()
重点在这几句
find_package(fish_protocol REQUIRED) target_link_libraries(example_fish_protocol "fish_protocol" )
另外代码块记得包裹下
-
@小鱼 在 下载编译小鱼的ros2 serial包 编译示例报错 中说:
target_link_libraries(example_fish_protocol
"fish_protocol"
)感谢大佬 问题已经解决还有一个新的问题 我想发送和接受 16进制的数据 不是字符串 该怎么使用这两个函数呢
-
@王涛 针对新的问题请发新的帖子提问哈,一个帖子只围绕一个问题讨论。
记住一句话——万物皆可字符串,无论什么数据都可以转换成string格式。
一个16进制数据可以用4个二进制组成,一个字节=8个二进制,所以任意两个16进制数据可以由一个字节组成,一个字节就是一个byte,也就是我们常见的char类型,而string=char[]+长度信息组成的。
随手找了一个,你可以参考: