Metas • Requisitos • Introdução • Recursos • Todos • Referências
A robótica C ++ tem os seguintes objetivos:
Este projeto é inspirado na Pythonrobotics. Em vez de ser apenas um repositório educacional, essa biblioteca visa implementar algoritmos rápidos com uma API consistente, para garantir o desempenho do tempo de execução e a facilidade de uso.
Embora este ainda seja um trabalho em andamento, eu apreciaria se você deixasse alguma sugestão ou estrelasse o repositório. Qualquer ajuda é muito apreciada!
Compilador C ++ 11
CMake 3.14+ (Se estiver usando o Visual Studio no Windows, você poderá importar o projeto como um projeto CMake)
As dependências C ++ serão obtidas automaticamente pelo CPM.CMake. Observe que a biblioteca depende apenas do Eigen , mas matplotplusplus é usado na pasta examples para plotar os resultados.
A seguir, alguns exemplos para começar. A pasta examples contém vários exemplos que são úteis para começar.
A cpprobotics pretende ser modular, o que significa:
Depois de definir um sistema dinâmico, a maioria dos algoritmos estará prontamente disponível para ele usar
Os dados devem fluir perfeitamente entre os objetos (por exemplo, estimador -> controlador)
Depois de configurar um algoritmo, você poderá alterar o sistema dinâmico e integrá -lo diretamente
Git clone https://github.com/giacomo-b/cprobotics.git
Dado um EXAMPLE genérico que você deseja executar, os seguintes comandos o criam:
cmake -S examples/EXAMPLE -B build/EXAMPLE
cmake --build build/EXAMPLE No Windows, isso será padrão para uma configuração de depuração. Para construir o projeto no modo de liberação, você pode adicionar --config=Release após o primeiro comando.
Para executar o exemplo no Linux, MacOS e a maioria dos sistemas baseados em Unix:
./build/EXAMPLE/mainNo Windows:
./build/EXAMPLE/CONFIG_TYPE/main Onde CONFIG_TYPE é Debug ou Release , dependendo de como você configurou o projeto.
# include < robotics/robotics.hpp > SystemBase representa um sistema dinâmico genérico. Na maioria dos casos, você usará um LinearSystem ou NonlinearSystem .
Como a biblioteca é modificada, para definir um sistema, você precisa definir:
O número de estados
O número de entradas (ações de controle)
O número de saídas
por exemplo:
static constexpr int N = 2 ; // Number of states
static constexpr int M = 1 ; // Number of inputs
static constexpr int P = 2 ; // Number of outputsAliases de tipo podem ser úteis e impedir que o codificador misture as dimensões erradas:
using State = Robotics::ColumnVector<N>;
using Input = Robotics::ColumnVector<M>;
using Output = Robotics::ColumnVector<P>;
using StateMatrix = Robotics::SquareMatrix<N>;
using InputMatrix = Robotics::Matrix<N, M>;
using OutputMatrix = Robotics::Matrix<P, N>;
using FeedthroughMatrix = Robotics::Matrix<P, N>;Vamos definir um sistema linear cuja forma de estado é
x' = A * x + B * u
y = C * x + D * u
Para configurar um LinearSystem :
StateMatrix A;
A << 1 , 0 ,
0 , 1 ;
InputMatrix B;
B << 1 , 0 ;
OutputMatrix C;
C << 1 , 0 ,
0 , 1 ;Observe que ter modelos não apenas melhora o desempenho do tempo de execução, mas também aplica a verificação do tempo de compilação. Se você inicializar uma matriz com o número errado de elementos, o código não será compilado.
As matrizes C e D não são necessárias: são nulas por padrão, se não forem fornecidas. Nesse caso, D é nulo. Para definir o sistema:
Robotics::Model::LinearSystem<N, M, P> system (A, B, C);O estado inicial é zero por padrão. Você pode definir um estado inicial personalizado da seguinte maneira:
system.SetInitialState(State( 1.0 , - 1.0 ));Confira Thelarians/ModernCppstarter se você deseja incluir esses recursos em seu projeto.
Do diretório raiz:
cmake -S test -B build/test
cmake --build build/test
CTEST_OUTPUT_ON_FAILURE=1 cmake --build build/test --target test
# or simply call the executable:
./build/test/RoboticsTests Para coletar também informações de cobertura de código, execute cmake com a opção -DENABLE_TEST_COVERAGE=1 .
Isso requer que o formato de clang , o formato cMake e o pyyaml sejam instalados no sistema atual.
cmake -S test -B build/test
# view changes
cmake --build build/test --target format
# apply changes
cmake --build build/test --target fix-formatConsulte o format.cmake para obter detalhes.
A documentação é construída e publicada automaticamente sempre que uma versão do GitHub for criada. Para criar documentação manualmente, chame o seguinte comando.
cmake -S documentation -B build/doc
cmake --build build/doc --target GenerateDocs
# view the docs
open build/doc/doxygen/html/index.htmlPara construir a documentação localmente, você precisará de doxygen , jinja2 e pigmentos instalados no seu sistema.
O projeto também inclui um diretório all que permite a criação de todos os alvos ao mesmo tempo. Isso é útil durante o desenvolvimento, pois expõe todos os subprojetos ao seu IDE e evita construções redundantes da biblioteca.
cmake -S all -B build
cmake --build build
# run tests
./build/test/RoboticsTests
# format code
cmake --build build --target fix-format
# run standalone
./build/standalone/Robotics --help
# build docs
cmake --build build --target GenerateDocsO teste e os subprojetos independentes incluem o arquivo Tools.cmake, que é usado para importar ferramentas adicionais sob demanda por meio de argumentos de configuração do CMake. Atualmente, o seguinte é suportado.
Os desinfetantes podem ser ativados configurando o cmake com -DUSE_SANITIZER=<Address | Memory | MemoryWithOrigins | Undefined | Thread | Leak | 'Address;Undefined'> .
Os analisadores estáticos podem ser ativados por configuração -DUSE_STATIC_ANALYZER=<clang-tidy | iwyu | cppcheck> , ou uma combinação daqueles que estão em aspas, separados por semicolons. Por padrão, os analisadores encontrarão automaticamente arquivos de configuração como .clang-format . Argumentos adicionais podem ser passados para os analisadores definindo as variáveis CLANG_TIDY_ARGS , IWYU_ARGS ou CPPCHECK_ARGS .
O CCACHE pode ser ativado configurando com -DUSE_CCACHE=<ON | OFF> .
Como mencionado acima, este repo foi originalmente inspirado por Atsushisakai/Pythonrobotics. Então vá conferir se quiser ver mais algoritmos (ou se quiser ajudar a portar alguns deles!).